aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Riedstra <mitch@riedstra.dev>2025-12-24 19:49:57 -0500
committerMitchell Riedstra <mitch@riedstra.dev>2025-12-24 19:49:57 -0500
commit939ac4319cb047a37ba46f84eff81948063f6954 (patch)
tree5112cf8aad73125a13f5b52c0290a7f26f948b52
parent3a1b5ba15b89c907f9bf66a0761ffdd73b32208b (diff)
downloadunixv4-939ac4319cb047a37ba46f84eff81948063f6954.tar.gz
unixv4-939ac4319cb047a37ba46f84eff81948063f6954.tar.xz
Add working webpage for unix v4
-rw-r--r--.gitignore3
-rw-r--r--Containerfile45
-rw-r--r--boot.ini4
-rwxr-xr-xbuild.sh27
-rwxr-xr-xentrypoint.sh17
-rwxr-xr-xjslinux-2019-12-21/bbl64.binbin0 -> 53786 bytes
-rw-r--r--jslinux-2019-12-21/images/bg-scrollbar-thumb-y.pngbin0 -> 2888 bytes
-rw-r--r--jslinux-2019-12-21/images/bg-scrollbar-track-y.pngbin0 -> 960 bytes
-rw-r--r--jslinux-2019-12-21/images/bg-scrollbar-trackend-y.pngbin0 -> 211 bytes
-rw-r--r--jslinux-2019-12-21/images/upload-icon.pngbin0 -> 530 bytes
-rw-r--r--jslinux-2019-12-21/index.html68
-rw-r--r--jslinux-2019-12-21/jslinux.js646
-rwxr-xr-xjslinux-2019-12-21/kernel-riscv64.binbin0 -> 3979556 bytes
-rw-r--r--jslinux-2019-12-21/kernel-x86.binbin0 -> 4969920 bytes
-rw-r--r--jslinux-2019-12-21/readme.txt27
-rw-r--r--jslinux-2019-12-21/riscvemu32-wasm.js4
-rw-r--r--jslinux-2019-12-21/riscvemu32-wasm.wasmbin0 -> 198789 bytes
-rw-r--r--jslinux-2019-12-21/riscvemu32.js19
-rw-r--r--jslinux-2019-12-21/riscvemu64-wasm.js4
-rw-r--r--jslinux-2019-12-21/riscvemu64-wasm.wasmbin0 -> 220054 bytes
-rw-r--r--jslinux-2019-12-21/riscvemu64.js20
-rw-r--r--jslinux-2019-12-21/root-riscv64.binbin0 -> 4194304 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64.cfg11
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk.txt4
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000000.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000001.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000002.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000003.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000004.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000005.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000006.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000007.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000008.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000009.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000010.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000011.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000012.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000013.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000014.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-riscv64/blk000000015.binbin0 -> 262144 bytes
-rw-r--r--jslinux-2019-12-21/root-x86.binbin0 -> 52428800 bytes
-rw-r--r--jslinux-2019-12-21/root-x86.bin.origbin0 -> 4194304 bytes
-rw-r--r--jslinux-2019-12-21/root-x86.cfg10
-rw-r--r--jslinux-2019-12-21/root-x86/blk.txt4
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000000.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000001.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000002.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000003.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000004.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000005.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000006.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000007.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000008.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000009.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000010.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000011.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000012.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000013.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000014.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000015.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000016.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000017.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000018.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000019.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000020.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000021.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000022.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000023.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000024.binbin0 -> 2097152 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000025.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000026.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000027.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000028.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000029.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000030.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000031.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000032.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000033.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000034.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000035.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000036.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000037.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000038.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000039.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000040.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000041.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000042.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000043.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000044.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000045.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000046.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000047.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000048.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000049.binbin0 -> 1048576 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000050.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000051.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000052.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000053.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000054.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000055.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000056.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000057.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000058.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000059.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000060.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000061.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000062.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000063.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000064.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000065.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000066.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000067.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000068.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000069.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000070.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000071.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000072.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000073.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000074.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000075.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000076.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000077.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000078.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000079.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000080.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000081.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000082.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000083.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000084.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000085.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000086.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000087.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000088.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000089.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000090.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000091.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000092.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000093.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000094.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000095.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000096.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000097.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000098.binbin0 -> 524288 bytes
-rw-r--r--jslinux-2019-12-21/root-x86/blk000000099.binbin0 -> 524288 bytes
-rwxr-xr-xjslinux-2019-12-21/splitimgbin0 -> 21968 bytes
-rw-r--r--jslinux-2019-12-21/style.css41
-rw-r--r--jslinux-2019-12-21/term.js1251
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/Changelog45
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/MIT-LICENSE.txt19
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/Makefile135
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/Makefile.js65
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/VERSION1
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/aes.c1321
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/aes.h49
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/block_net.c531
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/build_filelist.c311
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/cutils.c120
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/cutils.h194
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fbuf.h22
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs.c104
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs.h211
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs_disk.c659
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs_net.c2910
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.c370
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.h95
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.c625
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.h93
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/ide.c835
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/ide.h32
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/iomem.c264
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/iomem.h148
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/js/lib.js280
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/jsemu.c349
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/json.c464
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/json.h132
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/list.h94
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/machine.c640
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/machine.h196
-rwxr-xr-xjslinux-2019-12-21/tinyemu-2019-12-21/netinit.sh43
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/pci.c588
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/pci.h81
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/pckbd.c342
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/ps2.c489
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/ps2.h34
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/readme.txt204
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.c1377
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.h118
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_fp_template.h304
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_priv.h293
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_template.h1739
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/riscv_machine.c1053
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/sdl.c275
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/sha256.c341
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/sha256.h40
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/simplefb.c127
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.c314
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.h122
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/cksum.c139
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/debug.h34
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.c209
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.h25
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip.h253
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.c351
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.h161
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_input.c685
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_output.c172
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/libslirp.h56
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/main.h46
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.c218
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.h127
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.c403
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.h73
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.c181
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.h30
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.c828
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.h313
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp_config.h188
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.c722
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.h95
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp.h164
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_input.c1487
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_output.c492
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_subr.c915
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.c292
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.h127
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_var.h161
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcpip.h77
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tftp.h43
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.c386
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.h86
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/softfp.c87
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/softfp.h181
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template.h1129
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template_icvt.h171
-rwxr-xr-xjslinux-2019-12-21/tinyemu-2019-12-21/splitimgbin0 -> 21968 bytes
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.c102
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.d1
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.obin0 -> 13592 bytes
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/temu.c835
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/vga.c804
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/virtio.c2650
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/virtio.h146
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/vmmouse.c162
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.c96
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.h70
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/x86_machine.c2569
-rw-r--r--jslinux-2019-12-21/x86emu-wasm.js4
-rw-r--r--jslinux-2019-12-21/x86emu-wasm.wasmbin0 -> 369464 bytes
-rw-r--r--jslinux-2019-12-21/x86emu.js22
-rw-r--r--readme.md3
250 files changed, 39972 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2ebbe4a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+img.tar
+disk.img
+simh.zip
diff --git a/Containerfile b/Containerfile
new file mode 100644
index 0000000..fa16c73
--- /dev/null
+++ b/Containerfile
@@ -0,0 +1,45 @@
+FROM docker.io/alpine:3.23
+
+RUN apk update && apk upgrade
+
+RUN apk add \
+ build-base \
+ curl \
+ libarchive-tools \
+ libedit-dev \
+ libpcap-dev \
+ libpng-dev \
+ sdl2-dev \
+ pcre-dev
+
+
+COPY simh.zip /opt/
+RUN mkdir -p /opt/simh
+WORKDIR /opt/simh
+RUN bsdtar --strip-components=1 -xzvf /opt/simh.zip
+# RUN make pdp11
+RUN make CFLAGS_G='-march=i386' pdp11 -j$(nproc)
+RUN cp BIN/pdp11 /usr/bin/pdp11
+
+RUN mkdir /opt/unixv4
+COPY boot.ini /opt/unixv4/
+COPY disk.rk /opt/unixv4/
+WORKDIR /opt/unixv4
+
+RUN apk del \
+ build-base \
+ curl \
+ libarchive-tools \
+ libedit-dev \
+ libpcap-dev \
+ libpng-dev \
+ sdl2-dev \
+ pcre-dev
+
+RUN rm -rf /var/cache/apk /opt/simh /opt/simh.zip
+
+RUN apk add pcre sdl2
+
+COPY entrypoint.sh /bin/
+
+ENTRYPOINT /bin/entrypoint.sh
diff --git a/boot.ini b/boot.ini
index a42b696..8e80979 100644
--- a/boot.ini
+++ b/boot.ini
@@ -2,5 +2,5 @@ set cpu 11/45
att rk0 disk.rk
d sr 1
boot rk
-# type k
-# type unix
+type k
+type unix
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..285a76b
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+set -ex
+export BUILDAH_LAYERS=true
+sudo=sudo
+[ -n "$(command -v doas)" ] && [ -x $(command -v doas) ] && sudo=doas
+docker=docker
+[ -n "$(command -v podman)" ] && [ -x "$(command -v podman)" ] && docker=podman
+
+simh_url="https://github.com/simh/simh/archive/master.zip"
+simh_archive="./simh.zip"
+if ! [ -e "$simh_archive" ] ; then
+ wget -O "$simh_archive" "$simh_url"
+fi
+
+$docker build --platform=i386 -t unixv4 .
+$docker run --name unixv4emulator --entrypoint=/bin/true --replace unixv4
+$docker export unixv4emulator > img.tar
+$docker container rm unixv4emulator
+truncate -s 50M disk.img
+$sudo kpartx -av disk.img
+$sudo mkfs.ext2 /dev/loop0
+$sudo mount /dev/loop0 /mnt
+$sudo tar -C /mnt -xpvf img.tar
+$sudo umount /mnt
+$sudo kpartx -dv disk.img
+
+
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100755
index 0000000..7bdd9eb
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+if ! test -t ; then
+ echo "need an interactive terminal"
+ exit 1
+fi
+
+echo "You will need to type:"
+echo " k<enter>"
+echo " unix<enter>"
+echo ""
+echo "Where <enter> is the literal enter/return key."
+echo "Once you get to the login prompt, the root user without a password"
+echo "Will be available to you."
+echo ""
+echo "Note: to stop the simulation you can press c-e and type quit"
+
+exec /usr/bin/pdp11 boot.ini
diff --git a/jslinux-2019-12-21/bbl64.bin b/jslinux-2019-12-21/bbl64.bin
new file mode 100755
index 0000000..382672c
--- /dev/null
+++ b/jslinux-2019-12-21/bbl64.bin
Binary files differ
diff --git a/jslinux-2019-12-21/images/bg-scrollbar-thumb-y.png b/jslinux-2019-12-21/images/bg-scrollbar-thumb-y.png
new file mode 100644
index 0000000..2ce41f2
--- /dev/null
+++ b/jslinux-2019-12-21/images/bg-scrollbar-thumb-y.png
Binary files differ
diff --git a/jslinux-2019-12-21/images/bg-scrollbar-track-y.png b/jslinux-2019-12-21/images/bg-scrollbar-track-y.png
new file mode 100644
index 0000000..2636c54
--- /dev/null
+++ b/jslinux-2019-12-21/images/bg-scrollbar-track-y.png
Binary files differ
diff --git a/jslinux-2019-12-21/images/bg-scrollbar-trackend-y.png b/jslinux-2019-12-21/images/bg-scrollbar-trackend-y.png
new file mode 100644
index 0000000..16d740c
--- /dev/null
+++ b/jslinux-2019-12-21/images/bg-scrollbar-trackend-y.png
Binary files differ
diff --git a/jslinux-2019-12-21/images/upload-icon.png b/jslinux-2019-12-21/images/upload-icon.png
new file mode 100644
index 0000000..0efc325
--- /dev/null
+++ b/jslinux-2019-12-21/images/upload-icon.png
Binary files differ
diff --git a/jslinux-2019-12-21/index.html b/jslinux-2019-12-21/index.html
new file mode 100644
index 0000000..2e32891
--- /dev/null
+++ b/jslinux-2019-12-21/index.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>JSLinux</title>
+ <link href="style.css" type="text/css" rel="stylesheet"/>
+<style>
+</style>
+</head>
+<body>
+
+<h1>Run Unix v4 from your browser</h1>
+
+<p>
+Technically, we're booting Linux, to emulate a PDP-11.
+
+Once Linux is booted run:
+
+<pre><code>
+cd /opt/unixv4
+pdp11 boot.ini
+</code></pre>
+
+Once you see some info about the controller not being valid, type
+<pre>k</pre> it should push you to a newline, then type <pre>unix</pre>
+then hit enter.
+
+From there you should have a login prompt, at which you can type <pre>root</pre>
+and play with the system as you see fit.
+</p>
+<div id="term_wrap">
+ <div id="term_container">
+ </div>
+ <div>
+ <textarea id="term_paste" cols="10" rows="1" autocorrect="off">Paste Here</textarea>
+ <label>
+ <img title="Upload files" src="images/upload-icon.png"><input type="file" id="files" multiple onchange="on_update_files(this.files)">
+ </label>
+ <progress id="net_progress">
+ </progress>
+ </div>
+</div>
+<script type="text/javascript" src="term.js"></script>
+<script type="text/javascript" src="jslinux.js"></script>
+
+<p>
+Special thanks to:
+<ul>
+ <li>
+ <a href="https://x.com/akero_p">aap</a> for the disk image and basic
+ instructions found <a href="http://squoze.net/UNIX/v4/README">here</a>
+ </li>
+ <li>
+ Everyone involved with reading the tape and getting it to
+ <a href="https://archive.org/details/utah_unix_v4_raw">Archive.org</a>
+ </li>
+ <li>
+ Everyone at <a href="https://github.com/simh/simh">simh</a> for the
+ PDP-11 emulator
+ </li>
+ <li>
+ And finally Fabrice Bellard for
+ <a href="https://bellard.org/jslinux">JSLinux</a> and TinyEMU
+ </li>
+</ul>
+</p>
+</body>
+</html>
diff --git a/jslinux-2019-12-21/jslinux.js b/jslinux-2019-12-21/jslinux.js
new file mode 100644
index 0000000..39d45ac
--- /dev/null
+++ b/jslinux-2019-12-21/jslinux.js
@@ -0,0 +1,646 @@
+/*
+ * JS Linux main
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+"use strict";
+
+var term, console_write1;
+var graphic_display, display_key_event, display_mouse_event;
+var net_state, net_write_packet, net_set_carrier;
+var display_wheel_event;
+var fs_import_file;
+var Module = {};
+var downloading_timer_pending = false;
+var downloading_timer;
+
+function on_update_file(f)
+{
+ var f, reader;
+ reader = new FileReader();
+ reader.onload = function (ev) {
+ var buf, buf_addr, buf_len;
+ buf = new Uint8Array(reader.result);
+ buf_len = buf.length;
+ buf_addr = _malloc(buf_len);
+ HEAPU8.set(buf, buf_addr);
+ /* the buffer is freed by the function */
+ fs_import_file(f.name, buf_addr, buf_len);
+ };
+ reader.readAsArrayBuffer(f);
+}
+
+function on_update_files(files)
+{
+ var i, n;
+ n = files.length;
+ for(i = 0; i < n; i++) {
+ on_update_file(files[i]);
+ }
+}
+
+function term_handler(str)
+{
+ var i;
+ for(i = 0; i < str.length; i++) {
+ console_write1(str.charCodeAt(i));
+ }
+}
+
+function downloading_timer_cb()
+{
+ var el = document.getElementById("net_progress");
+ el.style.visibility = "hidden";
+ downloading_timer_pending = false;
+}
+
+function update_downloading(flag)
+{
+ var el;
+ if (flag) {
+ if (downloading_timer_pending) {
+ clearTimeout(downloading_timer);
+ downloading_timer_pending = false;
+ } else {
+ el = document.getElementById("net_progress");
+ el.style.visibility = "visible";
+ }
+ } else {
+ downloading_timer_pending = true;
+ downloading_timer = setTimeout(downloading_timer_cb, 500);
+ }
+}
+
+function get_params()
+{
+ var url, query_str, p, tab, i, params, tab2;
+ query_str = window.location.href;
+ p = query_str.indexOf("?");
+ if (p < 0)
+ return {};
+ query_str = query_str.substr(p + 1);
+ tab = query_str.split("&");
+ params = {};
+ for(i = 0; i < tab.length; i++) {
+ tab2 = tab[i].split("=");
+ params[decodeURIComponent(tab2[0])] = decodeURIComponent(tab2[1]);
+ }
+ return params;
+}
+
+function get_absolute_url(fname)
+{
+ var path, p;
+
+ if (fname.indexOf(":") >= 0)
+ return fname;
+ path = window.location.pathname;
+ p = path.lastIndexOf("/");
+ if (p < 0)
+ return fname;
+ return window.location.origin + path.slice(0, p + 1) + fname;
+}
+
+function GraphicDisplay(parent_el, width, height)
+{
+ this.width = width;
+ this.height = height;
+
+ this.canvas_el = document.createElement("canvas");
+ this.canvas_el.width = width; /* logical width */
+ this.canvas_el.height = height; /* logical width */
+ /* displayed size */
+ this.canvas_el.style.width = width + "px";
+ this.canvas_el.style.height = height + "px";
+ this.canvas_el.style.cursor = "none";
+
+ parent_el.appendChild(this.canvas_el);
+
+ this.ctx = this.canvas_el.getContext("2d");
+ /* clear the display */
+ this.ctx.fillStyle = "#000000";
+ this.ctx.fillRect(0, 0, width, height);
+
+ this.image = this.ctx.createImageData(width, height);
+
+ this.key_pressed = new Uint8Array(128);
+
+ document.addEventListener("keydown",
+ this.keyDownHandler.bind(this), false);
+ document.addEventListener("keyup",
+ this.keyUpHandler.bind(this), false);
+ document.addEventListener("blur",
+ this.blurHandler.bind(this), false);
+
+ this.canvas_el.onmousedown = this.mouseMoveHandler.bind(this);
+ this.canvas_el.onmouseup = this.mouseMoveHandler.bind(this);
+ this.canvas_el.onmousemove = this.mouseMoveHandler.bind(this);
+ this.canvas_el.oncontextmenu = this.onContextMenuHandler.bind(this);
+ this.canvas_el.onwheel = this.wheelHandler.bind(this);
+}
+
+GraphicDisplay.code_to_input_map = {
+ "Escape": 0x01,
+ "Digit1": 0x02,
+ "Digit2": 0x03,
+ "Digit3": 0x04,
+ "Digit4": 0x05,
+ "Digit5": 0x06,
+ "Digit6": 0x07,
+ "Digit7": 0x08,
+ "Digit8": 0x09,
+ "Digit9": 0x0a,
+ "Digit0": 0x0b,
+ "Minus": 0x0c,
+ "Equal": 0x0d,
+ "Backspace": 0x0e,
+ "Tab": 0x0f,
+ "KeyQ": 0x10,
+ "KeyW": 0x11,
+ "KeyE": 0x12,
+ "KeyR": 0x13,
+ "KeyT": 0x14,
+ "KeyY": 0x15,
+ "KeyU": 0x16,
+ "KeyI": 0x17,
+ "KeyO": 0x18,
+ "KeyP": 0x19,
+ "BracketLeft": 0x1a,
+ "BracketRight": 0x1b,
+ "Enter": 0x1c,
+ "ControlLeft": 0x1d,
+ "KeyA": 0x1e,
+ "KeyS": 0x1f,
+ "KeyD": 0x20,
+ "KeyF": 0x21,
+ "KeyG": 0x22,
+ "KeyH": 0x23,
+ "KeyJ": 0x24,
+ "KeyK": 0x25,
+ "KeyL": 0x26,
+ "Semicolon": 0x27,
+ "Quote": 0x28,
+ "Backquote": 0x29,
+ "ShiftLeft": 0x2a,
+ "Backslash": 0x2b,
+ "KeyZ": 0x2c,
+ "KeyX": 0x2d,
+ "KeyC": 0x2e,
+ "KeyV": 0x2f,
+ "KeyB": 0x30,
+ "KeyN": 0x31,
+ "KeyM": 0x32,
+ "Comma": 0x33,
+ "Period": 0x34,
+ "Slash": 0x35,
+ "ShiftRight": 0x36,
+ "NumpadMultiply": 0x37,
+ "AltLeft": 0x38,
+ "Space": 0x39,
+ "CapsLock": 0x3a,
+ "F1": 0x3b,
+ "F2": 0x3c,
+ "F3": 0x3d,
+ "F4": 0x3e,
+ "F5": 0x3f,
+ "F6": 0x40,
+ "F7": 0x41,
+ "F8": 0x42,
+ "F9": 0x43,
+ "F10": 0x44,
+ "NumLock": 0x45,
+ "ScrollLock": 0x46,
+ "Numpad7": 0x47,
+ "Numpad8": 0x48,
+ "Numpad9": 0x49,
+ "NumpadSubtract": 0x4a,
+ "Numpad4": 0x4b,
+ "Numpad5": 0x4c,
+ "Numpad6": 0x4d,
+ "NumpadAdd": 0x4e,
+ "Numpad1": 0x4f,
+ "Numpad2": 0x50,
+ "Numpad3": 0x51,
+ "Numpad0": 0x52,
+ "NumpadDecimal": 0x53,
+ "IntlBackslash": 0x56,
+ "F11": 0x57,
+ "F12": 0x58,
+
+ "NumpadEnter": 96,
+ "ControlRight": 97,
+ "NumpadDivide": 98,
+ "AltRight": 100,
+ "Home": 102,
+ "ArrowUp": 103,
+ "PageUp": 104,
+ "ArrowLeft": 105,
+ "ArrowRight": 106,
+ "End": 107,
+ "ArrowDown": 108,
+ "PageDown": 109,
+ "Insert": 110,
+ "Delete": 111,
+ "OSLeft": 125,
+ "OSRight": 126,
+ "ContextMenu": 127,
+};
+
+GraphicDisplay.key_code_to_input_map = new Uint8Array([
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0E, 0x0F, 0, 0, 0, 0x1C, 0, 0,
+ 0x2A, 0x1D, 0x38, 0, 0x3A, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x01, 0, 0, 0, 0,
+ 0x39, 104, 109, 107, 102, 105, 103, 106, /* 0x20 */
+ 0x50, 0, 0, 0, 0, 0x52, 0x53, 0,
+ 0x0B, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* 0x30 */
+ 0x09, 0x0A, 0, 0x27, 0, 0x0D, 0, 0,
+ 0, 0x1E, 0x30, 0x2E, 0x20, 0x12, 0x21, 0x22, /* 0x40 */
+ 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18,
+ 0x19, 0x10, 0x13, 0x1F, 0x14, 0x16, 0x2F, 0x11, /* 0x50 */
+ 0x2D, 0x15, 0x2C, 125, 126, 127, 0, 0,
+ 0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47, /* 0x60 */
+ 0x48, 0x49, 0x37, 0x4e, 0, 0x4a, 0x53, 98,
+ 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, /* 0x70 */
+ 0x43, 0x44, 0x57, 0x58, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x45, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */
+ 0, 0, 0, 0, 0, 0x0C, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */
+ 0, 0, 0x27, 0x0D, 0x33, 0x0C, 0x34, 0x35,
+ 0x29, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */
+ 0, 0, 0, 0x1A, 0x2B, 0x1B, 0x28, 0,
+ 125, 100, 0, 0, 0, 0, 0, 0, /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+]);
+
+GraphicDisplay.prototype.keyHandler = function keyHandler(ev, isDown)
+{
+ var code, input_key_code;
+
+ /* At least avoid exiting the navigator if Ctrl-Q or Ctrl-W are
+ * pressed */
+ if (ev.ctrlKey) {
+ window.onbeforeunload = function() {
+ window.onbeforeunload = null;
+ return "CTRL-W or Ctrl-Q cannot be sent to the emulator.";
+ };
+ } else {
+ window.onbeforeunload = null;
+ }
+
+ if (typeof ev.code != "undefined") {
+ code = ev.code;
+ input_key_code = GraphicDisplay.code_to_input_map[code];
+ if (typeof input_key_code != "undefined") {
+// console.log("code=" + code + " isDown=" + isDown + " input_key_code=" + input_key_code);
+ this.key_pressed[input_key_code] = isDown;
+ display_key_event(isDown, input_key_code);
+
+ if (ev.stopPropagation)
+ ev.stopPropagation();
+ if (ev.preventDefault)
+ ev.preventDefault();
+ return false;
+ }
+ } else {
+ /* fallback using keyCodes. Works only with an US keyboard */
+ code = ev.keyCode;
+ if (code < 256) {
+ input_key_code = GraphicDisplay.key_code_to_input_map[code];
+// console.log("keyCode=" + code + " isDown=" + isDown + " input_key_code=" + input_key_code);
+ if (input_key_code) {
+ this.key_pressed[input_key_code] = isDown;
+ display_key_event(isDown, input_key_code);
+
+ if (ev.stopPropagation)
+ ev.stopPropagation();
+ if (ev.preventDefault)
+ ev.preventDefault();
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+GraphicDisplay.prototype.keyDownHandler = function keyDownHandler(ev)
+{
+ return this.keyHandler(ev, 1);
+}
+
+GraphicDisplay.prototype.keyUpHandler = function keyUpHandler(ev)
+{
+ return this.keyHandler(ev, 0);
+}
+
+GraphicDisplay.prototype.blurHandler = function blurHandler(ev, isDown)
+{
+ var i, n, key_pressed;
+ /* allow unloading the page */
+ window.onbeforeunload = null;
+ /* release all keys */
+ key_pressed = this.key_pressed;
+ for(i = 0; i < key_pressed.length; i++) {
+ if (key_pressed[i]) {
+ display_key_event(0, i);
+ key_pressed[i] = 0;
+ }
+ }
+}
+
+GraphicDisplay.prototype.mouseMoveHandler = function (ev)
+{
+ var x, y, rect, buttons;
+ rect = this.canvas_el.getBoundingClientRect();
+ x = ev.clientX - rect.left;
+ y = ev.clientY - rect.top;
+ buttons = ev.buttons & 7;
+// console.log("mouse: x=" + x + " y=" + y + " buttons=" + buttons);
+ display_mouse_event(x, y, buttons);
+ if (ev.stopPropagation)
+ ev.stopPropagation();
+ if (ev.preventDefault)
+ ev.preventDefault();
+ return false;
+}
+
+GraphicDisplay.prototype.wheelHandler = function (ev)
+{
+ if (ev.deltaY < 0) {
+ display_wheel_event(1);
+ } else if (ev.deltaY > 0) {
+ display_wheel_event(-1);
+ }
+ if (ev.stopPropagation)
+ ev.stopPropagation();
+ if (ev.preventDefault)
+ ev.preventDefault();
+}
+
+/* disable contextual menu */
+GraphicDisplay.prototype.onContextMenuHandler = function (ev)
+{
+ if (ev.stopPropagation)
+ ev.stopPropagation();
+ if (ev.preventDefault)
+ ev.preventDefault();
+ return false;
+}
+
+/* Network support */
+
+function Ethernet(url)
+{
+ try {
+ this.socket = new WebSocket(url);
+ } catch(err) {
+ this.socket = null;
+ console.log("Could not open websocket url=" + url);
+ return;
+ }
+ this.socket.binaryType = 'arraybuffer';
+ this.socket.onmessage = this.messageHandler.bind(this);
+ this.socket.onclose = this.closeHandler.bind(this);
+ this.socket.onopen = this.openHandler.bind(this);
+ this.socket.onerror = this.errorHandler.bind(this);
+}
+
+Ethernet.prototype.openHandler = function(e)
+{
+ net_set_carrier(1);
+}
+
+Ethernet.prototype.closeHandler = function(e)
+{
+ net_set_carrier(0);
+}
+
+Ethernet.prototype.errorHandler = function(e)
+{
+ console.log("Websocket error=" + e);
+}
+
+Ethernet.prototype.messageHandler = function(e)
+{
+ var str, buf_len, buf_addr, buf;
+ if (e.data instanceof ArrayBuffer) {
+ buf_len = e.data.byteLength;
+ buf = new Uint8Array(e.data);
+ buf_addr = _malloc(buf_len);
+ HEAPU8.set(buf, buf_addr);
+ net_write_packet(buf_addr, buf_len);
+ _free(buf_addr);
+ } else {
+ str = e.data.toString();
+ if (str.substring(0, 5) == "ping:") {
+ try {
+ this.socket.send('pong:' + str.substring(5));
+ } catch (err) {
+ }
+ }
+ }
+}
+
+Ethernet.prototype.recv_packet = function(buf)
+{
+ if (this.socket) {
+ try {
+ this.socket.send(buf);
+ } catch (err) {
+ }
+ }
+}
+
+function start_vm(user, pwd)
+{
+ var url, mem_size, cpu, params, vm_url, cmdline, cols, rows, guest_url;
+ var font_size, graphic_enable, width, height, net_url, alloc_size;
+ var drive_url, vm_file;
+
+ function loadScript(src, f) {
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement("script");
+ script.src = src;
+ var done = false;
+ script.onload = script.onreadystatechange = function() {
+ // attach to both events for cross browser finish detection:
+ if ( !done && (!this.readyState ||
+ this.readyState == "loaded" || this.readyState == "complete") ) {
+ done = true;
+ if (f) {
+ f();
+ }
+ script.onload = script.onreadystatechange = null;
+ head.removeChild(script);
+ }
+ };
+ head.appendChild(script);
+ }
+
+ function start()
+ {
+ /* C functions called from javascript */
+ console_write1 = Module.cwrap('console_queue_char', null, ['number']);
+ fs_import_file = Module.cwrap('fs_import_file', null, ['string', 'number', 'number']);
+ display_key_event = Module.cwrap('display_key_event', null, ['number', 'number']);
+ display_mouse_event = Module.cwrap('display_mouse_event', null, ['number', 'number', 'number']);
+ display_wheel_event = Module.cwrap('display_wheel_event', null, ['number']);
+ net_write_packet = Module.cwrap('net_write_packet', null, ['number', 'number']);
+ net_set_carrier = Module.cwrap('net_set_carrier', null, ['number']);
+
+ net_state = null;
+ if (net_url != "") {
+ net_state = new Ethernet(net_url);
+ }
+
+ Module.ccall("vm_start", null, ["string", "number", "string", "string", "number", "number", "number", "string"], [url, mem_size, cmdline, pwd, width, height, (net_state != null) | 0, drive_url]);
+ pwd = null;
+ }
+
+ /* read the parameters */
+
+ params = get_params();
+ cpu = params["cpu"] || "x86";
+ url = params["url"];
+ if (!url) {
+ if (cpu == "riscv")
+ url = "root-riscv64.cfg";
+ else
+ url = "root-x86.cfg";
+ }
+ url = get_absolute_url(url);
+ mem_size = (params["mem"] | 0) || 128; /* in mb */
+ cmdline = params["cmdline"] || "";
+ cols = (params["cols"] | 0) || 80;
+ rows = (params["rows"] | 0) || 30;
+ font_size = (params["font_size"] | 0) || 15;
+ guest_url = params["guest_url"] || "";
+ width = (params["w"] | 0) || 1024;
+ height = (params["h"] | 0) || 640;
+ graphic_enable = params["graphic"] | 0;
+ net_url = params["net_url"] || ""; /* empty string means no network */
+ if (typeof net_url == "undefined")
+ net_url = "wss://relay.widgetry.org/";
+ drive_url = params["drive_url"] || "";
+
+ if (user) {
+ cmdline += " LOGIN_USER=" + user;
+ } else if (guest_url) {
+ cmdline += " GUEST_URL=" + guest_url;
+ }
+
+ if (graphic_enable) {
+ graphic_display = new GraphicDisplay(document.getElementById("term_container"), width, height);
+ } else {
+ width = 0;
+ height = 0;
+ /* start the terminal */
+ term = new Term(cols, rows, term_handler, 10000);
+ term.open(document.getElementById("term_container"),
+ document.getElementById("term_paste"));
+ term.term_el.style.fontSize = font_size + "px";
+ term.write("Loading...\r\n");
+ }
+
+// console.log("cpu=" + cpu + " url=" + url + " mem=" + mem_size);
+
+ switch(cpu) {
+ case "x86":
+ vm_file = "x86emu";
+ break;
+ case "riscv64":
+ case "riscv":
+ vm_file = "riscvemu64";
+ break;
+ case "riscv32":
+ vm_file = "riscvemu32";
+ break;
+ default:
+ term.writeln("Unknown cpu=" + cpu);
+ return;
+ }
+
+ if (typeof WebAssembly === "object") {
+ /* wasm support : the memory grows automatically */
+ vm_url = vm_file + "-wasm.js";
+ } else {
+ /* set the total memory */
+ alloc_size = mem_size;
+ if (cpu == "x86")
+ alloc_size += 16;
+ if (graphic_enable) {
+ /* frame buffer memory */
+ alloc_size += (width * height * 4 + 1048576 - 1) >> 20;
+ }
+ alloc_size += 32; /* extra space (XXX: reduce it ?) */
+ alloc_size = (alloc_size + 15) & -16; /* align to 16 MB */
+ Module.TOTAL_MEMORY = alloc_size << 20;
+ vm_url = vm_file + ".js";
+ }
+ Module.preRun = start;
+
+ loadScript(vm_url, null);
+}
+
+function on_login()
+{
+ var login_wrap_el = document.getElementById("wrap");
+ var term_wrap_el = document.getElementById("term_wrap");
+ var form = document.getElementById("form");
+ var status = document.getElementById("status");
+ var user = form.user.value;
+ var pwd = form.password.value;
+
+ if (user.length <= 1) {
+ status.innerHTML = "User name must be provided";
+ return false;
+ }
+
+ login_wrap_el.style.display = "none";
+ term_wrap_el.style.display = "block";
+ form.password.value = "";
+ form.user.value = "";
+
+ start_vm(user, pwd);
+
+ return false;
+}
+
+(function() {
+ var login, params;
+
+ params = get_params();
+ login = params["login"] || 0;
+ if (login) {
+ var login_wrap_el = document.getElementById("wrap");
+ login_wrap_el.style.display = "block";
+ } else {
+ var term_wrap_el = document.getElementById("term_wrap");
+ term_wrap_el.style.display = "block";
+ start_vm(null, null);
+ }
+})();
diff --git a/jslinux-2019-12-21/kernel-riscv64.bin b/jslinux-2019-12-21/kernel-riscv64.bin
new file mode 100755
index 0000000..18b3136
--- /dev/null
+++ b/jslinux-2019-12-21/kernel-riscv64.bin
Binary files differ
diff --git a/jslinux-2019-12-21/kernel-x86.bin b/jslinux-2019-12-21/kernel-x86.bin
new file mode 100644
index 0000000..d29d300
--- /dev/null
+++ b/jslinux-2019-12-21/kernel-x86.bin
Binary files differ
diff --git a/jslinux-2019-12-21/readme.txt b/jslinux-2019-12-21/readme.txt
new file mode 100644
index 0000000..89d182e
--- /dev/null
+++ b/jslinux-2019-12-21/readme.txt
@@ -0,0 +1,27 @@
+JSLinux demo
+============
+
+You must copy all the files to a directory on a web server in order to
+run the demo (it is needed so that the XML HTTP Requests work
+correctly). Assuming it is installed in http://localhost/jslinux,
+explore in a browser:
+
+http://localhost/jslinux
+
+A minimal busybox distribution for RISCV-64 and x86 is provided. The
+RISCV-64 version is executed by default. To run the x86 version,
+explore:
+
+http://localhost/jslinux?cpu=x86
+
+The source jslinux.js can be modified to change the default
+configuration.
+
+More complete Linux distributions (such as buildroot) can be used
+provided you keep using the same precompiled Linux kernels. The
+TinyEMU 'splitimg' tool must be used to convert a diskimage to a list
+of files. For example:
+
+splitimg root-riscv64.bin root-riscv64 256
+
+The demo VM configurations are in root-riscv64.cfg and root-x86.cfg.
diff --git a/jslinux-2019-12-21/riscvemu32-wasm.js b/jslinux-2019-12-21/riscvemu32-wasm.js
new file mode 100644
index 0000000..d3b2608
--- /dev/null
+++ b/jslinux-2019-12-21/riscvemu32-wasm.js
@@ -0,0 +1,4 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="riscvemu32-wasm.wast";var wasmBinaryFile="riscvemu32-wasm.wasm";var asmjsCodeFile="riscvemu32-wasm.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){err("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){err("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){err("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver).catch((function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource).catch((function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module["wasmMaxTableSize"];if(typeof WebAssembly==="object"&&typeof WebAssembly.Table==="function"){if(MAX_TABLE_SIZE!==undefined){env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,"maximum":MAX_TABLE_SIZE,"element":"anyfunc"})}else{env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,element:"anyfunc"})}}else{env["table"]=new Array(TABLE_SIZE)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+29488;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});var STATIC_BUMP=29488;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=(function(){Module["dynCall_vi"](func,arg)})}else{browserIterationFunc=(function(){Module["dynCall_v"](func)})}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}}),runIter:(function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}if(Module["postMainLoop"])Module["postMainLoop"]()})},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject==="undefined"){console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Module["preloadedImages"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module["preloadedAudios"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module["preloadedAudios"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(function(){});canvas.exitFullscreen=canvas.exitFullscreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?(function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null)||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullscreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullscreen()}}),requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){err("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");Browser.requestFullScreen=(function(lockPointer,resizeCanvas,vrDevice){return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)});return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),asyncLoad:(function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";Module["readAsync"](url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(dep)addRunDependency(dep)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}),wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:(function(){var handle=Browser.nextWgetRequestHandle;Browser.nextWgetRequestHandle++;return handle})};function _emscripten_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.");Module["requestFullScreen"]=Module["requestFullscreen"];Browser.requestFullScreen(lockPointer,resizeCanvas,vrDevice)};Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas,vrDevice){Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=184;Module["wasmMaxTableSize"]=184;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var __get_daylight=Module["__get_daylight"]=(function(){return Module["asm"]["__get_daylight"].apply(null,arguments)});var __get_timezone=Module["__get_timezone"]=(function(){return Module["asm"]["__get_timezone"].apply(null,arguments)});var __get_tzname=Module["__get_tzname"]=(function(){return Module["asm"]["__get_tzname"].apply(null,arguments)});var _console_queue_char=Module["_console_queue_char"]=(function(){return Module["asm"]["_console_queue_char"].apply(null,arguments)});var _display_key_event=Module["_display_key_event"]=(function(){return Module["asm"]["_display_key_event"].apply(null,arguments)});var _display_mouse_event=Module["_display_mouse_event"]=(function(){return Module["asm"]["_display_mouse_event"].apply(null,arguments)});var _display_wheel_event=Module["_display_wheel_event"]=(function(){return Module["asm"]["_display_wheel_event"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _fs_import_file=Module["_fs_import_file"]=(function(){return Module["asm"]["_fs_import_file"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _net_set_carrier=Module["_net_set_carrier"]=(function(){return Module["asm"]["_net_set_carrier"].apply(null,arguments)});var _net_write_packet=Module["_net_write_packet"]=(function(){return Module["asm"]["_net_write_packet"].apply(null,arguments)});var _vm_start=Module["_vm_start"]=(function(){return Module["asm"]["_vm_start"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiijjjjj=Module["dynCall_iiiiiiijjjjj"]=(function(){return Module["asm"]["dynCall_iiiiiiijjjjj"].apply(null,arguments)});var dynCall_iiijii=Module["dynCall_iiijii"]=(function(){return Module["asm"]["dynCall_iiijii"].apply(null,arguments)});var dynCall_iijiiii=Module["dynCall_iijiiii"]=(function(){return Module["asm"]["dynCall_iijiiii"].apply(null,arguments)});var dynCall_iijji=Module["dynCall_iijji"]=(function(){return Module["asm"]["dynCall_iijji"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiji=Module["dynCall_viiji"]=(function(){return Module["asm"]["dynCall_viiji"].apply(null,arguments)});Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run()
+
+
+
diff --git a/jslinux-2019-12-21/riscvemu32-wasm.wasm b/jslinux-2019-12-21/riscvemu32-wasm.wasm
new file mode 100644
index 0000000..f640595
--- /dev/null
+++ b/jslinux-2019-12-21/riscvemu32-wasm.wasm
Binary files differ
diff --git a/jslinux-2019-12-21/riscvemu32.js b/jslinux-2019-12-21/riscvemu32.js
new file mode 100644
index 0000000..b81d3db
--- /dev/null
+++ b/jslinux-2019-12-21/riscvemu32.js
@@ -0,0 +1,19 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+28480;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});memoryInitializer="data:application/octet-stream;base64,AAAAAAAAAABjY2NjfHx8fHd3d3d7e3t78vLy8mtra2tvb29vxcXFxTAwMDABAQEBZ2dnZysrKyv+/v7+19fX16urq6t2dnZ2ysrKyoKCgoLJycnJfX19ffr6+vpZWVlZR0dHR/Dw8PCtra2t1NTU1KKioqKvr6+vnJycnKSkpKRycnJywMDAwLe3t7f9/f39k5OTkyYmJiY2NjY2Pz8/P/f39/fMzMzMNDQ0NKWlpaXl5eXl8fHx8XFxcXHY2NjYMTExMRUVFRUEBAQEx8fHxyMjIyPDw8PDGBgYGJaWlpYFBQUFmpqamgcHBwcSEhISgICAgOLi4uLr6+vrJycnJ7KysrJ1dXV1CQkJCYODg4MsLCwsGhoaGhsbGxtubm5uWlpaWqCgoKBSUlJSOzs7O9bW1tazs7OzKSkpKePj4+MvLy8vhISEhFNTU1PR0dHRAAAAAO3t7e0gICAg/Pz8/LGxsbFbW1tbampqasvLy8u+vr6+OTk5OUpKSkpMTExMWFhYWM/Pz8/Q0NDQ7+/v76qqqqr7+/v7Q0NDQ01NTU0zMzMzhYWFhUVFRUX5+fn5AgICAn9/f39QUFBQPDw8PJ+fn5+oqKioUVFRUaOjo6NAQEBAj4+Pj5KSkpKdnZ2dODg4OPX19fW8vLy8tra2ttra2tohISEhEBAQEP/////z8/Pz0tLS0s3Nzc0MDAwMExMTE+zs7OxfX19fl5eXl0REREQXFxcXxMTExKenp6d+fn5+PT09PWRkZGRdXV1dGRkZGXNzc3NgYGBggYGBgU9PT0/c3NzcIiIiIioqKiqQkJCQiIiIiEZGRkbu7u7uuLi4uBQUFBTe3t7eXl5eXgsLCwvb29vb4ODg4DIyMjI6Ojo6CgoKCklJSUkGBgYGJCQkJFxcXFzCwsLC09PT06ysrKxiYmJikZGRkZWVlZXk5OTkeXl5eefn5+fIyMjINzc3N21tbW2NjY2N1dXV1U5OTk6pqampbGxsbFZWVlb09PT06urq6mVlZWV6enp6rq6urggICAi6urq6eHh4eCUlJSUuLi4uHBwcHKampqa0tLS0xsbGxujo6Ojd3d3ddHR0dB8fHx9LS0tLvb29vYuLi4uKioqKcHBwcD4+Pj61tbW1ZmZmZkhISEgDAwMD9vb29g4ODg5hYWFhNTU1NVdXV1e5ubm5hoaGhsHBwcEdHR0dnp6enuHh4eH4+Pj4mJiYmBERERFpaWlp2dnZ2Y6Ojo6UlJSUm5ubmx4eHh6Hh4eH6enp6c7Ozs5VVVVVKCgoKN/f39+MjIyMoaGhoYmJiYkNDQ0Nv7+/v+bm5uZCQkJCaGhoaEFBQUGZmZmZLS0tLQ8PDw+wsLCwVFRUVLu7u7sWFhYWAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAbAAAANgAAAAAAAAAAUKf0UVNlQX7DpBcall4nOstrqzvxRZ0fq1j6rJMD40tV+jAg9m12rZF2zIglTAL1/NflT9fLKsWARDUmj6NitUlasd5nG7olmA7qReHA/l0CdS/DEvBMgaOXRo3G+dNr51+PA5WckhXrem2/2llSlS2DvtTTIXRYKWngSUTIyY5qicJ1eHmO9Gs+WJndcbkntk/hvhetiPBmrCDJtDrOfRhK32OCMRrlYDNRl0V/U2Lgd2SxhK5ruxyggf6UKwj5WGhIcBn9RY+HbN6Ut/h7UiPTc6viAktyV48f4yqrVWYHKOuyA8K1L5p7xYalCDfT8ocoMLKlvyO6agMCXIIW7Sscz4qStHmn8PIH86HiaU7N9Npl1b4FBh9iNNGK/qbEnVMuNKBV86Iy4YoFdev2pDnsgwuq72BABp9xXlEQbr35iiE+PQbdlq4FPt1GveZNtY1UkQVdxHFv1AYE/xVQYCT7mBmX6b3WzENAiXee2We9QuiwiIuJBzhbGefb7sh5Rwp8oekPQnzJHoT4AAAAAIOGgAlI7SsyrHARHk5yWmz7/w79VjiFDx7Vrj0nOS02ZNkPCiGmXGjRVFubOi42JLFnCgwP51eT0pbutJ6RmxtPxcCAoiDcYWlLd1oWGhIcCrqT4uUqoMBD4CI8HRcbEgsNCQ6tx4vyuai2LcipHhSFGfFXTAd1r7vdme79YH+jnyYB97z1clzFO2ZENH77W3YpQ4vcxiPLaPzttmPx5LjK3DHXEIVjQkAilxMgEcaEfSRKhfg9u9IRMvmubaEpx0svnh3zMLLc7FKGDdDjwXdsFrMrmblwqfpIlBEiZOlHxIz8qBo/8KDYLH1W75AzIsdOSYfB0TjZ/qLKjDYL1JjPgfWmKN56pSaOt9qkv60/5J06LA2SeFCbzF9qYkZ+VMITjfbouNiQXvc5LvWvw4K+gF2ffJPQaakt1W+zEiXPO5msyKd9GBBuY5zoe7s72wl4Js30GFluAbea7KiaT4NlbpXmfub/qgjPvCHm6BXv2Zvnus42b0rUCZ/q1nywKa+ypDExIz8qMJSlxsBmojU3vE50psqC/LDQkOAV2KczSpgE8ffa7EEOUM1/L/aRF43WTXZNsO9DVE2qzN8EluTjtdGeG4hqTLgfLMF/UWVGBOpenV01jAFzdIf6LkEL+1odZ7NS0tuSM1YQ6RNH1m2MYdeaegyhN44U+FmJPBPr7iepzjXJYbft5RzhPLFHelnf0pw/c/JVec4UGL83x3PqzfdTW6r9XxRvPd+G20R4gfOvyj7EaLksNCQ4X0CjwnLDHRYMJeK8i0k8KEGVDf9xAag53rMMCJzktNiQwVZkYYTLe3C2MtV0XGxIQle40Kf0UVBlQX5TpBcaw14nOpZrqzvLRZ0f8Vj6rKsD40uT+jAgVW12rfZ2zIiRTAL1JdflT/zLKsXXRDUmgKNitY9asd5JG7olZw7qRZjA/l3hdS/DAvBMgRKXRo2j+dNrxl+PA+eckhWVem2/61lSldqDvtQtIXRY02ngSSnIyY5EicJ1anmO9Hg+WJlrcbkn3U/hvratiPAXrCDJZjrOfbRK32MYMRrlgjNRl2B/U2JFd2Sx4K5ru4Sggf4cKwj5lGhIcFj9RY8ZbN6Uh/h7UrfTc6sjAkty4o8f41erVWYqKOuyB8K1LwN7xYaaCDfTpYcoMPKlvyOyagMCuoIW7Vwcz4ortHmnkvIH8/DiaU6h9Nplzb4FBtViNNEf/qbEilMuNJ1V86Kg4YoFMuv2pHXsgws572BAqp9xXgYQbr1RiiE++Qbdlj0FPt2uveZNRo1UkbVdxHEF1AYEbxVQYP/7mBkk6b3Wl0NAicye2Wd3QuiwvYuJB4hbGec47sh52wp8oUcPQnzpHoT4yQAAAACGgAmD7SsySHARHqxyWmxO/w79+ziFD1bVrj0eOS02J9kPCmSmXGghVFub0S42JDpnCgyx51eTD5butNKRmxuexcCATyDcYaJLd1ppGhIcFrqT4goqoMDl4CI8QxcbEh0NCQ4Lx4vyrai2LbmpHhTIGfFXhQd1r0zdme67YH+j/SYB95/1cly8O2ZExX77WzQpQ4t2xiPL3Pzttmjx5Lhj3DHXyoVjQhAilxNAEcaEICRKhX09u9L4MvmuEaEpx20vnh1LMLLc81KGDezjwXfQFrMrbLlwqZlIlBH6ZOlHIoz8qMQ/8KAaLH1W2JAzIu9OSYfH0TjZwaLKjP4L1Jg2gfWmz956pSiOt9omv60/pJ06LOSSeFANzF9qm0Z+VGITjfbCuNiQ6Pc5Ll6vw4L1gF2fvpPQaXwt1W+pEiXPs5msyDt9GBCnY5zobrs723t4Js0JGFlu9Lea7AGaT4OobpXmZeb/qn7PvCEI6BXv5pvnutk2b0rOCZ/q1HywKdaypDGvIz8qMZSlxjBmojXAvE50N8qC/KbQkOCw2KczFZgE8Ura7EH3UM1/DvaRFy/WTXaNsO9DTU2qzFQEluTftdGe44hqTBsfLMG4UWVGf+penQQ1jAFddIf6c0EL+y4dZ7Na0tuSUlYQ6TNH1m0TYdeajAyhN3oU+FmOPBPriSepzu7JYbc15Rzh7bFHejzf0pxZc/JVP84UGHk3x3O/zfdT6qr9X1tvPd8U20R4hvOvyoHEaLk+NCQ4LECjwl/DHRZyJeK8DEk8KIuVDf9BAag5cbMMCN7ktNicwVZkkITLe2G2MtVwXGxIdFe40EL0UVCnQX5TZRcaw6QnOpZeqzvLa50f8UX6rKtY40uTAzAgVfp2rfZtzIiRdgL1JUzlT/zXKsXXyzUmgERitY+jsd5JWrolZxvqRZgO/l3hwC/DAnVMgRLwRo2jl9NrxvmPA+dfkhWVnG2/63pSldpZvtQtg3RY0yHgSSlpyY5EyMJ1aomO9Hh5WJlrPrkn3XHhvrZPiPAXrSDJZqzOfbQ632MYShrlgjFRl2AzU2JFf2Sx4Hdru4Sugf4coAj5lCtIcFhoRY8Z/d6Uh2x7Urf4c6sj00ty4gIf41ePVWYqq+uyByi1LwPCxYaaezfTpQgoMPKHvyOypQMCumoW7VyCz4orHHmnkrQH8/DyaU6h4tplzfQFBtW+NNEfYqbEiv4uNJ1T86KgVYoFMuH2pHXrgws57GBAqu9xXgafbr1RECE++Yrdlj0GPt2uBeZNRr1UkbWNxHEFXQYEb9RQYP8VmBkk+73Wl+lAicxD2Wd3nuiwvUKJB4iLGec4W8h52+58oUcKQnzpD4T4yR4AAAAAgAmDhisySO0RHqxwWmxOcg79+/+FD1Y4rj0e1S02JzkPCmTZXGghplub0VQ2JDouCgyxZ1eTD+futNKWmxuekcCAT8XcYaIgd1ppSxIcFhqT4gq6oMDlKiI8Q+AbEh0XCQ4LDYvyrce2LbmoHhTIqfFXhRl1r0wHme673X+j/WAB958mcly89WZExTv7WzR+Q4t2KSPL3Mbttmj85Lhj8THXytxjQhCFlxNAIsaEIBFKhX0ku9L4PfmuETIpx22hnh1LL7Lc8zCGDexSwXfQ47MrbBZwqZm5lBH6SOlHImT8qMSM8KAaP31W2CwzIu+QSYfHTjjZwdHKjP6i1Jg2C/Wmz4F6pSjet9omjq0/pL86LOSdeFANkl9qm8x+VGJGjfbCE9iQ6Lg5Ll73w4L1r12fvoDQaXyT1W+pLSXPsxKsyDuZGBCnfZzobmM723u7Js0JeFlu9Bia7AG3T4OompXmZW7/qn7mvCEIzxXv5ujnutmbb0rONp/q1AmwKdZ8pDGvsj8qMSOlxjCUojXAZk50N7yC/KbKkOCw0KczFdgE8UqY7EH32s1/DlCRFy/2TXaN1u9DTbCqzFRNluTfBNGe47VqTBuILMG4H2VGf1FenQTqjAFdNYf6c3QL+y5BZ7NaHduSUtIQ6TNW1m0TR9eajGGhN3oM+FmOFBPriTypzu4nYbc1yRzh7eVHejyx0pxZ3/JVP3MUGHnOx3O/N/dT6s39X1uqPd8Ub0R4htuvyoHzaLk+xCQ4LDSjwl9AHRZyw+K8DCU8KItJDf9Blag5cQEMCN6ztNic5FZkkMHLe2GEMtVwtmxIdFy40EJXUVCn9H5TZUEaw6QXOpZeJzvLa6sf8UWdrKtY+kuTA+MgVfowrfZtdoiRdsz1JUwCT/zX5cXXyyomgEQ1tY+jYt5JWrElZxu6RZgO6l3hwP7DAnUvgRLwTI2jl0ZrxvnTA+dfjxWVnJK/63ptldpZUtQtg75Y0yF0SSlp4I5EyMl1aonC9Hh5jplrPlgn3XG5vrZP4fAXrYjJZqwgfbQ6zmMYSt/lgjEal2AzUWJFf1Ox4Hdku4Sua/4coIH5lCsIcFhoSI8Z/UWUh2zeUrf4e6sj03Ny4gJL41ePH2Yqq1WyByjrLwPCtYaae8XTpQg3MPKHKCOypb8CumoD7VyCFoorHM+nkrR58/DyB06h4mllzfTaBtW+BdEfYjTEiv6mNJ1TLqKgVfMFMuGKpHXr9gs57INAqu9gXgafcb1REG4++Yohlj0G3d2uBT5NRr3mkbWNVHEFXcQEb9QGYP8VUBkk+5jWl+m9icxDQGd3ntmwvULoB4iLiec4Wxl52+7IoUcKfHzpD0L4yR6EAAAAAAmDhoAySO0rHqxwEWxOclr9+/8OD1Y4hT0e1a42JzktCmTZD2ghplyb0VRbJDouNgyxZwqTD+dXtNKW7huekZuAT8XAYaIg3FppS3ccFhoS4gq6k8DlKqA8Q+AiEh0XGw4LDQnyrceLLbmothTIqR5XhRnxr0wHde673Zmj/WB/958mAVy89XJExTtmWzR++4t2KUPL3MYjtmj87bhj8eTXytwxQhCFYxNAIpeEIBHGhX0kStL4PbuuETL5x22hKR1LL57c8zCyDexShnfQ48ErbBazqZm5cBH6SJRHImTpqMSM/KAaP/BW2Cx9Iu+QM4fHTknZwdE4jP6iypg2C9Smz4H1pSjeetomjrc/pL+tLOSdOlANknhqm8xfVGJGfvbCE42Q6LjYLl73OYL1r8OfvoBdaXyT0G+pLdXPsxIlyDuZrBCnfRjobmOc23u7O80JeCZu9BhZ7AG3moOomk/mZW6Vqn7m/yEIz7zv5ugVutmb50rONm/q1AmfKdZ8sDGvsqQqMSM/xjCUpTXAZqJ0N7xO/KbKguCw0JAzFdin8UqYBEH32ux/DlDNFy/2kXaN1k1DTbDvzFRNquTfBJae47XRTBuIasG4HyxGf1FlnQTqXgFdNYz6c3SH+y5BC7NaHWeSUtLb6TNWEG0TR9aajGHXN3oMoVmOFPjriTwTzu4nqbc1yWHh7eUcejyxR5xZ39JVP3PyGHnOFHO/N8dT6s33X1uq/d8Ubz14httEyoHzr7k+xGg4LDQkwl9AoxZywx28DCXiKItJPP9BlQ05cQGoCN6zDNic5LRkkMFWe2GEy9VwtjJIdFxs0EJXuKVjY8aEfHz4mXd37o17e/YN8vL/vWtr1rFvb95UxcWRUDAwYAMBAQKpZ2fOfSsrVhn+/udi19e15qurTZp2duxFysqPnYKCH0DJyYmHfX36Ffr67+tZWbLJR0eOC/Dw++ytrUFn1NSz/aKiX+qvr0W/nJwj96SkU5ZycuRbwMCbwre3dRz9/eGuk5M9aiYmTFo2NmxBPz9+Avf39U/MzINcNDRo9KWlUTTl5dEI8fH5k3Fx4nPY2KtTMTFiPxUVKgwEBAhSx8eVZSMjRl7Dw50oGBgwoZaWNw8FBQq1mpovCQcHDjYSEiSbgIAbPeLi3ybr681pJydOzbKyf591deobCQkSnoODHXQsLFguGho0LRsbNrJubtzuWlq0+6CgW/ZSUqRNOzt2YdbWt86zs317KSlSPuPj3XEvL16XhIQT9VNTpmjR0bkAAAAALO3twWAgIEAf/PzjyLGxee1bW7a+amrURsvLjdm+vmdLOTly3kpKlNRMTJjoWFiwSs/PhWvQ0Lsq7+/F5aqqTxb7++3FQ0OG101NmlUzM2aUhYURz0VFihD5+ekGAgIEgX9//vBQUKBEPDx4up+fJeOoqEvzUVGi/qOjXcBAQICKj48FrZKSP7ydnSFIODhwBPX18d+8vGPBtrZ3ddrar2MhIUIwEBAgGv//5Q7z8/1t0tK/TM3NgRQMDBg1ExMmL+zsw+FfX76il5c1zEREiDkXFy5XxMST8qenVYJ+fvxHPT16rGRkyOddXborGRkylXNz5qBgYMCYgYEZ0U9Pnn/c3KNmIiJEfioqVKuQkDuDiIgLykZGjCnu7sfTuLhrPBQUKHne3qfiXl68HQsLFnbb26074ODbVjIyZE46OnQeCgoU20lJkgoGBgxsJCRI5FxcuF3Cwp9u09O976ysQ6ZiYsSokZE5pJWVMTfk5NOLeXnyMufn1UPIyItZNzdut21t2oyNjQFk1dWx0k5OnOCpqUm0bGzY+lZWrAf09PMl6urPr2Vlyo56evTprq5HGAgIENW6um+IeHjwbyUlSnIuLlwkHBw48aamV8e0tHNRxsaXI+joy3zd3aGcdHToIR8fPt1LS5bcvb1hhouLDYWKig+QcHDgQj4+fMS1tXGqZmbM2EhIkAUDAwYB9vb3Eg4OHKNhYcJfNTVq+VdXrtC5uWmRhoYXWMHBmScdHTq5np4nOOHh2RP4+OuzmJgrMxERIrtpadJw2dmpiY6OB6eUlDO2m5stIh4ePJKHhxUg6enJSc7Oh/9VVap4KChQet/fpY+MjAP4oaFZgImJCRcNDRrav79lMebm18ZCQoS4aGjQw0FBgrCZmSl3LS1aEQ8PHsuwsHv8VFSo1ru7bToWFixjY8alfHz4hHd37pl7e/aN8vL/DWtr1r1vb96xxcWRVDAwYFABAQIDZ2fOqSsrVn3+/ucZ19e1YqurTeZ2duyaysqPRYKCH53JyYlAfX36h/r67xVZWbLrR0eOyfDw+wutrUHs1NSzZ6KiX/2vr0XqnJwjv6SkU/dycuSWwMCbW7e3dcL9/eEck5M9riYmTGo2NmxaPz9+Qff39QLMzINPNDRoXKWlUfTl5dE08fH5CHFx4pPY2KtzMTFiUxUVKj8EBAgMx8eVUiMjRmXDw51eGBgwKJaWN6EFBQoPmpovtQcHDgkSEiQ2gIAbm+Li3z3r680mJydOabKyf811deqfCQkSG4ODHZ4sLFh0Gho0LhsbNi1ubtyyWlq07qCgW/tSUqT2Ozt2TdbWt2Gzs33OKSlSe+Pj3T4vL15xhIQTl1NTpvXR0bloAAAAAO3twSwgIEBg/PzjH7GxechbW7btamrUvsvLjUa+vmfZOTlyS0pKlN5MTJjUWFiw6M/PhUrQ0Ltr7+/FKqqqT+X7++0WQ0OGxU1NmtczM2ZVhYURlEVFis/5+ekQAgIEBn9//oFQUKDwPDx4RJ+fJbqoqEvjUVGi86OjXf5AQIDAj48FipKSP62dnSG8ODhwSPX18QS8vGPftrZ3wdrar3UhIUJjEBAgMP//5Rrz8/0O0tK/bc3NgUwMDBgUExMmNezswy9fX77hl5c1okREiMwXFy45xMSTV6enVfJ+fvyCPT16R2RkyKxdXbrnGRkyK3Nz5pVgYMCggYEZmE9PntHc3KN/IiJEZioqVH6QkDuriIgLg0ZGjMru7scpuLhr0xQUKDze3qd5Xl684gsLFh3b26124ODbOzIyZFY6OnROCgoUHklJktsGBgwKJCRIbFxcuOTCwp9d09O9bqysQ+9iYsSmkZE5qJWVMaTk5NM3eXnyi+fn1TLIyItDNzduWW1t2reNjQGM1dWxZE5OnNKpqUngbGzYtFZWrPr09PMH6urPJWVlyq96evSOrq5H6QgIEBi6um/VeHjwiCUlSm8uLlxyHBw4JKamV/G0tHPHxsaXUejoyyPd3aF8dHTonB8fPiFLS5bdvb1h3IuLDYaKig+FcHDgkD4+fEK1tXHEZmbMqkhIkNgDAwYF9vb3AQ4OHBJhYcKjNTVqX1dXrvm5uWnQhoYXkcHBmVgdHTonnp4nueHh2Tj4+OsTmJgrsxERIjNpadK72dmpcI6OB4mUlDOnm5stth4ePCKHhxWS6enJIM7Oh0lVVar/KChQeN/fpXqMjAOPoaFZ+ImJCYANDRoXv79l2ubm1zFCQoTGaGjQuEFBgsOZmSmwLS1adw8PHhGwsHvLVFSo/Lu7bdYWFiw6Y8alY3z4hHx37pl3e/aNe/L/DfJr1r1rb96xb8WRVMUwYFAwAQIDAWfOqWcrVn0r/ucZ/te1YterTearduyadsqPRcqCH52CyYlAyX36h3367xX6WbLrWUeOyUfw+wvwrUHsrdSzZ9SiX/2ir0Xqr5wjv5ykU/ekcuSWcsCbW8C3dcK3/eEc/ZM9rpMmTGomNmxaNj9+QT/39QL3zINPzDRoXDSlUfSl5dE05fH5CPFx4pNx2Ktz2DFiUzEVKj8VBAgMBMeVUscjRmUjw51ewxgwKBiWN6GWBQoPBZovtZoHDgkHEiQ2EoAbm4Di3z3i680m6ydOaSeyf82ydeqfdQkSGwmDHZ6DLFh0LBo0LhobNi0bbtyyblq07lqgW/ugUqT2Ujt2TTvWt2HWs33OsylSeynj3T7jL15xL4QTl4RTpvVT0blo0QAAAADtwSztIEBgIPzjH/yxecixW7btW2rUvmrLjUbLvmfZvjlySzlKlN5KTJjUTFiw6FjPhUrP0Ltr0O/FKu+qT+Wq++0W+0OGxUNNmtdNM2ZVM4URlIVFis9F+ekQ+QIEBgJ//oF/UKDwUDx4RDyfJbqfqEvjqFGi81GjXf6jQIDAQI8Fio+SP62SnSG8nThwSDj18QT1vGPfvLZ3wbbar3XaIUJjIRAgMBD/5Rr/8/0O89K/bdLNgUzNDBgUDBMmNRPswy/sX77hX5c1opdEiMxEFy45F8STV8SnVfKnfvyCfj16Rz1kyKxkXbrnXRkyKxlz5pVzYMCgYIEZmIFPntFP3KN/3CJEZiIqVH4qkDurkIgLg4hGjMpG7scp7rhr07gUKDwU3qd53l684l4LFh0L26122+DbO+AyZFYyOnROOgoUHgpJkttJBgwKBiRIbCRcuORcwp9dwtO9btOsQ++sYsSmYpE5qJGVMaSV5NM35Hnyi3nn1TLnyItDyDduWTdt2rdtjQGMjdWxZNVOnNJOqUngqWzYtGxWrPpW9PMH9OrPJeplyq9levSOeq5H6a4IEBgIum/VunjwiHglSm8lLlxyLhw4JBymV/GmtHPHtMaXUcboyyPo3aF83XTonHQfPiEfS5bdS71h3L2LDYaLig+FinDgkHA+fEI+tXHEtWbMqmZIkNhIAwYFA/b3AfYOHBIOYcKjYTVqXzVXrvlXuWnQuYYXkYbBmVjBHTonHZ4nuZ7h2Tjh+OsT+Jgrs5gRIjMRadK7admpcNmOB4mOlDOnlJsttpsePCIehxWSh+nJIOnOh0nOVar/VShQeCjfpXrfjAOPjKFZ+KGJCYCJDRoXDb9l2r/m1zHmQoTGQmjQuGhBgsNBmSmwmS1ady0PHhEPsHvLsFSo/FS7bda7Fiw6FsalY2P4hHx87pl3d/aNe3v/DfLy1r1ra96xb2+RVMXFYFAwMAIDAQHOqWdnVn0rK+cZ/v61YtfXTearq+yadnaPRcrKH52CgolAycn6h3197xX6+rLrWVmOyUdH+wvw8EHsra2zZ9TUX/2iokXqr68jv5ycU/ekpOSWcnKbW8DAdcK3t+Ec/f09rpOTTGomJmxaNjZ+QT8/9QL394NPzMxoXDQ0UfSlpdE05eX5CPHx4pNxcatz2NhiUzExKj8VFQgMBASVUsfHRmUjI51ew8MwKBgYN6GWlgoPBQUvtZqaDgkHByQ2EhIbm4CA3z3i4s0m6+tOaScnf82ysuqfdXUSGwkJHZ6Dg1h0LCw0LhoaNi0bG9yybm607lpaW/ugoKT2UlJ2TTs7t2HW1n3Os7NSeykp3T7j415xLy8Tl4SEpvVTU7lo0dEAAAAAwSzt7UBgICDjH/z8ecixsbbtW1vUvmpqjUbLy2fZvr5ySzk5lN5KSpjUTEyw6FhYhUrPz7tr0NDFKu/vT+Wqqu0W+/uGxUNDmtdNTWZVMzMRlIWFis9FRekQ+fkEBgIC/oF/f6DwUFB4RDw8Jbqfn0vjqKii81FRXf6jo4DAQEAFio+PP62SkiG8nZ1wSDg48QT19WPfvLx3wba2r3Xa2kJjISEgMBAQ5Rr///0O8/O/bdLSgUzNzRgUDAwmNRMTwy/s7L7hX181opeXiMxERC45FxeTV8TEVfKnp/yCfn56Rz09yKxkZLrnXV0yKxkZ5pVzc8CgYGAZmIGBntFPT6N/3NxEZiIiVH4qKjurkJALg4iIjMpGRscp7u5r07i4KDwUFKd53t684l5eFh0LC61229vbO+DgZFYyMnROOjoUHgoKkttJSQwKBgZIbCQkuORcXJ9dwsK9btPTQ++srMSmYmI5qJGRMaSVldM35OTyi3l51TLn54tDyMhuWTc32rdtbQGMjY2xZNXVnNJOTkngqanYtGxsrPpWVvMH9PTPJerqyq9lZfSOenpH6a6uEBgICG/VurrwiHh4Sm8lJVxyLi44JBwcV/GmpnPHtLSXUcbGyyPo6KF83d3onHR0PiEfH5bdS0th3L29DYaLiw+FiorgkHBwfEI+PnHEtbXMqmZmkNhISAYFAwP3Afb2HBIODsKjYWFqXzU1rvlXV2nQubkXkYaGmVjBwTonHR0nuZ6e2Tjh4esT+Pgrs5iYIjMREdK7aWmpcNnZB4mOjjOnlJQttpubPCIeHhWSh4fJIOnph0nOzqr/VVVQeCgopXrf3wOPjIxZ+KGhCYCJiRoXDQ1l2r+/1zHm5oTGQkLQuGhogsNBQSmwmZlady0tHhEPD3vLsLCo/FRUbda7uyw6FhZSUlJSCQkJCWpqamrV1dXVMDAwMDY2NjalpaWlODg4OL+/v79AQEBAo6Ojo56enp6BgYGB8/Pz89fX19f7+/v7fHx8fOPj4+M5OTk5goKCgpubm5svLy8v/////4eHh4c0NDQ0jo6OjkNDQ0NERERExMTExN7e3t7p6enpy8vLy1RUVFR7e3t7lJSUlDIyMjKmpqamwsLCwiMjIyM9PT097u7u7kxMTEyVlZWVCwsLC0JCQkL6+vr6w8PDw05OTk4ICAgILi4uLqGhoaFmZmZmKCgoKNnZ2dkkJCQksrKysnZ2dnZbW1tboqKioklJSUltbW1ti4uLi9HR0dElJSUlcnJycvj4+Pj29vb2ZGRkZIaGhoZoaGhomJiYmBYWFhbU1NTUpKSkpFxcXFzMzMzMXV1dXWVlZWW2tra2kpKSkmxsbGxwcHBwSEhISFBQUFD9/f397e3t7bm5ubna2traXl5eXhUVFRVGRkZGV1dXV6enp6eNjY2NnZ2dnYSEhISQkJCQ2NjY2Kurq6sAAAAAjIyMjLy8vLzT09PTCgoKCvf39/fk5OTkWFhYWAUFBQW4uLi4s7Ozs0VFRUUGBgYG0NDQ0CwsLCweHh4ej4+Pj8rKyso/Pz8/Dw8PDwICAgLBwcHBr6+vr729vb0DAwMDAQEBARMTExOKioqKa2trazo6OjqRkZGREREREUFBQUFPT09PZ2dnZ9zc3Nzq6urql5eXl/Ly8vLPz8/Pzs7OzvDw8PC0tLS05ubm5nNzc3OWlpaWrKysrHR0dHQiIiIi5+fn562tra01NTU1hYWFheLi4uL5+fn5Nzc3N+jo6OgcHBwcdXV1dd/f399ubm5uR0dHR/Hx8fEaGhoacXFxcR0dHR0pKSkpxcXFxYmJiYlvb29vt7e3t2JiYmIODg4OqqqqqhgYGBi+vr6+GxsbG/z8/PxWVlZWPj4+PktLS0vGxsbG0tLS0nl5eXkgICAgmpqamtvb29vAwMDA/v7+/nh4eHjNzc3NWlpaWvT09PQfHx8f3d3d3aioqKgzMzMziIiIiAcHBwfHx8fHMTExMbGxsbESEhISEBAQEFlZWVknJycngICAgOzs7OxfX19fYGBgYFFRUVF/f39/qampqRkZGRm1tbW1SkpKSg0NDQ0tLS0t5eXl5Xp6enqfn5+fk5OTk8nJycmcnJyc7+/v76CgoKDg4ODgOzs7O01NTU2urq6uKioqKvX19fWwsLCwyMjIyOvr6+u7u7u7PDw8PIODg4NTU1NTmZmZmWFhYWEXFxcXKysrKwQEBAR+fn5+urq6und3d3fW1tbWJiYmJuHh4eFpaWlpFBQUFGNjY2NVVVVVISEhIQwMDAx9fX19EQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AAAAAAAAAAAASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAAAAAAD/////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAOg9AADSPQAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAFAAAAAQAAAPJDAAACAAAABgAAAAMAAAABAAAABAAAAAcAAAABAAAAAgAAAPgyAAAFAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAD1vAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeDMAAAUAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAAAmE4AAAAEAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAr/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAtPmZzX2NvdW50ID09IDEAanNlbXUuYwBpbml0X3ZtX2ZzAHAtPmRyaXZlX2NvdW50ID09IDEAaW5pdF92bV9kcml2ZQBwLT5ldGhfY291bnQgPT0gMQBpbml0X3ZtAHNoaWZ0ID49IDAALi9zb2Z0ZnBfdGVtcGxhdGUuaABub3JtYWxpemVfc2YzMgBub3JtYWxpemUyX3NmMzIAbm9ybWFsaXplX3NmNjQAbm9ybWFsaXplMl9zZjY0AGExIDwgYgBkaXZyZW1fdTY0AHZpcnRpb18lMDR4AHdyaXRlX3NpemUgPj0gMQB2aXJ0aW8uYwB2aXJ0aW9fYmxvY2tfcmVjdl9yZXF1ZXN0AHZpcnRpb190YWJsZXQAdmlydGlvX21vdXNlAHZpcnRpb19rZXlib2FyZAB3d2RkZGRkZHcAd3cAd3N3d3cAUXcAd3NzdwBRAHdzd3d3dwB3AHMAd2QAZFF3d3dkZGRkZGRkZGRkZGRkZGQAd3d3d3dkZGRkZAB3ZHcAd2J3ZGR3cwBiAHdiZGR3cwBiZGR3cwB3d3MAd3N3dwB3c3dzAHdzdwB3cwA5UDIwMDAuTAB3d3NzdwBoAHd3aAA5cDogdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlkPSVkCgBidWYgKyAxIDw9IGJ1Zl9lbmQAbWFyc2hhbGwAYnVmICsgMiA8PSBidWZfZW5kAGJ1ZiArIDQgPD0gYnVmX2VuZABidWYgKyA4IDw9IGJ1Zl9lbmQAbGVuIDw9IDY1NTM1AGJ1ZiArIDIgKyBsZW4gPD0gYnVmX2VuZABidWYgKyAxMyA8PSBidWZfZW5kAG4tPnR5cGUgPT0gRlRfRElSAGZzX25ldC5jAGlub2RlX2Rpcl9hZGQALi4Abi0+cmVmY291bnQgPj0gMQBpbm9kZV9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA9PSAwAGZsdXNoX2RpcgBuLT5yZWZjb3VudCA9PSAwAGlub2RlX2ZyZWUAbi0+b3Blbl9jb3VudCA9PSAwAGZzLT5mc19ibG9ja3MgPj0gMABmcy0+aW5vZGVfY2FjaGVfc2l6ZSA+PSAwAG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0FESU5HAGZzX3dnZXRfc2V0X2Vycm9yAGxpc3RfZW1wdHkoJm4tPnUuZGlyLmRlX2xpc3QpAGZzLT5pbm9kZV9jb3VudCA+PSAwAGJ1LT5yZWZfY291bnQgPj0gMQBmc19iYXNlX3VybF9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA+PSAwAGlub2RlX2RpcmVudF9kZWxldGVfbm9fZGVjcmVmAHhocgAhZnMtPmZzX2F0dGFjaChmcywgJnJvb3RfZmQsICZxaWQsIHVpZCwgIiIsICIiKQBmc19jbWRfeGhyAG4tPnR5cGUgPT0gRlRfUkVHICYmIG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0NBTABzZXRfYmFzZV91cmwAcmVzZXRfYmFzZV91cmwAZnNfaXNfbmV0KGZzMSkAZnNfbmV0X3Jlc2V0X2Jhc2VfdXJsAHNldF91cmwAZXhwb3J0X2ZpbGUAcGJrZGYyAHNldF9pbXBvcnRfZGlyAHVua25vd24gY29tbWFuZDogJyVzJwoAZnNfd3JpdGUAZnNfdHJ1bmNhdGUAZnNfbmV0X3NldF91cmwAZnNfbmV0X3NldF9iYXNlX3VybABuLT5vcGVuX2NvdW50ID49IDEAaW5vZGVfZGVjX29wZW4Abi0+dS5yZWcuc3RhdGUgPT0gUkVHX1NUQVRFX1VOTE9BREVEAGZzX29wZW5fd2dldABuLT51LnJlZy5zdGF0ZSA9PSBSRUdfU1RBVEVfTE9BREVEAGZzX3RyaW1fY2FjaGUAZnNfd2dldF9zZXRfbG9hZGVkAGxpc3RfZW1wdHkoJmZzLT5pbm9kZV9jYWNoZV9saXN0KQBmc19tZW1fZW5kAC90bXAAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAwLCAiIiwgIiIpAGZzX2NyZWF0ZV9jbWQALmZzY21kACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCByb290X2ZkLCBGU0NNRF9OQU1FLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjY2LCAwKQAhZnMtPmZzX2F0dGFjaChmcywgJnMtPnJvb3RfZmQsICZxaWQsIDAsICIiLCAiIikAZnNfaW5pdGlhbF9zeW5jAGhlYWQ/bm9jYWNoZT0lbGxkAC5oZWFkACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBoZWFkX2ZkLCAiLmhlYWQiLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjQ0LCAwKQBjb3VsZCBub3QgbG9hZCAnaGVhZCcgZmlsZSAoSFRUUCBlcnJvcj0lZCkAaW52YWxpZCBoZWFkIHZlcnNpb24AUm9vdElEAGV4cGVjdGVkIFJvb3RJRCB0YWcARlNNYXhTaXplAGZzX25ldF9zZXRfZnNfbWF4X3NpemUAZmlsZXMALwAuZmlsZWxpc3QudHh0ACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBuZXdfZmlsZWxpc3RfZmQsICIuZmlsZWxpc3QudHh0IiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDY0NCwgMCkAaGVhZF9sb2FkZWQAY291bGQgbm90IGxvYWQgZmlsZSBsaXN0IChIVFRQIGVycm9yPSVkKQBlcnJvciB3aGlsZSBwYXJzaW5nIGZpbGUgbGlzdAAucHJlbG9hZDIvcHJlbG9hZC50eHQALnByZWxvYWQAaW52YWxpZCBmaWxlbmFtZQoAaW52YWxpZCBwcmVsb2FkIGZpbGU6ICclcycKAGZpbGVuYW1lIHdpdGhvdXQgdGFyZ2V0OiAlcwoAaW52YWxpZCBzaXplCgBpbnZhbGlkIGZpbGUgaWQKAGludmFsaWQgbW9kZQoAaW52YWxpZCB1aWQKAGludmFsaWQgZ2lkCgBpbnZhbGlkIG1ham9yCgBpbnZhbGlkIG1pbm9yCgBpbnZhbGlkIG10aW1lCgBpbnZhbGlkIHN5bWxpbmsgbmFtZQoARXJyb3I6IABmc19pc19uZXQoZnMpAGZzX25ldF9zZXRfcHdkAC5mc2NtZF9wd2QAIWZzLT5mc19jcmVhdGUoZnMsICZxaWQsIHJvb3RfZmQsICIuZnNjbWRfcHdkIiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDYwMCwgMCkAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAxMDAwLCAiIiwgIiIpAGZzX2ltcG9ydF9maWxlAFBPU1QAR0VUAHNhbHRfbGVuIDw9IFNBTFRfTEVOX01BWABmc193Z2V0LmMAcGJrZGYyX2htYWNfc2hhMjU2APui6QElMDE2bGx4AAoKAFZlcnNpb24AaHR0cDoAaHR0cHM6AGZpbGU6AGlycV9udW0gPCA0AHBjaS5jAHBjaV9kZXZpY2VfZ2V0X2lycQBiYXJfbnVtIDwgUENJX05VTV9SRUdJT05TAHBjaV9yZWdpc3Rlcl9iYXIAKHNpemUgJiAoc2l6ZSAtIDEpKSA9PSAwAHNpemUgPj0gNAByLT5zaXplID09IDAAdW5leHBlY3RlZCBlbmQgb2YgZmlsZQBJbnZhbGlkIHByb3BlcnR5IG5hbWUAJzonIGV4cGVjdGVkAGV4cGVjdGluZyAnLCcgb3IgJ30nAGV4cGVjdGluZyAnLCcgb3IgJ10nAG51bGwAdHJ1ZQBmYWxzZQB1bmtub3duIGlkZW50aWZpZXI6ICclcycAdW5leHBlY3RlZCBjaGFyYWN0ZXIAdW50ZXJtaW5hdGVkIHN0cmluZwBpbnZhbGlnIGhleCBkaWdpdAB1bmtub3duIGVzY2FwZSBjb2RlAHN0cmluZyB0b28gbG9uZwB1bmV4cGVjdGVkIGNoYXJhY3RlcnMgYXQgdGhlIGVuZABDb3VsZCBub3QgbG9hZCBibG9jayBkZXZpY2UgZmlsZSAoZXJyPSVkKQoAYmxvY2tfc2l6ZQBpbnZhbGlkIGJsb2NrX3NpemUKAG5fYmxvY2sAaW52YWxpZCBuX2Jsb2NrCgBwcmVmZXRjaF9ncm91cF9sZW4AcHJlZmV0Y2hfZ3JvdXBfbGVuIGlzIHRvbyBsYXJnZQBwcmVmZXRjaABleHBlY3RpbmcgYW4gYXJyYXkKAGV4cGVjdGluZyBhbiBpbnRlZ2VyCgAlc2JsayUwOXUuYmluACVzZ3JwJTA5dS5iaW4AQ291bGQgbm90IGxvYWQgZ3JvdXAgJXUKAHNpemUgPT0gYmxvY2tfYnl0ZXMgKiByZXEtPm5fYmxvY2tfbnVtAGJsb2NrX25ldC5jAGJmX3ByZWZldGNoX2dyb3VwX29ubG9hZABiLT5zdGF0ZSA9PSBDQkxPQ0tfTE9BRElORwBiZl91cGRhdGVfYmxvY2sAQ291bGQgbm90IGxvYWQgYmxvY2sgJXUKAHNpemUgPT0gYmYtPmJsb2NrX3NpemUgKiA1MTIAYmZfcmVhZF9vbmxvYWQAcy0+bl9waHlzX21lbV9yYW5nZSA8IFBIWVNfTUVNX1JBTkdFX01BWABpb21lbS5jAHJlZ2lzdGVyX3JhbV9lbnRyeQAoc2l6ZSAmIChERVZSQU1fUEFHRV9TSVpFIC0gMSkpID09IDAgJiYgc2l6ZSAhPSAwAENvdWxkIG5vdCBhbGxvY2F0ZSBWTSBtZW1vcnkKAGNwdV9yZWdpc3Rlcl9kZXZpY2UAc2l6ZSA8PSAweGZmZmZmZmZmAHJpc2N2MzIscmlzY3Y2NCxyaXNjdjEyOAByaXNjdjMyAHJpc2N2NjQAcmlzY3YxMjgAdW5zdXBwb3J0ZWQgbWFjaGluZTogJXMKAHVuc3VwcG9ydGVkIG1heF94bGVuPSVkCgBzaW1wbGVmYgB1bnN1cHBvcnRlZCBkaXNwbGF5IGRldmljZTogJXMKAHZpcnRpbwB1bnN1cHBvcnRlZCBpbnB1dCBkZXZpY2U6ICVzCgBObyBiaW9zIGZvdW5kAEJJT1MgdG9vIGJpZwoAa2VybmVsIHRvbyBiaWcAaW5pdHJkIHRvbyBiaWcAI2FkZHJlc3MtY2VsbHMAI3NpemUtY2VsbHMAY29tcGF0aWJsZQB1Y2JiYXIscmlzY3ZlbXUtYmFyX2RldgBtb2RlbAB1Y2JiYXIscmlzY3ZlbXUtYmFyZQBjcHVzAHRpbWViYXNlLWZyZXF1ZW5jeQBjcHUAZGV2aWNlX3R5cGUAcmVnAHN0YXR1cwBva2F5AHJpc2N2AHJ2JWQAcmlzY3YsaXNhAHJpc2N2LHN2MzIAcmlzY3Ysc3Y0OABtbXUtdHlwZQBjbG9jay1mcmVxdWVuY3kAaW50ZXJydXB0LWNvbnRyb2xsZXIAI2ludGVycnVwdC1jZWxscwByaXNjdixjcHUtaW50YwBwaGFuZGxlAG1lbW9yeQBodGlmAHVjYixodGlmMAB1Y2JiYXIscmlzY3ZlbXUtYmFyLXNvYwBzaW1wbGUtYnVzAHJhbmdlcwBjbGludAByaXNjdixjbGludDAAaW50ZXJydXB0cy1leHRlbmRlZABwbGljAHJpc2N2LHBsaWMwAHJpc2N2LG5kZXYAdmlydGlvLG1taW8AZnJhbWVidWZmZXIAc2ltcGxlLWZyYW1lYnVmZmVyAHN0cmlkZQBmb3JtYXQAYThyOGc4YjgAY2hvc2VuAGJvb3RhcmdzAHJpc2N2LGtlcm5lbC1zdGFydAByaXNjdixrZXJuZWwtZW5kAGxpbnV4LGluaXRyZC1zdGFydABsaW51eCxpbml0cmQtZW5kAHMtPm9wZW5fbm9kZV9jb3VudCA9PSAwAHJpc2N2X21hY2hpbmUuYwBmZHRfb3V0cHV0ACVzQCVsbHgAc2l6ZV9sb2cyID09IDIAaHRpZl93cml0ZQAKUG93ZXIgb2ZmLgBIVElGOiB1bnN1cHBvcnRlZCB0b2hvc3Q9MHglMDE2bGx4CgBodGlmX3JlYWQAcGxpY193cml0ZQBwbGljX3JlYWQAY2xpbnRfd3JpdGUAY2xpbnRfcmVhZABleHBlY3RpbmcgJyVzJyBwcm9wZXJ0eQoAJXM6IGludGVnZXIgZXhwZWN0ZWQKAEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlsZQoAZXJyb3I6ICVzCgB2ZXJzaW9uAFRoZSBlbXVsYXRvciBpcyB0b28gb2xkIHRvIHJ1biB0aGlzIFZNOiBwbGVhc2UgdXBncmFkZQoAVGhlIFZNIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gb2xkIGZvciB0aGlzIGVtdWxhdG9yIHZlcnNpb246IHBsZWFzZSB1cGdyYWRlIHRoZSBWTSBjb25maWd1cmF0aW9uIGZpbGUKAG1hY2hpbmUAJXM6IHN0cmluZyBleHBlY3RlZAoAVW5rbm93biBtYWNoaW5lIG5hbWU6ICVzCgBtZW1vcnlfc2l6ZQBiaW9zAGtlcm5lbABpbml0cmQAY21kbGluZQBUWgBVVEMlYyUwMmQ6JTAyZABkcml2ZSVkAFRvbyBtYW55IGRyaXZlcwoAZmlsZQBkZXZpY2UAZnMlZABUb28gbWFueSBmaWxlc3lzdGVtcwoAdGFnAC9kZXYvcm9vdAAvZGV2L3Jvb3QlZABldGglZABUb28gbWFueSBldGhlcm5ldCBpbnRlcmZhY2VzCgBkcml2ZXIAdGFwAGlmbmFtZQBkaXNwbGF5MAB3aWR0aABoZWlnaHQAdmdhX2Jpb3MAaW5wdXRfZGV2aWNlAGFjY2VsAG5vbmUAYXV0bwB1bnN1cHBvcnRlZCAnYWNjZWwnIGNvbmZpZzogJXMKAHJ0Y19sb2NhbF90aW1lACVzOiBib29sZWFuIGV4cGVjdGVkCgAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAG5hbgBOQU4ALgAAAQIEBwMGBQ==";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=(function(){Module["dynCall_vi"](func,arg)})}else{browserIterationFunc=(function(){Module["dynCall_v"](func)})}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}}),runIter:(function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}if(Module["postMainLoop"])Module["postMainLoop"]()})},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject==="undefined"){console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Module["preloadedImages"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module["preloadedAudios"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module["preloadedAudios"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(function(){});canvas.exitFullscreen=canvas.exitFullscreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?(function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null)||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullscreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullscreen()}}),requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){err("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");Browser.requestFullScreen=(function(lockPointer,resizeCanvas,vrDevice){return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)});return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),asyncLoad:(function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";Module["readAsync"](url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(dep)addRunDependency(dep)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}),wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:(function(){var handle=Browser.nextWgetRequestHandle;Browser.nextWgetRequestHandle++;return handle})};function _emscripten_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.");Module["requestFullScreen"]=Module["requestFullscreen"];Browser.requestFullScreen(lockPointer,resizeCanvas,vrDevice)};Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas,vrDevice){Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==="boolean"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,"base64")}catch(_){buf=new Buffer(s,"base64")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16){var sp=stackSave();try{return Module["dynCall_iiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_iiiiiiii":invoke_iiiiiiii,"invoke_iiiiiiiii":invoke_iiiiiiiii,"invoke_iiiiiiiiiiiiiiiii":invoke_iiiiiiiiiiiiiiiii,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiii":invoke_viiiiii,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"__exit":__exit,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_get_now":_emscripten_get_now,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_emscripten_set_main_loop":_emscripten_set_main_loop,"_emscripten_set_main_loop_timing":_emscripten_set_main_loop_timing,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_get_new_handle":_file_buffer_get_new_handle,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"_tzset":_tzset,"flush_NO_FILESYSTEM":flush_NO_FILESYSTEM,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM
+var asm=(/** @suppress {uselessCode} */ function(global,env,buffer) {
+"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iii;var Y=env.invoke_iiii;var Z=env.invoke_iiiii;var _=env.invoke_iiiiii;var $=env.invoke_iiiiiii;var aa=env.invoke_iiiiiiii;var ba=env.invoke_iiiiiiiii;var ca=env.invoke_iiiiiiiiiiiiiiiii;var da=env.invoke_vi;var ea=env.invoke_vii;var fa=env.invoke_viii;var ga=env.invoke_viiii;var ha=env.invoke_viiiii;var ia=env.invoke_viiiiii;var ja=env.___assert_fail;var ka=env.___buildEnvironment;var la=env.___setErrNo;var ma=env.___syscall140;var na=env.___syscall146;var oa=env.___syscall54;var pa=env.___syscall6;var qa=env.__exit;var ra=env._abort;var sa=env._clock_gettime;var ta=env._console_get_size;var ua=env._console_write;var va=env._emscripten_async_call;var wa=env._emscripten_async_wget3_data;var xa=env._emscripten_get_now;var ya=env._emscripten_get_now_is_monotonic;var za=env._emscripten_memcpy_big;var Aa=env._emscripten_random;var Ba=env._emscripten_set_main_loop;var Ca=env._emscripten_set_main_loop_timing;var Da=env._exit;var Ea=env._fb_refresh;var Fa=env._file_buffer_get_new_handle;var Ga=env._file_buffer_init;var Ha=env._file_buffer_read;var Ia=env._file_buffer_reset;var Ja=env._file_buffer_resize;var Ka=env._file_buffer_set;var La=env._file_buffer_write;var Ma=env._fs_export_file;var Na=env._fs_wget_update_downloading;var Oa=env._gettimeofday;var Pa=env._localtime_r;var Qa=env._net_recv_packet;var Ra=env._time;var Sa=env._tzset;var Ta=env.flush_NO_FILESYSTEM;var Ua=0.0;
+// EMSCRIPTEN_START_FUNCS
+function ib(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function jb(){return l|0}function kb(a){a=a|0;l=a}function lb(a,b){a=a|0;b=b|0;l=a;m=b}function mb(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function nb(a){a=a|0;y=a}function ob(){return y|0}function pb(b){b=b|0;var d=0,e=0;d=c[6958]|0;if(d>>>0>=1024)return;e=c[6959]|0;a[19088+e>>0]=b;b=e+1|0;c[6959]=(b|0)==1024?0:b;c[6958]=d+1;return}function qb(a,b){a=a|0;b=b|0;var d=0;d=c[6960]|0;if(!d)return;eb[c[(c[d>>2]|0)+32>>2]&15](d,a,b&65535);return}function rb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[6960]|0;if(!e)return;Va[c[(c[e>>2]|0)+24>>2]&15](e)|0;g=c[6961]|0;h=g+-1|0;e=c[6962]|0;f=e+-1|0;a=(((h|0)>(a|0)?a:h)<<15|0)/(g|0)|0;e=(((f|0)>(b|0)?b:f)<<15|0)/(e|0)|0;c[6963]=a;c[6964]=e;c[6965]=d;b=c[6960]|0;gb[c[(c[b>>2]|0)+28>>2]&7](b,a,e,0,d);return}function sb(a){a=a|0;var b=0;b=c[6960]|0;if(!b)return;gb[c[(c[b>>2]|0)+28>>2]&7](b,c[6963]|0,c[6964]|0,a,c[6965]|0);return}function tb(a,b){a=a|0;b=b|0;var d=0;d=c[(c[6960]|0)+4>>2]|0;if(!d)return;eb[c[d+24>>2]&15](d,a,b);return}function ub(a){a=a|0;var b=0;c[6966]=a;b=c[6960]|0;if(!b)return;b=c[b+4>>2]|0;if(!b)return;db[c[b+28>>2]&15](b,a);return}function vb(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=lf(20)|0;c[i+4>>2]=b;c[i+8>>2]=Ah(d)|0;if(e|0)c[i+16>>2]=Ah(e)|0;c[6961]=f;c[6962]=g;c[i+12>>2]=h;h=lf(248)|0;c[i>>2]=h;zg(h);qg(c[i>>2]|0,a,4,i);return}function wb(a){a=a|0;var b=0,d=0,e=0;e=c[a>>2]|0;b=c[e+164>>2]|0;if((b|0)>0){if((b|0)!=1)ja(13668,13685,207,13693);d=Ld(c[e+108>>2]|0,5,a)|0;c[e+112>>2]=d;b=c[a+16>>2]|0;if(!b)return;Sd(d,b);return}b=c[e+96>>2]|0;if((b|0)<=0){Ab(a);return}if((b|0)!=1)ja(13704,13685,224,13724);c[e+56>>2]=Se(c[e+52>>2]|0,131072,6,a)|0;return}function xb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+144|0;d=h;e=h+132|0;f=h+128|0;g=a+8|0;b=c[g>>2]|0;if(b|0?Jc(b)|0:0){b=Kc(c[g>>2]|0)|0;i=c[a+12>>2]|0;b=Xa[c[i+8>>2]&31](c[i>>2]|0,d,(b|0)<128?b:128)|0;if((b|0)>0)Lc(c[g>>2]|0,d,b)|0;if(c[6967]|0){ta(e|0,f|0);Mc(c[g>>2]|0,c[e>>2]|0,c[f>>2]|0);c[6967]=0}}b=c[a+16>>2]|0;if(b|0)eb[c[b+24>>2]&15](b,1,0);if(!(Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0)){b=0;while(1){db[c[(c[a>>2]|0)+20>>2]&15](a,2e5);d=Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0;if(b>>>0>13|(d|0)!=0)break;else b=b+1|0}if(!d){va(7,a|0,0);l=h;return}}va(7,a|0,10);l=h;return}function yb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[a+8>>2]|0;Ea(b|0,(c[a+12>>2]|0)+(N(h,e)|0)+(d<<2)|0,d|0,e|0,f|0,g|0,h|0);return}function zb(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;d=c[b+96>>2]|0;if((d|0)<=0){Ab(a);return}if((d|0)!=1)ja(13704,13685,224,13724);c[b+56>>2]=Se(c[b+52>>2]|0,131072,6,a)|0;return}function Ab(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b>>2]|0;c[g+24>>2]=1;d=c[b+4>>2]<<20;h=g+16|0;c[h>>2]=d;c[h+4>>2]=((d|0)<0)<<31>>31;h=b+8|0;d=c[h>>2]|0;if(d|0?a[d>>0]|0:0)wg(c[b>>2]|0,d);e=c[6961]|0;d=c[6962]|0;if((e|0)>0&(d|0)>0){f=g+32|0;if(!(c[f>>2]|0)){c[f>>2]=Ah(17494)|0;e=c[6961]|0;d=c[6962]|0}c[g+36>>2]=e;c[g+40>>2]=d}else{c[6967]=1;f=lf(12)|0;c[f+4>>2]=3;c[f+8>>2]=5;c[g+44>>2]=f}e=g+180|0;d=c[e>>2]|0;do if((d|0)>0)if(c[b+12>>2]|0)if((d|0)==1){f=lf(32)|0;a[f>>0]=2;a[f+1>>0]=~~(+Aa()*256.0);a[f+2>>0]=~~(+Aa()*256.0);a[f+3>>0]=~~(+Aa()*256.0);a[f+4>>0]=~~(+Aa()*256.0);a[f+5>>0]=~~(+Aa()*256.0);c[f+8>>2]=4;c[f+12>>2]=0;c[g+176>>2]=f;break}else ja(13738,13685,269,13756);else{d=0;do{Bg(c[g+168+(d*12|0)+4>>2]|0);Bg(c[g+168+(d*12|0)>>2]|0);d=d+1|0}while((d|0)<(c[e>>2]|0));c[e>>2]=0;break}while(0);f=yg(g)|0;c[6960]=f;xg(c[b>>2]|0);d=c[f+4>>2]|0;if(d|0)db[c[d+28>>2]&15](d,c[6966]|0);Bg(c[b>>2]|0);Bg(c[h>>2]|0);d=b+16|0;e=c[d>>2]|0;if(!e){Bg(b);va(7,f|0,0);return}si(e|0,0,Pg(e)|0)|0;Bg(c[d>>2]|0);Bg(b);va(7,f|0,0);return}function Bb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[6958]|0;a=(e|0)>(d|0)?d:e;c[6958]=e-a;if(!a){b=0;return b|0}e=0;d=c[6968]|0;do{f=1024-d|0;f=(a|0)<(f|0)?a:f;ri(b+e|0,19088+d|0,f|0)|0;a=a-f|0;e=f+e|0;f=f+d|0;d=(f|0)==1024?0:f}while((a|0)!=0);c[6968]=d;f=e;return f|0}function Cb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=(a&2147483647)>>>0<(b&2147483647)>>>0;i=f?a:b;b=f?b:a;f=b>>>31;k=i>>>31;g=b>>>23;j=i>>>23&255;a=b<<3&67108856;h=i<<3&67108856;switch((g&255)<<24>>24){case -1:{if(!a){if((f|0)==(k|0)|(j|0)!=255){e=b;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(b&4194304|0?(i&8388607|0)==0|(i&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{i=a;g=1;break}default:{i=a|67108864;g=g&255}}b=(j|0)==0;a=b?h:h|67108864;b=g-(b?1:j)|0;do if(b)if((b|0)>31){a=(a|0)!=0&1;break}else{a=a>>>b|((1<<b)+134217727&a|0)!=0;break}while(0);if((f|0)==(k|0))a=a+i|0;else{a=i-a|0;f=(a|0)==0?(d|0)==2&1:f}b=Q(a|0)|0;if(!b)ja(13764,13775,183,13795);e=Db(f,g+4+(1-b)|0,a<<b+-1,d,e)|0;return e|0}function Db(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;switch(e|0){case 4:case 0:{j=64;break}case 1:{j=0;break}default:j=(e&1|0)==(a|0)?0:127}if((b|0)<1){h=(b|0)!=0|(j+d|0)>-1;b=1-b|0;do if(b)if((b|0)>31){d=(d|0)!=0&1;break}else{d=d>>>b|((1<<b)+-1&d|0)!=0;break}while(0);g=d&127;if(h&(g|0)!=0){i=c[f>>2]|2;c[f>>2]=i;h=d;b=1;d=i;i=14}else{b=1;i=12}}else{g=d&127;i=12}if((i|0)==12)if(!g)g=0;else{h=d;d=c[f>>2]|0;i=14}if((i|0)==14){c[f>>2]=d|1;d=h}d=(d+j|0)>>>7;d=(e|0)==0&(g|0)==64?d&33554430:d;g=(d>>>24)+b|0;if(d>>>0<8388608){f=0;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}b=(j|0)==0;if((g|0)<=254){f=g;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}c[f>>2]=c[f>>2]|5;f=b?254:255;j=b?8388607:0;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}function Eb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Cb(a,b^-2147483648,c,d)|0}function Fb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;m=b^a;n=m>>>31;h=a>>>23&255;g=b>>>23&255;i=a&8388607;l=b&8388607;j=(h|0)==255;k=(g|0)==255;if(j|k){f=(i|0)!=0;if(!((a&2139095040|0)==2139095040&f)?(l|0)==0|(b&2139095040|0)!=2139095040:0){if(!(j&(g|l|0)==0)?!((h|i|0)==0&k):0){e=m&-2147483648|2139095040;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(!((a&2143289344|0)==2139095040&f)?(l|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}do if(!h){if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break}e=m&-2147483648;return e|0}else a=i|8388608;while(0);do if(!g){if(l|0){g=Q(l|0)|0;f=l<<g+-8;g=9-g|0;break}e=m&-2147483648;return e|0}else f=l|8388608;while(0);f=ki(f<<8|0,0,a<<7|0,0)|0;f=(f|0)!=0|y;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);e=Db(n,h+-126+g+(1-a)|0,f<<a+-1,d,e)|0;return e|0}function Gb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=d>>>31;o=b^a;j=o>>>31;i=a>>>23&255;h=b>>>23&255;g=d>>>23&255;k=a&8388607;q=b&8388607;r=d&8388607;l=(i|0)==255;m=(h|0)==255;p=l|m;n=(g|0)==255;if(p|n){g=(k|0)!=0;if((!((a&2139095040|0)==2139095040&g)?(q|0)==0|(b&2139095040|0)!=2139095040:0)?(r|0)==0|(d&2139095040|0)!=2139095040:0){if((!(l&(h|q|0)==0)?!((i|k|0)==0&m):0)?(j|0)==(s|0)|p&n^1:0)if(n){f=d&-2147483648|2139095040;return f|0}else{f=o&-2147483648|2139095040;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}if((!((a&2143289344|0)==2139095040&g)?(q|0)==0|(b&2143289344|0)!=2139095040:0)?(r|0)==0|(d&2143289344|0)!=2139095040:0){f=2143289344;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}do if(!i)if(!k){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{i=Q(k|0)|0;b=k<<i+-8;i=9-i|0;break}else b=k|8388608;while(0);do if(!h)if(!q){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{h=Q(q|0)|0;a=q<<h+-8;h=9-h|0;break}else a=q|8388608;while(0);q=ki(a<<7|0,0,b<<7|0,0)|0;m=y;n=m>>>0<536870912;d=oi(m|0,0,1)|0;b=q<<(n&1);m=n?q>>>31|d:m;n=h+i+(n?-126:-125)|0;do if(!g){if(r|0){g=Q(r|0)|0;h=r<<g+-8;g=9-g|0;break}g=m|(b|0)!=0;t=Q(g|0)|0;a=t+-1|0;if(!t)ja(13764,13775,183,13795);f=Db(j,n-a|0,g<<a,e,f)|0;return f|0}else h=r|8388608;while(0);a=g+1|0;h=h<<6;if((n|0)>(a|0)){l=s;k=0;g=h;o=n;i=m}else{r=(n|0)!=(a|0)|m>>>0<h>>>0;l=r?j:s;k=r?b:0;g=r?m:h;j=r?s:j;o=r?a:n;i=r?h:m;b=r?0:b;a=r?n:a}h=o-a|0;a:do if((h|0)>63){a=(k|g|0)!=0&1;g=0}else{if((h|0)>32){a=h+-32|0;a=g>>>a|((1<<a)+-1&g|0)!=0;g=0;break}switch(h|0){case 0:{a=k;break a}case 32:{a=g|(k|0)!=0;g=0;break a}default:{a=g<<32-h|k>>>h|((1<<h)+-1&k|0)!=0;g=g>>>h;break a}}}while(0);if((j|0)==(l|0)){s=a+b|0;b=g+i+(s>>>0<a>>>0&1)|0;i=s}else{s=b-a|0;r=i-g+((s>>>0>b>>>0)<<31>>31)|0;b=r;i=s;j=(r|s|0)==0?(e|0)==2&1:j}if(!b){a=Q(i|0)|0;h=a+31|0;g=o-h|0;if((a+32|0)>>>0<33){a=32;t=50}else a=i<<a+-1}else{a=Q(b|0)|0;h=a+-1|0;if(!a)ja(13764,13775,201,13810);g=o-h|0;if(!h)a=b|(i|0)!=0;else t=50}if((t|0)==50)a=i>>>(33-a|0)|b<<h|(i<<h|0)!=0;f=Db(j,g,a,e,f)|0;return f|0}function Hb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=b^a;m=l>>>31;g=a>>>23&255;f=b>>>23;h=f&255;k=a&8388607;i=b&8388607;if((g|0)==255){f=(k|0)==0;if(f)if((i|0)==0|(b&2139095040|0)!=2139095040)if((h|0)==255){c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}else{e=l&-2147483648|2139095040;return e|0}else j=5;else if(f|(a&2143289344|0)!=2139095040)j=5;if((j|0)==5?(i|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}a:do switch((f&255)<<24>>24){case -1:{if(!i){e=l&-2147483648;return e|0}if(!((a&2143289344|0)==2139095040&(k|0)!=0|(b&2143289344|0)==2139095040)){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break a}f=c[e>>2]|0;if(!(g|k)){c[e>>2]=f|16;e=2143289344;return e|0}else{c[e>>2]=f|8;e=l&-2147483648|2139095040;return e|0}}default:a=i|8388608}while(0);do if(!g){if(k|0){f=Q(k|0)|0;g=9-f|0;f=k<<f+-8;break}e=l&-2147483648;return e|0}else f=k|8388608;while(0);l=a<<2;a=li(0,f|0,l|0,0)|0;l=ki(a|0,y|0,l|0,0)|0;f=fi(0,f|0,l|0,y|0)|0;a=((f|0)!=0|(y|0)!=0)&1|a;f=Q(a|0)|0;if(!f)ja(13764,13775,183,13795);e=Db(m,127-h+g+(1-f)|0,a<<f+-1,d,e)|0;return e|0}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=a>>>31;f=a>>>23&255;g=a&8388607;do if((f|0)==255){if(!g){if(e)break;return a|0}if((a&2143289344|0)!=2139095040){d=2143289344;return d|0}c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}else{if(e|0){if(f|g)break;return a|0}do if(!f)if(!g){d=0;return d|0}else{e=Q(g|0)|0;a=9-e|0;e=g<<e+-8;break}else{a=f;e=g|8388608}while(0);i=a+-127|0;h=(i&1|0)==0;i=((h?i:a+-128|0)>>1)+127|0;a=e<<((h^1)&1)<<5;if(!a)a=0;else{e=oi(1,0,(65-(Q(a+-1|0)|0)|0)>>>1|0)|0;f=y;while(1){g=li(0,a|0,e|0,f|0)|0;g=ei(g|0,y|0,e|0,f|0)|0;g=ni(g|0,y|0,1)|0;h=y;if(h>>>0<f>>>0|(h|0)==(f|0)&g>>>0<e>>>0){e=g;f=h}else break}h=ki(e|0,f|0,e|0,f|0)|0;a=(0!=(h|0)|(a|0)!=(y|0))&1|e}e=Q(a|0)|0;if(!e)ja(13764,13775,183,13795);d=Db(0,i+(1-e)|0,a<<e+-1,b,d)|0;return d|0}while(0);c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}function Jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?b:a;return b|0}else{b=(f|0)==0?b:a;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?a:b;return b|0}else{b=(f|0)==0?a:b;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Lb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(a&8388607|0)!=0;if(!((a&2139095040|0)==2139095040&e)?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0)return ((a|0)==(b|0)|((b|a)&2147483647|0)==0)&1|0;if(!((a&2143289344|0)==2139095040&e)?(b&8388607|0)==0|(b&2143289344|0)!=2139095040:0)return 0;c[d>>2]=c[d>>2]|16;return 0}function Mb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d|((b|a)&2147483647|0)==0;break}if(d){d=a>>>0>=b>>>0;break}else{d=a>>>0<=b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Nb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d&((b|a)&2147483647|0)!=0;break}if(d){d=a>>>0>b>>>0;break}else{d=a>>>0<b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Ob(a){a=a|0;var b=0,c=0;b=a>>>31;c=a&8388607;a:do switch((a>>>23&255)<<24>>24){case -1:if(!c){a=(b|0)==0?128:1;break a}else{a=(a>>>14&256)+256|0;break a}case 0:{a=(b|0)!=0;if(!c){a=a?8:16;break a}else{a=a?4:32;break a}}default:a=(b|0)==0?64:2}while(0);return a|0}function Pb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,0)|0}function Qb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=a>>>23&255;h=a&8388607;j=(h|0)!=0&(g|0)==255?0:a>>>31;a=(g|0)==0;g=a?-149:g+-150|0;a=a?h:h|8388608;h=a<<7;i=(e|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)>-1)if((g|0)<9?(f=a<<g,f>>>0<=i>>>0):0)a=14;else a=4;else{f=0-g|0;if((g|0)<-31)f=(a|0)!=0&1;else f=h>>>f|((1<<f)+2147483647&h|0)!=0;switch(b|0){case 4:case 0:{a=64;break}case 1:{a=0;break}default:a=(j|0)==(b&1|0)?0:127}e=f&127;f=(a+f|0)>>>7;f=(b|0)==0&(e|0)==64?f&33554430:f;if(f>>>0<=i>>>0)if(!e)a=14;else{c[d>>2]=c[d>>2]|1;a=14}else a=4}if((a|0)==4){c[d>>2]=c[d>>2]|16;j=i;return j|0}else if((a|0)==14){j=(j|0)==0?f:0-f|0;return j|0}return 0}function Rb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,1)|0}function Sb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-31|0;f=(e|0)>31;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=Q(g|0)|0;d=h+-1|0;if(!h)ja(13764,13775,183,13795);else return Db(a>>>31,(f?e+126|0:157)-d|0,g<<d,b,c)|0;return 0}function Tb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-31|0;f=(e|0)>31;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=Q(d|0)|0;a=g+-1|0;if(!g)ja(13764,13775,183,13795);else return Db(0,(f?e+126|0:157)-a|0,d<<a,b,c)|0;return 0}function Ub(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=b&2147483647;o=e&2147483647;o=k>>>0<o>>>0|(k|0)==(o|0)&a>>>0<d>>>0;k=o?a:d;l=o?b:e;i=o?d:a;d=o?e:b;a=ni(i|0,d|0,63)|0;o=ni(k|0,l|0,63)|0;b=ni(i|0,d|0,52)|0;n=ni(k|0,l|0,52)|0;n=n&2047;e=oi(i|0,d|0,3)|0;e=e&-8;h=y&8388607;j=oi(k|0,l|0,3)|0;j=j&-8;m=y&8388607;switch(b&2047){case 2047:{if((e|0)==0&(h|0)==0){if((a|0)==(o|0)|(n|0)!=2047){f=d;g=i;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}if(!(0==0&(d&524288|0)==0)?(k|0)==0&(l&1048575|0)==0|(0!=0|(l&2146959360|0)!=2146435072):0){f=2146959360;g=0;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}case 0:{k=1;i=e;break}default:{k=b&2047;i=e;h=h|8388608}}b=(n|0)==0;e=b?j:j;d=b?m:m|8388608;b=k-(b?1:n)|0;do if(b)if((b|0)>63){b=((e|0)!=0|(d|0)!=0)&1;d=0;break}else{m=oi(1,0,b|0)|0;m=ei(m|0,y|0,-1,16777215)|0;n=y;b=ni(e|0,d|0,b|0)|0;b=b|((m&e|0)!=0|(n&d|0)!=0)&1;d=y;break}else b=e;while(0);if((a|0)==(o|0)){d=ei(b|0,d|0,i|0,h|0)|0;b=y}else{d=fi(i|0,h|0,b|0,d|0)|0;b=y;a=(d|0)==0&(b|0)==0?(f|0)==2&1:a}e=qi(d|0,b|0,0)|0;if((e|0)<=0)ja(13764,13775,183,13826);o=oi(d|0,b|0,e+-1|0)|0;g=Vb(a,k+7+(1-e)|0,o,y,f,g)|0;f=y;y=f;return g|0}function Vb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;switch(f|0){case 4:case 0:{l=512;break}case 1:{l=0;break}default:l=(f&1|0)==(a|0)?0:1023}if((b|0)<1){i=ei(l|0,0,d|0,e|0)|0;h=y;i=(b|0)!=0|((h|0)>-1|(h|0)==-1&i>>>0>4294967295);h=1-b|0;do if(h)if((h|0)>63){d=((d|0)!=0|(e|0)!=0)&1;e=0;break}else{j=oi(1,0,h|0)|0;j=ei(j|0,y|0,-1,-1)|0;k=y;b=ni(d|0,e|0,h|0)|0;d=b|((j&d|0)!=0|(k&e|0)!=0)&1;e=y;break}while(0);h=d&1023;if(i&(h|0)!=0){j=c[g>>2]|2;c[g>>2]=j;i=1;b=0;k=14}else{i=1;b=0;k=12}}else{h=d&1023;i=b;b=((b|0)<0)<<31>>31;k=12}if((k|0)==12)if(!h)h=0;else{j=c[g>>2]|0;k=14}if((k|0)==14)c[g>>2]=j|1;k=ei(d|0,e|0,l|0,0)|0;k=ni(k|0,y|0,10)|0;d=y;f=(f|0)==0&(h|0)==512;h=f?k&-2:k;d=f?d&4194303:d;f=ni(h|0,d|0,53)|0;b=ei(f|0,y|0,i|0,b|0)|0;if(!(d>>>0<1048576|(d|0)==1048576&h>>>0<0)){e=(l|0)==0;if((b|0)>2046){c[g>>2]=c[g>>2]|5;b=e?2046:2047;d=e?1048575:0;h=e?-1:0}}else b=0;g=oi(a|0,0,63)|0;l=y;a=oi(b|0,0,52)|0;y=d&1048575|l|y;return h|g|a|0}function Wb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;f=Ub(a,b,c,d^-2147483648,e,f)|0;return f|0}function Xb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=e^b;q=ni(d^a|0,o|0,63)|0;j=ni(a|0,b|0,52)|0;j=j&2047;i=ni(d|0,e|0,52)|0;i=i&2047;n=b&1048575;p=e&1048575;k=(j|0)==2047;l=(i|0)==2047;if(k|l){h=(a|0)!=0|(n|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&h)?(m=(d|0)==0&(p|0)==0,m|(0!=0|(e&2146435072|0)!=2146435072)):0){if(!(m&(k&(i|0)==0))?!((a|0)==0&(n|0)==0&((j|0)==0&l)):0){q=o&-2147483648|2146435072;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&h)?(d|0)==0&(p|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){q=2146959360;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}do if(!j){if(!((a|0)==0&(n|0)==0)){j=qi(a|0,n|0,0)|0;a=oi(a|0,n|0,j+-11|0)|0;j=12-j|0;b=y;break}q=o&-2147483648;g=0;y=q;return g|0}else b=n|1048576;while(0);do if(!i){if(!((d|0)==0&(p|0)==0)){i=qi(d|0,p|0,0)|0;d=oi(d|0,p|0,i+-11|0)|0;i=12-i|0;h=y;break}q=o&-2147483648;g=0;y=q;return g|0}else h=p|1048576;while(0);p=oi(a|0,b|0,10)|0;e=oi(d|0,h|0,11)|0;o=ni(a|0,b|0,22)|0;h=ni(d|0,h|0,21)|0;p=p&-1024;d=e&-2048;b=ki(d|0,0,p|0,0)|0;e=y;p=ki(h|0,0,p|0,0)|0;n=y;d=ki(d|0,0,o|0,0)|0;m=y;o=ki(h|0,0,o|0,0)|0;h=y;p=ei(e|0,0,p&-1024|0,0)|0;d=ei(p|0,y|0,d&-2048|0,0)|0;p=y;n=ei(m|0,0,n|0,0)|0;n=ei(n|0,y|0,o|0,0)|0;p=ei(n|0,y|0,p|0,0)|0;ei(0,y&7|0,o|0,h|0)|0;h=y;d=p|((b&-2097152|0)!=0|(d|0)!=0)&1;b=qi(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);p=oi(d|0,h|0,b+-1|0)|0;g=Vb(q,j+-1022+i+(1-b)|0,p,y,f,g)|0;q=y;y=q;return g|0}function Yb(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=ni(f|0,g|0,63)|0;m=e^b;n=ni(d^a|0,m|0,63)|0;o=ni(a|0,b|0,52)|0;o=o&2047;l=ni(d|0,e|0,52)|0;l=l&2047;k=ni(f|0,g|0,52)|0;k=k&2047;u=b&1048575;v=e&1048575;w=g&1048575;p=(o|0)==2047;q=(l|0)==2047;t=p|q;r=(k|0)==2047;if(t|r){j=(a|0)!=0|(u|0)!=0;if((!(0==0&(b&2146435072|0)==2146435072&j)?(s=(d|0)==0&(v|0)==0,s|(0!=0|(e&2146435072|0)!=2146435072)):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146435072|0)!=2146435072):0){if((!(s&(p&(l|0)==0))?!((a|0)==0&(u|0)==0&((o|0)==0&q)):0)?(n|0)==(x|0)|t&r^1:0)if(r){h=g&-2147483648|2146435072;i=0;y=h;return i|0}else{h=m&-2147483648|2146435072;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}if((!(0==0&(b&2146959360|0)==2146435072&j)?(d|0)==0&(v|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146959360|0)!=2146435072):0){h=2146959360;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}do if(!o)if((a|0)==0&(u|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=oi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{o=qi(a|0,u|0,0)|0;a=oi(a|0,u|0,o+-11|0)|0;o=12-o|0;b=y;break}else b=u|1048576;while(0);do if(!l)if((d|0)==0&(v|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=oi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{l=qi(d|0,v|0,0)|0;d=oi(d|0,v|0,l+-11|0)|0;l=12-l|0;j=y;break}else j=v|1048576;while(0);g=oi(a|0,b|0,10)|0;q=oi(d|0,j|0,10)|0;b=ni(a|0,b|0,22)|0;e=ni(d|0,j|0,22)|0;g=g&-1024;q=q&-1024;p=ki(q|0,0,g|0,0)|0;v=y;g=ki(e|0,0,g|0,0)|0;m=y;q=ki(q|0,0,b|0,0)|0;u=y;b=ki(e|0,0,b|0,0)|0;e=y;g=ei(v|0,0,g&-1024|0,0)|0;q=ei(g|0,y|0,q&-1024|0,0)|0;g=y;m=ei(u|0,0,m|0,0)|0;m=ei(m|0,y|0,b|0,0)|0;m=ei(m|0,y|0,g|0,0)|0;ei(0,y&7|0,b|0,e|0)|0;e=y;b=e>>>0<536870912|(e|0)==536870912&m>>>0<0;u=oi(m|0,e|0,1)|0;v=y;g=ni(q|0,g|0,31)|0;q=oi(p&-1048576|0,q|0,b&1|0)|0;p=y;m=b?u|g&1:m;e=b?v:e;b=l+o+(b?-1022:-1021)|0;do if(!k){if(!((f|0)==0&(w|0)==0)){k=qi(f|0,w|0,0)|0;d=oi(f|0,w|0,k+-11|0)|0;k=12-k|0;j=y;break}j=m|((q|0)!=0|(p|0)!=0)&1;z=qi(j|0,e|0,0)|0;k=z+-1|0;if((z|0)<=0)ja(13764,13775,183,13826);z=oi(j|0,e|0,k|0)|0;i=Vb(n,b-k|0,z,y,h,i)|0;h=y;y=h;return i|0}else{d=f;j=w|1048576}while(0);k=k+1|0;l=oi(d|0,j|0,9)|0;o=y;if((b|0)>(k|0)){r=x;s=b;d=k;k=l;a=0;j=o;b=0;l=e}else{w=(b|0)!=(k|0)|(e>>>0<o>>>0|(e|0)==(o|0)&m>>>0<l>>>0);r=w?n:x;n=w?x:n;s=w?k:b;d=w?b:k;k=w?m:l;a=w?q:0;j=w?e:o;b=w?p:0;q=w?0:q;p=w?0:p;m=w?l:m;l=w?o:e}d=s-d|0;a:do if((d|0)>127){a=((a|k|0)!=0|(b|j|0)!=0)&1;b=0;k=0;j=0}else{if((d|0)>64){x=d+-64|0;b=oi(1,0,x|0)|0;b=ei(b|0,y|0,-1,-1)|0;a=y;x=ni(k|0,j|0,x|0)|0;a=x|((b&k|0)!=0|(a&j|0)!=0)&1;b=y;k=0;j=0;break}switch(d|0){case 0:break a;case 64:{a=k|((a|0)!=0|(b|0)!=0)&1;b=j;k=0;j=0;break a}default:{f=ei(oi(1,0,d|0)|0,y|0,-1,-1)|0;w=y;g=oi(k|0,j|0,64-d|0)|0;x=y;v=ni(a|0,b|0,d|0)|0;x=x|y;a=g|v|((f&a|0)!=0|(w&b|0)!=0)&1;b=x;k=ni(k|0,j|0,d|0)|0;j=y;break a}}}while(0);if((n|0)==(r|0)){w=ei(a|0,b|0,q|0,p|0)|0;x=y;j=ei(k|0,j|0,m|0,l|0)|0;a=ei(j|0,y|0,(x>>>0<b>>>0|(x|0)==(b|0)&w>>>0<a>>>0)&1|0,0)|0;j=y;l=w;m=x}else{w=fi(q|0,p|0,a|0,b|0)|0;x=y;j=fi(m|0,l|0,k|0,j|0)|0;a=(x>>>0>p>>>0|(x|0)==(p|0)&w>>>0>q>>>0)<<31>>31;a=ei(j|0,y|0,a|0,((a|0)<0)<<31>>31|0)|0;j=y;n=(a|w|0)==0&(j|x|0)==0?(h|0)==2&1:n;l=w;m=x}if((a|0)==0&(j|0)==0){k=qi(l|0,m|0,0)|0;b=k+63|0;d=s-b|0;if((k+64|0)>>>0<65){k=64;z=50}else{k=oi(l|0,m|0,k+-1|0)|0;j=y}}else{k=qi(a|0,j|0,0)|0;b=k+-1|0;if((k|0)<=0)ja(13764,13775,201,13841);d=s-b|0;if(!b)k=a|((l|0)!=0|(m|0)!=0)&1;else z=50}if((z|0)==50){z=oi(a|0,j|0,b|0)|0;j=y;x=ni(l|0,m|0,65-k|0)|0;j=y|j;k=oi(l|0,m|0,b|0)|0;k=x|z|((k|0)!=0|(y|0)!=0)&1}i=Vb(n,d,k,j,h,i)|0;h=y;y=h;return i|0}function Zb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;n=e^b;p=ni(d^a|0,n|0,63)|0;l=ni(a|0,b|0,52)|0;l=l&2047;h=ni(d|0,e|0,52)|0;i=h&2047;m=b&1048575;k=e&1048575;if((l|0)==2047){h=(a|0)==0&(m|0)==0;if(h)if((d|0)==0&(k|0)==0|(0!=0|(e&2146435072|0)!=2146435072))if((i|0)==2047){c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}else{p=n&-2147483648|2146435072;g=0;y=p;return g|0}else j=5;else if(h|(0!=0|(b&2146959360|0)!=2146435072))j=5;if((j|0)==5?(d|0)==0&(k|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}a:do switch(h&2047){case 2047:{if((d|0)==0&(k|0)==0){p=n&-2147483648;g=0;y=p;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&((a|0)!=0|(m|0)!=0)|0==0&(e&2146959360|0)==2146435072)){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}case 0:{if(!((d|0)==0&(k|0)==0)){o=qi(d|0,k|0,0)|0;d=oi(d|0,k|0,o+-11|0)|0;o=12-o|0;i=y;break a}h=c[g>>2]|0;if((a|0)==0&(m|0)==0&(l|0)==0){c[g>>2]=h|16;p=2146959360;g=0;y=p;return g|0}else{c[g>>2]=h|8;p=n&-2147483648|2146435072;g=0;y=p;return g|0}}default:{o=i;i=k|1048576}}while(0);do if(!l){if(!((a|0)==0&(m|0)==0)){n=qi(a|0,m|0,0)|0;h=oi(a|0,m|0,n+-11|0)|0;n=12-n|0;b=y;break}p=n&-2147483648;g=0;y=p;return g|0}else{n=l;b=m|1048576;h=a}while(0);k=oi(d|0,i|0,2)|0;l=y;if(!(b>>>0<l>>>0|(b|0)==(l|0)&h>>>0<k>>>0))ja(13857,13775,571,13864);j=0;d=0;e=0;do{r=oi(h|0,b|0,1)|0;q=y;m=ni(d|0,e|0,63)|0;r=m|r;q=y|q;m=(b|0)>-1|(b|0)==-1&h>>>0>4294967295;a=q>>>0<l>>>0|(q|0)==(l|0)&r>>>0<k>>>0;i=m&a;h=fi(r|0,q|0,(i?0:k)|0,(i?0:l)|0)|0;b=y;i=oi(d|0,e|0,1)|0;e=y;d=i|(m&a^1)&1;j=j+1|0}while((j|0)!=64);h=(h|0)==0&(b|0)==0;d=h?d:i|1;h=h?e:e;b=qi(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);r=oi(d|0,h|0,b+-1|0)|0;r=Vb(p,1023-o+n+(1-b)|0,r,y,f,g)|0;q=y;y=q;return r|0}function _b(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=ni(a|0,b|0,63)|0;f=ni(a|0,b|0,52)|0;f=f&2047;i=b&1048575;do if((f|0)==2047){if((a|0)==0&(i|0)==0){if(h)break;y=b;return a|0}if(!(0==0&(b&2146959360|0)==2146435072)){d=2146959360;e=0;y=d;return e|0}c[e>>2]=c[e>>2]|16;d=2146959360;e=0;y=d;return e|0}else{g=(f|0)==0;if(h|0){if(!((a|0)==0&(i|0)==0&g))break;y=b;return a|0}do if(g)if((a|0)==0&(i|0)==0){d=0;e=0;y=d;return e|0}else{f=qi(a|0,i|0,0)|0;a=oi(a|0,i|0,f+-11|0)|0;f=12-f|0;b=y;break}else b=i|1048576;while(0);m=f+-1023|0;l=(m&1|0)==0;k=oi(a|0,b|0,(l^1)&1|0)|0;m=((l?m:f+-1024|0)>>1)+1023|0;k=oi(k|0,y|0,8)|0;l=y;do if(!((k|0)==0&(l|0)==0)){b=ei(k|0,l|0,-1,-1)|0;b=qi(b|0,y|0,1)|0;b=oi(1,0,(129-b|0)>>>1|0)|0;a=y;if(!(a>>>0>l>>>0|(a|0)==(l|0)&b>>>0>k>>>0))ja(13857,13775,571,13864);while(1){f=0;g=k;h=l;i=0;j=0;do{t=oi(g|0,h|0,1)|0;s=y;q=ni(i|0,j|0,63)|0;t=q|t;s=y|s;q=(h|0)>-1|(h|0)==-1&g>>>0>4294967295;p=s>>>0<a>>>0|(s|0)==(a|0)&t>>>0<b>>>0;r=q&p;g=fi(t|0,s|0,(r?0:b)|0,(r?0:a)|0)|0;h=y;r=oi(i|0,j|0,1)|0;j=y;i=r|(q&p^1)&1;f=f+1|0}while((f|0)!=64);g=ei(i|0,j|0,b|0,a|0)|0;g=ni(g|0,y|0,1)|0;f=y;if(!(f>>>0<a>>>0|(f|0)==(a|0)&g>>>0<b>>>0)){f=21;break}if(f>>>0>l>>>0|(f|0)==(l|0)&g>>>0>k>>>0){a=f;b=g}else{f=17;break}}if((f|0)==17)ja(13857,13775,571,13864);else if((f|0)==21){t=ki(b|0,0,b|0,0)|0;o=y;n=ki(a|0,0,b|0,0)|0;q=y;r=ki(a|0,0,a|0,0)|0;s=y;n=oi(n|0,q|0,1)|0;o=ei(n&-2|0,y&1|0,o|0,0)|0;n=y;q=oi(q|0,0,1)|0;q=ei(q|0,y|0,r|0,0)|0;n=ei(q|0,y|0,n|0,0)|0;ei(0,y&7|0,r|0,s|0)|0;n=b|((t|0)!=0|(o|0)!=0|((n|0)!=(k|0)|(y|0)!=(l|0)))&1;o=a;break}}else{n=0;o=0}while(0);a=qi(n|0,o|0,0)|0;if((a|0)<=0)ja(13764,13775,183,13826);t=oi(n|0,o|0,a+-1|0)|0;t=Vb(0,m+(1-a)|0,t,y,d,e)|0;s=y;y=s;return t|0}while(0);c[e>>2]=c[e>>2]|16;s=2146959360;t=0;y=s;return t|0}function $b(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?e:b;e=g?d:a;y=b;return e|0}else{g=(h|0)==0;b=g?e:b;e=g?d:a;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function ac(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?b:e;e=g?a:d;y=b;return e|0}else{g=(h|0)==0;b=g?b:e;e=g?a:d;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function bc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=(a|0)!=0|(b&1048575|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0)return ((a|0)==(d|0)&(b|0)==(e|0)|(d|a|0)==0&((e|b)&2147483647|0)==0)&1|0;if(!(0==0&(b&2146959360|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)return 0;c[f>>2]=c[f>>2]|16;return 0}function cc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f|(d|a|0)==0&((e|b)&2147483647|0)==0;h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>=d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<=d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function dc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f&((d|a|0)!=0|((e|b)&2147483647|0)!=0);h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function ec(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=ni(a|0,b|0,63)|0;e=ni(a|0,b|0,52)|0;d=b&1048575;switch(e&2047){case 2047:if((a|0)==0&(d|0)==0){e=(c|0)==0?128:1;return e|0}else{e=ni(a|0,b|0,43)|0;e=(e&256)+256|0;return e|0}case 0:{b=(c|0)!=0;if((a|0)==0&(d|0)==0){e=b?8:16;return e|0}else{e=b?4:32;return e|0}}default:{e=(c|0)==0?64:2;return e|0}}return 0}function fc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=a>>>31;e=a>>>23;d=a&8388607;a:do switch((e&255)<<24>>24){case -1:{if(!d){f=oi(f|0,0,63)|0;e=y|2146435072;y=e;return f|0}if((a&2143289344|0)!=2139095040){e=2146959360;f=0;y=e;return f|0}c[b>>2]=c[b>>2]|16;e=2146959360;f=0;y=e;return f|0}case 0:{if(d|0){a=Q(d|0)|0;d=d<<a+-8;a=9-a|0;break a}f=oi(f|0,0,63)|0;e=y;y=e;return f|0}default:a=e&255}while(0);b=oi(d|0,0,29)|0;e=y;f=oi(f|0,0,63)|0;g=y;d=oi(a+896|0,0,52)|0;e=y|g|e&1048575;f=d|f|b&-536870912;y=e;return f|0}function gc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=ni(a|0,b|0,63)|0;g=y;h=ni(a|0,b|0,52)|0;f=b&1048575;a:do switch(h&2047){case 2047:{if((a|0)==0&(f|0)==0){i=oi(i|0,g|0,31)|0;i=i|2139095040;return i|0}if(!(0==0&(b&2146959360|0)==2146435072)){i=2143289344;return i|0}c[e>>2]=c[e>>2]|16;i=2143289344;return i|0}case 0:{if(!((a|0)==0&(f|0)==0)){b=qi(a|0,f|0,0)|0;b=12-b|0;break a}i=oi(i|0,g|0,31)|0;return i|0}default:{b=h&2047;f=f|1048576}}while(0);f=ni(a|0,f|0,22)|0;f=f|((a&4194303|0)!=0|0!=0)&1;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);i=Db(i,b+-896+(1-a)|0,f<<a+-1,d,e)|0;return i|0}function hc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ic(a,b,c,d,0)|0}function ic(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=ni(a|0,b|0,63)|0;g=ni(a|0,b|0,52)|0;g=g&2047;b=b&1048575;j=((a|0)!=0|(b|0)!=0)&(g|0)==2047?0:j;i=(g|0)==0;g=i?-1074:g+-1075|0;b=oi(a|0,b|0,10)|0;a=y;b=i?b:b;a=i?a:a|1073741824;i=(f|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)<=-1){if((g|0)<-63){b=((b|0)!=0|(a|0)!=0)&1;f=0}else{g=0-g|0;h=oi(1,0,g|0)|0;h=ei(h|0,y|0,-1,2147483647)|0;f=y;g=ni(b|0,a|0,g|0)|0;b=g|((h&b|0)!=0|(f&a|0)!=0)&1;f=y}switch(d|0){case 4:case 0:{a=512;g=0;break}case 1:{a=0;g=0;break}default:{g=(j|0)==(d&1|0);a=g?0:1023;g=g?0:0}}h=b&1023;b=ei(a|0,g|0,b|0,f|0)|0;b=ni(b|0,y|0,10)|0;f=y;d=(d|0)==0&(h|0)==512;b=d?b&-2:b;d=d?f&4194303:f;if(!(d>>>0>0|(d|0)==0&b>>>0>i>>>0)){if(h|0)c[e>>2]=c[e>>2]|1;e=(j|0)==0?b:0-b|0;return e|0}}c[e>>2]=c[e>>2]|16;e=i;return e|0}function jc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ic(a,b,c,d,1)|0}function kc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-63|0;f=(e|0)>63;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=qi(g|0,0,0)|0;d=h+-1|0;if((h|0)>0){h=oi(g|0,0,d|0)|0;h=Vb(a>>>31,(f?e+1022|0:1085)-d|0,h,y,b,c)|0;return h|0}else ja(13764,13775,183,13826);return 0}function lc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-63|0;f=(e|0)>63;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=qi(d|0,0,0)|0;a=g+-1|0;if((g|0)>0){g=oi(d|0,0,a|0)|0;g=Vb(0,(f?e+1022|0:1085)-a|0,g,y,b,c)|0;return g|0}else ja(13764,13775,183,13826);return 0}function mc(b,d){b=b|0;d=d|0;var e=0,f=0;e=lf(572)|0;oc(e,b,2,8,1);c[e+544>>2]=d;b=Va[c[d>>2]&15](d)|0;d=y;a[e+288>>0]=b;a[e+289>>0]=b>>>8;a[e+290>>0]=b>>>16;a[e+291>>0]=b>>>24;a[e+292>>0]=d;f=ni(b|0,d|0,40)|0;a[e+293>>0]=f;f=ni(b|0,d|0,48)|0;a[e+294>>0]=f;d=ni(b|0,d|0,56)|0;a[e+295>>0]=d;return e|0}function nc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;h=k;i=c[a+544>>2]|0;j=a+548|0;if(c[j>>2]|0){j=-1;l=k;return j|0}if((Ac(a,h,b,d,0,16,0)|0)<0){j=0;l=k;return j|0}m=c[h>>2]|0;g=a+552|0;c[g>>2]=m;c[g+12>>2]=b;c[g+16>>2]=d;switch(m|0){case 0:{b=Ag(f)|0;c[g+4>>2]=b;c[g+8>>2]=f;m=h+8|0;b=$a[c[i+4>>2]&3](i,c[m>>2]|0,c[m+4>>2]|0,b,(f+-1|0)/512|0,5,a)|0;if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Cc(a,b);m=0;l=k;return m|0}}case 1:{if((f|0)<=0)ja(13887,13903,1097,13912);f=e+-16|0;m=Ag(f)|0;Ac(a,m,b,d,16,f,0)|0;b=h+8|0;b=$a[c[i+8>>2]&3](i,c[b>>2]|0,c[b+4>>2]|0,m,(f|0)/512|0,5,a)|0;Bg(m);if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Cc(a,b);m=0;l=k;return m|0}}default:{m=0;l=k;return m|0}}return 0}function oc(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+64|0;m=n+32|0;k=n;si(d|0,0,544)|0;if(!(c[e>>2]|0)){k=c[e+4>>2]|0;c[d>>2]=k;c[d+12>>2]=c[e+16>>2];m=e+8|0;c[d+4>>2]=gf(k,c[m>>2]|0,c[m+4>>2]|0,4096,0,d,8,3,7)|0;c[d+16>>2]=9}else{switch(f|0){case 1:{i=4096;j=512;break}case 2:{i=4097;j=256;break}case 3:{i=4099;j=1920;break}case 9:{i=4169;j=2;break}case 18:{i=4178;j=2432;break}default:ra()}c[m>>2]=i&65535;Wg(k,32,13875,m)|0;v=ze(c[e>>2]|0,k,-1,6900,i,0,j)|0;k=d+8|0;c[k>>2]=v;Ge(v,44,6900);Ge(c[k>>2]|0,46,f&65535);Fe(c[k>>2]|0,61,1);c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;v=m+2|0;a[v>>0]=16;u=m+3|0;a[u>>0]=1;t=m+4|0;a[t>>0]=4;s=m+8|0;r=m+9|0;q=m+10|0;p=m+11|0;o=m+12|0;i=m+13|0;c[s>>2]=0;a[s+4>>0]=0;a[i>>0]=16;j=m+14|0;a[j>>0]=0;e=m+15|0;a[e>>0]=0;He(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=3;a[t>>0]=4;a[s>>0]=0;a[r>>0]=16;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;He(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=4;a[t>>0]=4;a[s>>0]=0;a[r>>0]=32;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;He(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;a[m>>0]=9;a[v>>0]=20;a[u>>0]=2;a[t>>0]=4;a[s>>0]=0;a[r>>0]=48;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;c[m+16>>2]=0;He(c[k>>2]|0,m,20)|0;c[d+16>>2]=6;c[d+12>>2]=Be(c[k>>2]|0,0)|0;m=Ce(c[k>>2]|0)|0;c[d>>2]=m;c[d+4>>2]=gf(m,0,0,16384,0,d,7,1,23)|0;De(c[k>>2]|0,4,16384,0,d,2)}c[d+264>>2]=f;c[d+268>>2]=65535;c[d+284>>2]=g;c[d+276>>2]=h;v=d+24|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[d+44>>2]=16;c[d+52>>2]=0;c[d+56>>2]=0;c[d+60>>2]=0;b[d+48>>1]=0;c[d+68>>2]=0;c[d+72>>2]=16;c[d+80>>2]=0;c[d+84>>2]=0;c[d+88>>2]=0;b[d+76>>1]=0;c[d+96>>2]=0;c[d+100>>2]=16;c[d+108>>2]=0;c[d+112>>2]=0;c[d+116>>2]=0;b[d+104>>1]=0;c[d+124>>2]=0;c[d+128>>2]=16;c[d+136>>2]=0;c[d+140>>2]=0;c[d+144>>2]=0;b[d+132>>1]=0;c[d+152>>2]=0;c[d+156>>2]=16;c[d+164>>2]=0;c[d+168>>2]=0;c[d+172>>2]=0;b[d+160>>1]=0;c[d+180>>2]=0;c[d+184>>2]=16;c[d+192>>2]=0;c[d+196>>2]=0;c[d+200>>2]=0;b[d+188>>1]=0;c[d+208>>2]=0;c[d+212>>2]=16;c[d+220>>2]=0;c[d+224>>2]=0;c[d+228>>2]=0;b[d+216>>1]=0;c[d+236>>2]=0;c[d+240>>2]=16;c[d+248>>2]=0;c[d+252>>2]=0;c[d+256>>2]=0;b[d+244>>1]=0;l=n;return}function pc(a,b,d){a=a|0;b=b|0;d=d|0;return Ee(c[a+8>>2]|0,b,0,d)|0}function qc(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;f=b&4095;switch(b>>>12&1048575|0){case 0:switch(e|0){case 2:switch(b&4095){case 4:{b=c[a+32>>2]|0;switch(b|0){case 0:{a=c[a+272>>2]|0;return a|0}case 1:{a=b;return a|0}default:{a=0;return a|0}}}case 0:{a=c[a+32>>2]|0;return a|0}case 32:{a=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;return a|0}case 40:{a=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;return a|0}case 48:{a=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;return a|0}default:{a=0;return a|0}}case 1:{f=f+-18|0;switch(f>>>1|f<<31|0){case 0:{a=16;return a|0}case 2:{a=c[a+36>>2]|0;return a|0}case 3:{a=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;return a|0}case 5:{a=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;return a|0}default:{a=0;return a|0}}}default:{if(!((e|0)==0&(f|0)==20)){a=0;return a|0}a=c[a+28>>2]|0;return a|0}}case 1:{if(f|e|0){a=0;return a|0}e=a+24|0;f=c[e>>2]|0;c[e>>2]=0;a=c[a+12>>2]|0;eb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);a=f;return a|0}case 2:{switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=f>>>0){a=0;return a|0}a=d[a+288+f>>0]|0;return a|0}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0);return a|0}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0)|(d[a+2>>0]|0)<<16|(d[a+3>>0]|0)<<24;return a|0}default:ra()}break}default:{a=0;return a|0}}return 0}function rc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0;g=d&4095;switch(d>>>12&1048575|0){case 0:switch(f|0){case 2:switch(g>>>3|d<<29|0){case 0:{c[a+32>>2]=e;return}case 4:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 5:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 6:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}default:return}case 1:switch(d&4095){case 22:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 24:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 28:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}default:return}default:{if(!((g|0)==20&(f|0)==0))return;c[a+28>>2]=e;if(e|0)return;g=c[a+12>>2]|0;eb[c[g>>2]&15](c[g+4>>2]|0,c[g+8>>2]|0,0);g=a+24|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}}case 2:{wc(a,g,e,f);return}case 3:{if(e>>>0>=8)return;xc(a,e);return}default:return}}function sc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;hf(c[a+4>>2]|0,d,0,e);return}function tc(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;a:do if(b>>>0<=255)if((e|0)==2)do switch(b|0){case 0:{f=1953655158;break a}case 4:{f=2;break a}case 8:{f=c[a+264>>2]|0;break a}case 12:{f=c[a+268>>2]|0;break a}case 16:{f=c[a+32>>2]|0;switch(f|0){case 1:break a;case 0:{f=c[a+272>>2]|0;break a}default:{f=0;break a}}}case 20:{f=c[a+32>>2]|0;break a}case 48:{f=c[a+36>>2]|0;break a}case 52:{f=16;break a}case 56:{f=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;break a}case 128:{f=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;break a}case 144:{f=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;break a}case 160:{f=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;break a}case 68:{f=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;break a}case 96:{f=c[a+24>>2]|0;break a}case 112:{f=c[a+28>>2]|0;break a}case 252:{f=0;break a}default:{f=0;break a}}while(0);else f=0;else{b=b+-256|0;switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=b>>>0){f=0;break a}f=d[a+288+b>>0]|0;break a}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0);break a}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;break a}default:ra()}}while(0);return f|0}function uc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;if(d>>>0>255){wc(a,d+-256|0,e,f);return}if((f|0)!=2)return;do switch(d|0){case 20:{c[a+32>>2]=e;return}case 48:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 56:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 128:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 144:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 160:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}case 112:{c[a+28>>2]=e;if(e|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);f=a+24|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}case 68:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}case 80:{if(e>>>0>=8)return;xc(a,e);return}case 100:{d=a+24|0;f=c[d>>2]&~e;c[d>>2]=f;if(f|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);return}default:return}while(0)}function vc(a,b,d){a=a|0;b=b|0;d=d|0;return jf(c[a>>2]|0,b,0,d)|0}function wc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;switch(f|0){case 0:{if((c[b+284>>2]|0)>>>0<=d>>>0)return;a[b+288+d>>0]=e;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 1:{if(((c[b+284>>2]|0)+-1|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=(e&65535)>>>8;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 2:{if(((c[b+284>>2]|0)+-3|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=e>>>8;a[d+2>>0]=e>>>16;a[d+3>>0]=e>>>24;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}default:return}}function xc(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;k=p+4|0;m=p;if(c[a+40+(d*28|0)+24>>2]|0){l=p;return}o=a+40+(d*28|0)+16|0;f=(c[o>>2]|0)+2|0;if((f&1|0)==0?(e=Xa[c[a+16>>2]&31](a,f,0)|0,(e|0)!=0):0)f=b[e>>1]|0;else f=0;g=a+276|0;h=a+40+(d*28|0)+8|0;e=b[h>>1]|0;if(e<<16>>16==f<<16>>16){l=p;return}i=a+40+(d*28|0)+4|0;j=a+16|0;while(1){e=(c[o>>2]|0)+4+(((c[i>>2]|0)+65535&(e&65535))<<1)|0;if((e&1|0)==0?(n=Xa[c[j>>2]&31](a,e,0)|0,(n|0)!=0):0)e=b[n>>1]|0;else e=0;e=e&65535;if((yc(a,k,m,d,e)|0)==0?(Za[c[g>>2]&7](a,d,e,c[k>>2]|0,c[m>>2]|0)|0)<0:0){e=13;break}e=(b[h>>1]|0)+1<<16>>16;b[h>>1]=e;if(e<<16>>16==f<<16>>16){e=13;break}}if((e|0)==13){l=p;return}}function yc(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;zc(a,p,g,h);o=p+12|0;j=e[o>>1]|0;a:do if(!(j&2)){i=p+8|0;k=p+14|0;h=0;do{h=(c[i>>2]|0)+h|0;if(!(j&1)){i=0;break a}zc(a,p,g,e[k>>1]|0);m=b[o>>1]|0;j=m&65535}while(!(j&2|0));j=m&65535;n=6}else{h=0;n=6}while(0);b:do if((n|0)==6){k=p+8|0;m=p+14|0;i=0;while(1){i=(c[k>>2]|0)+i|0;if(!(j&1))break b;zc(a,p,g,e[m>>1]|0);j=e[o>>1]|0;if(!(j&2)){h=-1;break}}l=q;return h|0}while(0);c[d>>2]=h;c[f>>2]=i;f=0;l=q;return f|0}function zc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a+16|0;g=16;e=(c[a+40+(d*28|0)+12>>2]|0)+(e<<4)|0;while(1){d=4096-(e&4095)|0;d=(g|0)<(d|0)?g:d;f=Xa[c[h>>2]&31](a,e,0)|0;if(!f){b=4;break}ri(b|0,f|0,d|0)|0;g=g-d|0;if((g|0)<=0){b=4;break}else{b=b+d|0;e=d+e|0}}if((b|0)==4)return}function Ac(a,d,f,g,h,i,j){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;y=z;if(!i){y=0;l=z;return y|0}x=a+40+(f*28|0)+12|0;w=a+16|0;m=y;n=16;g=(c[x>>2]|0)+(g<<4)|0;while(1){f=4096-(g&4095)|0;f=(n|0)<(f|0)?n:f;k=Xa[c[w>>2]&31](a,g,0)|0;if(!k)break;ri(m|0,k|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{m=m+f|0;g=f+g|0}}u=(j|0)!=0;v=y+12|0;k=b[v>>1]|0;f=k&65535;g=f&2;a:do if(u)if(!g){j=y+14|0;while(1){if(!(f&1)){q=-1;break}g=y;k=16;m=((e[j>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;ri(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}k=b[v>>1]|0;f=k&65535;g=f&2;if(g){t=2;break a}}l=z;return q|0}else t=2;else t=0;while(0);if((g|0)!=(t|0)){y=-1;l=z;return y|0}r=y+8|0;s=y+14|0;m=h;while(1){p=c[r>>2]|0;if(m>>>0<p>>>0){f=21;break}if(!(f&1)){q=-1;f=40;break}o=m-p|0;g=y;n=16;j=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(j&4095)|0;f=(n|0)<(f|0)?n:f;h=Xa[c[w>>2]&31](a,j,0)|0;if(!h)break;ri(g|0,h|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{g=g+f|0;j=f+j|0}}g=b[v>>1]|0;f=g&65535;if((f&2|0)!=(t|0)){q=-1;f=40;break}else{m=o;k=g}}if((f|0)==21){n=d;g=i;f=k;b:while(1){q=n;d=g;do{o=p-m|0;o=(d|0)<(o|0)?d:o;k=m+(c[y>>2]|0)|0;g=(o|0)>0;c:do if(u){if(g){n=o;j=q;while(1){g=4096-(k&4095)|0;g=(n|0)<(g|0)?n:g;h=Xa[c[w>>2]&31](a,k,1)|0;if(!h)break c;ri(h|0,j|0,g|0)|0;n=n-g|0;if((n|0)<=0)break;else{k=g+k|0;j=j+g|0}}}}else if(g){j=q;h=o;while(1){g=4096-(k&4095)|0;g=(h|0)<(g|0)?h:g;n=Xa[c[w>>2]&31](a,k,0)|0;if(!n)break c;ri(j|0,n|0,g|0)|0;h=h-g|0;if((h|0)<=0)break;else{j=j+g|0;k=g+k|0}}}while(0);d=d-o|0;if(!d){q=0;f=40;break b}m=o+m|0;q=q+o|0}while((m|0)!=(p|0));if(!(f&1)){q=-1;f=40;break}g=y;k=16;m=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;ri(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}f=b[v>>1]|0;if((t|0)!=(f&2|0)){q=-1;f=40;break}n=q;g=d;m=0;p=c[r>>2]|0}if((f|0)==40){l=z;return q|0}}else if((f|0)==40){l=z;return q|0}return 0}function Bc(a,b){a=a|0;b=b|0;Cc(a,b);c[a+548>>2]=0;xc(a,c[a+564>>2]|0);return}function Cc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;e=i;f=b+552|0;g=c[f+12>>2]|0;h=c[f+16>>2]|0;switch(c[f>>2]|0){case 0:{e=c[f+8>>2]|0;f=c[f+4>>2]|0;a[f+(e+-1)>>0]=d>>>31;Ac(b,f,g,h,0,e,1)|0;Bg(f);Dc(b,g,h,e);l=i;return}case 1:{a[e>>0]=d>>>31;Ac(b,e,g,h,0,1,1)|0;Dc(b,g,h,1);l=i;return}default:ra()}}function Dc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=a+40+(d*28|0)+20|0;h=(c[j>>2]|0)+2|0;if(!(h&1)){i=a+16|0;g=Xa[c[i>>2]&31](a,h,0)|0;if(!g)g=0;else g=b[g>>1]|0;g=g&65535;h=Xa[c[i>>2]&31](a,h,1)|0;if(h)b[h>>1]=g+1}else g=0;g=(c[j>>2]|0)+4+(((c[a+40+(d*28|0)+4>>2]|0)+65535&g)<<3)|0;if((g&3|0)==0?(k=Xa[c[a+16>>2]&31](a,g,1)|0,k|0):0)c[k>>2]=e;g=g+4|0;if((g&3|0)==0?(l=Xa[c[a+16>>2]&31](a,g,1)|0,l|0):0)c[l>>2]=f;l=a+24|0;c[l>>2]=c[l>>2]|1;l=c[a+12>>2]|0;eb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}function Ec(d,e){d=d|0;e=e|0;var f=0;f=lf(552)|0;oc(f,d,1,8,2);c[f+272>>2]=32;c[f+64>>2]=1;c[f+544>>2]=e;d=f+288|0;c[d>>2]=c[e>>2];b[d+4>>1]=b[e+4>>1]|0;a[f+294>>0]=0;a[f+295>>0]=0;c[f+548>>2]=12;c[e+16>>2]=f;c[e+20>>2]=9;c[e+24>>2]=5;c[e+28>>2]=6;return f|0}function Fc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=c[a+544>>2]|0;if((b|0)!=1){l=h;return 0}f=a+548|0;if((Ac(a,h,1,d,0,c[f>>2]|0,0)|0)<0){l=h;return 0}f=c[f>>2]|0;b=e-f|0;e=Ag(b)|0;Ac(a,e,1,d,f,b,0)|0;eb[c[g+8>>2]&15](g,e,b);Bg(e);Dc(a,1,d,0);l=h;return 0}function Gc(a){a=a|0;var d=0,e=0;e=c[a+16>>2]|0;if(!(c[e+40>>2]|0)){e=0;return e|0}a=(c[e+56>>2]|0)+2|0;if((a&1|0)==0?(d=Xa[c[e+16>>2]&31](e,a,0)|0,(d|0)!=0):0)a=b[d>>1]|0;else a=0;e=(b[e+48>>1]|0)!=a<<16>>16&1;return e|0}function Hc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;m=o+8|0;j=o+4|0;n=o;k=c[a+16>>2]|0;if(!(c[k+40>>2]|0)){l=o;return}g=k+56|0;a=(c[g>>2]|0)+2|0;if((a&1|0)==0?(f=Xa[c[k+16>>2]&31](k,a,0)|0,(f|0)!=0):0)a=b[f>>1]|0;else a=0;i=k+48|0;f=b[i>>1]|0;if(f<<16>>16==a<<16>>16){l=o;return}a=(c[g>>2]|0)+4+(((c[k+44>>2]|0)+65535&(f&65535))<<1)|0;if((a&1|0)==0?(h=Xa[c[k+16>>2]&31](k,a,0)|0,(h|0)!=0):0)a=b[h>>1]|0;else a=0;h=a&65535;if(yc(k,j,n,0,h)|0){l=o;return}a=k+548|0;f=c[a>>2]|0;g=f+e|0;if((g|0)>(c[n>>2]|0)){l=o;return}si(m|0,0,f|0)|0;Ac(k,m,0,h,0,f,1)|0;Ac(k,d,0,h,c[a>>2]|0,e,1)|0;Dc(k,0,h,g);b[i>>1]=(b[i>>1]|0)+1<<16>>16;l=o;return}function Ic(a,b){a=a|0;b=b|0;return}function Jc(a){a=a|0;var d=0,e=0;if(!(c[a+40>>2]|0)){a=0;return a|0}e=(c[a+56>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;a=(b[a+48>>1]|0)!=d<<16>>16&1;return a|0}function Kc(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j+4|0;i=j;if(!(c[a+40>>2]|0)){i=0;l=j;return i|0}f=a+56|0;e=(c[f>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;e=b[a+48>>1]|0;if(e<<16>>16==d<<16>>16){i=0;l=j;return i|0}d=(c[f>>2]|0)+4+(((c[a+44>>2]|0)+65535&(e&65535))<<1)|0;if((d&1|0)==0?(g=Xa[c[a+16>>2]&31](a,d,0)|0,(g|0)!=0):0)d=b[g>>1]|0;else d=0;h=(yc(a,h,i,0,d&65535)|0)==0;i=h?c[i>>2]|0:0;l=j;return i|0}function Lc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(c[a+40>>2]|0)){e=0;return e|0}i=a+56|0;g=(c[i>>2]|0)+2|0;if((g&1|0)==0?(f=Xa[c[a+16>>2]&31](a,g,0)|0,(f|0)!=0):0)f=b[f>>1]|0;else f=0;h=a+48|0;g=b[h>>1]|0;if(g<<16>>16==f<<16>>16){e=0;return e|0}f=(c[i>>2]|0)+4+(((c[a+44>>2]|0)+65535&(g&65535))<<1)|0;if((f&1|0)==0?(j=Xa[c[a+16>>2]&31](a,f,0)|0,(j|0)!=0):0)f=b[j>>1]|0;else f=0;j=f&65535;Ac(a,d,0,j,0,e,1)|0;Dc(a,0,j,e);b[h>>1]=(b[h>>1]|0)+1<<16>>16;return e|0}function Mc(b,d,e){b=b|0;d=d|0;e=e|0;a[b+288>>0]=d;a[b+289>>0]=(d&65535)>>>8;a[b+290>>0]=e;a[b+291>>0]=(e&65535)>>>8;e=b+24|0;c[e>>2]=c[e>>2]|2;e=c[b+12>>2]|0;eb[c[e>>2]&15](c[e+4>>2]|0,c[e+8>>2]|0,1);return}function Nc(a,b){a=a|0;b=b|0;var d=0;d=lf(548)|0;oc(d,a,3,4,3);c[d+272>>2]=1;c[d+64>>2]=1;c[d+544>>2]=b;return d|0}function Oc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[a+544>>2]|0;if((b|0)!=1)return 0;b=Ag(e)|0;Ac(a,b,1,d,0,e,0)|0;eb[c[f+4>>2]&15](c[f>>2]|0,b,e);Bg(b);Dc(a,1,d,0);return 0}function Pc(a,b,d){a=a|0;b=b|0;d=d|0;if(c[a+544>>2]|0){a=-1;return a|0}b=Qc(a,1,d,b)|0;if(b|0){a=b;return a|0}a=Qc(a,0,0,0)|0;return a|0}function Qc(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;if(!(c[d+40>>2]|0)){j=-1;l=k;return j|0}a[j>>0]=e;a[j+1>>0]=(e&65535)>>>8;a[j+2>>0]=f;a[j+3>>0]=(f&65535)>>>8;a[j+4>>0]=g;a[j+5>>0]=g>>>8;a[j+6>>0]=g>>>16;a[j+7>>0]=g>>>24;g=d+56|0;e=(c[g>>2]|0)+2|0;if((e&1|0)==0?(h=Xa[c[d+16>>2]&31](d,e,0)|0,(h|0)!=0):0)e=b[h>>1]|0;else e=0;h=d+48|0;f=b[h>>1]|0;if(f<<16>>16==e<<16>>16){j=-1;l=k;return j|0}e=(c[g>>2]|0)+4+(((c[d+44>>2]|0)+65535&(f&65535))<<1)|0;if((e&1|0)==0?(i=Xa[c[d+16>>2]&31](d,e,0)|0,(i|0)!=0):0)e=b[i>>1]|0;else e=0;i=e&65535;Ac(d,j,0,i,0,8,1)|0;Dc(d,0,i,8);b[h>>1]=(b[h>>1]|0)+1<<16>>16;j=0;l=k;return j|0}function Rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[a+544>>2]|0;if((g+-1|0)>>>0>=2){i=-1;return i|0}if((g|0)==1){b=Qc(a,2,0,b)|0;if(b|0){i=b;return i|0}b=Qc(a,2,1,d)|0;if(b|0){i=b;return i|0}}else{b=Qc(a,3,0,b)|0;if(b|0){i=b;return i|0}b=Qc(a,3,1,d)|0;if(b|0){i=b;return i|0}}if(e|0?(h=Qc(a,2,8,e)|0,h|0):0){i=h;return i|0}d=a+548|0;b=c[d>>2]|0;if((b|0)!=(f|0)){g=f&1;do if((g|0)!=(b&1|0)){b=Qc(a,1,272,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>1&1;do if((g|0)!=(b>>>1&1|0)){b=Qc(a,1,273,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>2&1;if((g|0)!=(b>>>2&1|0)?(i=Qc(a,1,274,g)|0,i|0):0)return i|0;c[d>>2]=f}i=Qc(a,0,0,0)|0;return i|0}function Sc(a,b){a=a|0;b=b|0;var d=0;d=lf(552)|0;oc(d,a,18,256,4);c[d+64>>2]=1;c[d+272>>2]=0;c[d+280>>2]=8;c[d+544>>2]=b;return d|0}function Tc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if((b|0)!=1)return 0;Dc(a,1,c,0);return 0}function Uc(b){b=b|0;var e=0,f=0;switch(a[b+288>>0]|0){case 1:{switch(c[b+544>>2]|0){case 0:{e=13965;break}case 1:{e=13952;break}case 2:{e=13938;break}default:ra()}f=Pg(e)|0;a[b+290>>0]=f;ri(b+296|0,e|0,f|0)|0;return}case 18:{if((c[b+544>>2]|0)!=2)return;if((d[b+289>>0]|0)>=2)return;a[b+290>>0]=20;e=b+296|0;a[e>>0]=0;a[e+1>>0]=0;a[e+2>>0]=0;a[e+3>>0]=0;a[b+300>>0]=-1;a[b+301>>0]=127;e=b+302|0;f=e+14|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));return}case 17:{e=b+290|0;a[e>>0]=0;switch(c[b+544>>2]|0){case 0:switch(a[b+289>>0]|0){case 1:{a[e>>0]=16;e=b+296|0;f=e+16|0;do{a[e>>0]=255;e=e+1|0}while((e|0)<(f|0));return}case 20:{a[e>>0]=1;return}default:return}case 1:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=3;a[b+297>>0]=1;return}default:return}case 2:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=0;a[b+297>>0]=1;return}case 3:{a[e>>0]=1;a[b+296>>0]=3;return}default:return}default:ra()}break}case 0:return;default:{a[b+290>>0]=0;return}}}function Vc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=Pg(e)|0;f=lf(564)|0;oc(f,b,9,g+2|0,5);c[f+272>>2]=1;a[f+288>>0]=g;a[f+289>>0]=g>>>8;ri(f+290|0,e|0,g|0)|0;c[f+544>>2]=d;c[f+548>>2]=8192;e=f+552|0;c[e>>2]=e;c[f+556>>2]=e;return f|0}function Wc(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;Va=l;l=l+3008|0;Ta=Va+2984|0;A=Va+2976|0;z=Va+2968|0;fa=Va+2960|0;y=Va+2944|0;x=Va+2928|0;Ia=Va+2920|0;Ga=Va+2912|0;Ea=Va+2904|0;w=Va+2888|0;v=Va+2880|0;za=Va+2872|0;u=Va+2848|0;t=Va+2840|0;s=Va+2832|0;r=Va+2816|0;q=Va+2800|0;Q=Va+2792|0;o=Va+2776|0;n=Va+2760|0;Aa=Va+2736|0;ea=Va+2712|0;xa=Va+2704|0;J=Va+2672|0;I=Va+2664|0;G=Va+2648|0;F=Va+2608|0;R=Va+2464|0;E=Va+2456|0;qa=Va+2448|0;D=Va+2440|0;pa=Va+2432|0;C=Va+2408|0;oa=Va+2400|0;B=Va+2384|0;na=Va+2376|0;p=Va+2352|0;H=Va+2344|0;m=Va+2288|0;Sa=Va+2240|0;Ha=Va+2992|0;Oa=Va+1024|0;Pa=Va;Na=Va+2120|0;Ma=Va+2988|0;Ka=Va+2104|0;Ja=Va+2088|0;Fa=Va+2072|0;ja=Va+2064|0;ka=Va+2056|0;la=Va+2048|0;La=f+544|0;Qa=c[La>>2]|0;if(g|0){h=0;l=Va;return h|0}P=f+560|0;if(c[P>>2]|0){h=-1;l=Va;return h|0}c[Ha>>2]=0;a:do if(!(Ac(f,Oa,0,h,0,7,0)|0)){Ra=a[Oa+4>>0]|0;i=a[Oa+5>>0]|0;g=(d[Oa+6>>0]<<8|i&255)&65535;c[Ha>>2]=(c[Ha>>2]|0)+7;Ra=Ra&255;Wa=Ra+-8|0;j=(g&65535)>>>8&255;do switch(Wa>>>1|Wa<<31|0){case 11:{k=-524;break a}case 0:{db[c[Qa+8>>2]&15](Qa,Sa);Ta=c[Sa>>2]|0;Ja=Sa+8|0;Ia=c[Ja>>2]|0;Ja=c[Ja+4>>2]|0;La=Sa+16|0;Ka=c[La>>2]|0;La=c[La+4>>2]|0;Na=Sa+24|0;Ma=c[Na>>2]|0;Na=c[Na+4>>2]|0;Qa=Sa+32|0;Pa=c[Qa>>2]|0;Qa=c[Qa+4>>2]|0;Ua=Sa+40|0;Wa=c[Ua>>2]|0;Ua=c[Ua+4>>2]|0;c[m>>2]=0;c[m+4>>2]=Ta;Ta=m+8|0;c[Ta>>2]=Ia;c[Ta+4>>2]=Ja;Ta=m+16|0;c[Ta>>2]=Ka;c[Ta+4>>2]=La;Ta=m+24|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Na;Ta=m+32|0;c[Ta>>2]=Pa;c[Ta+4>>2]=Qa;Ta=m+40|0;c[Ta>>2]=Wa;c[Ta+4>>2]=Ua;c[m+48>>2]=0;c[m+52>>2]=256;Ta=Xc(0,Oa,1024,13981,m)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}case 2:{c[H>>2]=Sa;c[H+4>>2]=Pa;b:do if((Yc(f,0,h,Ha,13991,H)|0)==0?(W=c[Sa>>2]|0,X=f+552|0,k=c[f+556>>2]|0,(k|0)!=(X|0)):0){while(1){if((c[k+8>>2]|0)==(W|0))break;k=c[k+4>>2]|0;if((k|0)==(X|0))break b}if(k|0?(ia=c[k+12>>2]|0,ia|0):0){j=Ag(16)|0;c[j>>2]=f;c[j+4>>2]=0;c[j+8>>2]=h;b[j+12>>1]=g;i=_a[c[Qa+24>>2]&15](Qa,Na,ia,c[Pa>>2]|0,4,j)|0;if((i|0)<1)_c(Na,i,j);else c[P>>2]=1;Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 3:{c[p>>2]=Sa;c[p+4>>2]=Ka;c[p+8>>2]=Pa;c[p+12>>2]=Na;c[p+16>>2]=Ma;if(Yc(f,0,h,Ha,13994,p)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;c:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=25;break c}}if((k|0)!=0?(ra=c[k+12>>2]|0,(ra|0)!=0):0){k=$a[c[Qa+28>>2]&3](Qa,Ja,ra,c[Ka>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0)|0;Bg(c[Ka>>2]|0);if(!k){Ta=(c[f+548>>2]|0)+-24|0;c[na>>2]=Ja;c[na+4>>2]=Ta;Ta=Xc(0,Oa,1024,14e3,na)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=25}else Ua=25;while(0);if((Ua|0)==25){Bg(c[Ka>>2]|0);k=-71}break a}case 4:{c[B>>2]=Sa;c[B+4>>2]=Na;c[B+8>>2]=Ma;c[B+12>>2]=Pa;if(Yc(f,0,h,Ha,14003,B)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;d:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break d}}if((k|0)!=0?(sa=c[k+12>>2]|0,(sa|0)!=0):0)k=_a[c[Qa+60>>2]&15](Qa,Ka,sa,c[Na>>2]|0,c[Ma>>2]|0,c[Pa>>2]|0)|0;else k=-71}else k=-71;while(0);Bg(c[Na>>2]|0);Bg(c[Ma>>2]|0);if(k|0)break a;c[oa>>2]=Ka;Ta=Xc(0,Oa,1024,14008,oa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}case 5:{c[C>>2]=Sa;c[C+4>>2]=Ja;c[C+8>>2]=Pa;c[C+12>>2]=Na;c[C+16>>2]=Ma;c[C+20>>2]=Ka;e:do if(!(Yc(f,0,h,Ha,14010,C)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;f:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break f}if(k|0?(ta=c[k+12>>2]|0,ta|0):0){k=ab[c[Qa+64>>2]&1](Qa,Fa,ta,c[Ja>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;Bg(c[Ja>>2]|0);if(k|0){g=5;break e}c[pa>>2]=Fa;Wa=Xc(0,Oa,1024,14008,pa)|0;k=Wa+7|0;g=Ag(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;ri(g+7|0,Oa|0,Wa|0)|0;Ac(f,g,0,h,0,k,1)|0;Dc(f,0,h,k);Bg(g);g=0;k=0;break e}}while(0);Bg(c[Ja>>2]|0);g=5;k=-71}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 7:{c[D>>2]=Sa;if(Yc(f,0,h,Ha,14017,D)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;g:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break g}}if((k|0)!=0?(ua=c[k+12>>2]|0,(ua|0)!=0):0){k=Ya[c[Qa+68>>2]&3](Qa,Pa,1024,ua)|0;if(!k){c[qa>>2]=Pa;Ta=Xc(0,Oa,1024,14019,qa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);break a}case 8:{c[E>>2]=Sa;c[E+4>>2]=Pa;h:do if((Yc(f,0,h,Ha,14021,E)|0)==0?(Y=c[Sa>>2]|0,Z=f+552|0,K=c[f+556>>2]|0,(K|0)!=(Z|0)):0){k=K;while(1){if((c[k+8>>2]|0)==(Y|0))break;k=c[k+4>>2]|0;if((k|0)==(Z|0))break h}if(k|0?(_=c[k+12>>2]|0,_|0):0){k=Xa[c[Qa+32>>2]&31](Qa,_,Na)|0;if(k|0)break a;ua=Pa;va=c[ua+4>>2]|0;xa=c[Na+16>>2]|0;ya=c[Na+20>>2]|0;Ta=c[Na+24>>2]|0;Aa=Na+32|0;za=c[Aa>>2]|0;Aa=c[Aa+4>>2]|0;Ca=Na+40|0;Ba=c[Ca>>2]|0;Ca=c[Ca+4>>2]|0;Ea=Na+48|0;Da=c[Ea>>2]|0;Ea=c[Ea+4>>2]|0;Ga=Na+56|0;Fa=c[Ga>>2]|0;Ga=c[Ga+4>>2]|0;Ia=Na+64|0;Ha=c[Ia>>2]|0;Ia=c[Ia+4>>2]|0;Ka=Na+72|0;Ja=c[Ka>>2]|0;Ka=c[Ka+4>>2]|0;La=c[Na+80>>2]|0;Pa=Na+88|0;Ma=c[Pa>>2]|0;Pa=c[Pa+4>>2]|0;Qa=c[Na+96>>2]|0;Wa=Na+104|0;Sa=c[Wa>>2]|0;Wa=c[Wa+4>>2]|0;Ua=c[Na+112>>2]|0;wa=R;c[wa>>2]=c[ua>>2];c[wa+4>>2]=va;c[R+8>>2]=Na;c[R+12>>2]=xa;c[R+16>>2]=ya;c[R+20>>2]=Ta;Ta=R+24|0;c[Ta>>2]=za;c[Ta+4>>2]=Aa;Ta=R+32|0;c[Ta>>2]=Ba;c[Ta+4>>2]=Ca;Ta=R+40|0;c[Ta>>2]=Da;c[Ta+4>>2]=Ea;Ta=R+48|0;c[Ta>>2]=Fa;c[Ta+4>>2]=Ga;Ta=R+56|0;c[Ta>>2]=Ha;c[Ta+4>>2]=Ia;Ta=R+64|0;c[Ta>>2]=Ja;c[Ta+4>>2]=Ka;Ta=R+72|0;c[Ta>>2]=La;c[Ta+4>>2]=0;Ta=R+80|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Pa;Ta=R+88|0;c[Ta>>2]=Qa;c[Ta+4>>2]=0;Ta=R+96|0;c[Ta>>2]=Sa;c[Ta+4>>2]=Wa;Ta=R+104|0;c[Ta>>2]=Ua;c[Ta+4>>2]=0;Ta=R+112|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+120|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+128|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+136|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=Xc(0,Oa,1024,14024,R)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 9:{c[F>>2]=Sa;c[F+4>>2]=Pa;c[F+8>>2]=Na;c[F+12>>2]=Ma;c[F+16>>2]=Ka;c[F+20>>2]=Ja;c[F+24>>2]=Fa;c[F+28>>2]=ja;c[F+32>>2]=ka;c[F+36>>2]=la;i:do if(!(Yc(f,0,h,Ha,14045,F)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){g=4;k=0;break i}}if((k|0)!=0?(va=c[k+12>>2]|0,(va|0)!=0):0){La=Fa;Oa=ja;Wa=ka;k=la;k=bb[c[Qa+36>>2]&1](Qa,va,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0,c[Ja>>2]|0,c[Ja+4>>2]|0,c[La>>2]|0,c[La+4>>2]|0,c[Oa>>2]|0,c[Oa+4>>2]|0,c[Wa>>2]|0,c[Wa+4>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0;if(!k){g=Ag(7)|0;a[g>>0]=7;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ac(f,g,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(g);g=0;k=0}else g=5}else{g=4;k=0}}else{g=4;k=0}}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:case 4:{Ua=262;break a}default:i=0}l=Va;return i|0}case 16:{c[G>>2]=Sa;c[G+4>>2]=Na;c[G+8>>2]=Pa;j:do if((Yc(f,0,h,Ha,14056,G)|0)==0?($=c[Sa>>2]|0,aa=f+552|0,L=c[f+556>>2]|0,(L|0)!=(aa|0)):0){k=L;while(1){if((c[k+8>>2]|0)==($|0))break;k=c[k+4>>2]|0;if((k|0)==(aa|0))break j}if(k|0?(ma=c[k+12>>2]|0,ma|0):0){k=c[Pa>>2]|0;g=Ag(k+4|0)|0;Wa=Na;k=_a[c[Qa+44>>2]&15](Qa,ma,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0)break a;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,g|0,k+4|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Bg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 21:{c[I>>2]=Sa;if(Yc(f,0,h,Ha,14017,I)|0){Ua=262;break a}Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}case 22:{n=Pa+28|0;c[J>>2]=Sa;c[J+4>>2]=Pa;c[J+8>>2]=Pa+4;c[J+12>>2]=Pa+8;c[J+16>>2]=Pa+16;c[J+20>>2]=Pa+24;c[J+24>>2]=n;if(Yc(f,0,h,Ha,14060,J)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;k:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=106;break k}}if((k|0)!=0?(ya=c[k+12>>2]|0,(ya|0)!=0):0){k=Xa[c[Qa+80>>2]&31](Qa,ya,Pa)|0;Bg(c[n>>2]|0);if((k|0)>=0){c[xa>>2]=k;Ta=Xc(0,Oa,1024,14068,xa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=106}else Ua=106;while(0);if((Ua|0)==106){Bg(c[n>>2]|0);k=-71}break a}case 23:{n=Pa+8|0;o=Pa+16|0;p=Pa+24|0;q=Pa+28|0;c[ea>>2]=Sa;c[ea+4>>2]=Pa;c[ea+8>>2]=n;c[ea+12>>2]=o;c[ea+16>>2]=p;c[ea+20>>2]=q;if(Yc(f,0,h,Ha,14070,ea)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;l:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break l}}if((k|0)!=0?(Ba=c[k+12>>2]|0,(Ba|0)!=0):0){k=Xa[c[Qa+84>>2]&31](Qa,Ba,Pa)|0;if((k|0)>=0){c[Aa>>2]=Pa;c[Aa+4>>2]=n;c[Aa+8>>2]=o;c[Aa+12>>2]=p;c[Aa+16>>2]=q;Ta=Xc(0,Oa,1024,14077,Aa)|0;Bg(c[q>>2]|0);Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);Bg(c[q>>2]|0);break a}case 31:{c[n>>2]=Sa;c[n+4>>2]=Pa;c[n+8>>2]=Na;if(Yc(f,0,h,Ha,14083,n)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;m:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=127;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==127)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=134;break m}}if((k|0)!=0?(Ca=c[k+12>>2]|0,(m|0)!=0&(Ca|0)!=0):0){k=Ya[c[Qa+56>>2]&3](Qa,m,Ca,c[Na>>2]|0)|0;Bg(c[Na>>2]|0);if(!k){Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=134}else Ua=134;while(0);if((Ua|0)==134){Bg(c[Na>>2]|0);k=-71}break a}case 32:{c[o>>2]=Sa;c[o+4>>2]=Ma;c[o+8>>2]=Pa;c[o+12>>2]=Na;n:do if((Yc(f,0,h,Ha,14087,o)|0)==0?(ba=c[Sa>>2]|0,ca=f+552|0,M=c[f+556>>2]|0,(M|0)!=(ca|0)):0){k=M;while(1){if((c[k+8>>2]|0)==(ba|0))break;k=c[k+4>>2]|0;if((k|0)==(ca|0))break n}if(k|0?(da=c[k+12>>2]|0,da|0):0){k=_a[c[Qa+20>>2]&15](Qa,Ka,da,c[Ma>>2]|0,c[Pa>>2]|0,c[Na>>2]|0)|0;if(k|0)break a;c[Q>>2]=Ka;Ta=Xc(0,Oa,1024,14008,Q)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 33:{c[q>>2]=Sa;c[q+4>>2]=Na;c[q+8>>2]=Pa;c[q+12>>2]=Ma;if(Yc(f,0,h,Ha,14092,q)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;o:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=156;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==156)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){k=-71;break o}}if((k|0)!=0?(Da=c[k+12>>2]|0,(m|0)!=0&(Da|0)!=0):0)k=Za[c[Qa+72>>2]&7](Qa,m,c[Na>>2]|0,Da,c[Ma>>2]|0)|0;else k=-71}else k=-71;while(0);Bg(c[Na>>2]|0);Bg(c[Ma>>2]|0);if(k|0)break a;Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}case 34:{c[r>>2]=Sa;c[r+4>>2]=Na;c[r+8>>2]=Pa;if(Yc(f,0,h,Ha,14097,r)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;p:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=174;break p}}if((k|0)!=0?(wa=c[k+12>>2]|0,(wa|0)!=0):0){k=Xa[c[Qa+76>>2]&31](Qa,wa,c[Na>>2]|0)|0;Bg(c[Na>>2]|0);if(!k){Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=174}else Ua=174;while(0);if((Ua|0)==174){Bg(c[Na>>2]|0);k=-71}break a}case 46:{c[s>>2]=Sa;c[s+4>>2]=Pa;if(Yc(f,0,h,Ha,14101,s)|0){Ua=262;break a}Ta=f+548|0;c[Ta>>2]=c[Sa>>2];Bg(c[Pa>>2]|0);c[t>>2]=c[Ta>>2];c[t+4>>2]=14104;Ta=Xc(0,Oa,1024,14101,t)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}case 48:{c[u>>2]=Sa;c[u+4>>2]=Pa;c[u+8>>2]=Ma;c[u+12>>2]=Ka;c[u+16>>2]=Na;if(!(Yc(f,0,h,Ha,14113,u)|0)){k=_a[c[Qa+12>>2]&15](Qa,Fa,Ja,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;if(!k){p=c[Sa>>2]|0;m=c[Fa>>2]|0;n=f+552|0;o=f+556|0;g=c[o>>2]|0;q:do if((g|0)!=(n|0)){k=g;while(1){if((c[k+8>>2]|0)==(p|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=190;break q}}if(k){Qa=c[La>>2]|0;Wa=k+12|0;db[c[Qa+4>>2]&15](Qa,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=190}else Ua=190;while(0);if((Ua|0)==190){Wa=Ag(16)|0;c[Wa+8>>2]=p;c[Wa+12>>2]=m;c[o>>2]=Wa;c[Wa>>2]=n;c[Wa+4>>2]=g;c[g>>2]=Wa}Bg(c[Ma>>2]|0);Bg(c[Ka>>2]|0);c[za>>2]=Ja;Wa=Xc(0,Oa,1024,14008,za)|0;k=Wa+7|0;g=Ag(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;ri(g+7|0,Oa|0,Wa|0)|0;Ac(f,g,0,h,0,k,1)|0;Dc(f,0,h,k);Bg(g);g=0;k=0}else g=5}else{g=2;k=0}switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 50:{c[v>>2]=Sa;if(Yc(f,0,h,Ha,14119,v)|0){Ua=262;break a}Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}case 51:{c[w>>2]=Sa;c[w+4>>2]=Pa;c[w+8>>2]=Na;r:do if(!(Yc(f,0,h,Ha,14121,w)|0)){g=c[Sa>>2]|0;p=f+552|0;q=f+556|0;k=c[q>>2]|0;s:do if((k|0)!=(p|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0))break s}if(k|0){k=c[k+12>>2]|0;c[Ma>>2]=k;if(!k)break r;m=lf(e[Na>>1]<<2)|0;Wa=b[Na>>1]|0;n=Ag((Wa&65535)<<4)|0;t:do if(!(Wa<<16>>16)){g=0;Ua=209}else{k=0;do{c[Ea>>2]=m+(k<<2);k=k+1|0;if(Yc(f,0,h,Ha,14019,Ea)|0){k=-71;break t}g=b[Na>>1]|0}while(k>>>0<(g&65535)>>>0);g=g&65535;k=c[Ma>>2]|0;Ua=209}while(0);if((Ua|0)==209)k=_a[c[Qa+16>>2]&15](Qa,Ma,n,k,g,m)|0;if(b[Na>>1]|0){g=0;do{Bg(c[m+(g<<2)>>2]|0);g=g+1|0}while(g>>>0<(e[Na>>1]|0)>>>0)}Bg(m);if((k|0)<0){Bg(n);break a}c[Ga>>2]=k;g=Xc(0,Oa,1024,14119,Ga)|0;if(!k)o=g;else{m=0;do{c[Ia>>2]=n+(m<<4);g=(Xc(0,Oa+g|0,1024-g|0,14008,Ia)|0)+g|0;m=m+1|0}while((m|0)<(k|0));o=g}Bg(n);n=c[Pa>>2]|0;m=c[Ma>>2]|0;g=c[q>>2]|0;u:do if((g|0)!=(p|0)){k=g;while(1){if((c[k+8>>2]|0)==(n|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0)){Ua=223;break u}}if(k){Ta=c[La>>2]|0;Wa=k+12|0;db[c[Ta+4>>2]&15](Ta,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=223}else Ua=223;while(0);if((Ua|0)==223){Wa=Ag(16)|0;c[Wa+8>>2]=n;c[Wa+12>>2]=m;c[q>>2]=Wa;c[Wa>>2]=p;c[Wa+4>>2]=g;c[g>>2]=Wa}Ua=o+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,o|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);c[Ma>>2]=0}while(0);Ua=262;break a}case 54:{c[x>>2]=Sa;c[x+4>>2]=Na;c[x+8>>2]=Pa;v:do if((Yc(f,0,h,Ha,14056,x)|0)==0?(S=c[Sa>>2]|0,T=f+552|0,N=c[f+556>>2]|0,(N|0)!=(T|0)):0){k=N;while(1){if((c[k+8>>2]|0)==(S|0))break;k=c[k+4>>2]|0;if((k|0)==(T|0))break v}if(k|0?(ga=c[k+12>>2]|0,ga|0):0){k=c[Pa>>2]|0;g=Ag(k+4|0)|0;Wa=Na;k=_a[c[Qa+48>>2]&15](Qa,ga,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0){Bg(g);break a}a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,g|0,k+4|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Bg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 55:{c[y>>2]=Sa;c[y+4>>2]=Na;c[y+8>>2]=Pa;w:do if((Yc(f,0,h,Ha,14056,y)|0)==0?(U=c[Sa>>2]|0,V=f+552|0,O=c[f+556>>2]|0,(O|0)!=(V|0)):0){k=O;while(1){if((c[k+8>>2]|0)==(U|0))break;k=c[k+4>>2]|0;if((k|0)==(V|0))break w}if(k|0?(ha=c[k+12>>2]|0,ha|0):0){Wa=c[Pa>>2]|0;g=Ag(Wa)|0;if(Ac(f,g,0,h,c[Ha>>2]|0,Wa,0)|0){Bg(g);break}k=Na;k=_a[c[Qa+52>>2]&15](Qa,ha,c[k>>2]|0,c[k+4>>2]|0,g,c[Pa>>2]|0)|0;Bg(g);if((k|0)<0)break a;c[fa>>2]=k;Ta=Xc(0,Oa,1024,14017,fa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 56:{c[z>>2]=Sa;if(Yc(f,0,h,Ha,14017,z)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;x:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break x}if(k|0){Ua=c[La>>2]|0;db[c[Ua+4>>2]&15](Ua,c[k+12>>2]|0);Ua=c[k>>2]|0;Wa=c[k+4>>2]|0;c[Ua+4>>2]=Wa;c[Wa>>2]=Ua;Bg(k)}}while(0);Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}default:{c[A>>2]=Ra;Yh(14125,A)|0;Ua=262;break a}}while(0)}else{i=0;j=0;Ua=262}while(0);if((Ua|0)==262)k=-71;c[Ta>>2]=0-k;Ta=Xc(0,Sa,4,14017,Ta)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=7;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Sa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}function Xc(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;c[k>>2]=g;j=d+e|0;e=a[f>>0]|0;if(!(e<<24>>24)){k=d;d=k-d|0;l=m;return d|0}b=d;a:while(1){f=f+1|0;switch(e<<24>>24|0){case 98:{e=b+1|0;if(e>>>0>j>>>0){e=5;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;b=e;break}case 104:{e=b+2|0;if(e>>>0>j>>>0){e=8;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;b=e;break}case 119:{e=b+4|0;if(e>>>0>j>>>0){e=11;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=i>>>8;a[b+2>>0]=i>>>16;a[b+3>>0]=i>>>24;b=e;break}case 100:{e=b+8|0;if(e>>>0>j>>>0){e=14;break a}g=(c[k>>2]|0)+(8-1)&~(8-1);i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;c[k>>2]=g+8;a[b>>0]=h;a[b+1>>0]=h>>>8;a[b+2>>0]=h>>>16;a[b+3>>0]=h>>>24;a[b+4>>0]=i;a[b+5>>0]=ni(h|0,i|0,40)|0;a[b+6>>0]=ni(h|0,i|0,48)|0;a[b+7>>0]=ni(h|0,i|0,56)|0;b=e;break}case 115:{i=(c[k>>2]|0)+(4-1)&~(4-1);h=c[i>>2]|0;c[k>>2]=i+4;i=Pg(h)|0;if((i|0)>=65536){e=17;break a}e=b+2|0;g=e+i|0;if(g>>>0>j>>>0){e=19;break a}a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;ri(e|0,h|0,i|0)|0;b=g;break}case 81:{e=b+13|0;if(e>>>0>j>>>0){e=22;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=a[i>>0]|0;h=c[i+4>>2]|0;a[b+1>>0]=h;a[b+2>>0]=h>>>8;a[b+3>>0]=h>>>16;a[b+4>>0]=h>>>24;i=i+8|0;h=c[i>>2]|0;i=c[i+4>>2]|0;a[b+5>>0]=h;a[b+6>>0]=h>>>8;a[b+7>>0]=h>>>16;a[b+8>>0]=h>>>24;a[b+9>>0]=i;a[b+10>>0]=ni(h|0,i|0,40)|0;a[b+11>>0]=ni(h|0,i|0,48)|0;a[b+12>>0]=ni(h|0,i|0,56)|0;b=e;break}default:{e=24;break a}}e=a[f>>0]|0;if(!(e<<24>>24)){e=26;break}}if((e|0)==5)ja(14158,13903,1783,14177);else if((e|0)==8)ja(14186,13903,1793,14177);else if((e|0)==11)ja(14205,13903,1803,14177);else if((e|0)==14)ja(14224,13903,1813,14177);else if((e|0)==17)ja(14243,13903,1832,14177);else if((e|0)==19)ja(14256,13903,1833,14177);else if((e|0)==22)ja(14281,13903,1843,14177);else if((e|0)==24)ra();else if((e|0)==26){k=b;d=k-d|0;l=m;return d|0}return 0}function Yc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;x=l;l=l+32|0;u=x+16|0;v=x;m=c[h>>2]|0;c[u>>2]=j;k=a[i>>0]|0;a:do if(k<<24>>24){n=v+1|0;o=v+2|0;p=v+3|0;q=v+4|0;r=v+5|0;s=v+6|0;t=v+7|0;j=m;b:while(1){i=i+1|0;switch(k<<24>>24|0){case 98:{if(Ac(e,v,f,g,j,1,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;a[m>>0]=a[v>>0]|0;j=j+1|0;break}case 104:{if(Ac(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;b[m>>1]=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;break}case 119:{if(Ac(e,v,f,g,j,4,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;j=j+4|0;break}case 100:{if(Ac(e,v,f,g,j,8,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;k=(d[r>>0]|0)<<8|(d[q>>0]|0)|(d[s>>0]|0)<<16|(d[t>>0]|0)<<24;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;c[m+4>>2]=k;j=j+8|0;break}case 115:{if(Ac(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}m=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;k=Ag(m+1|0)|0;if(Ac(e,k,f,g,j,m,0)|0){j=-1;k=18;break b}a[k+m>>0]=0;z=(c[u>>2]|0)+(4-1)&~(4-1);y=c[z>>2]|0;c[u>>2]=z+4;c[y>>2]=k;j=m+j|0;break}default:{k=15;break b}}k=a[i>>0]|0;if(!(k<<24>>24)){w=j;break a}}if((k|0)==15)ra();else if((k|0)==18){l=x;return j|0}}else w=m;while(0);c[h>>2]=w;z=0;l=x;return z|0}function Zc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[e>>2]|0;a=c[e+4>>2]|0;_c(b,d,e);c[f+560>>2]=0;xc(f,a);return}function _c(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+64|0;k=m+40|0;j=m+32|0;g=m+48|0;h=m;i=c[f>>2]|0;if((e|0)<0){d=c[f+4>>2]|0;h=c[f+8>>2]|0;n=b[f+12>>1]|0;c[j>>2]=0-e;e=Xc(0,g,4,14017,j)|0;j=e+7|0;k=Ag(j)|0;a[k>>0]=j;a[k+1>>0]=j>>>8;a[k+2>>0]=j>>>16;a[k+3>>0]=j>>>24;a[k+4>>0]=7;a[k+5>>0]=n;a[k+6>>0]=(n&65535)>>>8;ri(k+7|0,g|0,e|0)|0;Ac(i,k,d,h,0,j,1)|0;Dc(i,d,h,j);Bg(k);Bg(f);l=m;return}else{e=(c[i+548>>2]|0)+-24|0;c[k>>2]=d;c[k+4>>2]=e;e=Xc(0,h,32,14e3,k)|0;g=c[f+4>>2]|0;j=c[f+8>>2]|0;d=b[f+12>>1]|0;k=e+7|0;n=Ag(k)|0;a[n>>0]=k;a[n+1>>0]=k>>>8;a[n+2>>0]=k>>>16;a[n+3>>0]=k>>>24;a[n+4>>0]=13;a[n+5>>0]=d;a[n+6>>0]=(d&65535)>>>8;ri(n+7|0,h|0,e|0)|0;Ac(i,n,g,j,0,k,1)|0;Dc(i,g,j,k);Bg(n);Bg(f);l=m;return}}function $c(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+32|0;d=e+16|0;c[d>>2]=b;_a[c[a+16>>2]&15](a,d,e,b,0,0)|0;l=e;return c[d>>2]|0}function ad(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;p=r+20|0;j=r+24|0;k=r+16|0;q=r;c[p>>2]=d;i=(f|0)==0;n=b+16|0;o=b+4|0;m=1;g=(a[e>>0]|0)==47?e+1|0:e;while(1){h=Tg(g,47)|0;if(!h){c[j>>2]=g;if(!i){e=5;break}g=1;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0}else{e=h-g|0;s=Ag(e+1|0)|0;c[j>>2]=s;ri(s|0,g|0,e|0)|0;a[s+e>>0]=0;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0;Bg(c[j>>2]|0);g=0}if(!m)db[c[o>>2]&15](b,c[p>>2]|0);d=c[k>>2]|0;c[p>>2]=d;if((e|0)<1){e=13;break}if(g){e=15;break}else{m=0;g=h+1|0}}if((e|0)==5){c[f>>2]=g;if(!m){s=d;l=r;return s|0}if((_a[c[n>>2]&15](b,p,q,d,0,0)|0)<0){c[p>>2]=0;s=0;l=r;return s|0}else{s=c[p>>2]|0;l=r;return s|0}}else if((e|0)==13){db[c[o>>2]&15](b,d);c[p>>2]=0;s=0;l=r;return s|0}else if((e|0)==15){l=r;return d|0}return 0}function bd(a,b,c){a=a|0;b=b|0;c=c|0;return ad(a,b,c,0)|0}function cd(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=l;l=l+16|0;e=m;b=lf(208)|0;c[b>>2]=9;c[b+4>>2]=7;c[b+8>>2]=8;c[b+12>>2]=1;c[b+16>>2]=2;c[b+20>>2]=3;c[b+24>>2]=4;c[b+28>>2]=1;c[b+32>>2]=10;c[b+36>>2]=1;c[b+40>>2]=9;c[b+44>>2]=5;c[b+48>>2]=6;c[b+52>>2]=7;c[b+56>>2]=1;c[b+60>>2]=8;c[b+64>>2]=1;c[b+68>>2]=2;c[b+72>>2]=6;c[b+76>>2]=11;c[b+80>>2]=12;c[b+84>>2]=13;n=b+88|0;c[n>>2]=n;o=b+92|0;c[o>>2]=n;j=b+128|0;f=j;c[f>>2]=1;c[f+4>>2]=0;f=b+136|0;c[f>>2]=12;g=b+140|0;c[g>>2]=4096;h=b+104|0;c[h>>2]=1048576;c[h+4>>2]=0;h=b+120|0;c[h>>2]=262144;c[h+4>>2]=0;h=b+148|0;c[h>>2]=h;c[b+152>>2]=h;h=b+168|0;c[h>>2]=67108864;c[h+4>>2]=0;h=b+176|0;c[h>>2]=h;c[b+180>>2]=h;h=b+184|0;c[h>>2]=h;c[b+188>>2]=h;h=b+192|0;c[h>>2]=h;c[b+196>>2]=h;h=lf(104)|0;i=h+16|0;c[i>>2]=1;c[h+20>>2]=0;p=j;d=c[p+4>>2]|0;k=h+8|0;c[k>>2]=c[p>>2];c[k+4>>2]=d;k=j;k=ei(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[j>>2]=k;c[j+4>>2]=y;j=h+24|0;c[j>>2]=4;c[h+28>>2]=511;c[h+32>>2]=0;c[h+36>>2]=0;k=h+56|0;c[k>>2]=k;c[h+60>>2]=k;d=c[o>>2]|0;c[o>>2]=h;c[h>>2]=n;c[h+4>>2]=d;c[d>>2]=h;d=b+96|0;n=d;n=ei(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;c[d>>2]=n;c[d+4>>2]=y;Oa(e|0,0)|0;d=c[e>>2]|0;c[h+40>>2]=d;e=(c[e+4>>2]|0)*1e3|0;c[h+48>>2]=e;c[h+44>>2]=d;c[h+52>>2]=e;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)!=4)ja(14301,14319,456,14328);p=lf(18)|0;c[p+8>>2]=h;d=p+13|0;a[d>>0]=46;a[d+1>>0]=0;d=h+64|0;e=c[d>>2]|0;o=e+18|0;t=ei(c[g>>2]|0,0,-1,-1)|0;s=y;n=ei(t|0,s|0,o|0,((o|0)<0)<<31>>31|0)|0;r=c[f>>2]|0;n=ni(n|0,y|0,r|0)|0;q=y;e=ei(t|0,s|0,e|0,((e|0)<0)<<31>>31|0)|0;r=ni(e|0,y|0,r|0)|0;e=b+112|0;s=e;r=fi(c[s>>2]|0,c[s+4>>2]|0,r|0,y|0)|0;q=ei(r|0,y|0,n|0,q|0)|0;n=e;c[n>>2]=q;c[n+4>>2]=y;c[d>>2]=o;o=c[k>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[p+4>>2]=k;c[k>>2]=p;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)==4){t=lf(19)|0;c[t+8>>2]=h;o=t+13|0;a[o>>0]=a[14342]|0;a[o+1>>0]=a[14343]|0;a[o+2>>0]=a[14344]|0;o=c[d>>2]|0;s=o+19|0;j=ei(c[g>>2]|0,0,-1,-1)|0;n=y;r=ei(j|0,n|0,s|0,((s|0)<0)<<31>>31|0)|0;p=c[f>>2]|0;r=ni(r|0,y|0,p|0)|0;q=y;o=ei(j|0,n|0,o|0,((o|0)<0)<<31>>31|0)|0;p=ni(o|0,y|0,p|0)|0;o=e;p=fi(c[o>>2]|0,c[o+4>>2]|0,p|0,y|0)|0;q=ei(p|0,y|0,r|0,q|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;c[d>>2]=s;s=c[k>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[t+4>>2]=k;c[k>>2]=t;c[b+144>>2]=h;l=m;return b|0}else ja(14301,14319,456,14328);return 0}function dd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+88|0;b=c[a+92>>2]|0;if((b|0)!=(h|0))do{e=b;b=c[b+4>>2]|0;c[e+16>>2]=0;if((c[e+24>>2]|0)==4){g=e+56|0;f=e+60|0;d=c[f>>2]|0;if((d|0)!=(g|0))do{j=d+4|0;i=d;d=c[j>>2]|0;k=c[i>>2]|0;c[k+4>>2]=d;c[d>>2]=k;c[i>>2]=0;c[j>>2]=0;Bg(i)}while((d|0)!=(g|0));c[g>>2]=g;c[f>>2]=g}Ad(a,e)}while((b|0)!=(h|0));k=a+148|0;if((c[k+4>>2]|0)==(k|0)){Bg(c[a+200>>2]|0);return}else ja(15144,14319,1527,15178)}function ed(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+8|0;if(c[d>>2]|0)c[d>>2]=0;d=b+16|0;e=c[d>>2]|0;if(e|0){f=c[e+4>>2]|0;if(f|0)c[f>>2]=0;Bg(e);c[d>>2]=0}d=c[b+4>>2]|0;e=d+20|0;f=c[e>>2]|0;if((f|0)<=0)ja(14992,14319,397,15011);c[e>>2]=f+-1;if((f|0)!=1){Bg(b);return}if((c[d+16>>2]|0)>=1){Bg(b);return}Ad(a,d);Bg(b);return}function fd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=1024;d=a+120|0;e=d;f=a+136|0;e=oi(c[e>>2]|0,c[e+4>>2]|0,(c[f>>2]|0)+-10|0)|0;g=b+8|0;c[g>>2]=e;c[g+4>>2]=y;g=a+112|0;g=fi(c[d>>2]|0,c[d+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0)|0;f=oi(g|0,y|0,(c[f>>2]|0)+-10|0)|0;g=y;d=b+16|0;c[d>>2]=f;c[d+4>>2]=g;d=b+24|0;c[d>>2]=f;c[d+4>>2]=g;d=a+104|0;g=d;f=c[g+4>>2]|0;e=b+32|0;c[e>>2]=c[g>>2];c[e+4>>2]=f;a=a+96|0;a=fi(c[d>>2]|0,c[d+4>>2]|0,c[a>>2]|0,c[a+4>>2]|0)|0;b=b+40|0;c[b>>2]=a;c[b+4>>2]=y;return}function gd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=b+144|0;g=c[b>>2]|0;h=lf(20)|0;i=g+20|0;c[i>>2]=(c[i>>2]|0)+1;c[h+4>>2]=g;c[h>>2]=f;c[d>>2]=h;b=c[b>>2]|0;d=c[b+24>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;g=b+8|0;h=c[g+4>>2]|0;i=e+8|0;c[i>>2]=c[g>>2];c[i+4>>2]=h;return 0}function hd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=c[f+4>>2]|0;a:do if((g|0)>0){b=0;do{k=c[h+(b<<2)>>2]|0;if((c[i+24>>2]|0)!=4)break a;l=i+56|0;j=c[i+60>>2]|0;if((j|0)==(l|0))break a;while(1){if(!(Og(j+13|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(l|0))break a}if(!j)break a;i=c[j+8>>2]|0;j=e+(b<<4)|0;k=c[i+24>>2]|0;do if((k|0)!=4)if((k|0)==10){a[j>>0]=2;break}else{a[j>>0]=0;break}else a[j>>0]=-128;while(0);c[e+(b<<4)+4>>2]=0;j=i+8|0;k=c[j+4>>2]|0;l=e+(b<<4)+8|0;c[l>>2]=c[j>>2];c[l+4>>2]=k;b=b+1|0}while((b|0)<(g|0))}else b=0;while(0);h=c[f>>2]|0;f=lf(20)|0;g=i+20|0;c[g>>2]=(c[g>>2]|0)+1;c[f+4>>2]=i;c[f>>2]=h;c[d>>2]=f;return b|0}function id(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;s=l;l=l+16|0;n=s;q=c[e+4>>2]|0;r=q+24|0;if((c[r>>2]|0)!=4){d=-20;l=s;return d|0}p=q+56|0;i=c[q+60>>2]|0;a:do if((i|0)!=(p|0)){while(1){if(!(Og(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(p|0))break a}if(i|0){d=-17;l=s;return d|0}}while(0);j=c[e>>2]|0;k=lf(104)|0;e=k+16|0;c[e>>2]=1;c[k+20>>2]=0;m=b+128|0;u=m;t=c[u+4>>2]|0;o=k+8|0;i=o;c[i>>2]=c[u>>2];c[i+4>>2]=t;i=m;i=ei(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[m>>2]=i;c[m+4>>2]=y;m=k+24|0;c[m>>2]=4;c[k+28>>2]=g&4095;c[k+32>>2]=j;c[k+36>>2]=h;j=k+56|0;c[j>>2]=j;c[k+60>>2]=j;g=b+92|0;h=c[g>>2]|0;c[g>>2]=k;c[k>>2]=b+88;c[k+4>>2]=h;c[h>>2]=k;h=b+96|0;g=h;g=ei(c[g>>2]|0,c[g+4>>2]|0,1,0)|0;c[h>>2]=g;c[h+4>>2]=y;Oa(n|0,0)|0;h=c[n>>2]|0;c[k+40>>2]=h;n=(c[n+4>>2]|0)*1e3|0;c[k+48>>2]=n;c[k+44>>2]=h;c[k+52>>2]=n;c[e>>2]=(c[e>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);u=lf(18)|0;c[u+8>>2]=k;e=u+13|0;a[e>>0]=46;a[e+1>>0]=0;e=k+64|0;i=c[e>>2]|0;t=i+18|0;g=b+140|0;z=ei(c[g>>2]|0,0,-1,-1)|0;x=y;v=ei(z|0,x|0,t|0,((t|0)<0)<<31>>31|0)|0;h=b+136|0;w=c[h>>2]|0;v=ni(v|0,y|0,w|0)|0;n=y;i=ei(z|0,x|0,i|0,((i|0)<0)<<31>>31|0)|0;w=ni(i|0,y|0,w|0)|0;i=b+112|0;b=i;b=fi(c[b>>2]|0,c[b+4>>2]|0,w|0,y|0)|0;n=ei(b|0,y|0,v|0,n|0)|0;b=i;c[b>>2]=n;c[b+4>>2]=y;c[e>>2]=t;t=c[j>>2]|0;c[t+4>>2]=u;c[u>>2]=t;c[u+4>>2]=j;c[j>>2]=u;u=q+16|0;c[u>>2]=(c[u>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);z=lf(19)|0;c[z+8>>2]=q;t=z+13|0;a[t>>0]=a[14342]|0;a[t+1>>0]=a[14343]|0;a[t+2>>0]=a[14344]|0;t=c[e>>2]|0;x=t+19|0;n=ei(c[g>>2]|0,0,-1,-1)|0;b=y;w=ei(n|0,b|0,x|0,((x|0)<0)<<31>>31|0)|0;u=c[h>>2]|0;w=ni(w|0,y|0,u|0)|0;v=y;t=ei(n|0,b|0,t|0,((t|0)<0)<<31>>31|0)|0;u=ni(t|0,y|0,u|0)|0;t=i;u=fi(c[t>>2]|0,c[t+4>>2]|0,u|0,y|0)|0;v=ei(u|0,y|0,w|0,v|0)|0;w=i;c[w>>2]=v;c[w+4>>2]=y;c[e>>2]=x;x=c[j>>2]|0;c[x+4>>2]=z;c[z>>2]=x;c[z+4>>2]=j;c[j>>2]=z;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);x=Pg(f)|0;w=x+17|0;z=lf(w)|0;c[z+8>>2]=k;ri(z+13|0,f|0,x+1|0)|0;x=q+64|0;r=c[x>>2]|0;w=r+w|0;f=ei(c[g>>2]|0,0,-1,-1)|0;q=y;u=ei(f|0,q|0,w|0,((w|0)<0)<<31>>31|0)|0;t=c[h>>2]|0;u=ni(u|0,y|0,t|0)|0;v=y;r=ei(f|0,q|0,r|0,((r|0)<0)<<31>>31|0)|0;t=ni(r|0,y|0,t|0)|0;r=i;t=fi(c[r>>2]|0,c[r+4>>2]|0,t|0,y|0)|0;v=ei(t|0,y|0,u|0,v|0)|0;c[i>>2]=v;c[i+4>>2]=y;c[x>>2]=w;i=c[p>>2]|0;c[i+4>>2]=z;c[z>>2]=i;c[z+4>>2]=p;c[p>>2]=z;i=c[m>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;w=o;x=c[w+4>>2]|0;z=d+8|0;c[z>>2]=c[w>>2];c[z+4>>2]=x;z=0;l=s;return z|0}function jd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=c[e+4>>2]|0;l=e+8|0;if(c[l>>2]|0)c[l>>2]=0;i=e+16|0;j=c[i>>2]|0;if(j|0){k=c[j+4>>2]|0;if(k|0)c[k>>2]=0;Bg(j);c[i>>2]=0}j=u+24|0;i=c[j>>2]|0;a:do if(f&65536){if((i|0)!=4){h=-20;return h|0}}else{switch(i|0){case 4:case 8:break a;default:i=-22}return i|0}while(0);c[e+12>>2]=f;b:do if((c[j>>2]|0)==8){if(!((f&512|0)==0|(f&3|0)==0))Gd(b,u,0,0)|0;t=u+56|0;c:do switch(c[t>>2]|0){case 0:break b;case 1:{k=u+80|0;j=c[k>>2]|0;k=c[k+4>>2]|0;f=b+176|0;i=c[b+180>>2]|0;d:do if((i|0)!=(f|0)){while(1){s=i+8|0;if((c[s>>2]|0)==(j|0)?(c[s+4>>2]|0)==(k|0):0)break;i=c[i+4>>2]|0;if((i|0)==(f|0))break d}s=i+16|0;i=c[i+20>>2]|0;if((i|0)!=(s|0)){q=b+184|0;r=b+188|0;do{k=c[i+12>>2]|0;e:do if(!(c[i+8>>2]|0)){j=Ed(b,k)|0;if((j|0?(c[j+24>>2]|0)==8:0)?(c[j+56>>2]|0)==1:0)Hd(b,j,0)|0}else{j=c[r>>2]|0;if((j|0)!=(q|0)){while(1){if(!(Og(c[j+8>>2]|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(q|0))break e}if(j|0){o=Ed(b,k)|0;do if((o|0?(c[o+24>>2]|0)==8:0)?(c[o+56>>2]|0)==1:0){p=j+12|0;n=j+16|0;k=c[n>>2]|0;if((k|0)==(p|0))break e;f=0;d=0;m=0;do{l=Ed(b,c[k+24>>2]|0)|0;do if(l){if((c[l+24>>2]|0)!=8)break;f=(c[l+56>>2]|0)==1?1:f}while(0);l=k+16|0;m=ei(c[l>>2]|0,c[l+4>>2]|0,m|0,d|0)|0;d=y;k=c[k+4>>2]|0}while((k|0)!=(p|0));if(!f)break e;if(!((d|0)==0?(m|0)==(c[o+60>>2]|0):0))break;Hd(b,o,1)|0;j=c[n>>2]|0;if((j|0)==(p|0))break e;m=o+96|0;l=0;d=0;while(1){k=j+24|0;f=Ed(b,c[k>>2]|0)|0;f:do if(f|0){if((c[f+24>>2]|0)!=8)break;if((c[f+56>>2]|0)!=1)break;o=j+16|0;do if((c[o+4>>2]|0)==0?(c[o>>2]|0)==(c[f+60>>2]|0):0){n=f+80|0;o=j+8|0;if(!((c[n>>2]|0)==(c[o>>2]|0)?(c[n+4>>2]|0)==(c[o+4>>2]|0):0))break;Hd(b,f,2)|0;o=f+96|0;k=c[o>>2]|0;f=k+24|0;n=(c[m>>2]|0)+40|0;v=c[n>>2]|0;c[v+4>>2]=f;c[f>>2]=v;c[k+28>>2]=n;c[n>>2]=f;o=(c[o>>2]|0)+32|0;c[o>>2]=l;c[o+4>>2]=d;break f}while(0);k=Ed(b,c[k>>2]|0)|0;if(!k)break;if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Hd(b,k,0)|0}while(0);v=j+16|0;l=ei(c[v>>2]|0,c[v+4>>2]|0,l|0,d|0)|0;j=c[j+4>>2]|0;if((j|0)==(p|0))break e;else d=y}}while(0);f=j+12|0;j=c[j+16>>2]|0;if((j|0)!=(f|0))do{k=Ed(b,c[j+24>>2]|0)|0;do if(k|0){if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Hd(b,k,0)|0}while(0);j=c[j+4>>2]|0}while((j|0)!=(f|0))}}}while(0);i=c[i+4>>2]|0}while((i|0)!=(s|0));if((c[t>>2]|0)==2)break c}}while(0);i=Hd(b,u,0)|0;if(i|0){v=i;return v|0}v=c[u+96>>2]|0;c[v+48>>2]=e;c[v+52>>2]=g;c[v+56>>2]=h;v=1;return v|0}case 2:break;case 3:{h=u+88|0;v=c[h>>2]|0;g=u+92|0;e=c[g>>2]|0;c[v+4>>2]=e;c[e>>2]=v;c[h>>2]=0;c[g>>2]=0;e=b+148|0;b=e+4|0;v=c[b>>2]|0;c[b>>2]=h;c[h>>2]=e;c[g>>2]=v;c[v>>2]=h;break b}default:ra()}while(0);i=c[u+96>>2]|0;j=i+52|0;if(c[j>>2]|0){v=-5;return v|0}c[i+48>>2]=e;c[j>>2]=g;c[i+56>>2]=h;v=1;return v|0}while(0);c[l>>2]=1;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=u+8|0;h=c[g+4>>2]|0;v=d+8|0;c[v>>2]=c[g>>2];c[v+4>>2]=h;v=0;return v|0}function kd(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+16|0;u=x;w=e+4|0;v=c[w>>2]|0;r=v+24|0;if((c[r>>2]|0)!=4){d=-20;l=x;return d|0}s=v+56|0;j=c[v+60>>2]|0;a:do if((j|0)!=(s|0)){while(1){if(!(Og(j+13|0,f)|0))break;j=c[j+4>>2]|0;if((j|0)==(s|0))break a}if(j|0){d=-17;l=x;return d|0}}while(0);t=e+8|0;if(c[t>>2]|0)c[t>>2]=0;j=e+16|0;k=c[j>>2]|0;if(k|0){m=c[k+4>>2]|0;if(m|0)c[m>>2]=0;Bg(k);c[j>>2]=0}m=c[e>>2]|0;n=lf(104)|0;c[n+16>>2]=1;o=n+20|0;c[o>>2]=0;p=b+128|0;z=p;j=c[z+4>>2]|0;q=n+8|0;k=q;c[k>>2]=c[z>>2];c[k+4>>2]=j;k=p;k=ei(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[p>>2]=k;c[p+4>>2]=y;p=n+24|0;c[p>>2]=8;c[n+28>>2]=h&4095;c[n+32>>2]=m;c[n+36>>2]=i;Ga(n+64|0);h=b+92|0;i=c[h>>2]|0;c[h>>2]=n;c[n>>2]=b+88;c[n+4>>2]=i;c[i>>2]=n;i=b+96|0;h=i;h=ei(c[h>>2]|0,c[h+4>>2]|0,1,0)|0;c[i>>2]=h;c[i+4>>2]=y;Oa(u|0,0)|0;i=c[u>>2]|0;c[n+40>>2]=i;u=(c[u+4>>2]|0)*1e3|0;c[n+48>>2]=u;c[n+44>>2]=i;c[n+52>>2]=u;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);k=Pg(f)|0;m=k+17|0;j=lf(m)|0;c[j+8>>2]=n;ri(j+13|0,f|0,k+1|0)|0;k=v+64|0;z=c[k>>2]|0;m=z+m|0;f=ei(c[b+140>>2]|0,0,-1,-1)|0;h=y;u=ei(f|0,h|0,m|0,((m|0)<0)<<31>>31|0)|0;i=c[b+136>>2]|0;u=ni(u|0,y|0,i|0)|0;v=y;z=ei(f|0,h|0,z|0,((z|0)<0)<<31>>31|0)|0;i=ni(z|0,y|0,i|0)|0;z=b+112|0;h=z;i=fi(c[h>>2]|0,c[h+4>>2]|0,i|0,y|0)|0;v=ei(i|0,y|0,u|0,v|0)|0;c[z>>2]=v;c[z+4>>2]=y;c[k>>2]=m;k=c[s>>2]|0;c[k+4>>2]=j;c[j>>2]=k;c[j+4>>2]=s;c[s>>2]=j;j=c[w>>2]|0;k=j+20|0;m=c[k>>2]|0;if((m|0)<=0)ja(14992,14319,397,15011);c[k>>2]=m+-1;if((m|0)==1?(c[j+16>>2]|0)<1:0)Ad(b,j);c[o>>2]=(c[o>>2]|0)+1;c[w>>2]=n;c[t>>2]=1;c[e+12>>2]=g;j=c[p>>2]|0;do if((j|0)!=4)if((j|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=q;w=c[g+4>>2]|0;z=d+8|0;c[z>>2]=c[g>>2];c[z+4>>2]=w;z=0;l=x;return z|0}function ld(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;h=i+24|0;d=c[h>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;d=i+8|0;g=c[d+4>>2]|0;f=e+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=g;c[e+16>>2]=c[h>>2]<<12|c[i+28>>2];c[e+20>>2]=c[i+32>>2];c[e+24>>2]=c[i+36>>2];f=c[i+16>>2]|0;g=e+32|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;switch(c[h>>2]|0){case 2:case 6:{d=c[i+56>>2]<<8|c[i+60>>2];f=0;break}default:{d=0;f=0}}g=e+40|0;c[g>>2]=d;c[g+4>>2]=f;g=b+140|0;f=e+56|0;c[f>>2]=c[g>>2];c[f+4>>2]=0;switch(c[h>>2]|0){case 8:{d=c[i+60>>2]|0;f=0;break}case 10:{d=Pg(c[i+56>>2]|0)|0;f=0;break}case 4:{f=c[i+64>>2]|0;d=f;f=((f|0)<0)<<31>>31;break}default:{d=0;f=0}}h=e+48|0;c[h>>2]=d;c[h+4>>2]=f;g=c[g>>2]|0;h=ei(d|0,f|0,-1,-1)|0;g=ei(h|0,y|0,g|0,0)|0;b=c[b+136>>2]|0;g=ni(g|0,y|0,b|0)|0;b=oi(g|0,y|0,b+-9|0)|0;g=e+64|0;c[g>>2]=b;c[g+4>>2]=y;g=i+40|0;b=e+72|0;c[b>>2]=c[g>>2];c[b+4>>2]=0;b=i+48|0;c[e+80>>2]=c[b>>2];h=e+88|0;c[h>>2]=c[g>>2];c[h+4>>2]=0;c[e+96>>2]=c[b>>2];b=e+104|0;c[b>>2]=c[i+44>>2];c[b+4>>2]=0;c[e+112>>2]=c[i+52>>2];return 0}function md(a,b,d,e,f,g,h,i,j,k,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;var s=0;p=l;l=l+16|0;n=p;m=c[b+4>>2]|0;if(d&1|0)c[m+28>>2]=e;if(d&2|0)c[m+32>>2]=f;if(d&4|0)c[m+36>>2]=g;if(d&8|0?(s=Gd(a,m,h,i)|0,s|0):0){i=s;l=p;return i|0}do if(d&32|0)if(!(d&256)){Oa(n|0,0)|0;c[m+40>>2]=c[n>>2];c[m+48>>2]=(c[n+4>>2]|0)*1e3;break}else{c[m+40>>2]=o;c[m+48>>2]=q;break}while(0);if(!(d&64)){i=0;l=p;return i|0}Oa(n|0,0)|0;c[m+44>>2]=c[n>>2];c[m+52>>2]=(c[n+4>>2]|0)*1e3;i=0;l=p;return i|0}function nd(a,b){a=a|0;b=b|0;var d=0;a=b+8|0;if(c[a>>2]|0)c[a>>2]=0;a=b+16|0;b=c[a>>2]|0;if(!b)return;d=c[b+4>>2]|0;if(d|0)c[d>>2]=0;Bg(b);c[a>>2]=0;return}function od(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;return h|0}if((c[b+24>>2]|0)!=4){h=-71;return h|0}m=b+56|0;b=c[b+60>>2]|0;a:do if((e|0)==0&(f|0)==0){e=b;i=0;d=0}else{i=0;d=0;while(1){if((b|0)==(m|0)){b=0;break}i=ei(i|0,d|0,1,0)|0;d=y;b=c[b+4>>2]|0;if(!(d>>>0<f>>>0|(d|0)==(f|0)&i>>>0<e>>>0)){e=b;break a}}return b|0}while(0);if((e|0)==(m|0)){h=0;return h|0}b=0;while(1){f=e+13|0;j=Pg(f)|0;k=b+24|0;l=k+j|0;if((l|0)>(h|0)){d=11;break}i=ei(i|0,d|0,1,0)|0;d=y;p=c[e+8>>2]|0;n=p+24|0;o=c[n>>2]|0;a[g+b>>0]=(o|0)==4?-128:(o|0)==10?2:0;o=g+(b+1)|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;a[o+3>>0]=0;o=g+(b+5)|0;p=p+8|0;q=c[p>>2]|0;p=c[p+4>>2]|0;a[o>>0]=q;a[o+1>>0]=q>>>8;a[o+2>>0]=q>>>16;a[o+3>>0]=q>>>24;a[o+4>>0]=p;r=ni(q|0,p|0,40)|0;a[o+5>>0]=r;r=ni(q|0,p|0,48)|0;a[o+6>>0]=r;p=ni(q|0,p|0,56)|0;a[o+7>>0]=p;o=g+(b+13)|0;a[o>>0]=i;a[o+1>>0]=i>>>8;a[o+2>>0]=i>>>16;a[o+3>>0]=i>>>24;a[o+4>>0]=d;p=ni(i|0,d|0,40)|0;a[o+5>>0]=p;p=ni(i|0,d|0,48)|0;a[o+6>>0]=p;p=ni(i|0,d|0,56)|0;a[o+7>>0]=p;a[g+(b+21)>>0]=c[n>>2];b=g+(b+22)|0;a[b>>0]=j;a[b+1>>0]=(j&65535)>>>8;ri(g+k|0,f|0,j|0)|0;e=c[e+4>>2]|0;if((e|0)==(m|0)){b=l;d=11;break}else b=l}if((d|0)==11)return b|0;return 0}function pd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=c[b+4>>2]|0;if(!(c[b+8>>2]|0)){g=-71;return g|0}if((c[h+24>>2]|0)!=8){g=-5;return g|0}if((c[b+12>>2]&3|0)==1){g=-5;return g|0}if(!(c[h+100>>2]|0)){i=c[h+60>>2]|0;a=fi(i|0,0,d|0,e|0)|0;b=y;if(!(0>e>>>0|0==(e|0)&i>>>0>d>>>0)){i=0;return i|0}i=((g|0)<0)<<31>>31;i=b>>>0<i>>>0|(b|0)==(i|0)&a>>>0<g>>>0?a:g;Ha(h+64|0,d|0,f|0,i|0);return i|0}else{a=c[b+16>>2]|0;if(!a){i=-5;return i|0}i=c[a+8>>2]|0;i=(i|0)<(g|0)?i:g;ri(f|0,a+12|0,i|0)|0;return i|0}return 0}function qd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=l;l=l+4480|0;k=L+4448|0;A=L+4472|0;F=L+3408|0;H=L+2384|0;B=L+1360|0;J=L+336|0;x=L+208|0;v=L+80|0;z=L+4432|0;I=L+4464|0;w=L+4460|0;G=L+64|0;q=L+4456|0;m=L+4452|0;j=L;s=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;l=L;return h|0}if((c[s+24>>2]|0)!=8){h=-5;l=L;return h|0}if(!(c[d+12>>2]&3)){h=-5;l=L;return h|0}if(!h){h=0;l=L;return h|0}if(!(c[s+100>>2]|0)){f=ei(h|0,((h|0)<0)<<31>>31|0,e|0,f|0)|0;i=y;j=s+60|0;if(i>>>0>0|((i|0)==0?f>>>0>(c[j>>2]|0)>>>0:0)?(p=Gd(b,s,f,i)|0,p|0):0){h=p;l=L;return h|0}Oa(A|0,0)|0;c[s+40>>2]=c[A>>2];c[s+48>>2]=(c[A+4>>2]|0)*1e3;f=s+56|0;do if((c[f>>2]|0)==3){K=s+88|0;H=c[K>>2]|0;J=s+92|0;I=c[J>>2]|0;c[H+4>>2]=I;c[I>>2]=H;c[K>>2]=0;c[J>>2]=0;J=b+160|0;K=J;K=fi(c[K>>2]|0,c[K+4>>2]|0,c[j>>2]|0,0)|0;b=y;c[J>>2]=K;c[J+4>>2]=b;if((b|0)>-1|(b|0)==-1&K>>>0>4294967295){c[f>>2]=0;break}else ja(14470,14319,1283,14936)}while(0);La(s+64|0,e|0,g|0,h|0);l=L;return h|0}e=Ag(h+1|0)|0;ri(e|0,g|0,h|0)|0;a[e+h>>0]=0;c[m>>2]=e;a:do if((ie(j,64,m)|0)<0)K=104;else{do if(!(Og(j,14688)|0)){f=c[d>>2]|0;c[A>>2]=c[m>>2];p=d+16|0;b:do if((((((c[p>>2]|0)==0?(ie(J,1024,A)|0)>=0:0)?(ie(x,128,A)|0)>=0:0)?(ie(v,128,A)|0)>=0:0)?(ie(H,1024,A)|0)>=0:0)?(ie(F,1024,A)|0)>=0:0){do if(((ie(B,1024,A)|0)>=0?(r=Pg(B)|0,(r&1|0)==0):0)?(t=r>>1,(r|0)<=33):0){if((pe(G,B,t)|0)<0)break;if((r|0)<0){f=-5;break b}if((le(q,A)|0)<0){f=-5;break b}o=(t|0)==0;if((t|16|0)!=16){f=-5;break b}m=(a[x>>0]|0)==0?0:x;k=(a[v>>0]|0)==0?0:v;if(_a[c[b+12>>2]&15](b,I,z,f,28468,28468)|0)ja(14692,14319,2526,14740);n=ad(b,c[I>>2]|0,F,w)|0;do if(!n){f=-2;i=b+4|0}else{Xa[c[b+76>>2]&31](b,n,c[w>>2]|0)|0;f=$a[c[b+28>>2]&3](b,z,n,c[w>>2]|0,514,384,0)|0;c:do if((f|0)<0)j=0;else{do if(a[H>>0]|0){j=bd(b,c[I>>2]|0,H)|0;if(!j){j=0;f=-2;break c}f=_a[c[b+24>>2]&15](b,z,j,0,0,0)|0;if((f|0)<0)break c;f=c[j+4>>2]|0;if((c[f+24>>2]|0)!=8)ja(14751,14319,2555,14740);if(!(c[f+56>>2]|0)){C=j;D=c[f+60>>2]|0;E=0;break}else ja(14751,14319,2555,14740)}else{C=0;D=0;E=0}while(0);i=lf(260)|0;c[i+4>>2]=c[I>>2];c[i+8>>2]=n;c[i+12>>2]=C;if(o)f=0;else{f=i+16|0;rf(G,128,f)|0}I=lf(76)|0;c[I>>2]=0;c[I+8>>2]=0;c[I+4>>2]=i;c[i>>2]=d;c[p>>2]=I;be(b,n,J,m,k,C,D,E,2,i,f);f=0;break b}while(0);i=b+4|0;db[c[i>>2]&15](b,n);if(!j)break;db[c[i>>2]&15](b,j)}while(0);db[c[i>>2]&15](b,c[I>>2]|0);break b}while(0);f=-5}else f=-5;while(0)}else{if(!(Og(j,14806)|0)){c[A>>2]=c[m>>2];d:do if((((ie(H,1024,A)|0)>=0?(ie(J,1024,A)|0)>=0:0)?(ie(x,128,A)|0)>=0:0)?(ie(v,128,A)|0)>=0:0){do if(((ie(B,1024,A)|0)>=0?(i=Pg(B)|0,(i&1|0)==0):0)?(o=i>>1,(i|0)<=33):0){if((pe(G,B,o)|0)<0)break;if((i|0)<0){f=-22;break d}j=(a[x>>0]|0)==0?0:x;i=(a[v>>0]|0)==0?0:v;switch(o|0){case 0:{f=0;break}case 16:{rf(G,128,F)|0;f=F;break}default:{f=-22;break d}}Dd(b,H,J,j,i,f);f=0;break d}while(0);f=-22}else f=-22;while(0);break}if(!(Og(j,14819)|0)){c[A>>2]=c[m>>2];e:do if((ie(B,1024,A)|0)>=0){if((c[b>>2]|0)!=9)ja(14834,14319,1665,14849);i=b+192|0;f=c[i+4>>2]|0;if((f|0)!=(i|0)){while(1){if(!(Og(c[f+12>>2]|0,B)|0))break;f=c[f+4>>2]|0;if((f|0)==(i|0)){f=0;break e}}if(f){Bd(f);f=0}else f=0}else f=0}else f=-22;while(0);break}if(!(Og(j,14871)|0)){c[A>>2]=c[m>>2];if((((ie(J,1024,A)|0)>=0?(ie(B,1024,A)|0)>=0:0)?(ne(F,A)|0)>=0:0)?(ke(H,A)|0)>=0:0){f=Ed(b,J)|0;if(!f)f=-2;else{I=F;J=H;f=Fd(b,f,B,c[I>>2]|0,c[I+4>>2]|0,c[J>>2]|0,c[J+4>>2]|0)|0}}else f=-22;break}if(!(Og(j,14879)|0)){c[A>>2]=c[m>>2];f:do if((ie(B,1024,A)|0)>=0){f=Ed(b,B)|0;if(f)if((c[f+24>>2]|0)==8){switch(c[f+56>>2]|0){case 3:case 0:break;default:{f=-5;break f}}I=yh(B,47)|0;J=f+60|0;b=Ag(c[J>>2]|0)|0;Ha(f+64|0,0,b|0,c[J>>2]|0);Ma(((I|0)==0?B:I+1|0)|0,b|0,c[J>>2]|0);Bg(b);f=0}else f=-5;else f=-2}else f=-5;while(0);break}if(Og(j,14891)|0){if(Og(j,14898)|0){c[k>>2]=j;Yh(14913,k)|0;K=104;break a}c[A>>2]=c[m>>2];if((ie(B,1024,A)|0)<0)f=-22;else{f=b+200|0;Bg(c[f>>2]|0);c[f>>2]=Ah(B)|0;f=0}break}c[A>>2]=c[m>>2];j=d+16|0;g:do if(!(c[j>>2]|0)){do if(((ie(B,1024,A)|0)>=0?(n=Pg(B)|0,(n&1|0)==0):0)?(u=n>>1,(n|0)<=2049):0){if((pe(J,B,u)|0)<0)break;if((n|0)<0){f=-22;break g}do if((ie(B,1024,A)|0)<0)f=-1;else{f=Pg(B)|0;if(f&1|0){f=-1;break}i=f>>1;if((f|0)>257){f=-1;break}f=(pe(x,B,i)|0)<0;f=f?-1:i}while(0);if((le(F,A)|0)<0){f=-22;break g}if((le(H,A)|0)<0){f=-22;break g}if(((c[H>>2]|0)+-1|0)>>>0>63){f=-22;break g}b=lf(76)|0;c[b>>2]=1;I=c[H>>2]|0;c[b+8>>2]=I;ee(J,u,x,f,c[F>>2]|0,I,b+12|0);c[j>>2]=b;f=0;break g}while(0);f=-22}else f=-5;while(0)}while(0);Bg(e);f=(f|0)==0?h:f}while(0);if((K|0)==104){Bg(e);f=-5}h=f;l=L;return h|0}function rd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[b+4>>2]|0;g=c[d+4>>2]|0;if((c[g+24>>2]|0)==4){e=-1;return e|0}d=h+24|0;a:do if((c[d>>2]|0)==4?(i=h+56|0,f=c[h+60>>2]|0,(f|0)!=(i|0)):0){b=f;while(1){if(!(Og(b+13|0,e)|0))break;b=c[b+4>>2]|0;if((b|0)==(i|0))break a}if(b|0){e=-17;return e|0}}while(0);i=g+16|0;c[i>>2]=(c[i>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);j=Pg(e)|0;l=j+17|0;i=lf(l)|0;c[i+8>>2]=g;ri(i+13|0,e|0,j+1|0)|0;e=h+56|0;h=h+64|0;j=c[h>>2]|0;g=j+l|0;l=ei(c[a+140>>2]|0,0,-1,-1)|0;k=y;d=ei(l|0,k|0,g|0,((g|0)<0)<<31>>31|0)|0;b=c[a+136>>2]|0;d=ni(d|0,y|0,b|0)|0;f=y;j=ei(l|0,k|0,j|0,((j|0)<0)<<31>>31|0)|0;b=ni(j|0,y|0,b|0)|0;a=a+112|0;j=a;b=fi(c[j>>2]|0,c[j+4>>2]|0,b|0,y|0)|0;f=ei(b|0,y|0,d|0,f|0)|0;c[a>>2]=f;c[a+4>>2]=y;c[h>>2]=g;a=c[e>>2]|0;c[a+4>>2]=i;c[i>>2]=a;c[i+4>>2]=e;c[e>>2]=i;e=0;return e|0}function sd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=l;l=l+16|0;k=o;m=c[e+4>>2]|0;n=m+24|0;a:do if((c[n>>2]|0)==4?(j=m+56|0,i=c[m+60>>2]|0,(i|0)!=(j|0)):0){while(1){if(!(Og(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(j|0))break a}if(i|0){d=-17;l=o;return d|0}}while(0);p=c[e>>2]|0;i=lf(104)|0;c[i+16>>2]=1;c[i+20>>2]=0;j=b+128|0;s=j;r=c[s+4>>2]|0;e=i+8|0;q=e;c[q>>2]=c[s>>2];c[q+4>>2]=r;q=j;q=ei(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[j>>2]=q;c[j+4>>2]=y;j=i+24|0;c[j>>2]=10;c[i+28>>2]=511;c[i+32>>2]=p;c[i+36>>2]=h;p=b+92|0;h=c[p>>2]|0;c[p>>2]=i;c[i>>2]=b+88;c[i+4>>2]=h;c[h>>2]=i;h=b+96|0;p=h;p=ei(c[p>>2]|0,c[p+4>>2]|0,1,0)|0;c[h>>2]=p;c[h+4>>2]=y;Oa(k|0,0)|0;h=c[k>>2]|0;c[i+40>>2]=h;k=(c[k+4>>2]|0)*1e3|0;c[i+48>>2]=k;c[i+44>>2]=h;c[i+52>>2]=k;c[i+56>>2]=Ah(g)|0;if((c[n>>2]|0)!=4)ja(14301,14319,456,14328);r=Pg(f)|0;q=r+17|0;s=lf(q)|0;c[s+8>>2]=i;ri(s+13|0,f|0,r+1|0)|0;i=m+56|0;r=m+64|0;p=c[r>>2]|0;q=p+q|0;g=ei(c[b+140>>2]|0,0,-1,-1)|0;h=y;m=ei(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;k=c[b+136>>2]|0;m=ni(m|0,y|0,k|0)|0;n=y;p=ei(g|0,h|0,p|0,((p|0)<0)<<31>>31|0)|0;k=ni(p|0,y|0,k|0)|0;p=b+112|0;h=p;k=fi(c[h>>2]|0,c[h+4>>2]|0,k|0,y|0)|0;n=ei(k|0,y|0,m|0,n|0)|0;c[p>>2]=n;c[p+4>>2]=y;c[r>>2]=q;r=c[i>>2]|0;c[r+4>>2]=s;c[s>>2]=r;c[s+4>>2]=i;c[i>>2]=s;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;q=e;r=c[q+4>>2]|0;s=d+8|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;s=0;l=o;return s|0}function td(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;s=l;l=l+16|0;q=s;n=c[e+4>>2]|0;r=g>>>12;o=r&15;r=r&255;switch(r&15){case 1:case 2:case 6:case 8:case 12:break;default:{d=-22;l=s;return d|0}}p=n+24|0;a:do if((c[p>>2]|0)==4?(m=n+56|0,k=c[n+60>>2]|0,(k|0)!=(m|0)):0){while(1){if(!(Og(k+13|0,f)|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break a}if(k|0){d=-17;l=s;return d|0}}while(0);t=c[e>>2]|0;k=lf(104)|0;c[k+16>>2]=1;c[k+20>>2]=0;m=b+128|0;w=m;v=c[w+4>>2]|0;e=k+8|0;u=e;c[u>>2]=c[w>>2];c[u+4>>2]=v;u=m;u=ei(c[u>>2]|0,c[u+4>>2]|0,1,0)|0;c[m>>2]=u;c[m+4>>2]=y;m=k+24|0;c[m>>2]=o;c[k+28>>2]=g&4095;c[k+32>>2]=t;c[k+36>>2]=j;switch(r&15){case 8:{Ga(k+64|0);break}case 4:{w=k+56|0;c[w>>2]=w;c[k+60>>2]=w;break}default:{}}w=b+92|0;v=c[w>>2]|0;c[w>>2]=k;c[k>>2]=b+88;c[k+4>>2]=v;c[v>>2]=k;v=b+96|0;w=v;w=ei(c[w>>2]|0,c[w+4>>2]|0,1,0)|0;c[v>>2]=w;c[v+4>>2]=y;Oa(q|0,0)|0;v=c[q>>2]|0;c[k+40>>2]=v;w=(c[q+4>>2]|0)*1e3|0;c[k+48>>2]=w;c[k+44>>2]=v;c[k+52>>2]=w;if((o|4|0)==6){c[k+56>>2]=h;c[k+60>>2]=i}if((c[p>>2]|0)!=4)ja(14301,14319,456,14328);v=Pg(f)|0;u=v+17|0;w=lf(u)|0;c[w+8>>2]=k;ri(w+13|0,f|0,v+1|0)|0;k=n+56|0;v=n+64|0;t=c[v>>2]|0;u=t+u|0;h=ei(c[b+140>>2]|0,0,-1,-1)|0;i=y;q=ei(h|0,i|0,u|0,((u|0)<0)<<31>>31|0)|0;j=c[b+136>>2]|0;q=ni(q|0,y|0,j|0)|0;r=y;t=ei(h|0,i|0,t|0,((t|0)<0)<<31>>31|0)|0;j=ni(t|0,y|0,j|0)|0;t=b+112|0;i=t;j=fi(c[i>>2]|0,c[i+4>>2]|0,j|0,y|0)|0;r=ei(j|0,y|0,q|0,r|0)|0;c[t>>2]=r;c[t+4>>2]=y;c[v>>2]=u;v=c[k>>2]|0;c[v+4>>2]=w;c[w>>2]=v;c[w+4>>2]=k;c[k>>2]=w;k=c[m>>2]|0;do if((k|0)!=4)if((k|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;u=e;v=c[u+4>>2]|0;w=d+8|0;c[w>>2]=c[u>>2];c[w+4>>2]=v;w=0;l=s;return w|0}function ud(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[f+4>>2]|0;if((c[b+24>>2]|0)!=10){e=-5;return e|0}f=c[b+56>>2]|0;b=Pg(f)|0;e=e+-1|0;e=(b|0)<(e|0)?b:e;ri(d|0,f|0,e|0)|0;a[d+e>>0]=0;e=0;return e|0}function vd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=b+4|0;b=c[l>>2]|0;if((c[b+24>>2]|0)!=4){a=-2;return a|0}h=b+56|0;b=c[b+60>>2]|0;if((b|0)==(h|0)){a=-2;return a|0}k=b;while(1){if(!(Og(k+13|0,d)|0))break;b=c[k+4>>2]|0;if((b|0)==(h|0)){b=-2;i=28;break}else k=b}if((i|0)==28)return b|0;if(!k){a=-2;return a|0}e=e+4|0;h=c[e>>2]|0;d=h+24|0;a:do if((c[d>>2]|0)==4?(j=h+56|0,g=c[h+60>>2]|0,(g|0)!=(j|0)):0){while(1){if(!(Og(g+13|0,f)|0))break;b=c[g+4>>2]|0;if((b|0)==(j|0)){e=0;break a}else g=b}if(g){b=c[g+8>>2]|0;if((c[b+24>>2]|0)==4){a=-17;return a|0}else{zd(a,h,g);h=c[e>>2]|0;e=b;d=h+24|0;break}}else e=0}else e=0;while(0);b=k+8|0;g=c[b>>2]|0;j=g+16|0;c[j>>2]=(c[j>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);i=Pg(f)|0;p=i+17|0;j=lf(p)|0;c[j+8>>2]=g;ri(j+13|0,f|0,i+1|0)|0;g=h+56|0;h=h+64|0;i=c[h>>2]|0;f=i+p|0;p=ei(c[a+140>>2]|0,0,-1,-1)|0;o=y;m=ei(p|0,o|0,f|0,((f|0)<0)<<31>>31|0)|0;n=c[a+136>>2]|0;m=ni(m|0,y|0,n|0)|0;d=y;i=ei(p|0,o|0,i|0,((i|0)<0)<<31>>31|0)|0;n=ni(i|0,y|0,n|0)|0;i=a+112|0;o=i;n=fi(c[o>>2]|0,c[o+4>>2]|0,n|0,y|0)|0;d=ei(n|0,y|0,m|0,d|0)|0;c[i>>2]=d;c[i+4>>2]=y;c[h>>2]=f;h=c[g>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[j+4>>2]=g;c[g>>2]=j;h=c[b>>2]|0;zd(a,c[l>>2]|0,k);b=h+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)==1?(c[h+20>>2]|0)<1:0)Ad(a,h);if(!e){p=0;return p|0}b=e+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)!=1){p=0;return p|0}if((c[e+20>>2]|0)>=1){p=0;return p|0}Ad(a,e);p=0;return p|0}function wd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!(Og(d,19070)|0)){o=-2;return o|0}if(!(Og(d,14342)|0)){o=-2;return o|0}m=b+4|0;g=c[m>>2]|0;if((c[g+24>>2]|0)!=4){o=-2;return o|0}f=g+56|0;b=c[g+60>>2]|0;if((b|0)==(f|0)){o=-2;return o|0}while(1){if(!(Og(b+13|0,d)|0))break;e=c[b+4>>2]|0;if((e|0)==(f|0)){k=-2;l=30;break}else b=e}if((l|0)==30)return k|0;if(!b){o=-2;return o|0}i=b+8|0;j=c[i>>2]|0;do if((c[j+24>>2]|0)==4){h=j+56|0;e=c[j+60>>2]|0;a:do if((e|0)!=(h|0)){f=e;do{d=f+13|0;if(Og(d,19070)|0?Og(d,14342)|0:0){k=-39;l=30;break}f=c[f+4>>2]|0}while((f|0)!=(h|0));if((l|0)==30)return k|0;while(1){d=e;e=c[e+4>>2]|0;f=c[d+8>>2]|0;zd(a,j,d);d=f+16|0;g=c[d>>2]|0;if((g|0)<=0)break;c[d>>2]=g+-1;if((g|0)==1?(c[f+20>>2]|0)<1:0)Ad(a,f);if((e|0)==(h|0))break a}ja(14345,14319,389,14362)}while(0);if(!(c[j+64>>2]|0)){n=c[m>>2]|0;o=c[i>>2]|0;break}else ja(14375,14319,576,14394)}else{n=g;o=j}while(0);zd(a,n,b);b=o+16|0;e=c[b>>2]|0;if((e|0)<=0)ja(14345,14319,389,14362);c[b>>2]=e+-1;if((e|0)!=1){o=0;return o|0}if((c[o+20>>2]|0)>=1){o=0;return o|0}Ad(a,o);o=0;return o|0}function xd(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function yd(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function zd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=Pg(d+13|0)|0;e=b+64|0;i=c[e>>2]|0;b=-17-k+i|0;k=ei(c[a+140>>2]|0,0,-1,-1)|0;j=y;f=ei(k|0,j|0,b|0,((b|0)<0)<<31>>31|0)|0;h=c[a+136>>2]|0;f=ni(f|0,y|0,h|0)|0;g=y;i=ei(k|0,j|0,i|0,((i|0)<0)<<31>>31|0)|0;h=ni(i|0,y|0,h|0)|0;a=a+112|0;i=a;h=fi(c[i>>2]|0,c[i+4>>2]|0,h|0,y|0)|0;g=ei(h|0,y|0,f|0,g|0)|0;f=a;c[f>>2]=g;c[f+4>>2]=y;c[e>>2]=b;if((b|0)<=-1)ja(14639,14319,554,14658);k=a;j=c[k+4>>2]|0;if((j|0)>-1|(j|0)==-1&(c[k>>2]|0)>>>0>4294967295){j=c[d>>2]|0;k=c[d+4>>2]|0;c[j+4>>2]=k;c[k>>2]=j;Bg(d);return}else ja(14451,14319,555,14658)}function Ad(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c[b+16>>2]|0)ja(14404,14319,334,14421);if(c[b+20>>2]|0)ja(14432,14319,335,14421);a:do switch(c[b+24>>2]|0){case 8:{d=b+60|0;k=c[a+140>>2]|0;k=ni(ei(ei(c[d>>2]|0,0,-1,-1)|0,y|0,k|0,0)|0,y|0,c[a+136>>2]|0)|0;h=a+112|0;i=h;k=fi(c[i>>2]|0,c[i+4>>2]|0,k|0,y|0)|0;i=y;c[h>>2]=k;c[h+4>>2]=i;if(!((i|0)>-1|(i|0)==-1&k>>>0>4294967295))ja(14451,14319,339,14421);Ia(b+64|0);switch(c[b+56>>2]|0){case 0:break a;case 3:{k=b+88|0;h=c[k>>2]|0;i=b+92|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[k>>2]=0;c[i>>2]=0;i=a+160|0;k=i;k=fi(c[k>>2]|0,c[k+4>>2]|0,c[d>>2]|0,0)|0;j=y;c[i>>2]=k;c[i+4>>2]=j;if((j|0)>-1|(j|0)==-1&k>>>0>4294967295){Bd(c[b+72>>2]|0);break a}else ja(14470,14319,348,14421);break}case 2:{k=c[b+96>>2]|0;d=c[k+8>>2]|0;if(d|0)Xd(d);i=k+4|0;d=c[i>>2]|0;do if((d|0)==1){h=k+40|0;d=c[k+44>>2]|0;if((d|0)!=(h|0)){while(1){e=d;d=c[d+4>>2]|0;e=c[e+-12>>2]|0;f=e+56|0;if((c[f>>2]|0)!=2){e=18;break}g=c[e+96>>2]|0;c[f>>2]=1;Ia(e+64|0);e=c[g+52>>2]|0;if(e|0)fb[e&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){e=g+24|0;m=c[e>>2]|0;f=g+28|0;l=c[f>>2]|0;c[m+4>>2]=l;c[l>>2]=m;c[e>>2]=0;c[f>>2]=0}e=c[g+16>>2]|0;if(e|0)ae(e);Bg(g);if((d|0)==(h|0)){e=26;break}}if((e|0)==18)ja(14496,14319,754,14532);else if((e|0)==26){j=c[i>>2]|0;e=27;break}}}else{j=d;e=27}while(0);if((e|0)==27?(j|0)==2:0){l=k+24|0;i=c[l>>2]|0;m=k+28|0;j=c[m>>2]|0;c[i+4>>2]=j;c[j>>2]=i;c[l>>2]=0;c[m>>2]=0}d=c[k+16>>2]|0;if(d|0)ae(d);Bg(k);Bd(c[b+72>>2]|0);break a}case 1:{Bd(c[b+72>>2]|0);break a}default:ra()}break}case 10:{Bg(c[b+56>>2]|0);break}case 4:{if((c[b+60>>2]|0)!=(b+56|0))ja(14550,14319,376,14421);break}default:{}}while(0);m=c[b>>2]|0;l=c[b+4>>2]|0;c[m+4>>2]=l;c[l>>2]=m;Bg(b);b=a+96|0;l=b;m=c[l>>2]|0;l=c[l+4>>2]|0;a=ei(m|0,l|0,-1,-1)|0;c[b>>2]=a;c[b+4>>2]=y;if((l|0)>0|(l|0)==0&m>>>0>0)return;else ja(14580,14319,384,14421)}function Bd(a){a=a|0;var b=0,d=0;b=a+8|0;d=c[b>>2]|0;if((d|0)<=0)ja(14601,14319,1609,14620);d=d+-1|0;c[b>>2]=d;if(d|0)return;Bg(c[a+12>>2]|0);Bg(c[a+16>>2]|0);Bg(c[a+20>>2]|0);Bg(c[a+24>>2]|0);b=c[a>>2]|0;d=c[a+4>>2]|0;c[b+4>>2]=d;c[d>>2]=b;Bg(a);return}function Cd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;d=c[g+8>>2]|0;if(d|0)db[c[b+4>>2]&15](b,d);h=c[g+12>>2]|0;d=b+4|0;if(h|0)db[c[d>>2]&15](b,h);db[c[d>>2]&15](b,c[g+4>>2]|0);d=c[g>>2]|0;if(!d){Bg(g);return}b=c[d+16>>2]|0;h=(f|0)<0;e=h?e:0;a[b+12>>0]=e;a[b+13>>0]=e>>>8;a[b+14>>0]=e>>>16;a[b+15>>0]=e>>>24;c[b+8>>2]=4;c[b+4>>2]=0;Bg(g);return}function Dd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((c[a>>2]|0)!=9)ja(14834,14319,1629,14972);h=a+192|0;a=c[h+4>>2]|0;a:do if((a|0)!=(h|0)){while(1){if(!(Og(c[a+12>>2]|0,b)|0))break;a=c[a+4>>2]|0;if((a|0)==(h|0)){i=8;break a}}if(a){Bg(c[a+16>>2]|0);Bg(c[a+20>>2]|0);Bg(c[a+24>>2]|0);h=a}else i=8}else i=8;while(0);if((i|0)==8){i=lf(276)|0;c[i+12>>2]=Ah(b)|0;c[i+8>>2]=1;b=c[h>>2]|0;c[b+4>>2]=i;c[i>>2]=b;c[i+4>>2]=h;c[h>>2]=i;h=i}c[h+16>>2]=Ah(d)|0;if(!e)a=0;else a=Ah(e)|0;c[h+20>>2]=a;if(!f)a=0;else a=Ah(f)|0;c[h+24>>2]=a;a=h+28|0;if(!g){c[a>>2]=0;return}else{c[a>>2]=1;ri(h+32|0,g|0,244)|0;return}}function Ed(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+1024|0;g=h;if(!b){g=0;l=h;return g|0}b=c[b+144>>2]|0;d=(a[d>>0]|0)==47?d+1|0:d;a:do if(a[d>>0]|0)while(1){e=Tg(d,47)|0;if(!e){f=Pg(d)|0;e=0}else{f=e-d|0;e=e+1|0}if(f>>>0>1023){b=0;break a}ri(g|0,d|0,f|0)|0;a[g+f>>0]=0;if((c[b+24>>2]|0)!=4){b=0;break a}d=b+56|0;b=c[b+60>>2]|0;if((b|0)==(d|0)){b=0;break a}while(1){if(!(Og(b+13|0,g)|0))break;b=c[b+4>>2]|0;if((b|0)==(d|0)){b=0;break a}}if(!b){b=0;break a}b=c[b+8>>2]|0;if(!e)break;else d=e}while(0);g=b;l=h;return g|0}function Fd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if((c[a>>2]|0)!=9)ja(14834,14319,1687,14957);k=a+192|0;i=c[k+4>>2]|0;if((i|0)==(k|0)){l=-2;return l|0}j=i;while(1){if(!(Og(c[j+12>>2]|0,d)|0))break;i=c[j+4>>2]|0;if((i|0)==(k|0)){i=-2;l=13;break}else j=i}if((l|0)==13)return i|0;if(!j){l=-2;return l|0}if((c[b+24>>2]|0)!=8){l=-5;return l|0}i=b+56|0;if(c[i>>2]|0){l=-5;return l|0}if(c[b+68>>2]|0){l=-5;return l|0}if((g|0)==0&(h|0)==0){l=0;return l|0}c[i>>2]=1;c[b+72>>2]=j;l=j+8|0;c[l>>2]=(c[l>>2]|0)+1;c[b+60>>2]=g;l=c[a+140>>2]|0;g=ei(g|0,h|0,-1,-1)|0;g=ei(g|0,y|0,l|0,0)|0;g=ni(g|0,y|0,c[a+136>>2]|0)|0;l=a+112|0;h=l;h=ei(g|0,y|0,c[h>>2]|0,c[h+4>>2]|0)|0;c[l>>2]=h;c[l+4>>2]=y;l=b+80|0;c[l>>2]=e;c[l+4>>2]=f;l=0;return l|0}function Gd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((c[b+24>>2]|0)!=8){l=-22;return l|0}if(e>>>0>0|(e|0)==0&d>>>0>4294967295){l=-28;return l|0}j=b+60|0;f=c[j>>2]|0;h=d-f|0;if(!h){l=0;return l|0}m=ei(c[a+140>>2]|0,0,-1,-1)|0;g=y;i=ei(m|0,g|0,d|0,e|0)|0;k=c[a+136>>2]|0;i=ni(i|0,y|0,k|0)|0;l=y;g=ei(m|0,g|0,f|0,0)|0;k=ni(g|0,y|0,k|0)|0;k=fi(i|0,l|0,k|0,y|0)|0;l=b+56|0;a:do switch(c[l>>2]|0){case 1:{if((d|0)==0&(e|0)==0)c[l>>2]=0;break}case 0:case 3:{if((h|0)<=0){f=(c[b+68>>2]<<2>>>0)/5|0;if(!(0<e>>>0|0==(e|0)&f>>>0<d>>>0)?(Ja(b+64|0,f|0)|0)<0:0){m=-28;return m|0}}else{i=a+112|0;i=ei(c[i>>2]|0,c[i+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;n=y;m=a+120|0;g=c[m+4>>2]|0;if(n>>>0>g>>>0|((n|0)==(g|0)?i>>>0>(c[m>>2]|0)>>>0:0)){n=-28;return n|0}i=b+64|0;g=c[b+68>>2]|0;do if(0<e>>>0|0==(e|0)&g>>>0<d>>>0){n=(g*5|0)>>>2;if((Ja(i|0,(0<e>>>0|0==(e|0)&n>>>0<d>>>0?d:n)|0)|0)<0){n=-28;return n|0}else{f=c[j>>2]|0;break}}while(0);Ka(i|0,f|0,0,h|0)}if((c[l>>2]|0)==3){n=b+88|0;i=c[n>>2]|0;b=b+92|0;m=c[b>>2]|0;c[i+4>>2]=m;c[m>>2]=i;c[n>>2]=0;c[b>>2]=0;b=a+160|0;n=b;n=fi(c[n>>2]|0,c[n+4>>2]|0,c[j>>2]|0,0)|0;m=y;c[b>>2]=n;c[b+4>>2]=m;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){c[l>>2]=0;break a}else ja(14470,14319,1240,14945)}break}case 2:{n=-5;return n|0}default:ra()}while(0);l=a+112|0;n=l;n=ei(c[n>>2]|0,c[n+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;m=y;c[l>>2]=n;c[l+4>>2]=m;if(!((m|0)>-1|(m|0)==-1&n>>>0>4294967295))ja(14451,14319,1248,14945);c[j>>2]=d;n=0;return n|0}function Hd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;p=q;j=b+56|0;if((c[j>>2]|0)!=1)ja(15026,14319,848,15063);k=b+60|0;m=c[k>>2]|0;o=a+160|0;r=o;r=ei(c[r>>2]|0,c[r+4>>2]|0,m|0,0)|0;t=y;h=a+168|0;g=h;s=c[g+4>>2]|0;do if((t|0)>(s|0)|((t|0)==(s|0)?r>>>0>(c[g>>2]|0)>>>0:0)?(i=a+148|0,e=c[i>>2]|0,(e|0)!=(i|0)):0){f=e+-32|0;if((c[f>>2]|0)!=3)ja(15076,14319,684,15111);g=e;while(1){e=g;g=c[g>>2]|0;if(!(c[e+-68>>2]|0)){Ia(e+-24|0);c[f>>2]=1;s=c[e>>2]|0;f=e+4|0;t=c[f>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[e>>2]=0;c[f>>2]=0;f=o;e=fi(c[f>>2]|0,c[f+4>>2]|0,c[e+-28>>2]|0,0)|0;f=y;t=o;c[t>>2]=e;c[t+4>>2]=f;if(!((f|0)>-1|(f|0)==-1&e>>>0>4294967295)){f=10;break}s=ei(e|0,f|0,m|0,0)|0;f=y;t=h;r=c[t+4>>2]|0;if((g|0)==(i|0)|((f|0)<(r|0)|((f|0)==(r|0)?s>>>0<=(c[t>>2]|0)>>>0:0))){f=14;break}}else if((g|0)==(i|0)){f=14;break}f=g+-32|0;if((c[f>>2]|0)!=3){f=7;break}}if((f|0)==7)ja(15076,14319,684,15111);else if((f|0)==10)ja(14470,14319,697,15111);else if((f|0)==14){n=c[k>>2]|0;break}}else n=m;while(0);if((Ja(b+64|0,n|0)|0)<0){t=-5;l=q;return t|0}c[j>>2]=2;g=lf(64)|0;c[g+20>>2]=0;c[g>>2]=a;c[g+12>>2]=b;c[g+4>>2]=d;switch(d|0){case 2:break;case 1:{f=g+40|0;c[f>>2]=f;c[g+44>>2]=f;f=18;break}default:f=18}if((f|0)==18){f=b+80|0;oe(p,c[f>>2]|0,c[f+4>>2]|0)|0;f=c[b+72>>2]|0;e=fe(c[f+16>>2]|0,p)|0;if(c[f+28>>2]|0)c[g+16>>2]=Zd(f+32|0,14,g)|0;c[g+8>>2]=Yd(e,c[f+20>>2]|0,c[f+24>>2]|0,g,5,0)|0}c[b+96>>2]=g;t=0;l=q;return t|0}function Id(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a+12>>2]|0;a=a+20|0;e=c[a>>2]|0;g=(c[f+60>>2]|0)-e|0;d=g>>>0>d>>>0?d:g;La(f+64|0,e|0,b|0,d|0);c[a>>2]=d+(c[a>>2]|0);return 0}function Jd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1024|0;n=q;j=a+12|0;p=c[j>>2]|0;do if((b|0)>=0){f=a+16|0;g=c[f>>2]|0;if(!g){g=p+60|0;m=a+20|0;r=c[m>>2]|0;f=(c[g>>2]|0)-r|0;f=f>>>0>e>>>0?e:f;La(p+64|0,r|0,d|0,f|0);f=f+(c[m>>2]|0)|0;c[m>>2]=f;if(b){l=q;return}}else{if((_d(g,d,e)|0)<0)break;if(b|0){l=q;return}if(($d(c[f>>2]|0)|0)<0)break;g=p+60|0;f=c[a+20>>2]|0}if((f|0)==(c[g>>2]|0)){if((c[a+4>>2]|0)==1?(o=a+40|0,i=c[a+44>>2]|0,(i|0)!=(o|0)):0){m=(c[j>>2]|0)+64|0;do{f=i;i=c[i+4>>2]|0;j=c[f+-12>>2]|0;k=j+60|0;g=c[k>>2]|0;if(g|0){b=f+8|0;a=j+64|0;f=0;h=0;d=0;e=c[b>>2]|0;b=c[b+4>>2]|0;while(1){f=fi(g|0,f|0,h|0,d|0)|0;r=y;s=r>>>0<0|(r|0)==0&f>>>0<1024;f=s?f:1024;r=s?r:0;Ha(m|0,e|0,n|0,f|0);La(a|0,h|0,n|0,f|0);e=ei(f|0,r|0,e|0,b|0)|0;b=y;h=ei(f|0,r|0,h|0,d|0)|0;d=y;g=c[k>>2]|0;if(!(d>>>0<0|(d|0)==0&h>>>0<g>>>0))break;else f=0}}Kd(j)}while((i|0)!=(o|0))}Kd(p);l=q;return}}while(0);a:do if((c[a+4>>2]|0)==1?(k=a+40|0,h=c[a+44>>2]|0,(h|0)!=(k|0)):0){while(1){f=h;h=c[h+4>>2]|0;f=c[f+-12>>2]|0;g=f+56|0;if((c[g>>2]|0)!=2)break;d=c[f+96>>2]|0;c[g>>2]=1;Ia(f+64|0);f=c[d+52>>2]|0;if(f|0)fb[f&31](c[d>>2]|0,0,-5,c[d+56>>2]|0);if((c[d+4>>2]|0)==2){r=d+24|0;n=c[r>>2]|0;s=d+28|0;o=c[s>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[r>>2]=0;c[s>>2]=0}f=c[d+16>>2]|0;if(f|0)ae(f);Bg(d);if((h|0)==(k|0))break a}ja(14496,14319,754,14532)}while(0);f=p+56|0;if((c[f>>2]|0)!=2)ja(14496,14319,754,14532);g=c[p+96>>2]|0;c[f>>2]=1;Ia(p+64|0);f=c[g+52>>2]|0;if(f|0)fb[f&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){r=g+24|0;o=c[r>>2]|0;s=g+28|0;p=c[s>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[r>>2]=0;c[s>>2]=0}f=c[g+16>>2]|0;if(f|0)ae(f);Bg(g);l=q;return}function Kd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;e=g;d=b+56|0;if((c[d>>2]|0)!=2)ja(14496,14319,735,15125);f=c[b+96>>2]|0;h=c[f>>2]|0;c[d>>2]=3;i=b+88|0;j=h+152|0;d=c[j>>2]|0;c[j>>2]=i;c[i>>2]=h+148;c[b+92>>2]=d;c[d>>2]=i;d=h+160|0;h=d;h=ei(c[h>>2]|0,c[h+4>>2]|0,c[b+60>>2]|0,0)|0;c[d>>2]=h;c[d+4>>2]=y;d=f+52|0;if(c[d>>2]|0){c[(c[f+48>>2]|0)+8>>2]=1;h=c[b+24>>2]|0;a[e>>0]=(h|0)==4?-128:(h|0)==10?2:0;c[e+4>>2]=0;h=b+8|0;i=c[h+4>>2]|0;j=e+8|0;c[j>>2]=c[h>>2];c[j+4>>2]=i;fb[c[d>>2]&31](c[f>>2]|0,e,0,c[f+56>>2]|0)}if((c[f+4>>2]|0)==2){i=f+24|0;e=c[i>>2]|0;j=f+28|0;h=c[j>>2]|0;c[e+4>>2]=h;c[h>>2]=e;c[i>>2]=0;c[j>>2]=0}d=c[f+16>>2]|0;if(!d){Bg(f);l=g;return}ae(d);Bg(f);l=g;return}function Ld(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;i=o+144|0;m=o+128|0;g=o;h=o+152|0;n=cd()|0;if(!(c[6969]|0))c[6969]=n;c[n+200>>2]=Ah(15189)|0;e=n+12|0;if(_a[c[e>>2]&15](n,m,g,0,28468,28468)|0)ja(15194,14319,2070,15240);j=n+28|0;if($a[c[j>>2]&3](n,g,c[m>>2]|0,15254,514,438,0)|0)ja(15261,14319,2072,15240);k=c[m>>2]|0;c[(c[k+4>>2]|0)+100>>2]=1;db[c[n+4>>2]&15](n,k);if(!a){l=o;return n|0}k=lf(28)|0;c[k>>2]=n;f=k+4|0;c[f>>2]=Ah(a)|0;c[k+8>>2]=b;c[k+12>>2]=d;a=k+16|0;if(_a[c[e>>2]&15](n,a,m,0,28468,28468)|0)ja(15340,14319,2145,15389);Oa(h|0,0)|0;b=c[h>>2]|0;b=ki(b|0,((b|0)<0)<<31>>31|0,1e6,0)|0;h=c[h+4>>2]|0;h=ei(b|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;Wg(g,128,15405,i)|0;b=ge(c[f>>2]|0,g)|0;a=$c(n,c[a>>2]|0)|0;if($a[c[j>>2]&3](n,m,a,15423,514,420,0)|0)ja(15429,14319,2154,15389);be(n,a,b,0,0,0,0,0,3,k,0);Bg(b);l=o;return n|0}function Md(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;h=n+64|0;j=n;k=n+56|0;m=n+40|0;i=n+32|0;if((f|0)<0){c[h>>2]=0-e;Nd(15505,h)}f=Ag(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);d=g+16|0;Xa[c[b+76>>2]&31](b,c[d>>2]|0,15423)|0;if((ue(f)|0)!=1)Nd(15548,n+72|0);if((te(k,f,15569)|0)<0)Nd(15576,n+80|0);e=(se(i,f,15596)|0)==0;h=i;f=c[h>>2]|0;h=c[h+4>>2]|0;do if(e&(h>>>0>0|(h|0)==0&f>>>0>1048575))if((c[b>>2]|0)==9){e=c[b+140>>2]|0;i=ei(f|0,h|0,-1,-1)|0;e=ei(i|0,y|0,e|0,0)|0;e=ni(e|0,y|0,c[b+136>>2]|0)|0;i=b+120|0;c[i>>2]=e;c[i+4>>2]=y;break}else ja(14834,14319,1677,15606);while(0);h=ge(c[g+4>>2]|0,15629)|0;Dd(b,15635,h,0,0,0);f=$c(b,c[d>>2]|0)|0;if(!($a[c[b+28>>2]&3](b,m,f,15637,514,420,0)|0)){m=k;oe(j,c[m>>2]|0,c[m+4>>2]|0)|0;m=ge(h,j)|0;be(b,f,m,0,0,0,0,0,4,g,0);Bg(h);Bg(m);l=n;return}else ja(15651,14319,2196,15743)}function Nd(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;b=c[3261]|0;Uh(16070,7,1,b)|0;Yg(b,a,d)|0;Zh(10,b)|0;Da(1)}function Od(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;h=k;i=k+12|0;if((f|0)<0){c[h>>2]=0-e;Nd(15755,h)}f=Ag(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);Xa[c[b+76>>2]&31](b,c[g+16>>2]|0,15637)|0;if((ue(f)|0)==1?(e=qe(f)|0,c[i>>2]=e,e|0):0)if(!(Pd(b,i,c[b+144>>2]|0,28468)|0)){c[g+24>>2]=0;Qd(b,0,0,g);l=k;return}else Nd(15796,j);Nd(15796,j)}
+function Of(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;i=p;o=1<<h;if(o+-1&e|0){if((h|0)==31){g=0;l=p;return g|0}m=0;while(1){i=m+e|0;j=ni(f|0,g|0,m<<3|0)|0;k=i>>>12&255;if((c[d+2580+(k<<3)>>2]|0)!=(i&-4096|0)){i=Of(d,i,j&255,0,0)|0;if(i|0){j=24;break}}else a[(c[d+2580+(k<<3)+4>>2]|0)+i>>0]=j;m=m+1|0;if((m|0)>=(o|0)){i=0;j=24;break}}if((j|0)==24){l=p;return i|0}}if(Rf(d,i,e,1)|0){c[d+440>>2]=e;c[d+436>>2]=15;g=-1;l=p;return g|0}k=c[i>>2]|0;n=ff(c[d+528>>2]|0,k,0)|0;if(!n){g=0;l=p;return g|0}m=n+8|0;i=k-(c[m>>2]|0)|0;if(!(c[n+32>>2]|0)){j=c[n+76>>2]|0;if(j&o|0){fb[c[n+72>>2]&31](c[n+64>>2]|0,i,f,h);g=0;l=p;return g|0}if(!((h|0)==3&(j&4|0)!=0)){g=0;l=p;return g|0}d=n+72|0;e=n+64|0;fb[c[d>>2]&31](c[e>>2]|0,i,f,2);fb[c[d>>2]&31](c[e>>2]|0,i+4|0,g,2);g=0;l=p;return g|0}o=c[n+48>>2]|0;j=o+(i>>>17<<2)|0;if(o){c[j>>2]=c[j>>2]|1<<(i>>>12&31);i=k-(c[m>>2]|0)|0}o=e>>>12&255;i=(c[n+40>>2]|0)+i|0;c[d+2580+(o<<3)>>2]=e&-4096;c[d+2580+(o<<3)+4>>2]=i-e;switch(h|0){case 0:{a[i>>0]=f;g=0;l=p;return g|0}case 1:{b[i>>1]=f;g=0;l=p;return g|0}case 2:{c[i>>2]=f;g=0;l=p;return g|0}case 3:{e=i;c[e>>2]=f;c[e+4>>2]=g;g=0;l=p;return g|0}default:ra()}return 0}function Pf(b,e,f){b=b|0;e=e|0;f=f|0;if((e&3072|0)==3072&(f|0)!=0){b=-1;return b|0}f=a[21566]|0;if((e>>>8&3)>>>0>(f&255)>>>0){b=-1;return b|0}a:do switch(e|0){case 1:if(!(a[21567]|0)){b=-1;return b|0}else{f=c[5390]|0;e=46;break a}case 2:if(!(a[21567]|0)){b=-1;return b|0}else{f=d[21564]|0;e=46;break a}case 3:if(!(a[21567]|0)){b=-1;return b|0}else{f=d[21564]<<5|c[5390];e=46;break a}case 3074:case 3072:{if((f&255)<3?((f<<24>>24==0?c[5418]|0:c[5411]|0)&1<<(e&31)|0)==0:0){e=45;break a}f=c[5394]|0;e=46;break}case 3202:case 3200:{if((a[21565]|0)==32){if((f&255)<3?((f<<24>>24==0?c[5418]|0:c[5411]|0)&1<<(e&31)|0)==0:0){e=45;break a}f=c[5395]|0;e=46}else e=45;break}case 256:{e=d[21567]<<13|c[5399];f=e&909619;if((e&24576|0)==24576|(e&98304|0)==98304){f=1<<(d[21565]|0)+-1|f;e=46}else e=46;break}case 260:{f=c[5410]&c[5407];e=46;break}case 261:{f=c[5412]|0;e=46;break}case 262:{f=c[5418]|0;e=46;break}case 320:{f=c[5413]|0;e=46;break}case 321:{f=c[5414]|0;e=46;break}case 322:{f=c[5415]|0;e=46;break}case 323:{f=c[5416]|0;e=46;break}case 324:{f=c[5410]&c[5408];e=46;break}case 384:{f=c[5417]|0;e=46;break}case 768:{f=d[21567]<<13|c[5399];if((f&24576|0)==24576|(f&98304|0)==98304){f=1<<(d[21565]|0)+-1|f;e=46}else e=46;break}case 769:{f=d[21568]<<(d[21565]|0)+-2|c[5406];e=46;break}case 770:{f=c[5409]|0;e=46;break}case 771:{f=c[5410]|0;e=46;break}case 772:{f=c[5407]|0;e=46;break}case 773:{f=c[5400]|0;e=46;break}case 774:{f=c[5411]|0;e=46;break}case 832:{f=c[5401]|0;e=46;break}case 833:{f=c[5402]|0;e=46;break}case 834:{f=c[5403]|0;e=46;break}case 835:{f=c[5404]|0;e=46;break}case 836:{f=c[5408]|0;e=46;break}case 2818:case 2816:{f=c[5394]|0;e=46;break}case 2946:case 2944:{if((a[21565]|0)==32){f=c[5395]|0;e=46}else e=45;break}case 3860:{f=c[5405]|0;e=46;break}default:e=45}while(0);if((e|0)==45){c[b>>2]=0;b=-1;return b|0}else if((e|0)==46){c[b>>2]=f;b=0;return b|0}return 0}function Qf(b,d){b=b|0;d=d|0;var e=0,f=0;do switch(b|0){case 1:{c[5390]=d&31;a[21567]=3;break}case 2:{d=d&7;a[21564]=d>>>0>4?0:d&255;a[21567]=3;break}case 3:{f=d>>>5&7;a[21564]=f>>>0>4?0:f&255;c[5390]=d&31;a[21567]=3;break}case 256:{e=c[5399]|0;f=e&-909620|d&909619;b=f^e;if(!((b&917504|0)==0?(e&131072|0)==0|(b&6144|0)==0:0)){b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256)}a[21567]=d>>>13&3;c[5399]=f&924091|e&-924092;break}case 260:{f=c[5410]|0;c[5407]=c[5407]&~f|f&d;break}case 261:{c[5412]=d&-4;break}case 262:{c[5418]=d&5;break}case 320:{c[5413]=d;break}case 321:{c[5414]=d&-2;break}case 322:{c[5415]=d;break}case 323:{c[5416]=d;break}case 324:{f=c[5410]|0;c[5408]=c[5408]&~f|f&d;break}case 384:{c[5417]=d&-2143289345;b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256);b=2;return b|0}case 768:{e=c[5399]|0;f=e^d;if(!((f&917504|0)==0?(e&131072|0)==0|(f&6144|0)==0:0)){b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256)}a[21567]=d>>>13&3;c[5399]=e&-924092|d&924091;break}case 769:break;case 770:{c[5409]=c[5409]&-65536|d&65535;break}case 771:{c[5410]=c[5410]&-547|d&546;break}case 772:{c[5407]=c[5407]&-683|d&682;break}case 773:{c[5400]=d&-4;break}case 774:{c[5411]=d&5;break}case 832:{c[5401]=d;break}case 833:{c[5402]=d&-2;break}case 834:{c[5403]=d;break}case 835:{c[5404]=d;break}case 836:{c[5408]=c[5408]&-35|d&34;break}default:{d=-1;return d|0}}while(0);d=0;return d|0}function Rf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;q=b+444|0;h=c[q>>2]|0;if((g|0)!=2&(h&131072|0)!=0)o=h>>>11&3;else o=d[b+414>>0]|0;if((o|0)==3){r=a[b+413>>0]|0;c[e>>2]=((r&255)<32?(1<<(r&255))+-1|0:-1)&f;r=0;return r|0}h=c[b+516>>2]|0;if((h|0)>-1){c[e>>2]=f;r=0;return r|0}p=b+528|0;j=f>>>20&4092|h<<12;h=ff(c[p>>2]|0,j,0)|0;if(!h){r=-1;return r|0}if(!(c[h+32>>2]|0)){r=-1;return r|0}b=c[(c[h+40>>2]|0)+(j-(c[h+8>>2]|0))>>2]|0;if(!(b&1)){r=-1;return r|0}i=b>>>10<<12;h=b>>>1&7;if(!h){j=f>>>10&4092|i;h=ff(c[p>>2]|0,j,0)|0;if(!h){r=-1;return r|0}if(!(c[h+32>>2]|0)){r=-1;return r|0}i=c[(c[h+40>>2]|0)+(j-(c[h+8>>2]|0))>>2]|0;if(!(i&1)){r=-1;return r|0}h=i>>>1&7;if(!h){r=-1;return r|0}else{b=i;i=i>>>10<<12;m=j;n=12;k=j;l=0}}else{m=j;n=22;k=j;l=0}if((h|4|0)==6){r=-1;return r|0}j=(b&16|0)!=0;if((o|0)==1){if(j?(c[q>>2]&262144|0)==0:0){r=-1;return r|0}}else if(!j){r=-1;return r|0}if(!((((c[q>>2]&524288|0)==0?0:h>>>2)|h)&1<<g)){r=-1;return r|0}q=(g|0)==1;h=b|(q?192:64);if(((b&64|0)==0|q&(b&128|0)==0?(r=ff(c[p>>2]|0,k,l)|0,r|0):0)?c[r+32>>2]|0:0)c[(c[r+40>>2]|0)+(m-(c[r+8>>2]|0))>>2]=h;r=1<<n;c[e>>2]=i&0-r|r+-1&f;r=0;return r|0}function Sf(b,d){b=b|0;d=d|0;if((d|0)!=32){d=0;return d|0}c[5288]=12968;c[5420]=b;c[5289]=4096;a[21566]=3;a[21565]=32;a[21568]=1;c[5399]=0;c[5406]=c[5406]|1315117;b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256);b=21152;return b|0}function Tf(a){a=a|0;return}function Uf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;z=l;l=l+96|0;x=z+80|0;u=z+72|0;q=z+64|0;o=z+56|0;n=z+48|0;k=z+40|0;f=z+32|0;d=z+24|0;e=z+88|0;m=z;b=c[a+8>>2]|0;if(Og(b,17419)|0)if(Og(b,17427)|0)if(!(Og(b,17435)|0))b=128;else{c[d>>2]=b;ng(17444,d);x=0;l=z;return x|0}else b=64;else b=32;r=lf(488)|0;c[r>>2]=c[a+4>>2];d=a+16|0;t=d;j=c[t+4>>2]|0;s=r+32|0;p=s;c[p>>2]=c[t>>2];c[p+4>>2]=j;p=r+24|0;c[p>>2]=b;j=$e()|0;t=r+20|0;c[t>>2]=j;c[j+2584>>2]=r;c[(c[t>>2]|0)+2588>>2]=8;j=Sf(c[t>>2]|0,b)|0;c[r+28>>2]=j;if(!j){c[f>>2]=b;ng(17469,f);x=0;l=z;return x|0}i=c[t>>2]|0;j=d;_a[c[i+2568>>2]&15](i,-2147483648,0,c[j>>2]|0,c[j+4>>2]|0,0)|0;j=c[t>>2]|0;_a[c[j+2568>>2]&15](j,0,0,65536,0,0)|0;j=a+24|0;c[r+40>>2]=c[j>>2];if(c[j>>2]|0){sa(1,e|0)|0;j=c[e>>2]|0;j=ki(j|0,((j|0)<0)<<31>>31|0,1e7,0)|0;i=(c[e+4>>2]|0)/100|0;i=ei(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;j=r+48|0;c[j>>2]=i;c[j+4>>2]=y}gf(c[t>>2]|0,33554432,0,786432,0,r,16,13,4)|0;gf(c[t>>2]|0,1074790400,0,4194304,0,r,17,14,4)|0;j=r+72|0;b=1;do{kf(j+(b*12|0)|0,9,r,b);b=b+1|0}while((b|0)!=32);gf(c[t>>2]|0,1073774592,0,16,0,r,18,15,4)|0;b=a+44|0;c[r+12>>2]=c[b>>2];c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+4>>2]=c[t>>2];i=m+8|0;h=i;c[h>>2]=1073807360;c[h+4>>2]=0;b=c[b>>2]|0;if(!b)b=1;else{c[m+16>>2]=r+84;c[r+8>>2]=Nc(m,b)|0;h=i;h=ei(c[h>>2]|0,c[h+4>>2]|0,4096,0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;b=r+480|0;c[b>>2]=(c[b>>2]|0)+1;b=2}e=a+180|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+4|0;h=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);B=a+168+(d*12|0)+8|0;Ec(m,c[B>>2]|0)|0;c[g>>2]=c[B>>2];B=i;B=ei(c[B>>2]|0,c[B+4>>2]|0,4096,0)|0;A=i;c[A>>2]=B;c[A+4>>2]=y;b=b+1|0;c[h>>2]=(c[h>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+96|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);mc(m,c[a+48+(d*12|0)+8>>2]|0)|0;A=i;A=ei(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+164|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);Vc(m,c[a+100+(d<<4)+12>>2]|0,c[a+100+(d<<4)+4>>2]|0)|0;A=i;A=ei(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0));e=b}else e=b;b=a+32|0;do if(c[b>>2]|0){d=lf(28)|0;c[r+16>>2]=d;b=c[b>>2]|0;if(!(Og(b,17494)|0)){xe(c[t>>2]|0,1090519040,0,d,c[a+36>>2]|0,c[a+40>>2]|0)|0;break}else{c[k>>2]=b;ng(17503,k);Da(1)}}while(0);b=c[a+192>>2]|0;do if(b|0)if(!(Og(b,17535)|0)){n=m+16|0;c[n>>2]=j+(e*12|0);c[r+472>>2]=Sc(m,0)|0;A=i;A=ei(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;B=r+480|0;c[B>>2]=(c[B>>2]|0)+1;c[n>>2]=j+((e+1|0)*12|0);c[r+476>>2]=Sc(m,2)|0;n=i;n=ei(c[n>>2]|0,c[n+4>>2]|0,4096,0)|0;A=i;c[A>>2]=n;c[A+4>>2]=y;c[B>>2]=(c[B>>2]|0)+1;break}else{c[n>>2]=b;ng(17542,n);Da(1)}while(0);b=a+200|0;if(!(c[b>>2]|0))ng(17572,o);e=c[a+204>>2]|0;f=c[a+224>>2]|0;h=c[a+228>>2]|0;i=c[a+236>>2]|0;j=c[a+240>>2]|0;g=c[a+184>>2]|0;A=((e|0)<0)<<31>>31;B=s;a=c[B+4>>2]|0;if(a>>>0<A>>>0|((a|0)==(A|0)?(c[B>>2]|0)>>>0<e>>>0:0)){ng(17586,q);Da(1)}B=c[b>>2]|0;d=jf(c[t>>2]|0,-2147483648,0,1)|0;ri(d|0,B|0,e|0)|0;if((h|0)>0){b=(c[p>>2]|0)==32?4194304:2097152;b=e+-1+b&0-b;ri(d+b|0,f|0,h|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+h|0)>>>0:0)){ng(17600,u);Da(1)}else w=b}else w=0;if((j|0)>0){b=s;b=ni(c[b>>2]|0,c[b+4>>2]|0,1)|0;b=b>>>0<134217728?b:134217728;ri(d+b|0,i|0,j|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+j|0)>>>0:0)){ng(17615,x);Da(1)}else v=b}else v=0;B=jf(c[t>>2]|0,0,0,1)|0;hg(r,B+4160|0,w^-2147483648,0,h,((h|0)<0)<<31>>31,v|-2147483648,0,j,((j|0)<0)<<31>>31,g);c[B+4096>>2]=2147480215;c[B+4100>>2]=1431;c[B+4104>>2]=63276435;c[B+4108>>2]=-247454349;c[B+4112>>2]=163943;B=r;l=z;return B|0}function Vf(a){a=a|0;var b=0;b=c[a+28>>2]|0;cb[c[(c[b>>2]|0)+4>>2]&15](b);ef(c[a+20>>2]|0);Bg(a);return}function Wf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;d=i;e=a+28|0;h=c[e>>2]|0;do if(!((Va[c[(c[h>>2]|0)+24>>2]&15](h)|0)&128)){g=a+56|0;f=c[g>>2]|0;g=c[g+4>>2]|0;if(!(c[a+40>>2]|0)){a=c[e>>2]|0;a=Va[c[(c[a>>2]|0)+12>>2]&15](a)|0;a=ni(a|0,y|0,4)|0;d=y}else{sa(1,d|0)|0;e=c[d>>2]|0;e=ki(e|0,((e|0)<0)<<31>>31|0,1e7,0)|0;d=(c[d+4>>2]|0)/100|0;d=ei(e|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;a=a+48|0;a=fi(d|0,y|0,c[a>>2]|0,c[a+4>>2]|0)|0;d=y}a=fi(f|0,g|0,a|0,d|0)|0;d=y;if((d|0)<0|(d|0)==0&a>>>0<1){db[c[(c[h>>2]|0)+16>>2]&15](h,128);b=0;break}else{g=li(a|0,d|0,1e4,0)|0;e=y;f=((b|0)<0)<<31>>31;b=(e|0)<(f|0)|(e|0)==(f|0)&g>>>0<b>>>0?g:b;break}}while(0);h=(Va[c[(c[h>>2]|0)+28>>2]&15](h)|0)==0;l=i;return (h?0:b)|0}function Xf(a,b){a=a|0;b=b|0;a=c[a+28>>2]|0;db[c[(c[a>>2]|0)+8>>2]&15](a,b);return}function Yf(a){a=a|0;return 1}function Zf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;a=c[a+476>>2]|0;if(!a)return;Rc(a,b,d,e,f)|0;return}function _f(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+472>>2]|0;if(!a)return;Pc(a,b,d)|0;return}function $f(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+28>>2]|0;eb[c[(c[a>>2]|0)+36>>2]&15](a,b,d);return}function ag(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((d|0)!=2)ja(18248,18213,200,18365);if((b|0)<49144)switch(b|0){case 16384:{e=c[a+56>>2]|0;l=f;return e|0}case 16388:{e=c[a+56+4>>2]|0;l=f;return e|0}default:{e=0;l=f;return e|0}}switch(b|0){case 49144:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=ni(e|0,y|0,4)|0;l=f;return e|0}else{sa(1,e|0)|0;d=c[e>>2]|0;d=ki(d|0,((d|0)<0)<<31>>31|0,1e7,0)|0;d=ei(d|0,y|0,(c[e+4>>2]|0)/100|0|0,0)|0;e=a+48|0;e=fi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;l=f;return e|0}case 49148:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=ni(e|0,y|0,36)|0;l=f;return e|0}else{sa(1,e|0)|0;b=c[e>>2]|0;b=ki(b|0,((b|0)<0)<<31>>31|0,1e7,0)|0;d=(c[e+4>>2]|0)/100|0;d=ei(b|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;e=a+48|0;fi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;e=y;l=f;return e|0}default:{e=0;l=f;return e|0}}return 0}function bg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,226,18353);switch(b|0){case 16384:{e=a+56|0;c[e>>2]=d;c[e+4>>2]=0;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}case 16388:{b=a+56|0;e=b;c[e>>2]=c[b>>2];c[e+4>>2]=d;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}default:return}}function cg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;if((d|0)!=2)ja(18248,18213,261,18343);if((b|0)!=2097156){h=0;return h|0}h=c[a+64>>2]|0;f=a+68|0;g=c[f>>2]|0;d=h&~g;if(!d){h=0;return h|0}b=0;while(1){if(1<<b&d|0){e=b;break}b=b+1|0;if(b>>>0>=32){e=32;break}}g=1<<e|g;c[f>>2]=g;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(h&~g))db[c[d+20>>2]&15](b,2560);else db[c[d+16>>2]&15](b,2560);h=e+1|0;return h|0}function dg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,289,18332);if((b|0)!=2097156)return;b=d+-1|0;if(b>>>0>=32)return;d=a+68|0;e=c[d>>2]&~(1<<b);c[d>>2]=e;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(c[a+64>>2]&~e)){db[c[d+20>>2]&15](b,2560);return}else{db[c[d+16>>2]&15](b,2560);return}}function eg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;b=1<<b+-1;if(!d){e=a+64|0;d=c[e>>2]&~b;c[e>>2]=d}else{e=a+64|0;d=c[e>>2]|b;c[e>>2]=d}b=c[a+28>>2]|0;e=c[b>>2]|0;if(!(d&~c[a+68>>2])){db[c[e+20>>2]&15](b,2560);return}else{db[c[e+16>>2]&15](b,2560);return}}function fg(a,b,d){a=a|0;b=b|0;d=d|0;if((d|0)!=2)ja(18248,18213,108,18322);switch(b>>>2|b<<30|0){case 0:{d=c[a+456>>2]|0;return d|0}case 1:{d=c[a+456+4>>2]|0;return d|0}case 2:{d=c[a+464>>2]|0;return d|0}case 3:{d=c[a+464+4>>2]|0;return d|0}default:{d=0;return d|0}}return 0}function gg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;i=k+8|0;if((f|0)!=2)ja(18248,18213,158,18263);switch(d>>>2|d<<30|0){case 0:{j=b+456|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 1:{d=b+456|0;f=c[d>>2]|0;g=d;c[g>>2]=f;c[g+4>>2]=e;g=e>>>16&255;if((f|0)==1&(e|0)==0){_h(18274)|0;Da(0)}h=(e&-16777216|0)==16777216&0==0;if(h&(g|0)==1){a[i>>0]=f;j=c[b+12>>2]|0;eb[c[j+4>>2]&15](c[j>>2]|0,i,1);j=d;c[j>>2]=0;c[j+4>>2]=0;j=b+464|0;c[j>>2]=0;c[j+4>>2]=16842752;l=k;return}if(h&(g|0)==0){j=d;c[j>>2]=0;c[j+4>>2]=0;l=k;return}else{i=j;c[i>>2]=f;c[i+4>>2]=e;Yh(18286,j)|0;l=k;return}}case 2:{j=b+464|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 3:{i=b+464|0;j=i;c[j>>2]=c[i>>2];c[j+4>>2]=e;l=k;return}default:{l=k;return}}}function hg(b,d,e,f,g,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+160|0;v=D+136|0;t=D+128|0;u=D;A=lf(28)|0;B=A+4|0;r=c[B>>2]|0;o=r+1|0;C=A+8|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){p=A;q=c[A>>2]|0;o=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}a[q+(o<<2)>>0]=0;o=(c[p>>2]|0)+(c[B>>2]<<2)+1|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;z=A+12|0;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}x=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=x;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[A>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;jg(A,17657,17668,24);jg(A,17692,17698,21);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+2|0;p=c[C>>2]|0;if((p|0)<(o|0)){p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}else{p=A;q=c[A>>2]|0;o=r}o=q+(o<<2)|0;a[o>>0]=a[17719]|0;a[o+1>>0]=a[17720]|0;a[o+2>>0]=a[17721]|0;a[o+3>>0]=a[17722]|0;a[o+4>>0]=a[17723]|0;o=(c[p>>2]|0)+(c[B>>2]<<2)+5|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+2|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+3|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17724)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=-2137614336;kg(A,17743,0,0);jg(A,17747,17743,4);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;jg(A,17763,17770,5);jg(A,17657,17775,6);q=c[b+24>>2]|0;r=c[b+28>>2]|0;r=Va[c[(c[r>>2]|0)+32>>2]&15](r)|0;c[t>>2]=q;p=0;o=u+(Wg(u,128,17781,t)|0)|0;do{if(1<<p&r){a[o>>0]=p+97;o=o+1|0}p=p+1|0}while((p|0)!=26);a[o>>0]=0;jg(A,17786,u,(Pg(u)|0)+1|0);jg(A,17818,(q|0)<33?17796:17807,11);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17827)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=9713015;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;q=c[B>>2]|0;o=q+6|0;p=c[C>>2]|0;if((p|0)<(o|0)){r=(p*3|0)/2|0;r=(r|0)<(o|0)?o:r;p=Cg(c[A>>2]|0,r<<2)|0;c[A>>2]=p;c[C>>2]=r;r=A;o=c[B>>2]|0}else{r=A;p=c[A>>2]|0;o=q}o=p+(o<<2)|0;p=17843;q=o+21|0;do{a[o>>0]=a[p>>0]|0;o=o+1|0;p=p+1|0}while((o|0)<(q|0));o=(c[r>>2]|0)+(c[B>>2]<<2)+21|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+6|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+7|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;jg(A,17843,0,0);jg(A,17657,17881,15);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;kg(A,17904,-2147483648,0);jg(A,17747,17904,7);t=b+32|0;u=c[t>>2]|0;t=c[t+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){x=A;w=A;q=c[A>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;x=A;p=o+1|0;w=A}r=pi(s|0)|0;c[B>>2]=p;c[q+(o<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=128;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;r=p+(o<<2)|0;a[r>>0]=a[17911]|0;a[r+1>>0]=a[17912]|0;a[r+2>>0]=a[17913]|0;a[r+3>>0]=a[17914]|0;a[r+4>>0]=a[17915]|0;r=(c[x>>2]|0)+(c[B>>2]<<2)+5|0;a[r>>0]=0;a[r+1>>0]=0;a[r+2>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;jg(A,17657,17916,10);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))p=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}o=p+(o<<2)|0;a[o>>0]=115;a[o+1>>0]=111;a[o+2>>0]=99;a[o+3>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[v>>2]=17926;c[v+4>>2]=17950;c[v+8>>2]=0;lg(A,0,v);jg(A,17961,0,0);kg(A,17968,33554432,0);jg(A,17657,17974,13);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=117440512;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=2;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=3072;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;kg(A,18007,1074790400,0);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;jg(A,17843,0,0);jg(A,17657,18012,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18024)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=520093696;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=4160;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16384;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=150994944;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=184549376;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;v=b+480|0;if((c[v>>2]|0)>0){u=0;do{t=(u<<12)+1073807360|0;kg(A,17535,t,0);jg(A,17657,18035,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=1048576;u=u+1|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}while((u|0)<(c[v>>2]|0))}u=c[b+16>>2]|0;if(u|0){kg(A,18047,1090519040,0);jg(A,17657,18059,19);t=c[u+16>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=65;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t>>31|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18898)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18904)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+8>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18078)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;jg(A,18085,18092,9);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;b=p+(o<<2)|0;a[b>>0]=a[18101]|0;a[b+1>>0]=a[18102]|0;a[b+2>>0]=a[18103]|0;a[b+3>>0]=a[18104]|0;a[b+4>>0]=a[18105]|0;a[b+5>>0]=a[18106]|0;a[b+6>>0]=a[18107]|0;a[(c[x>>2]|0)+(c[B>>2]<<2)+7>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;n=(n|0)==0?28468:n;jg(A,18108,n,(Pg(n)|0)+1|0);if(!((g|0)==0&(h|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18117)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(f|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=pi(e|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=ei(g|0,h|0,e|0,f|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18136)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}h=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=h}if(!((k|0)==0&(m|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18153)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(j|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=pi(i|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=ei(k|0,m|0,i|0,j|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18172)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}m=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=m}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0)){k=p;m=c[x>>2]|0;C=o;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;mg(A,d)|0;C=c[w>>2]|0;Bg(C);C=A+16|0;C=c[C>>2]|0;Bg(C);Bg(A);l=D;return}else{k=(q*3|0)/2|0;k=(k|0)<(p|0)?p:k;m=Cg(c[w>>2]|0,k<<2)|0;c[w>>2]=m;c[C>>2]=k;C=c[B>>2]|0;k=C+1|0;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;mg(A,d)|0;C=c[w>>2]|0;Bg(C);C=A+16|0;C=c[C>>2]|0;Bg(C);Bg(A);l=D;return}}function ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+20|0;h=c[i>>2]|0;a:do if((h|0)>0){e=c[a+16>>2]|0;d=0;while(1){f=e+d|0;if(!(Og(f,b)|0))break;d=d+1+(Pg(f)|0)|0;if((d|0)>=(h|0))break a}return d|0}while(0);f=(Pg(b)|0)+1|0;g=f+h|0;d=a+24|0;e=c[d>>2]|0;if((g|0)>(e|0)){h=(e*3|0)/2|0;h=(g|0)>(h|0)?g:h;a=a+16|0;e=Cg(c[a>>2]|0,h)|0;c[a>>2]=e;c[d>>2]=h;d=c[i>>2]|0}else{e=c[a+16>>2]|0;d=h}ri(e+d|0,b|0,f|0)|0;c[i>>2]=g;i=d;return i|0}function jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=a+4|0;f=c[j>>2]|0;g=f+1|0;k=a+8|0;h=c[k>>2]|0;if((h|0)>(f|0))h=c[a>>2]|0;else{f=(h*3|0)/2|0;f=(f|0)<(g|0)?g:f;h=Cg(c[a>>2]|0,f<<2)|0;c[a>>2]=h;c[k>>2]=f;f=c[j>>2]|0;g=f+1|0}c[j>>2]=g;c[h+(f<<2)>>2]=50331648;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Cg(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=pi(e|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;b=ig(a,b)|0;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Cg(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=pi(b|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;f=(e+3|0)/4|0;g=c[j>>2]|0;h=g+f|0;i=c[k>>2]|0;if((i|0)<(h|0)){i=(i*3|0)/2|0;i=(i|0)<(h|0)?h:i;b=Cg(c[a>>2]|0,i<<2)|0;c[a>>2]=b;c[k>>2]=i;k=a;a=c[j>>2]|0;a=b+(a<<2)|0;ri(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;si(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}else{k=a;b=c[a>>2]|0;a=g;a=b+(a<<2)|0;ri(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;si(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}}function kg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+272|0;j=m+256|0;k=m;c[j>>2]=b;f=j+8|0;c[f>>2]=d;c[f+4>>2]=e;Wg(k,256,18240,j)|0;j=a+4|0;f=c[j>>2]|0;b=f+1|0;i=a+8|0;d=c[i>>2]|0;if((d|0)>(f|0)){e=c[a>>2]|0;d=f}else{d=(d*3|0)/2|0;d=(d|0)<(b|0)?b:d;e=Cg(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=c[j>>2]|0;b=d+1|0}c[j>>2]=b;c[e+(d<<2)>>2]=16777216;f=Pg(k)|0;g=f+1|0;h=(f+4|0)/4|0;b=c[j>>2]|0;d=h+b|0;e=c[i>>2]|0;if((e|0)<(d|0)){e=(e*3|0)/2|0;d=(e|0)<(d|0)?d:e;e=Cg(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=a;b=c[j>>2]|0}else{d=a;e=c[a>>2]|0}ri(e+(b<<2)|0,k|0,g|0)|0;si((c[d>>2]|0)+(c[j>>2]<<2)+g|0,0,f&3^3|0)|0;c[j>>2]=(c[j>>2]|0)+h;k=a+12|0;c[k>>2]=(c[k>>2]|0)+1;l=m;return}function lg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4;if(!e)b=0;else{b=0;do{b=b+1+(Pg(e)|0)|0;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4}while((e|0)!=0)}f=Ag(b)|0;c[g>>2]=d;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4;if(!e){g=0;jg(a,17657,f,g);Bg(f);l=h;return}b=0;do{d=(Pg(e)|0)+1|0;ri(f+b|0,e|0,d|0)|0;b=d+b|0;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4}while((e|0)!=0);jg(a,17657,f,b);Bg(f);l=h;return}function mg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c[b+12>>2]|0)ja(18189,18213,536,18229);i=b+4|0;e=c[i>>2]|0;f=e+1|0;g=b+8|0;h=c[g>>2]|0;if((h|0)>(e|0)){h=b;g=c[b>>2]|0}else{e=(h*3|0)/2|0;e=(e|0)<(f|0)?f:e;j=Cg(c[b>>2]|0,e<<2)|0;c[b>>2]=j;c[g>>2]=e;e=c[i>>2]|0;f=e+1|0;h=b;g=j}c[i>>2]=f;c[g+(e<<2)>>2]=150994944;e=c[i>>2]<<2;g=c[b+20>>2]|0;c[d>>2]=-302117424;c[d+20>>2]=285212672;c[d+24>>2]=268435456;c[d+28>>2]=0;c[d+32>>2]=pi(g|0)|0;c[d+36>>2]=pi(e|0)|0;c[d+8>>2]=671088640;ri(d+40|0,c[h>>2]|0,e|0)|0;e=e+40|0;if(e&4)while(1){f=e+1|0;a[d+e>>0]=0;if(!(f&7)){e=f;break}else e=f}c[d+16>>2]=pi(e|0)|0;j=d+e|0;i=j;c[i>>2]=0;c[i+4>>2]=0;j=j+8|0;c[j>>2]=0;c[j+4>>2]=0;e=e+16|0;c[d+12>>2]=pi(e|0)|0;ri(d+e|0,c[b+16>>2]|0,g|0)|0;e=e+g|0;if(!(e&7)){j=e;b=pi(j|0)|0;d=d+4|0;c[d>>2]=b;return j|0}f=e;while(1){e=f+1|0;a[d+f>>0]=0;if(!(e&7))break;else f=e}b=pi(e|0)|0;j=d+4|0;c[j>>2]=b;return e|0}function ng(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;Xh(a,e)|0;l=d;return}function og(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+24|0;f=g+16|0;e=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Ie(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[e>>2]=b;ng(18376,e);i=-1;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;ng(18401,f);i=-1;l=g;return i|0}}return 0}function pg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+16|0;f=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Ie(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[d>>2]=e;i=0;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;ng(18401,f);i=-1;l=g;return i|0}}return 0}function qg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=lf(24)|0;c[f>>2]=a;c[f+4>>2]=d;c[f+8>>2]=e;c[a>>2]=Ah(b)|0;if(!(ve(b)|0))rg();else{c[f+12>>2]=10;c[f+16>>2]=f;Yd(b,0,0,f,16,1)|0;return}}function rg(){ra()}function sg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;oa=l;l=l+816|0;ma=oa+796|0;na=oa+744|0;ja=oa+736|0;ga=oa+728|0;fa=oa+720|0;ea=oa+712|0;da=oa+704|0;ca=oa+696|0;ba=oa+688|0;aa=oa+680|0;$=oa+672|0;_=oa+664|0;Y=oa+656|0;X=oa+648|0;W=oa+640|0;V=oa+632|0;U=oa+624|0;T=oa+616|0;ia=oa+608|0;P=oa+600|0;O=oa+592|0;N=oa+584|0;M=oa+576|0;L=oa+568|0;K=oa+560|0;ha=oa+552|0;H=oa+544|0;G=oa+536|0;F=oa+528|0;E=oa+520|0;D=oa+512|0;J=oa+504|0;A=oa+488|0;v=oa+480|0;u=oa+472|0;t=oa+464|0;s=oa+456|0;r=oa+448|0;q=oa+440|0;p=oa+432|0;j=oa+424|0;i=oa+416|0;n=oa+408|0;m=oa+400|0;k=oa+392|0;h=oa+384|0;g=oa+376|0;C=oa+288|0;w=oa+256|0;x=oa+792|0;z=oa+748|0;S=oa;la=oa+368|0;pa=oa+360|0;B=oa+352|0;I=oa+344|0;R=oa+336|0;Z=oa+328|0;f=oa+320|0;ka=c[b>>2]|0;Re(pa,d,e);e=pa;d=c[e>>2]|0;e=c[e+4>>2]|0;pa=la;c[pa>>2]=d;c[pa+4>>2]=e;if((d|0)==7){c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];c[g>>2]=Me(ma)|0;ng(18452,g);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);Da(1)}pa=w;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18463);pa=C;d=c[pa+4>>2]|0;a:do switch(c[pa>>2]|0){case 6:{c[h>>2]=18463;ng(18376,h);Q=6;break}case 1:{if((d|0)!=1)if((d|0)>1){ng(18471,m);Da(1)}else{ng(18527,n);Da(1)}m=la;n=c[m+4>>2]|0;pa=w;c[pa>>2]=c[m>>2];c[pa+4>>2]=n;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18633);switch(c[C>>2]|0){case 6:{c[i>>2]=18633;ng(18376,i);break}case 0:{g=Ah((c[C+4>>2]|0)+4|0)|0;c[ka+8>>2]=g;d=c[3252]|0;e=Tg(d,44)|0;b:do if(!e){o=d;Q=20}else{h=Pg(g)|0;while(1){if((e-d|0)==(h|0)?(Gh(g,d,h)|0)==0:0)break b;d=e+1|0;e=Tg(d,44)|0;if(!e){o=d;Q=20;break}}}while(0);if((Q|0)==20?Og(g,o)|0:0){c[ka+4>>2]=0;c[p>>2]=g;ng(18662,p);break a}c[ka+4>>2]=13008;cb[c[13012>>2]&15](ka);pa=la;d=c[pa+4>>2]|0;e=w;c[e>>2]=c[pa>>2];c[e+4>>2]=d;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18688);e=C;d=c[e>>2]|0;e=c[e+4>>2]|0;switch(d|0){case 6:{c[q>>2]=18688;ng(18376,q);break}case 1:{q=ka+16|0;c[q>>2]=oi(mi(d|0,e|0,32)|0,y|0,20)|0;c[q+4>>2]=y;q=la;r=c[q+4>>2]|0;pa=w;c[pa>>2]=c[q>>2];c[pa+4>>2]=r;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18700);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+196>>2]=Ah((c[C+4>>2]|0)+4|0)|0;break}default:{c[s>>2]=18700;ng(18641,s);break a}}r=la;s=c[r+4>>2]|0;pa=w;c[pa>>2]=c[r>>2];c[pa+4>>2]=s;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18705);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+220>>2]=Ah((c[C+4>>2]|0)+4|0)|0;break}default:{c[t>>2]=18705;ng(18641,t);break a}}s=la;t=c[s+4>>2]|0;pa=w;c[pa>>2]=c[s>>2];c[pa+4>>2]=t;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18712);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+232>>2]=Ah((c[C+4>>2]|0)+4|0)|0;break}default:{c[u>>2]=18712;ng(18641,u);break a}}t=la;u=c[t+4>>2]|0;pa=w;c[pa>>2]=c[t>>2];c[pa+4>>2]=u;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18719);switch(c[C>>2]|0){case 6:break;case 0:{d=(c[C+4>>2]|0)+4|0;nf(ma);h=C;i=z+36|0;c:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 0:break c;case 36:{e=d+1|0;if((a[e>>0]|0)==123){e=C;g=d+2|0;d:while(1){d=a[g>>0]|0;switch(d<<24>>24){case 0:case 125:break d;default:{}}if((e-h|0)>>>0<31){a[e>>0]=d;d=e+1|0}else d=e;e=d;g=g+1|0}a[e>>0]=0;d=(a[g>>0]|0)==125?g+1|0:g;if(!(Og(C,18727)|0)){Ra(x|0)|0;Pa(x|0,z|0)|0;u=c[i>>2]|0;v=(u|0)/60|0;u=(u|0)<-59;v=u?0-v|0:v;pa=(v|0)/60|0;c[A>>2]=u?43:45;c[A+4>>2]=pa;c[A+8>>2]=v-(pa*60|0);Wg(w,32,18730,A)|0;pf(ma,w)}}else{d=e;Q=52}break}default:{d=d+1|0;Q=52}}if((Q|0)==52){Q=0;of(ma,g)}}of(ma,0);c[ka+184>>2]=c[ma>>2];break}default:{c[v>>2]=18719;ng(18641,v);break a}}i=ka+96|0;c[J>>2]=c[i>>2];Wg(S,256,18745,J)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(B,ma,S);e=B;d=c[e>>2]|0;e:do if((d|0)==6)Q=68;else{h=J+4|0;g=J+4|0;e=c[e+4>>2]|0;f:while(1){if((c[i>>2]|0)>3){Q=58;break}pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Ie(J,ma,18770);switch(c[J>>2]|0){case 6:{Q=60;break f}case 0:break;default:{Q=61;break f}}pa=Ah((c[h>>2]|0)+4|0)|0;c[ka+48+((c[i>>2]|0)*12|0)+4>>2]=pa;pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Ie(J,ma,18775);switch(c[J>>2]|0){case 6:{d=0;break}case 0:{d=Ah((c[g>>2]|0)+4|0)|0;break}default:{Q=65;break f}}c[ka+48+((c[i>>2]|0)*12|0)>>2]=d;e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[H>>2]=e;Wg(S,256,18745,H)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(B,ma,S);e=B;d=c[e>>2]|0;if((d|0)==6){Q=68;break e}else e=c[e+4>>2]|0}if((Q|0)==58){ng(18753,D);break}else if((Q|0)==60){c[E>>2]=18770;ng(18376,E)}else if((Q|0)==61){c[F>>2]=18770;ng(18641,F)}else if((Q|0)==65){c[G>>2]=18775;ng(18641,G);break a}break a}while(0);g:do if((Q|0)==68){j=ka+164|0;c[ha>>2]=c[j>>2];Wg(S,256,18782,ha)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(I,ma,S);e=I;d=c[e>>2]|0;h:do if((d|0)!=6){h=ha+4|0;i=ha+4|0;e=c[e+4>>2]|0;i:while(1){if((c[j>>2]|0)>3){Q=71;break}pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Ie(ha,ma,18770);switch(c[ha>>2]|0){case 6:{Q=73;break i}case 0:break;default:{Q=74;break i}}pa=Ah((c[h>>2]|0)+4|0)|0;c[ka+100+(c[j>>2]<<4)+8>>2]=pa;pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Ie(ha,ma,18809);j:do switch(c[ha>>2]|0){case 6:{d=c[j>>2]|0;if(!d){d=S;e=18813;g=d+10|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(g|0));d=S;break j}else{c[O>>2]=d;Wg(S,256,18823,O)|0;d=S;break j}}case 0:{d=(c[i>>2]|0)+4|0;break}default:{Q=77;break i}}while(0);d=Ah(d)|0;e=c[j>>2]|0;c[ka+100+(e<<4)+4>>2]=d;e=e+1|0;c[j>>2]=e;c[P>>2]=e;Wg(S,256,18782,P)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(I,ma,S);e=I;d=c[e>>2]|0;if((d|0)==6)break h;else e=c[e+4>>2]|0}if((Q|0)==71){ng(18787,K);break g}else if((Q|0)==73){c[L>>2]=18770;ng(18376,L)}else if((Q|0)==74){c[M>>2]=18770;ng(18641,M)}else if((Q|0)==77){c[N>>2]=18809;ng(18641,N);break a}break a}while(0);i=ka+180|0;c[ia>>2]=c[i>>2];Wg(S,256,18835,ia)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(R,ma,S);e=R;d=c[e>>2]|0;k:do if((d|0)!=6){g=ia+4|0;h=ia+4|0;e=c[e+4>>2]|0;l:while(1){if((c[i>>2]|0)>0){Q=86;break}pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18871);switch(c[ia>>2]|0){case 6:{Q=88;break l}case 0:break;default:{Q=89;break l}}pa=(c[g>>2]|0)+4|0;P=Ah(pa)|0;c[ka+168+((c[i>>2]|0)*12|0)>>2]=P;if(!(Og(pa,18878)|0)){pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18882);switch(c[ia>>2]|0){case 6:{Q=93;break l}case 0:break;default:{Q=94;break l}}pa=Ah((c[h>>2]|0)+4|0)|0;c[ka+168+((c[i>>2]|0)*12|0)+4>>2]=pa}e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[Y>>2]=e;Wg(S,256,18835,Y)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(R,ma,S);e=R;d=c[e>>2]|0;if((d|0)==6)break k;else e=c[e+4>>2]|0}if((Q|0)==86){ng(18841,T);break g}else if((Q|0)==88){c[U>>2]=18871;ng(18376,U);Q=90}else if((Q|0)==89){c[V>>2]=18871;ng(18641,V);Q=90}else if((Q|0)==93){c[W>>2]=18882;ng(18376,W);Q=95}else if((Q|0)==94){c[X>>2]=18882;ng(18641,X);Q=95}if((Q|0)==90)break a;else if((Q|0)==95)break a}while(0);d=ka+32|0;c[d>>2]=0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(Z,ma,18889);g=Z;e=c[g>>2]|0;g=c[g+4>>2]|0;m:do if((e|0)!=6){pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18775);switch(c[ia>>2]|0){case 6:{c[_>>2]=18775;ng(18376,_);break}case 0:{c[d>>2]=Ah((c[ia+4>>2]|0)+4|0)|0;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18898);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[aa>>2]=18898;ng(18376,aa);break}case 1:{c[ka+36>>2]=d;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18904);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[ca>>2]=18904;ng(18376,ca);break}case 1:{c[ka+40>>2]=d;pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18911);switch(c[ia>>2]|0){case 6:break m;case 0:{c[ka+208>>2]=Ah((c[ia+4>>2]|0)+4|0)|0;break m}default:{c[ea>>2]=18911;ng(18641,ea);break a}}}default:{c[da>>2]=18904;ng(18401,da)}}break a}default:{c[ba>>2]=18898;ng(18401,ba)}}break a}default:{c[$>>2]=18775;ng(18641,$)}}break a}while(0);da=la;ea=c[da+4>>2]|0;pa=ha;c[pa>>2]=c[da>>2];c[pa+4>>2]=ea;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18920);switch(c[ia>>2]|0){case 6:{d=0;break}case 0:{d=Ah((c[ia+4>>2]|0)+4|0)|0;break}default:{c[fa>>2]=18920;ng(18641,fa);break a}}c[ka+192>>2]=d;ea=la;fa=c[ea+4>>2]|0;pa=ha;c[pa>>2]=c[ea>>2];c[pa+4>>2]=fa;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18933);n:do switch(c[ia>>2]|0){case 6:break;case 0:{d=(c[ia+4>>2]|0)+4|0;if(!(Og(d,18939)|0)){c[ka+188>>2]=0;break n}if(!(Og(d,18944)|0)){c[ka+188>>2]=1;break n}c[ja>>2]=d;ng(18949,ja);Da(1);break}default:{c[ga>>2]=18933;ng(18641,ga);break a}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(f,ma,18981);switch(c[f>>2]|0){case 4:{c[ka+28>>2]=c[f+4>>2];c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);pa=b+20|0;c[pa>>2]=0;ug(b);l=oa;return}case 6:{c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);pa=b+20|0;c[pa>>2]=0;ug(b);l=oa;return}default:{c[na>>2]=18981;ng(18996,na);break a}}}while(0);Da(1);break}default:{c[r>>2]=18688;ng(18401,r)}}break a}default:{c[j>>2]=18633;ng(18641,j)}}break}default:{c[k>>2]=18463;ng(18401,k);Q=6}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);Da(1)}function tg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if((b|0)<0){c[f>>2]=0-b;ng(18423,f);Da(1)}else{eb[c[a+12>>2]&15](c[a+16>>2]|0,d,e);l=g;return}}function ug(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=c[b>>2]|0;f=b+20|0;d=c[f>>2]|0;a:do if((d|0)<4)while(1){e=c[g+196+(d*12|0)>>2]|0;if(e|0)break a;e=d+1|0;c[f>>2]=e;if((d|0)<3)d=e;else{d=e;h=5;break}}else h=5;while(0);do if((h|0)==5){if((d|0)!=4){e=c[g+196+(d*12|0)>>2]|0;break}d=c[b+4>>2]|0;if(d|0)cb[d&15](c[b+8>>2]|0);Bg(b);return}while(0);d=c[g>>2]|0;if((((d|0)!=0?(Tg(e,58)|0)==0:0)?(a[e>>0]|0)!=47:0)?(i=yh(d,47)|0,(i|0)!=0):0){g=i+1-d|0;h=(Pg(e)|0)+1|0;i=Ag(h+g|0)|0;ri(i|0,d|0,g|0)|0;ri(i+g|0,e|0,h|0)|0;d=i}else d=Ah(e)|0;if(!(ve(d)|0))rg();c[b+12>>2]=11;c[b+16>>2]=b;Yd(d,0,0,b,16,1)|0;Bg(d);return}function vg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;g=Ag(d)|0;e=a+20|0;c[f+196+((c[e>>2]|0)*12|0)+4>>2]=g;ri(c[f+196+((c[e>>2]|0)*12|0)+4>>2]|0,b|0,d|0)|0;c[f+196+((c[e>>2]|0)*12|0)+8>>2]=d;c[e>>2]=(c[e>>2]|0)+1;ug(a);return}function wg(b,d){b=b|0;d=d|0;var e=0,f=0;if((a[d>>0]|0)==33){e=Ah(d+1|0)|0;d=b+184|0;b=c[d>>2]|0;Bg(b);c[d>>2]=e;return}else{e=b+184|0;f=c[e>>2]|0;f=(f|0)==0?28468:f;b=Pg(f)|0;b=Ag(b+2+(Pg(d)|0)|0)|0;Qg(b,f)|0;f=b+(Pg(b)|0)|0;a[f>>0]=32;a[f+1>>0]=0;Rg(b,d)|0;d=b;b=c[e>>2]|0;Bg(b);c[e>>2]=d;return}}function xg(a){a=a|0;var b=0,d=0;Bg(c[a+8>>2]|0);Bg(c[a+184>>2]|0);Bg(c[a+196>>2]|0);Bg(c[a+200>>2]|0);Bg(c[a+208>>2]|0);Bg(c[a+212>>2]|0);Bg(c[a+220>>2]|0);Bg(c[a+224>>2]|0);Bg(c[a+232>>2]|0);Bg(c[a+236>>2]|0);d=a+96|0;if((c[d>>2]|0)>0){b=0;do{Bg(c[a+48+(b*12|0)+4>>2]|0);Bg(c[a+48+(b*12|0)>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+164|0;if((c[d>>2]|0)>0){b=0;do{Bg(c[a+100+(b<<4)+8>>2]|0);Bg(c[a+100+(b<<4)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+180|0;if((c[d>>2]|0)<=0){d=a+192|0;d=c[d>>2]|0;Bg(d);d=a+32|0;d=c[d>>2]|0;Bg(d);a=c[a>>2]|0;Bg(a);return}b=0;do{Bg(c[a+168+(b*12|0)>>2]|0);Bg(c[a+168+(b*12|0)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0));d=a+192|0;d=c[d>>2]|0;Bg(d);d=a+32|0;d=c[d>>2]|0;Bg(d);a=c[a>>2]|0;Bg(a);return}function yg(a){a=a|0;return Va[c[(c[a+4>>2]|0)+8>>2]&15](a)|0}function zg(a){a=a|0;si(a|0,0,248)|0;return}function Ag(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;o=x;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;n=c[6971]|0;d=n>>>a;if(d&3|0){b=(d&1^1)+a|0;a=27924+(b<<1<<2)|0;d=a+8|0;e=c[d>>2]|0;f=e+8|0;g=c[f>>2]|0;if((g|0)==(a|0))c[6971]=n&~(1<<b);else{c[g+12>>2]=a;c[d>>2]=g}w=b<<3;c[e+4>>2]=w|3;w=e+w+4|0;c[w>>2]=c[w>>2]|1;w=f;l=x;return w|0}m=c[6973]|0;if(k>>>0>m>>>0){if(d|0){b=2<<a;b=d<<a&(b|0-b);b=(b&0-b)+-1|0;i=b>>>12&16;b=b>>>i;d=b>>>5&8;b=b>>>d;g=b>>>2&4;b=b>>>g;a=b>>>1&2;b=b>>>a;e=b>>>1&1;e=(d|i|g|a|e)+(b>>>e)|0;b=27924+(e<<1<<2)|0;a=b+8|0;g=c[a>>2]|0;i=g+8|0;d=c[i>>2]|0;if((d|0)==(b|0)){a=n&~(1<<e);c[6971]=a}else{c[d+12>>2]=b;c[a>>2]=d;a=n}w=e<<3;h=w-k|0;c[g+4>>2]=k|3;f=g+k|0;c[f+4>>2]=h|1;c[g+w>>2]=h;if(m|0){e=c[6976]|0;b=m>>>3;d=27924+(b<<1<<2)|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[6973]=h;c[6976]=f;w=i;l=x;return w|0}g=c[6972]|0;if(g){d=(g&0-g)+-1|0;f=d>>>12&16;d=d>>>f;e=d>>>5&8;d=d>>>e;h=d>>>2&4;d=d>>>h;i=d>>>1&2;d=d>>>i;j=d>>>1&1;j=c[28188+((e|f|h|i|j)+(d>>>j)<<2)>>2]|0;d=j;i=j;j=(c[j+4>>2]&-8)-k|0;while(1){a=c[d+16>>2]|0;if(!a){a=c[d+20>>2]|0;if(!a)break}h=(c[a+4>>2]&-8)-k|0;f=h>>>0<j>>>0;d=a;i=f?a:i;j=f?h:j}h=i+k|0;if(h>>>0>i>>>0){f=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){d=0;break}}while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);do if(f|0){b=c[i+28>>2]|0;a=28188+(b<<2)|0;if((i|0)==(c[a>>2]|0)){c[a>>2]=d;if(!d){c[6972]=g&~(1<<b);break}}else{w=f+16|0;c[((c[w>>2]|0)==(i|0)?w:f+20|0)>>2]=d;if(!d)break}c[d+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}b=c[i+20>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}while(0);if(j>>>0<16){w=j+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[h+4>>2]=j|1;c[h+j>>2]=j;if(m|0){e=c[6976]|0;b=m>>>3;d=27924+(b<<1<<2)|0;b=1<<b;if(!(b&n)){c[6971]=b|n;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[6973]=j;c[6976]=h}w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=k}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;e=c[6972]|0;if(e){f=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)j=31;else{n=(a+1048320|0)>>>16&8;r=a<<n;i=(r+520192|0)>>>16&4;r=r<<i;j=(r+245760|0)>>>16&2;j=14-(i|n|j)+(r<<j>>>15)|0;j=k>>>(j+7|0)&1|j<<1}else j=0;d=c[28188+(j<<2)>>2]|0;a:do if(!d){d=0;a=0;r=61}else{a=0;i=k<<((j|0)==31?0:25-(j>>>1)|0);g=0;while(1){h=(c[d+4>>2]&-8)-k|0;if(h>>>0<f>>>0)if(!h){a=d;f=0;r=65;break a}else{a=d;f=h}r=c[d+20>>2]|0;d=c[d+16+(i>>>31<<2)>>2]|0;g=(r|0)==0|(r|0)==(d|0)?g:r;if(!d){d=g;r=61;break}else i=i<<1}}while(0);if((r|0)==61){if((d|0)==0&(a|0)==0){a=2<<j;a=(a|0-a)&e;if(!a){n=k;break}n=(a&0-a)+-1|0;h=n>>>12&16;n=n>>>h;g=n>>>5&8;n=n>>>g;i=n>>>2&4;n=n>>>i;j=n>>>1&2;n=n>>>j;d=n>>>1&1;a=0;d=c[28188+((g|h|i|j|d)+(n>>>d)<<2)>>2]|0}if(!d){i=a;h=f}else r=65}if((r|0)==65){g=d;while(1){n=(c[g+4>>2]&-8)-k|0;d=n>>>0<f>>>0;f=d?n:f;a=d?g:a;d=c[g+16>>2]|0;if(!d)d=c[g+20>>2]|0;if(!d){i=a;h=f;break}else g=d}}if(((i|0)!=0?h>>>0<((c[6973]|0)-k|0)>>>0:0)?(m=i+k|0,m>>>0>i>>>0):0){g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){b=0;break}}while(1){f=b+20|0;d=c[f>>2]|0;if(!d){f=b+16|0;d=c[f>>2]|0;if(!d)break;else{b=d;a=f}}else{b=d;a=f}}c[a>>2]=0}else{w=c[i+8>>2]|0;c[w+12>>2]=b;c[b+8>>2]=w}while(0);do if(g){a=c[i+28>>2]|0;d=28188+(a<<2)|0;if((i|0)==(c[d>>2]|0)){c[d>>2]=b;if(!b){e=e&~(1<<a);c[6972]=e;break}}else{w=g+16|0;c[((c[w>>2]|0)==(i|0)?w:g+20|0)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[i+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[i+20>>2]|0;if(a){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);b:do if(h>>>0<16){w=h+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[m+4>>2]=h|1;c[m+h>>2]=h;b=h>>>3;if(h>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=m;c[b+12>>2]=m;c[m+8>>2]=b;c[m+12>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;d=(w+245760|0)>>>16&2;d=14-(u|v|d)+(w<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=28188+(d<<2)|0;c[m+28>>2]=d;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<d;if(!(e&a)){c[6972]=e|a;c[b>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(h|0)){e=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(h|0)){b=a;break c}else{e=e<<1;b=a}}c[d>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break b}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=m;c[v>>2]=m;c[m+8>>2]=w;c[m+12>>2]=b;c[m+24>>2]=0}while(0);w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=-1;while(0);d=c[6973]|0;if(d>>>0>=n>>>0){b=d-n|0;a=c[6976]|0;if(b>>>0>15){w=a+n|0;c[6976]=w;c[6973]=b;c[w+4>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=n|3}else{c[6973]=0;c[6976]=0;c[a+4>>2]=d|3;w=a+d+4|0;c[w>>2]=c[w>>2]|1}w=a+8|0;l=x;return w|0}h=c[6974]|0;if(h>>>0>n>>>0){u=h-n|0;c[6974]=u;w=c[6977]|0;v=w+n|0;c[6977]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}if(!(c[7089]|0)){c[7091]=4096;c[7090]=4096;c[7092]=-1;c[7093]=-1;c[7094]=0;c[7082]=0;c[7089]=o&-16^1431655768;a=4096}else a=c[7091]|0;i=n+48|0;j=n+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=n>>>0){w=0;l=x;return w|0}a=c[7081]|0;if(a|0?(m=c[7079]|0,o=m+k|0,o>>>0<=m>>>0|o>>>0>a>>>0):0){w=0;l=x;return w|0}d:do if(!(c[7082]&4)){d=c[6977]|0;e:do if(d){e=28332;while(1){o=c[e>>2]|0;if(o>>>0<=d>>>0?(o+(c[e+4>>2]|0)|0)>>>0>d>>>0:0)break;a=c[e+8>>2]|0;if(!a){r=128;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=ti(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[e+4>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;r=145;break d}}else{e=a;r=136}}else b=0}else r=128;while(0);do if((r|0)==128){d=ti(0)|0;if((d|0)!=(-1|0)?(b=d,p=c[7090]|0,q=p+-1|0,b=((q&b|0)==0?0:(q+b&0-p)-b|0)+k|0,p=c[7079]|0,q=b+p|0,b>>>0>n>>>0&b>>>0<2147483647):0){o=c[7081]|0;if(o|0?q>>>0<=p>>>0|q>>>0>o>>>0:0){b=0;break}a=ti(b|0)|0;if((a|0)==(d|0)){h=b;g=d;r=145;break d}else{e=a;r=136}}else b=0}while(0);do if((r|0)==136){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;r=145;break d}a=c[7091]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;r=145;break d}if((ti(a|0)|0)==(-1|0)){ti(d|0)|0;b=0;break}else{h=a+b|0;g=e;r=145;break d}}while(0);c[7082]=c[7082]|4;r=143}else{b=0;r=143}while(0);if(((r|0)==143?k>>>0<2147483647:0)?(u=ti(k|0)|0,q=ti(0)|0,s=q-u|0,t=s>>>0>(n+40|0)>>>0,!((u|0)==(-1|0)|t^1|u>>>0<q>>>0&((u|0)!=(-1|0)&(q|0)!=(-1|0))^1)):0){h=t?s:b;g=u;r=145}if((r|0)==145){b=(c[7079]|0)+h|0;c[7079]=b;if(b>>>0>(c[7080]|0)>>>0)c[7080]=b;j=c[6977]|0;f:do if(j){b=28332;while(1){a=c[b>>2]|0;d=c[b+4>>2]|0;if((g|0)==(a+d|0)){r=154;break}e=c[b+8>>2]|0;if(!e)break;else b=e}if(((r|0)==154?(v=b+4|0,(c[b+12>>2]&8|0)==0):0)?g>>>0>j>>>0&a>>>0<=j>>>0:0){c[v>>2]=d+h;w=(c[6974]|0)+h|0;u=j+8|0;u=(u&7|0)==0?0:0-u&7;v=j+u|0;u=w-u|0;c[6977]=v;c[6974]=u;c[v+4>>2]=u|1;c[j+w+4>>2]=40;c[6978]=c[7093];break}if(g>>>0<(c[6975]|0)>>>0)c[6975]=g;d=g+h|0;b=28332;while(1){if((c[b>>2]|0)==(d|0)){r=162;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((r|0)==162?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;m=b+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;k=m+n|0;i=b-m-n|0;c[m+4>>2]=n|3;g:do if((j|0)==(b|0)){w=(c[6974]|0)+i|0;c[6974]=w;c[6977]=k;c[k+4>>2]=w|1}else{if((c[6976]|0)==(b|0)){w=(c[6973]|0)+i|0;c[6973]=w;c[6976]=k;c[k+4>>2]=w|1;c[k+w>>2]=w;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;e=a>>>3;h:do if(a>>>0<256){a=c[b+8>>2]|0;d=c[b+12>>2]|0;if((d|0)==(a|0)){c[6971]=c[6971]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}else{g=c[b+24>>2]|0;a=c[b+12>>2]|0;do if((a|0)==(b|0)){d=b+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{w=c[b+8>>2]|0;c[w+12>>2]=a;c[a+8>>2]=w}while(0);if(!g)break;d=c[b+28>>2]|0;e=28188+(d<<2)|0;do if((c[e>>2]|0)!=(b|0)){w=g+16|0;c[((c[w>>2]|0)==(b|0)?w:g+20|0)>>2]=a;if(!a)break h}else{c[e>>2]=a;if(a|0)break;c[6972]=c[6972]&~(1<<d);break h}while(0);c[a+24>>2]=g;d=b+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(!d)break;c[a+20>>2]=d;c[d+24>>2]=a}while(0);b=b+h|0;f=h+i|0}else f=i;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;b=f>>>3;if(f>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=k;c[b+12>>2]=k;c[k+8>>2]=b;c[k+12>>2]=d;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=28188+(e<<2)|0;c[k+28>>2]=e;a=k+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[6972]|0;d=1<<e;if(!(a&d)){c[6972]=a|d;c[b>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break}b=c[b>>2]|0;i:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break i}else{e=e<<1;b=a}}c[d>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break g}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=k;c[v>>2]=k;c[k+8>>2]=w;c[k+12>>2]=b;c[k+24>>2]=0}while(0);w=m+8|0;l=x;return w|0}b=28332;while(1){a=c[b>>2]|0;if(a>>>0<=j>>>0?(w=a+(c[b+4>>2]|0)|0,w>>>0>j>>>0):0)break;b=c[b+8>>2]|0}f=w+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=j+16|0;a=a>>>0<f>>>0?j:a;b=a+8|0;d=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=d-u|0;c[6977]=v;c[6974]=u;c[v+4>>2]=u|1;c[g+d+4>>2]=40;c[6978]=c[7093];d=a+4|0;c[d>>2]=27;c[b>>2]=c[7083];c[b+4>>2]=c[7084];c[b+8>>2]=c[7085];c[b+12>>2]=c[7086];c[7083]=g;c[7084]=h;c[7086]=0;c[7085]=b;b=a+24|0;do{v=b;b=b+4|0;c[b>>2]=7}while((v+8|0)>>>0<w>>>0);if((a|0)!=(j|0)){g=a-j|0;c[d>>2]=c[d>>2]&-2;c[j+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=j;c[b+12>>2]=j;c[j+8>>2]=b;c[j+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=28188+(e<<2)|0;c[j+28>>2]=e;c[j+20>>2]=0;c[f>>2]=0;b=c[6972]|0;a=1<<e;if(!(b&a)){c[6972]=b|a;c[d>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}b=c[d>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(g|0)){b=a;break j}else{e=e<<1;b=a}}c[d>>2]=j;c[j+24>>2]=b;c[j+12>>2]=j;c[j+8>>2]=j;break f}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=j;c[v>>2]=j;c[j+8>>2]=w;c[j+12>>2]=b;c[j+24>>2]=0}}else{w=c[6975]|0;if((w|0)==0|g>>>0<w>>>0)c[6975]=g;c[7083]=g;c[7084]=h;c[7086]=0;c[6980]=c[7089];c[6979]=-1;c[6984]=27924;c[6983]=27924;c[6986]=27932;c[6985]=27932;c[6988]=27940;c[6987]=27940;c[6990]=27948;c[6989]=27948;c[6992]=27956;c[6991]=27956;c[6994]=27964;c[6993]=27964;c[6996]=27972;c[6995]=27972;c[6998]=27980;c[6997]=27980;c[7e3]=27988;c[6999]=27988;c[7002]=27996;c[7001]=27996;c[7004]=28004;c[7003]=28004;c[7006]=28012;c[7005]=28012;c[7008]=28020;c[7007]=28020;c[7010]=28028;c[7009]=28028;c[7012]=28036;c[7011]=28036;c[7014]=28044;c[7013]=28044;c[7016]=28052;c[7015]=28052;c[7018]=28060;c[7017]=28060;c[7020]=28068;c[7019]=28068;c[7022]=28076;c[7021]=28076;c[7024]=28084;c[7023]=28084;c[7026]=28092;c[7025]=28092;c[7028]=28100;c[7027]=28100;c[7030]=28108;c[7029]=28108;c[7032]=28116;c[7031]=28116;c[7034]=28124;c[7033]=28124;c[7036]=28132;c[7035]=28132;c[7038]=28140;c[7037]=28140;c[7040]=28148;c[7039]=28148;c[7042]=28156;c[7041]=28156;c[7044]=28164;c[7043]=28164;c[7046]=28172;c[7045]=28172;w=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=w-u|0;c[6977]=v;c[6974]=u;c[v+4>>2]=u|1;c[g+w+4>>2]=40;c[6978]=c[7093]}while(0);b=c[6974]|0;if(b>>>0>n>>>0){u=b-n|0;c[6974]=u;w=c[6977]|0;v=w+n|0;c[6977]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}}c[(Jg()|0)>>2]=12;w=0;l=x;return w|0}function Bg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;d=a+-8|0;f=c[6975]|0;a=c[a+-4>>2]|0;b=a&-8;j=d+b|0;do if(!(a&1)){e=c[d>>2]|0;if(!(a&3))return;h=d+(0-e)|0;g=e+b|0;if(h>>>0<f>>>0)return;if((c[6976]|0)==(h|0)){a=j+4|0;b=c[a>>2]|0;if((b&3|0)!=3){i=h;b=g;break}c[6973]=g;c[a>>2]=b&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}d=e>>>3;if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[6971]=c[6971]&~(1<<d);i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){b=h+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){a=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;d=28188+(b<<2)|0;if((c[d>>2]|0)==(h|0)){c[d>>2]=a;if(!a){c[6972]=c[6972]&~(1<<b);i=h;b=g;break}}else{i=f+16|0;c[((c[i>>2]|0)==(h|0)?i:f+20|0)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=h+16|0;d=c[b>>2]|0;if(d|0){c[a+16>>2]=d;c[d+24>>2]=a}b=c[b+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=d;h=d}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;e=c[a>>2]|0;if(!(e&1))return;if(!(e&2)){if((c[6977]|0)==(j|0)){j=(c[6974]|0)+b|0;c[6974]=j;c[6977]=i;c[i+4>>2]=j|1;if((i|0)!=(c[6976]|0))return;c[6976]=0;c[6973]=0;return}if((c[6976]|0)==(j|0)){j=(c[6973]|0)+b|0;c[6973]=j;c[6976]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[6971]=c[6971]&~(1<<d);break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){d=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0;d=a}else{d=c[j+8>>2]|0;c[d+12>>2]=a;c[a+8>>2]=d;d=a}while(0);if(g|0){a=c[j+28>>2]|0;b=28188+(a<<2)|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=d;if(!d){c[6972]=c[6972]&~(1<<a);break}}else{e=g+16|0;c[((c[e>>2]|0)==(j|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;a=j+16|0;b=c[a>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}a=c[a+4>>2]|0;if(a|0){c[d+20>>2]=a;c[a+24>>2]=d}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[6976]|0)){c[6973]=f;return}}else{c[a>>2]=e&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}a=f>>>3;if(f>>>0<256){d=27924+(a<<1<<2)|0;b=c[6971]|0;a=1<<a;if(!(b&a)){c[6971]=b|a;a=d;b=d+8|0}else{b=d+8|0;a=c[b>>2]|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)e=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;e=(j+245760|0)>>>16&2;e=14-(g|h|e)+(j<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;a=28188+(e<<2)|0;c[i+28>>2]=e;c[i+20>>2]=0;c[i+16>>2]=0;b=c[6972]|0;d=1<<e;a:do if(!(b&d)){c[6972]=b|d;c[a>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i}else{a=c[a>>2]|0;b:do if((c[a+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=a+16+(e>>>31<<2)|0;b=c[d>>2]|0;if(!b)break;if((c[b+4>>2]&-8|0)==(f|0)){a=b;break b}else{e=e<<1;a=b}}c[d>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i;break a}while(0);h=a+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=a;c[i+24>>2]=0}while(0);j=(c[6979]|0)+-1|0;c[6979]=j;if(j|0)return;a=28340;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[6979]=-1;return}function Cg(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=Ag(b)|0;return b|0}if(b>>>0>4294967231){c[(Jg()|0)>>2]=12;b=0;return b|0}d=Dg(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=Ag(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;ri(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Bg(a);b=d;return b|0}function Dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=a+4|0;m=c[l>>2]|0;d=m&-8;i=a+d|0;if(!(m&3)){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[7091]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;k=a+b|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|3;m=i+4|0;c[m>>2]=c[m>>2]|1;Eg(k,d);return a|0}if((c[6977]|0)==(i|0)){k=(c[6974]|0)+d|0;d=k-b|0;e=a+b|0;if(k>>>0<=b>>>0){a=0;return a|0}c[l>>2]=m&1|b|2;c[e+4>>2]=d|1;c[6977]=e;c[6974]=d;return a|0}if((c[6976]|0)==(i|0)){e=(c[6973]|0)+d|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){k=a+b|0;e=a+e|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|1;c[e>>2]=d;e=e+4|0;c[e>>2]=c[e>>2]&-2;e=k}else{c[l>>2]=m&1|e|2;e=a+e+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[6973]=d;c[6976]=e;return a|0}e=c[i+4>>2]|0;if(e&2|0){a=0;return a|0}j=(e&-8)+d|0;if(j>>>0<b>>>0){a=0;return a|0}k=j-b|0;f=e>>>3;do if(e>>>0<256){e=c[i+8>>2]|0;d=c[i+12>>2]|0;if((d|0)==(e|0)){c[6971]=c[6971]&~(1<<f);break}else{c[e+12>>2]=d;c[d+8>>2]=e;break}}else{h=c[i+24>>2]|0;d=c[i+12>>2]|0;do if((d|0)==(i|0)){e=i+16|0;f=e+4|0;d=c[f>>2]|0;if(!d){d=c[e>>2]|0;if(!d){f=0;break}}else e=f;while(1){g=d+20|0;f=c[g>>2]|0;if(!f){g=d+16|0;f=c[g>>2]|0;if(!f)break;else{d=f;e=g}}else{d=f;e=g}}c[e>>2]=0;f=d}else{f=c[i+8>>2]|0;c[f+12>>2]=d;c[d+8>>2]=f;f=d}while(0);if(h|0){d=c[i+28>>2]|0;e=28188+(d<<2)|0;if((c[e>>2]|0)==(i|0)){c[e>>2]=f;if(!f){c[6972]=c[6972]&~(1<<d);break}}else{g=h+16|0;c[((c[g>>2]|0)==(i|0)?g:h+20|0)>>2]=f;if(!f)break}c[f+24>>2]=h;d=i+16|0;e=c[d>>2]|0;if(e|0){c[f+16>>2]=e;c[e+24>>2]=f}d=c[d+4>>2]|0;if(d|0){c[f+20>>2]=d;c[d+24>>2]=f}}}while(0);if(k>>>0<16){c[l>>2]=m&1|j|2;m=a+j+4|0;c[m>>2]=c[m>>2]|1;return a|0}else{i=a+b|0;c[l>>2]=m&1|b|2;c[i+4>>2]=k|3;m=a+j+4|0;c[m>>2]=c[m>>2]|1;Eg(i,k);return a|0}return 0}function Eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){f=c[a>>2]|0;if(!(d&3))return;h=a+(0-f)|0;b=f+b|0;if((c[6976]|0)==(h|0)){a=i+4|0;d=c[a>>2]|0;if((d&3|0)!=3)break;c[6973]=b;c[a>>2]=d&-2;c[h+4>>2]=b|1;c[i>>2]=b;return}e=f>>>3;if(f>>>0<256){a=c[h+8>>2]|0;d=c[h+12>>2]|0;if((d|0)==(a|0)){c[6971]=c[6971]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}g=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){d=h+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{f=c[h+8>>2]|0;c[f+12>>2]=a;c[a+8>>2]=f}while(0);if(g){d=c[h+28>>2]|0;e=28188+(d<<2)|0;if((c[e>>2]|0)==(h|0)){c[e>>2]=a;if(!a){c[6972]=c[6972]&~(1<<d);break}}else{f=g+16|0;c[((c[f>>2]|0)==(h|0)?f:g+20|0)>>2]=a;if(!a)break}c[a+24>>2]=g;d=h+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(d){c[a+20>>2]=d;c[d+24>>2]=a}}}else h=a;while(0);a=i+4|0;e=c[a>>2]|0;if(!(e&2)){if((c[6977]|0)==(i|0)){i=(c[6974]|0)+b|0;c[6974]=i;c[6977]=h;c[h+4>>2]=i|1;if((h|0)!=(c[6976]|0))return;c[6976]=0;c[6973]=0;return}if((c[6976]|0)==(i|0)){i=(c[6973]|0)+b|0;c[6973]=i;c[6976]=h;c[h+4>>2]=i|1;c[h+i>>2]=i;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){a=c[i+8>>2]|0;b=c[i+12>>2]|0;if((b|0)==(a|0)){c[6971]=c[6971]&~(1<<d);break}else{c[a+12>>2]=b;c[b+8>>2]=a;break}}else{g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+16|0;d=a+4|0;b=c[d>>2]|0;if(!b){b=c[a>>2]|0;if(!b){d=0;break}}else a=d;while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);if(g|0){b=c[i+28>>2]|0;a=28188+(b<<2)|0;if((c[a>>2]|0)==(i|0)){c[a>>2]=d;if(!d){c[6972]=c[6972]&~(1<<b);break}}else{e=g+16|0;c[((c[e>>2]|0)==(i|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;b=i+16|0;a=c[b>>2]|0;if(a|0){c[d+16>>2]=a;c[a+24>>2]=d}b=c[b+4>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}}while(0);c[h+4>>2]=f|1;c[h+f>>2]=f;if((h|0)==(c[6976]|0)){c[6973]=f;return}}else{c[a>>2]=e&-2;c[h+4>>2]=b|1;c[h+b>>2]=b;f=b}b=f>>>3;if(f>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=h;c[b+12>>2]=h;c[h+8>>2]=b;c[h+12>>2]=d;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{g=(b+1048320|0)>>>16&8;i=b<<g;d=(i+520192|0)>>>16&4;i=i<<d;e=(i+245760|0)>>>16&2;e=14-(d|g|e)+(i<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=28188+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[h+16>>2]=0;a=c[6972]|0;d=1<<e;if(!(a&d)){c[6972]=a|d;c[b>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}b=c[b>>2]|0;a:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break a}else{e=e<<1;b=a}}c[d>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}while(0);g=b+8|0;i=c[g>>2]|0;c[i+12>>2]=h;c[g>>2]=h;c[h+8>>2]=i;c[h+12>>2]=b;c[h+24>>2]=0;return}function Fg(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Kg(c[a+60>>2]|0)|0;a=Ig(pa(6,d|0)|0)|0;l=b;return a|0}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+32|0;g=n+16|0;f=n;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=Ig(na(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=b+(o<<31>>31)|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=Ig(na(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function Hg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((Ig(ma(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function Ig(a){a=a|0;if(a>>>0>4294963200){c[(Jg()|0)>>2]=0-a;a=-1}return a|0}function Jg(){return 28444}function Kg(a){a=a|0;return a|0}function Lg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=1;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,oa(54,f|0)|0):0)a[b+75>>0]=-1;f=Gg(b,d,e)|0;l=g;return f|0}function Mg(a){a=a|0;return (a+-48|0)>>>0<10|0}function Ng(){return 13300}function Og(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function Pg(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=5;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=5;break}}}while(0);if((e|0)==5){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function Qg(a,b){a=a|0;b=b|0;Sg(a,b)|0;return a|0}function Rg(a,b){a=a|0;b=b|0;Qg(a+(Pg(a)|0)|0,b)|0;return a|0}function Sg(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=10}else f=10;while(0);if((f|0)==10){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function Tg(b,c){b=b|0;c=c|0;b=Vg(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function Ug(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else i=16;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)==g<<24>>24)if(!e){i=16;break}else break;f=N(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break c;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break}}else i=11;while(0);if((i|0)==11)if(!e){i=16;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;e=e+-1|0;if(!e){i=16;break}else b=b+1|0}}while(0);if((i|0)==16)b=0;return b|0}function Vg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(Pg(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=N(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function Wg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f;c[g>>2]=e;e=Xg(a,b,d,g)|0;l=f;return e|0}function Xg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=13544;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(Jg()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=Yg(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function Yg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+208|0;p=s+160|0;q=s+80|0;r=s;f=p;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((Zg(0,d,n,q,p)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)o=_g(b)|0;else o=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=Zg(b,d,n,q,p)|0;if(h){Xa[c[b+36>>2]&31](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=Zg(b,d,n,q,p)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(o|0)$g(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function Zg(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+64|0;D=I+56|0;E=I+40|0;A=I;G=I+48|0;H=I+60|0;c[D>>2]=e;w=(d|0)!=0;x=A+40|0;z=x;A=A+39|0;B=G+4|0;j=0;e=0;m=0;a:while(1){do{do if((e|0)>-1)if((j|0)>(2147483647-e|0)){c[(Jg()|0)>>2]=75;e=-1;break}else{e=j+e|0;break}while(0);s=c[D>>2]|0;j=a[s>>0]|0;if(!(j<<24>>24)){v=94;break a}k=s;b:while(1){switch(j<<24>>24){case 37:{v=10;break b}case 0:{j=k;break b}default:{}}u=k+1|0;c[D>>2]=u;j=a[u>>0]|0;k=u}c:do if((v|0)==10){v=0;j=k;do{if((a[k+1>>0]|0)!=37)break c;j=j+1|0;k=k+2|0;c[D>>2]=k}while((a[k>>0]|0)==37)}while(0);j=j-s|0;if(w)ah(d,s,j)}while((j|0)!=0);u=(Mg(a[(c[D>>2]|0)+1>>0]|0)|0)==0;k=c[D>>2]|0;if(!u?(a[k+2>>0]|0)==36:0){q=(a[k+1>>0]|0)+-48|0;o=1;j=3}else{q=-1;o=m;j=1}j=k+j|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>31|(1<<m&75913|0)==0)n=0;else{n=0;do{n=1<<m|n;j=j+1|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0}while(!(m>>>0>31|(1<<m&75913|0)==0))}if(k<<24>>24==42){if((Mg(a[j+1>>0]|0)|0)!=0?(F=c[D>>2]|0,(a[F+2>>0]|0)==36):0){j=F+1|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;m=1;k=F+3|0}else{if(o|0){e=-1;break}if(w){u=(c[f>>2]|0)+(4-1)&~(4-1);j=c[u>>2]|0;c[f>>2]=u+4}else j=0;m=0;k=(c[D>>2]|0)+1|0}c[D>>2]=k;u=(j|0)<0;t=u?0-j|0:j;n=u?n|8192:n;u=m}else{j=bh(D)|0;if((j|0)<0){e=-1;break}t=j;u=o;k=c[D>>2]|0}do if((a[k>>0]|0)==46){j=k+1|0;if((a[j>>0]|0)!=42){c[D>>2]=j;j=bh(D)|0;k=c[D>>2]|0;break}if(Mg(a[k+2>>0]|0)|0?(C=c[D>>2]|0,(a[C+3>>0]|0)==36):0){j=C+2|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;k=C+4|0;c[D>>2]=k;break}if(u|0){e=-1;break a}if(w){r=(c[f>>2]|0)+(4-1)&~(4-1);j=c[r>>2]|0;c[f>>2]=r+4}else j=0;k=(c[D>>2]|0)+2|0;c[D>>2]=k}else j=-1;while(0);r=0;while(1){if(((a[k>>0]|0)+-65|0)>>>0>57){e=-1;break a}m=k;k=k+1|0;c[D>>2]=k;m=a[(a[m>>0]|0)+-65+(10304+(r*58|0))>>0]|0;o=m&255;if((o+-1|0)>>>0>=8)break;else r=o}if(!(m<<24>>24)){e=-1;break}p=(q|0)>-1;do if(m<<24>>24==19)if(p){e=-1;break a}else v=54;else{if(p){c[i+(q<<2)>>2]=o;p=g+(q<<3)|0;q=c[p+4>>2]|0;v=E;c[v>>2]=c[p>>2];c[v+4>>2]=q;v=54;break}if(!w){e=0;break a}ch(E,o,f);k=c[D>>2]|0;v=55}while(0);if((v|0)==54){v=0;if(w)v=55;else j=0}d:do if((v|0)==55){v=0;k=a[k+-1>>0]|0;k=(r|0)!=0&(k&15|0)==3?k&-33:k;m=n&-65537;q=(n&8192|0)==0?n:m;e:do switch(k|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[E>>2]>>2]=e;j=0;break d}case 1:{c[c[E>>2]>>2]=e;j=0;break d}case 2:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}case 3:{b[c[E>>2]>>1]=e;j=0;break d}case 4:{a[c[E>>2]>>0]=e;j=0;break d}case 6:{c[c[E>>2]>>2]=e;j=0;break d}case 7:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}default:{j=0;break d}}case 112:{k=120;j=j>>>0>8?j:8;m=q|8;v=67;break}case 88:case 120:{m=q;v=67;break}case 111:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;p=eh(k,m,x)|0;v=z-p|0;n=0;o=19018;j=(q&8|0)==0|(j|0)>(v|0)?j:v+1|0;v=73;break}case 105:case 100:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;if((m|0)<0){k=fi(0,0,k|0,m|0)|0;m=y;n=E;c[n>>2]=k;c[n+4>>2]=m;n=1;o=19018;v=72;break e}else{n=(q&2049|0)!=0&1;o=(q&2048|0)==0?((q&1|0)==0?19018:19020):19019;v=72;break e}}case 117:{m=E;n=0;o=19018;k=c[m>>2]|0;m=c[m+4>>2]|0;v=72;break}case 99:{a[A>>0]=c[E>>2];r=A;n=0;o=19018;p=1;j=z;break}case 109:{k=gh(c[(Jg()|0)>>2]|0)|0;v=77;break}case 115:{k=c[E>>2]|0;k=(k|0)==0?19028:k;v=77;break}case 67:{c[G>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=G;o=-1;v=81;break}case 83:{if(!j){hh(d,32,t,0,q);j=0;v=91}else{o=j;v=81}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{j=jh(d,+h[E>>3],t,j,q,k)|0;break d}default:{r=s;n=0;o=19018;p=j;m=q;j=z}}while(0);f:do if((v|0)==67){s=E;r=c[s>>2]|0;s=c[s+4>>2]|0;p=dh(r,s,x,k&32)|0;o=(m&8|0)==0|(r|0)==0&(s|0)==0;n=o?0:2;o=o?19018:19018+(k>>>4)|0;q=m;k=r;m=s;v=73}else if((v|0)==72){p=fh(k,m,x)|0;v=73}else if((v|0)==77){v=0;s=Ug(k,0,j)|0;q=(s|0)==0;r=k;n=0;o=19018;p=q?j:s-k|0;j=q?k+j|0:s}else if((v|0)==81){v=0;n=c[E>>2]|0;j=0;while(1){k=c[n>>2]|0;if(!k)break;k=ih(H,k)|0;m=(k|0)<0;if(m|k>>>0>(o-j|0)>>>0){v=85;break}j=k+j|0;if(o>>>0>j>>>0)n=n+4|0;else break}if((v|0)==85){v=0;if(m){e=-1;break a}}hh(d,32,t,j,q);if(!j){j=0;v=91}else{m=c[E>>2]|0;n=0;while(1){k=c[m>>2]|0;if(!k){v=91;break f}k=ih(H,k)|0;n=k+n|0;if((n|0)>(j|0)){v=91;break f}ah(d,H,k);if(n>>>0>=j>>>0){v=91;break}else m=m+4|0}}}while(0);if((v|0)==73){v=0;m=(k|0)!=0|(m|0)!=0;s=(j|0)!=0|m;m=z-p+((m^1)&1)|0;r=s?p:x;p=s?((j|0)>(m|0)?j:m):0;m=(j|0)>-1?q&-65537:q;j=z}else if((v|0)==91){v=0;hh(d,32,t,j,q^8192);j=(t|0)>(j|0)?t:j;break}q=j-r|0;p=(p|0)<(q|0)?q:p;s=p+n|0;j=(t|0)<(s|0)?s:t;hh(d,32,j,s,m);ah(d,o,n);hh(d,48,j,s,m^65536);hh(d,48,p,q,0);ah(d,r,q);hh(d,32,j,s,m^8192)}while(0);m=u}g:do if((v|0)==94)if(!d)if(!m)e=0;else{e=1;while(1){j=c[i+(e<<2)>>2]|0;if(!j)break;ch(g+(e<<3)|0,j,f);e=e+1|0;if(e>>>0>=10){e=1;break g}}while(1){if(c[i+(e<<2)>>2]|0){e=-1;break g}e=e+1|0;if(e>>>0>=10){e=1;break}}}while(0);l=I;return e|0}function _g(a){a=a|0;return 0}function $g(a){a=a|0;return}function ah(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))vh(b,d,a)|0;return}function bh(b){b=b|0;var d=0,e=0;if(!(Mg(a[c[b>>2]>>0]|0)|0))d=0;else{d=0;do{e=c[b>>2]|0;d=(d*10|0)+-48+(a[e>>0]|0)|0;e=e+1|0;c[b>>2]=e}while((Mg(a[e>>0]|0)|0)!=0)}return d|0}function ch(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function dh(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[10768+(b&15)>>0]|0|f;b=ni(b|0,c|0,4)|0;c=y}while(!((b|0)==0&(c|0)==0));return e|0}function eh(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=ni(b|0,c|0,3)|0;c=y}while(!((b|0)==0&(c|0)==0));return d|0}function fh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){do{e=b;b=li(b|0,c|0,10,0)|0;f=c;c=y;g=ki(b|0,c|0,10,0)|0;g=fi(e|0,f|0,g|0,y|0)|0;d=d+-1|0;a[d>>0]=g&255|48}while(f>>>0>9|(f|0)==9&e>>>0>4294967295);c=b}else c=b;if(c)do{g=c;c=(c>>>0)/10|0;d=d+-1|0;a[d>>0]=g-(c*10|0)|48}while(g>>>0>=10);return d|0}function gh(a){a=a|0;return qh(a,c[(ph()|0)+188>>2]|0)|0}function hh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;si(f|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{ah(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}ah(a,f,e)}l=g;return}function ih(a,b){a=a|0;b=b|0;if(!a)a=0;else a=nh(a,b,0)|0;return a|0}function jh(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+32|0;v=H+536|0;G=H;F=G;n=H+540|0;c[v>>2]=0;E=n+12|0;kh(e)|0;j=y;if((j|0)<0){e=-e;kh(e)|0;D=1;C=19035;j=y}else{D=(h&2049|0)!=0&1;C=(h&2048|0)==0?((h&1|0)==0?19036:19041):19038}do if(0==0&(j&2146435072|0)==2146435072){G=(i&32|0)!=0;j=D+3|0;hh(b,32,f,j,h&-65537);ah(b,C,D);ah(b,e!=e|0.0!=0.0?(G?19062:19066):G?19054:19058,3);hh(b,32,f,j,h^8192)}else{r=+lh(e,v)*2.0;j=r!=0.0;if(j)c[v>>2]=(c[v>>2]|0)+-1;u=i|32;if((u|0)==97){p=i&32;s=(p|0)==0?C:C+9|0;q=D|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[s>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[v>>2]|0;j=(k|0)<0?0-k|0:k;j=fh(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;k=(g|0)<1;m=(h&8|0)==0;n=G;do{D=~~e;j=n+1|0;a[n>>0]=p|d[10768+D>>0];e=(e-+(D|0))*16.0;if((j-F|0)==1?!(m&(k&e==0.0)):0){a[j>>0]=46;n=n+2|0}else n=j}while(e!=0.0);if((g|0)!=0?(-2-F+n|0)<(g|0):0){k=E;m=o;j=g+2+k-m|0}else{k=E;m=o;j=k-F-m+n|0}E=j+q|0;hh(b,32,f,E,h);ah(b,s,q);hh(b,48,f,E,h^65536);F=n-F|0;ah(b,G,F);G=k-m|0;hh(b,48,j-(F+G)|0,0,0);ah(b,o,G);hh(b,32,f,E,h^8192);j=E;break}k=(g|0)<0?6:g;if(j){j=(c[v>>2]|0)+-28|0;c[v>>2]=j;e=r*268435456.0}else{e=r;j=c[v>>2]|0}B=(j|0)<0?m:m+288|0;m=B;do{z=~~e>>>0;c[m>>2]=z;m=m+4|0;e=(e-+(z>>>0))*1.0e9}while(e!=0.0);z=B;if((j|0)>0){p=B;while(1){o=(j|0)<29?j:29;j=m+-4|0;if(j>>>0>=p>>>0){n=0;do{t=oi(c[j>>2]|0,0,o|0)|0;t=ei(t|0,y|0,n|0,0)|0;w=y;n=li(t|0,w|0,1e9,0)|0;x=ki(n|0,y|0,1e9,0)|0;x=fi(t|0,w|0,x|0,y|0)|0;c[j>>2]=x;j=j+-4|0}while(j>>>0>=p>>>0);if(n){x=p+-4|0;c[x>>2]=n;n=x}else n=p}else n=p;a:do if(m>>>0>n>>>0){j=m;while(1){m=j+-4|0;if(c[m>>2]|0){m=j;break a}if(m>>>0>n>>>0)j=m;else break}}while(0);j=(c[v>>2]|0)-o|0;c[v>>2]=j;if((j|0)>0)p=n;else break}}else n=B;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(u|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0<m>>>0){o=(1<<s)+-1|0;p=1e9>>>s;q=0;j=n;do{x=c[j>>2]|0;c[j>>2]=(x>>>s)+q;q=N(x&o,p)|0;j=j+4|0}while(j>>>0<m>>>0);n=(c[n>>2]|0)==0?n+4|0:n;if(q){c[m>>2]=q;m=m+4|0}}else n=(c[n>>2]|0)==0?n+4|0:n;j=t?B:n;m=(m-j>>2|0)>(g|0)?j+(g<<2)|0:m;j=(c[v>>2]|0)+s|0;c[v>>2]=j}while((j|0)<0);t=n}else t=n;if(t>>>0<m>>>0){j=(z-t>>2)*9|0;o=c[t>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;j=j+1|0}while(o>>>0>=n>>>0)}}else j=0;w=(u|0)==103;x=(k|0)!=0;n=k-((u|0)==102?0:j)+((x&w)<<31>>31)|0;if((n|0)<(((m-z>>2)*9|0)+-9|0)){v=n+9216|0;n=(v|0)/9|0;g=B+4+(n+-1024<<2)|0;n=v-(n*9|0)|0;if((n|0)<8){o=10;while(1){o=o*10|0;if((n|0)<7)n=n+1|0;else break}}else o=10;q=c[g>>2]|0;n=(q>>>0)/(o>>>0)|0;s=q-(N(n,o)|0)|0;p=(g+4|0)==(m|0);if(!(p&(s|0)==0)){r=(n&1|0)==0?9007199254740992.0:9007199254740994.0;v=o>>>1;e=s>>>0<v>>>0?.5:p&(s|0)==(v|0)?1.0:1.5;if(D){v=(a[C>>0]|0)==45;e=v?-e:e;r=v?-r:r}n=q-s|0;c[g>>2]=n;if(r+e!=r){v=n+o|0;c[g>>2]=v;if(v>>>0>999999999){o=g;j=t;while(1){n=o+-4|0;c[o>>2]=0;if(n>>>0<j>>>0){j=j+-4|0;c[j>>2]=0}v=(c[n>>2]|0)+1|0;c[n>>2]=v;if(v>>>0>999999999)o=n;else{o=j;break}}}else{n=g;o=t}j=(z-o>>2)*9|0;q=c[o>>2]|0;if(q>>>0>=10){p=10;do{p=p*10|0;j=j+1|0}while(q>>>0>=p>>>0)}}else{n=g;o=t}}else{n=g;o=t}v=n+4|0;m=m>>>0>v>>>0?v:m}else o=t;g=0-j|0;b:do if(m>>>0>o>>>0)while(1){n=m+-4|0;if(c[n>>2]|0){v=m;u=1;break b}if(n>>>0>o>>>0)m=n;else{v=n;u=0;break}}else{v=m;u=0}while(0);do if(w){k=k+((x^1)&1)|0;if((k|0)>(j|0)&(j|0)>-5){p=i+-1|0;k=k+-1-j|0}else{p=i+-2|0;k=k+-1|0}if(!(h&8)){if(u?(A=c[v+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){n=0;m=10;do{m=m*10|0;n=n+1|0}while(!((A>>>0)%(m>>>0)|0|0))}else n=0;else n=9;m=((v-z>>2)*9|0)+-9|0;if((p|32|0)==102){i=m-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}else{i=m+j-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}}}else p=i;while(0);t=(k|0)!=0;q=t?1:h>>>3&1;s=(p|32|0)==102;if(s){w=0;j=(j|0)>0?j:0}else{m=(j|0)<0?g:j;m=fh(m,((m|0)<0)<<31>>31,E)|0;n=E;if((n-m|0)<2)do{m=m+-1|0;a[m>>0]=48}while((n-m|0)<2);a[m+-1>>0]=(j>>31&2)+43;j=m+-2|0;a[j>>0]=p;w=j;j=n-j|0}j=D+1+k+q+j|0;hh(b,32,f,j,h);ah(b,C,D);hh(b,48,f,j,h^65536);if(s){q=o>>>0>B>>>0?B:o;s=G+9|0;o=s;p=G+8|0;n=q;do{m=fh(c[n>>2]|0,0,s)|0;if((n|0)==(q|0)){if((m|0)==(s|0)){a[p>>0]=48;m=p}}else if(m>>>0>G>>>0){si(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}ah(b,m,o-m|0);n=n+4|0}while(n>>>0<=B>>>0);if(!((h&8|0)==0&(t^1)))ah(b,19070,1);if(n>>>0<v>>>0&(k|0)>0)while(1){m=fh(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){si(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}ah(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0<v>>>0&(k|0)>9)){k=m;break}else k=m}hh(b,48,k+9|0,9,0)}else{v=u?v:o+4|0;if(o>>>0<v>>>0&(k|0)>-1){g=G+9|0;t=(h&8|0)==0;u=g;q=0-F|0;s=G+8|0;p=o;do{m=fh(c[p>>2]|0,0,g)|0;if((m|0)==(g|0)){a[s>>0]=48;m=s}do if((p|0)==(o|0)){n=m+1|0;ah(b,m,1);if(t&(k|0)<1){m=n;break}ah(b,19070,1);m=n}else{if(m>>>0<=G>>>0)break;si(G|0,48,m+q|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=u-m|0;ah(b,m,(k|0)>(F|0)?F:k);k=k-F|0;p=p+4|0}while(p>>>0<v>>>0&(k|0)>-1)}hh(b,48,k+18|0,18,0);ah(b,w,E-w|0)}hh(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function kh(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;y=c[j+4>>2]|0;return b|0}function lh(a,b){a=+a;b=b|0;return +(+mh(a,b))}function mh(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=ni(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+mh(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function nh(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(oh()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(Jg()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(Jg()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function oh(){return Ng()|0}function ph(){return Ng()|0}function qh(b,e){b=b|0;e=e|0;var f=0,g=0;f=0;while(1){if((d[10784+f>>0]|0)==(b|0)){g=4;break}f=f+1|0;if((f|0)==87){b=87;g=5;break}}if((g|0)==4)if(!f)f=10880;else{b=f;g=5}if((g|0)==5){f=10880;do{do{g=f;f=f+1|0}while((a[g>>0]|0)!=0);b=b+-1|0}while((b|0)!=0)}return rh(f,c[e+20>>2]|0)|0}function rh(a,b){a=a|0;b=b|0;return sh(a,b)|0}function sh(a,b){a=a|0;b=b|0;if(!b)b=0;else b=th(c[b>>2]|0,c[b+4>>2]|0,a)|0;return ((b|0)==0?a:b)|0}function th(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=uh(c[b+8>>2]|0,o)|0;f=uh(c[b+12>>2]|0,o)|0;g=uh(c[b+16>>2]|0,o)|0;a:do if((h>>>0<d>>>2>>>0?(n=d-(h<<2)|0,f>>>0<n>>>0&g>>>0<n>>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=uh(c[b+(g<<2)>>2]|0,o)|0;g=uh(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0<d>>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=Og(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}l=f?l:k;h=f?j:h-j|0}f=i+m|0;g=uh(c[b+(f<<2)>>2]|0,o)|0;f=uh(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0<d>>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function uh(a,b){a=a|0;b=b|0;var c=0;c=pi(a|0)|0;return ((b|0)==0?a:c)|0}function vh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(wh(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0<d>>>0){f=Xa[c[e+36>>2]&31](e,b,d)|0;break}b:do if((a[e+75>>0]|0)<0|(d|0)==0){h=0;g=b}else{i=d;while(1){g=i+-1|0;if((a[b+g>>0]|0)==10)break;if(!g){h=0;g=b;break b}else i=g}f=Xa[c[e+36>>2]&31](e,b,i)|0;if(f>>>0<i>>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}while(0);ri(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0}
+function Pd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;K=l;l=l+2080|0;D=K+2056|0;E=K+1024|0;F=K;J=K+2076|0;G=K+2072|0;H=K+2068|0;o=K+2064|0;p=K+2048|0;c[J>>2]=c[d>>2];q=b+128|0;r=b+88|0;s=b+92|0;t=b+96|0;u=D+4|0;v=b+140|0;w=b+136|0;x=b+112|0;z=e+16|0;A=e+24|0;B=e+56|0;C=e+64|0;a:while(1){g=c[J>>2]|0;b:do switch(a[g>>0]|0){case 0:{h=44;break a}case 46:{h=5;break a}case 35:{he(J);break}default:{if((je(G,J,8)|0)<0){h=7;break a}m=c[G>>2]|0;n=m>>>12;c[G>>2]=m&4095;if((le(H,J)|0)<0){h=9;break a}if((le(o,J)|0)<0){h=11;break a}h=c[G>>2]|0;k=c[H>>2]|0;m=c[o>>2]|0;i=lf(104)|0;g=i+16|0;c[g>>2]=1;c[i+20>>2]=0;M=q;j=c[M+4>>2]|0;L=i+8|0;c[L>>2]=c[M>>2];c[L+4>>2]=j;L=q;j=q;c[j>>2]=ei(c[L>>2]|0,c[L+4>>2]|0,1,0)|0;c[j+4>>2]=y;j=i+24|0;c[j>>2]=n;c[i+28>>2]=h&4095;c[i+32>>2]=k;c[i+36>>2]=m;switch(n&1048575|0){case 8:{Ga(i+64|0);break}case 4:{M=i+56|0;c[M>>2]=M;c[i+60>>2]=M;break}default:{}}k=c[s>>2]|0;c[s>>2]=i;c[i>>2]=r;c[i+4>>2]=k;c[k>>2]=i;k=t;L=t;c[L>>2]=ei(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[L+4>>2]=y;Oa(D|0,0)|0;L=c[D>>2]|0;k=i+40|0;c[k>>2]=L;M=(c[u>>2]|0)*1e3|0;m=i+48|0;c[m>>2]=M;c[i+44>>2]=L;c[i+52>>2]=M;M=p;c[M>>2]=0;c[M+4>>2]=0;switch(n&1048575|0){case 6:case 2:{if((le(i+56|0,J)|0)<0){h=17;break a}if((le(i+60|0,J)|0)<0){h=19;break a}break}case 8:{if((ke(p,J)|0)<0){h=21;break a}break}case 4:{c[g>>2]=(c[g>>2]|0)+1;if((c[j>>2]|0)!=4){h=23;break a}M=lf(18)|0;c[M+8>>2]=i;g=M+13|0;a[g>>0]=46;a[g+1>>0]=0;g=i+56|0;h=i+64|0;R=c[h>>2]|0;L=R+18|0;S=ei(c[v>>2]|0,0,-1,-1)|0;N=y;P=ei(S|0,N|0,L|0,((L|0)<0)<<31>>31|0)|0;Q=c[w>>2]|0;P=ni(P|0,y|0,Q|0)|0;O=y;Q=ni(ei(S|0,N|0,R|0,((R|0)<0)<<31>>31|0)|0,y|0,Q|0)|0;R=x;N=x;c[N>>2]=ei(fi(c[R>>2]|0,c[R+4>>2]|0,Q|0,y|0)|0,y|0,P|0,O|0)|0;c[N+4>>2]=y;c[h>>2]=L;L=c[g>>2]|0;c[L+4>>2]=M;c[M>>2]=L;c[M+4>>2]=g;c[g>>2]=M;c[z>>2]=(c[z>>2]|0)+1;if((c[j>>2]|0)!=4){h=25;break a}S=lf(19)|0;c[S+8>>2]=e;M=S+13|0;a[M>>0]=a[14342]|0;a[M+1>>0]=a[14343]|0;a[M+2>>0]=a[14344]|0;M=c[h>>2]|0;R=M+19|0;L=ei(c[v>>2]|0,0,-1,-1)|0;Q=y;O=ei(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=ni(O|0,y|0,N|0)|0;P=y;N=ni(ei(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=ei(fi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[h>>2]=R;R=c[g>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=g;c[g>>2]=S;break}default:{}}if((me(k,m,J)|0)<0){h=28;break a}if((ie(E,1024,J)|0)<0){h=30;break a}if((c[A>>2]|0)!=4){h=32;break a}M=Pg(E)|0;R=M+17|0;S=lf(R)|0;c[S+8>>2]=i;ri(S+13|0,E|0,M+1|0)|0;M=c[C>>2]|0;R=M+R|0;L=ei(c[v>>2]|0,0,-1,-1)|0;Q=y;O=ei(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=ni(O|0,y|0,N|0)|0;P=y;N=ni(ei(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=ei(fi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[C>>2]=R;R=c[B>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=B;c[B>>2]=S;do if((n|0)!=10){S=p;if(!((n|0)==8&((c[S>>2]|0)!=0|(c[S+4>>2]|0)!=0))){he(J);if((n|0)!=4)break b;S=fe(f,E)|0;g=Pd(b,J,i,S)|0;Bg(S);if(!g)break b;else{h=46;break a}}else{if((ne(D,J)|0)<0){h=40;break a}R=D;S=p;Fd(b,i,15635,c[R>>2]|0,c[R+4>>2]|0,c[S>>2]|0,c[S+4>>2]|0)|0;break}}else{if((ie(F,1024,J)|0)<0){h=35;break a}c[i+56>>2]=Ah(F)|0}while(0);he(J)}}while(0)}switch(h|0){case 5:{c[J>>2]=g+1;he(J);I=c[J>>2]|0;break}case 7:{Uh(15963,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 9:{Uh(15977,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 11:{Uh(15990,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 17:{Uh(16003,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 19:{Uh(16018,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 21:{Uh(15932,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 23:{ja(14301,14319,456,14328);break}case 25:{ja(14301,14319,456,14328);break}case 28:{Uh(16033,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 30:{Uh(15857,17,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 32:{ja(14301,14319,456,14328);break}case 35:{Uh(16048,21,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 40:{Uh(15946,16,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 44:{I=g;break}case 46:{l=K;return g|0}}c[d>>2]=I;S=0;l=K;return S|0}function Qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;f=h;g=e+20|0;b=c[g>>2]|0;if(b|0){db[c[a+4>>2]&15](a,b);c[g>>2]=0}b=e+24|0;d=c[b>>2]|0;if((d|0)<=1){i=c[e+16>>2]|0;c[b>>2]=d+1;b=bd(a,i,c[12960+(d<<2)>>2]|0)|0;c[g>>2]=b;if(b|0?(_a[c[a+24>>2]&15](a,f,b,0,6,e)|0)>=1:0){l=h;return}Qd(a,0,0,e);l=h;return}if((Rd(a,15826,1)|0)<0)Rd(a,15848,0)|0;db[c[a+4>>2]&15](a,c[e+16>>2]|0);b=c[e+8>>2]|0;if(b|0)cb[b&15](c[e+12>>2]|0);Bg(e);l=h;return}function Rd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=l;l=l+1072|0;h=t+1056|0;o=t+1048|0;n=t+1040|0;q=t+1060|0;r=t;k=t+1032|0;m=t+1024|0;d=Ed(b,d)|0;if(!d){s=-1;l=t;return s|0}if((c[d+24>>2]|0)!=8){s=-1;l=t;return s|0}if((c[d+56>>2]|0)!=3){s=-1;l=t;return s|0}j=c[d+60>>2]|0;p=Ag(j+1|0)|0;Ha(d+64|0,0,p|0,j|0);a[p+j>>0]=0;if(!e){c[q>>2]=p;f=c[3261]|0;g=b+176|0;d=p;a:while(1)b:do switch(a[d>>0]|0){case 0:break a;case 9:case 32:{d=d+1|0;c[q>>2]=d;break}case 10:{d=d+1|0;c[q>>2]=d;break}default:{if((ie(r,1024,q)|0)<0){s=49;break a}d=Ed(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0){o=lf(24)|0;m=d+80|0;n=c[m+4>>2]|0;e=o+8|0;c[e>>2]=c[m>>2];c[e+4>>2]=n;e=o+16|0;c[e>>2]=e;c[o+20>>2]=e;n=c[g>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=g;c[g>>2]=o;while(1){d=c[q>>2]|0;c:while(1){switch(a[d>>0]|0){case 10:case 0:break b;case 9:case 32:break;default:break c}o=d+1|0;c[q>>2]=o;d=o}if((ie(r,1024,q)|0)<0){s=61;break a}o=lf(16)|0;c[o+12>>2]=Ah(r)|0;n=c[e>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=e;c[e>>2]=o}}c[h>>2]=r;Wh(f,15875,h)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:break b;default:{}}o=d+1|0;c[q>>2]=o;d=o}}}while(0);if((s|0)==49)Uh(15857,17,1,f)|0;else if((s|0)==61)Uh(15857,17,1,f)|0}else{c[q>>2]=p;h=c[3261]|0;i=b+176|0;j=b+184|0;e=0;g=0;d=p;d:while(1){f=e;e:while(1){f:while(1){e=a[d>>0]|0;g:while(1)switch(e<<24>>24){case 0:break d;case 64:{s=12;break e}case 10:break f;case 35:break;case 9:case 32:break g;default:{e=0;break e}}e=d+1|0;c[q>>2]=e;d=e}d=d+1|0;c[q>>2]=d;f=0}if((s|0)==12){c[q>>2]=d+1;e=1}if((ie(r,1024,q)|0)<0){s=14;break}d=c[q>>2]|0;h:while(1){switch(a[d>>0]|0){case 58:{s=18;break h}case 9:case 32:break;default:{s=27;break h}}s=d+1|0;c[q>>2]=s;d=s}i:do if((s|0)==18){s=0;c[q>>2]=d+1;d=Ed(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0)if(!e){f=lf(24)|0;d=d+80|0;e=c[d+4>>2]|0;g=f+8|0;c[g>>2]=c[d>>2];c[g+4>>2]=e;g=f+16|0;c[g>>2]=g;c[f+20>>2]=g;g=c[i>>2]|0;c[g+4>>2]=f;c[f>>2]=g;c[f+4>>2]=i;c[i>>2]=f;g=0;break}else{g=lf(20)|0;c[g+8>>2]=Ah(r)|0;f=g+12|0;c[f>>2]=f;c[g+16>>2]=f;f=c[j>>2]|0;c[f+4>>2]=g;c[g>>2]=f;c[g+4>>2]=j;c[j>>2]=g;f=0;break}c[n>>2]=r;Wh(h,15875,n)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:{f=0;g=0;break i}default:{}}g=d+1|0;c[q>>2]=g;d=g}}else if((s|0)==27){s=0;d=(g|0)!=0;if(!(d|(f|0)!=0)){s=28;break d}if(!d){d=lf(16)|0;c[d+12>>2]=Ah(r)|0;c[d+8>>2]=e;g=f+16|0;e=c[g>>2]|0;c[e+4>>2]=d;c[d>>2]=e;c[d+4>>2]=g;c[g>>2]=d;g=0;break}if((ke(m,q)|0)<0){s=31;break d}if((ne(k,q)|0)<0){s=33;break d}d=lf(32)|0;c[d+24>>2]=Ah(r)|0;e=k;u=c[e+4>>2]|0;v=d+8|0;c[v>>2]=c[e>>2];c[v+4>>2]=u;v=m;u=c[v+4>>2]|0;e=d+16|0;c[e>>2]=c[v>>2];c[e+4>>2]=u;e=g+12|0;u=c[e>>2]|0;c[u+4>>2]=d;c[d>>2]=u;c[d+4>>2]=e;c[e>>2]=d}while(0);d=c[q>>2]|0;v=a[d>>0]|0;e=v<<24>>24==10;if(e^v<<24>>24!=0)do{d=d+1|0;c[q>>2]=d;v=a[d>>0]|0;e=v<<24>>24==10}while(e^v<<24>>24!=0);if(e){d=d+1|0;c[q>>2]=d}e=f}if((s|0)==14)Uh(15857,17,1,h)|0;else if((s|0)==28){c[o>>2]=r;Wh(h,15903,o)|0}else if((s|0)==31)Uh(15932,13,1,h)|0;else if((s|0)==33)Uh(15946,16,1,h)|0}Bg(p);v=0;l=t;return v|0}function Sd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=l;l=l+32|0;d=f+16|0;e=f;if((c[a>>2]|0)!=9)ja(16078,14319,2865,16092);if(_a[c[a+12>>2]&15](a,d,e,0,28468,28468)|0)ja(15194,14319,2867,16092);if(!($a[c[a+28>>2]&3](a,e,c[d>>2]|0,16107,514,384,0)|0)){h=c[a+52>>2]|0;g=c[d>>2]|0;e=Pg(b)|0;_a[h&15](a,g,0,0,b,e)|0;db[c[a+4>>2]&15](a,c[d>>2]|0);l=f;return}else ja(16118,14319,2869,16092)}function Td(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;f=i+16|0;g=i;h=c[6969]|0;if(!h){Bg(b);l=i;return}if(_a[c[h+12>>2]&15](h,f,g,1e3,28468,28468)|0)ja(16199,14319,2892,16248);e=bd(h,c[f>>2]|0,c[h+200>>2]|0)|0;if(e|0){wd(h,c[f>>2]|0,a)|0;if(($a[c[h+28>>2]&3](h,g,e,a,514,384,0)|0)>=0)_a[c[h+52>>2]&15](h,e,0,0,b,d)|0;db[c[h+4>>2]&15](h,e)}a=c[f>>2]|0;if(a|0)db[c[h+4>>2]&15](h,a);Bg(b);l=i;return}function Ud(){return}function Vd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[6970]|0;c[6970]=f+-1;a=(f|0)>1;if((f|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,0,d,e);return}function Wd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[6970]|0;c[6970]=e+-1;a=(e|0)>1;if((e|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,(d|0)<1?-404:0-d|0,0,0);return}function Xd(a){a=a|0;c[a+4>>2]=0;c[a>>2]=0;return}function Yd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;g=lf(8)|0;c[g>>2]=e;c[g+4>>2]=f;f=c[6970]|0;c[6970]=f+1;if(!f)Na(1);wa(a|0,16268,b|0,d|0,0,0,g|0,1,7,8,0)|0;return g|0}function Zd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=lf(4132)|0;c[e>>2]=b;c[e+4>>2]=d;c[e+16>>2]=a;return e|0}function _d(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!e){q=0;return q|0}l=b+8|0;m=b+12|0;n=b+36|0;o=b+16|0;p=b+20|0;q=b+4|0;k=b+40|0;j=d;a:while(1){switch(c[l>>2]|0){case 0:{i=c[m>>2]|0;d=20-i|0;d=(e|0)<(d|0)?e:d;ri(b+36+i|0,j|0,d|0)|0;i=d+(c[m>>2]|0)|0;c[m>>2]=i;if((i|0)>19){if(Gh(n,16326,4)|0){d=-1;e=12;break a}f=p;g=k;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[l>>2]=1;c[m>>2]=0}break}case 1:{d=c[m>>2]|0;i=4096-d|0;i=(e|0)<(i|0)?e:i;ri(b+36+d|0,j|0,i|0)|0;d=i+(c[m>>2]|0)|0;c[m>>2]=d;if((d|0)>4095){d=d+-16|0;uf(n,n,d,c[o>>2]|0,p,0);d=Xa[c[b>>2]&31](c[q>>2]|0,n,d)|0;if((d|0)<0){e=12;break a}f=n;g=(c[m>>2]|0)+(b+36)+-16|0;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[m>>2]=16;d=i}else d=i;break}default:{e=10;break a}}e=e-d|0;if(!e){d=0;e=12;break}else j=j+d|0}if((e|0)==10)ra();else if((e|0)==12)return d|0;return 0}function $d(b){b=b|0;var d=0,e=0,f=0,g=0;if((c[b+8>>2]|0)!=1){g=-1;return g|0}d=b+12|0;e=c[d>>2]|0;if(!((e|0)!=0&(e&15|0)==0)){g=-1;return g|0}g=b+36|0;uf(g,g,e,c[b+16>>2]|0,b+20|0,0);d=a[(c[d>>2]|0)+-1+(b+36)>>0]|0;if((d+-1&255)>15){g=-1;return g|0}d=e-(d&255)|0;if(d|0?(f=Xa[c[b>>2]&31](c[b+4>>2]|0,g,d)|0,(f|0)<0):0){g=f;return g|0}g=0;return g|0}function ae(a){a=a|0;Bg(a);return}function be(a,b,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=lf(48)|0;c[m>>2]=a;c[m+4>>2]=b;b=m+8|0;c[b>>2]=0;c[b+4>>2]=0;c[m+16>>2]=j;c[m+20>>2]=k;b=m+24|0;c[b>>2]=g;k=m+32|0;g=k;c[g>>2]=0;c[g+4>>2]=0;if(l|0){g=lf(4132)|0;c[g>>2]=15;c[g+4>>2]=m;c[g+16>>2]=l;c[m+40>>2]=g}l=lf(8)|0;c[l>>2]=m;c[l+4>>2]=9;g=(h|0)!=0|(i|0)!=0;if(g){a=Ag(h)|0;j=c[m>>2]|0;b=c[b>>2]|0;if((b|0)!=0?(n=k,n=_a[c[j+48>>2]&15](j,b,c[n>>2]|0,c[n+4>>2]|0,a,h)|0,(n|0)>=0):0){b=k;n=ei(c[b>>2]|0,c[b+4>>2]|0,n|0,((n|0)<0)<<31>>31|0)|0;b=k;c[b>>2]=n;c[b+4>>2]=y;b=16263}else b=16263}else{a=0;b=16268}n=c[6970]|0;c[6970]=n+1;if(!n)Na(1);wa(d|0,b|0,e|0,f|0,a|0,h|0,l|0,1,7,8,0)|0;if(!g)return;Bg(a);return}function ce(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=c[a>>2]|0;e=a+8|0;f=e;a=_a[c[g+52>>2]&15](g,c[a+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,b,d)|0;if((a|0)<0)return a|0;f=e;f=ei(c[f>>2]|0,c[f+4>>2]|0,a|0,((a|0)<0)<<31>>31|0)|0;g=e;c[g>>2]=f;c[g+4>>2]=y;return a|0}function de(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[b>>2]|0;do if((d|0)<0){h=b+40|0;i=d;g=((d|0)<0)<<31>>31}else{h=b+40|0;g=c[h>>2]|0;do if(!g){i=b+8|0;g=i;g=_a[c[o+52>>2]&15](o,c[b+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0,e,f)|0;if((g|0)<0)n=13;else{m=i;m=ei(c[m>>2]|0,c[m+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;n=i;c[n>>2]=m;c[n+4>>2]=y;n=14}}else{g=_d(g,e,f)|0;if(!((d|0)==0&(g|0)>-1))if((g|0)<0){n=13;break}else{n=14;break}g=c[h>>2]|0;if((((c[g+8>>2]|0)==1?(i=g+12|0,j=c[i>>2]|0,(j|0)!=0&(j&15|0)==0):0)?(k=g+36|0,uf(k,k,j,c[g+16>>2]|0,g+20|0,0),l=a[(c[i>>2]|0)+-1+(g+36)>>0]|0,(l+-1&255)<=15):0)?(m=j-(l&255)|0,m|0):0)Xa[c[g>>2]&31](c[g+4>>2]|0,k,m)|0}while(0);if((n|0)==13){i=g;g=((g|0)<0)<<31>>31;break}if((n|0)==14?d|0:0)return;g=b+8|0;i=c[g>>2]|0;g=c[g+4>>2]|0}while(0);gb[c[b+16>>2]&7](o,c[b+4>>2]|0,i,g,c[b+20>>2]|0);g=c[h>>2]|0;if(g|0)Bg(g);Bg(b);return}function ee(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=l;l=l+288|0;x=A+48|0;y=A;z=A+80|0;if((f|0)>=33)ja(16272,16297,589,16307);if((h|0)<=0){l=A;return}o=y+f|0;p=y+(f+1)|0;q=y+(f+2)|0;r=y+(f+3)|0;s=f+4|0;t=(g|0)>0;u=(d|0)>64;v=z+112|0;w=z+176|0;n=1;while(1){c[x>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;ri(y|0,e|0,f|0)|0;a[o>>0]=n>>>24;a[p>>0]=n>>>16;a[q>>0]=n>>>8;a[r>>0]=n;if(t){k=s;m=0;while(1){if(u){zf(b,d,v);j=32}else{ri(v|0,b|0,d|0)|0;j=d}si(z+112+j|0,0,64-j|0)|0;j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^54;j=j+1|0}while((j|0)!=64);vf(z);wf(z,v,64);wf(z,y,k);yf(w,z);j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^106;j=j+1|0}while((j|0)!=64);zf(v,96,y);j=0;do{B=x+j|0;a[B>>0]=a[B>>0]^a[y+j>>0];j=j+1|0}while((j|0)!=32);m=m+1|0;if((m|0)==(g|0))break;else k=32}}j=(h|0)<32?h:32;ri(i|0,x|0,j|0)|0;h=h-j|0;if((h|0)<=0)break;else{i=i+j|0;n=n+1|0}}l=A;return}function fe(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(!(a[b>>0]|0)){f=Ah(c)|0;return f|0}g=Pg(b)|0;e=Pg(c)|0;f=Ag(g+2+e|0)|0;ri(f|0,b|0,g|0)|0;d=f+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}ri(d|0,c|0,e+1|0)|0;g=f;return g|0}function ge(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(Tg(c,58)|0){f=Ah(c)|0;return f|0}if(!(a[b>>0]|0)){f=Ah(c)|0;return f|0}g=Pg(b)|0;f=Pg(c)|0;e=Ag(g+2+f|0)|0;ri(e|0,b|0,g|0)|0;d=e+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}ri(d|0,c|0,f+1|0)|0;g=e;return g|0}function he(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]|0;while(1){g=a[d>>0]|0;e=g<<24>>24==10;f=d+1|0;if(e^g<<24>>24!=0)d=f;else break}c[b>>2]=e?f:d;return}function ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[e>>2]|0;a:while(1){f=a[h>>0]|0;switch(f<<24>>24){case 34:{j=4;break a}case 0:{i=-1;j=26;break a}case 9:case 32:break;default:{j=21;break a}}h=h+1|0}b:do if((j|0)==4){k=b+d+-1|0;f=h+1|0;c:while(1){d=f+1|0;j=a[f>>0]|0;h=j<<24>>24;d:do switch(j<<24>>24){case 34:{g=b;l=d;break b}case 0:case 10:{i=-1;j=26;break c}case 92:{i=f+2|0;h=a[d>>0]|0;switch(h|0){case 92:case 34:case 39:{f=i;break d}case 110:{h=10;f=i;break d}case 114:{h=13;f=i;break d}case 116:{h=9;f=i;break d}case 120:{i=a[i>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{j=d+-87|0;break}else{j=d+-55|0;break}else j=h;while(0);i=a[f+3>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{h=d+-87|0;break}else{h=d+-55|0;break}while(0);h=h|j<<4;f=f+4|0;break d}default:{i=-1;j=26;break c}}}default:f=d}while(0);if(b>>>0>=k>>>0){i=-1;j=26;break}a[b>>0]=h;b=b+1|0}if((j|0)==26)return i|0}else if((j|0)==21){i=b+d+-1|0;g=b;while(1){switch(f<<24>>24){case 10:case 0:case 9:case 32:{l=h;break b}default:{}}if(g>>>0>=i>>>0){i=-1;break}l=h+1|0;a[g>>0]=f;g=g+1|0;h=l;f=a[l>>0]|0}return i|0}else if((j|0)==26)return i|0;while(0);a[g>>0]=0;c[e>>2]=l;e=0;return e|0}function je(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=c[d>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Hh(g,f,e)|0;b=c[f>>2]|0;if((b|0)==(g|0)){d=-1;l=h;return d|0}c[d>>2]=b;d=0;l=h;return d|0}function ke(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=Rh(f,e,0)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function le(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}c[b>>2]=Hh(f,e,0)|0;b=c[e>>2]|0;if((b|0)==(f|0)){d=-1;l=g;return d|0}c[d>>2]=b;d=0;l=g;return d|0}function me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;g=c[e>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Hh(g,f,0)|0;b=c[f>>2]|0;if((b|0)==(g|0)){e=-1;l=i;return e|0}if((a[b>>0]|0)==46){b=b+1|0;f=a[b>>0]|0;if((f+-48&255)<10){g=0;h=1e9;do{h=(h>>>0)/10|0;g=(N((f<<24>>24)+-48|0,h)|0)+g|0;b=b+1|0;f=a[b>>0]|0}while((f+-48&255)<10);f=g}else f=0}else f=0;c[d>>2]=f;c[e>>2]=b;e=0;l=i;return e|0}function ne(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=Rh(f,e,16)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function oe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=f;c[g>>2]=b;c[g+4>>2]=d;Ih(a,16330,f)|0;l=e;return a|0}function pe(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if((d|0)<=0){d=0;return d|0}j=0;a:while(1){h=j<<1;f=a[c+h>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{i=g+-87|0;break}else{i=g+-55|0;break}else i=e;while(0);f=a[c+(h|1)>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{e=g+-87|0;break}else{e=g+-55|0;break}while(0);a[b+j>>0]=e|i<<4;j=j+1|0;if((j|0)>=(d|0)){e=0;f=12;break}}if((f|0)==12)return e|0;return 0}function qe(a){a=a|0;a=Bh(a,16338)|0;return ((a|0)==0?0:a+2|0)|0}function re(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+128|0;i=k;j=i;a:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 10:case 0:{d=-1;f=18;break a}default:{}}f=i;b:while(1){switch(g<<24>>24){case 0:case 10:case 58:break b;default:{}}if((f-j|0)>>>0<127){a[f>>0]=g;f=f+1|0}g=d+1|0;d=g;g=a[g>>0]|0}a[f>>0]=0;if((a[d>>0]|0)!=58){d=-1;f=18;break}c:while(1){d=d+1|0;switch(a[d>>0]|0){case 9:case 32:break;default:break c}}f=Tg(d,10)|0;g=(f|0)!=0;if(g)h=f-d|0;else h=Pg(d)|0;if(!(Og(i,e)|0)){f=16;break}if(g)d=f+1|0;else{d=-1;f=18;break}}if((f|0)==16){c=(h|0)<(c|0)?h:c+-1|0;ri(b|0,d|0,c|0)|0;a[b+c>>0]=0;c=0;l=k;return c|0}else if((f|0)==18){l=k;return d|0}return 0}function se(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(re(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=Rh(f,g,0)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function te(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(re(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=Rh(f,g,16)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function ue(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+80|0;e=f+64|0;d=f;if(re(d,64,b,16341)|0){l=f;return -1}a:while(1){switch(a[d>>0]|0){case 9:case 32:break;default:break a}d=d+1|0}b=Rh(d,e,0)|0;l=f;return ((c[e>>2]|0)==(d|0)?-1:b)|0}function ve(a){a=a|0;if(mf(a,16349,0)|0){a=1;return a|0}if(mf(a,16355,0)|0){a=1;return a|0}a=(mf(a,16362,0)|0)!=0&1;return a|0}function we(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[e>>2]|0;o=Wa[c[o+2576>>2]&3](o,e)|0;if((f|0)<=0)return;m=a+8|0;n=a+4|0;l=0;h=0;e=0;while(1){g=c[o+(l>>>5<<2)>>2]|0;if(!g)g=h;else{i=0;k=e;while(1){j=i;while(1){e=1<<j;if(!(e&g))j=j+1|0;else break}g=g&~e;e=j+l<<12;p=c[m>>2]|0;i=(e|0)/(p|0)|0;p=((e|4095|0)/(p|0)|0)+1|0;e=c[n>>2]|0;e=(p|0)<(e|0)?p:e;if((k|0)!=(h|0)){if((i|0)>(k+3|0)){hb[b&1](a,d,0,h,c[a>>2]|0,k-h|0);h=i}}else h=i;if(!g){g=h;break}else{i=j;k=e}}}l=l+32|0;if((l|0)>=(f|0))break;else h=g}if((e|0)==(g|0))return;hb[b&1](a,d,0,g,c[a>>2]|0,e-g|0);return}function xe(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=lf(12)|0;c[h>>2]=e;c[e>>2]=f;c[e+4>>2]=g;f=f<<2;c[e+8>>2]=f;f=(N(f,g)|0)+65535&-65536;g=e+16|0;c[g>>2]=f;c[h+4>>2]=f>>12;g=c[g>>2]|0;g=_a[c[a+2568>>2]&15](a,b,d,g,((g|0)<0)<<31>>31,2)|0;c[h+8>>2]=g;c[e+12>>2]=c[g+40>>2];c[e+20>>2]=h;c[e+24>>2]=6;return h|0}function ye(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+20>>2]|0;we(a,b,d,c[e+8>>2]|0,c[e+4>>2]|0);return}function ze(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;a:do if((e|0)>=0){j=b+4+(e<<2)|0;if(c[j>>2]|0){i=0;return i|0}}else{e=0;while(1){j=b+4+(e<<2)|0;if(!(c[j>>2]|0))break a;e=e+8|0;if(e>>>0>=256){e=0;break}}return e|0}while(0);k=lf(432)|0;c[k>>2]=b;c[k+316>>2]=Ah(d)|0;a[k+4>>0]=e;a[k+56>>0]=f;a[k+57>>0]=(f&65535)>>>8;a[k+58>>0]=g;a[k+59>>0]=(g&65535)>>>8;a[k+64>>0]=h;a[k+66>>0]=i;a[k+67>>0]=(i&65535)>>>8;a[k+70>>0]=0;a[k+312>>0]=64;kf(k+8|0,7,k,0);kf(k+20|0,7,k,1);kf(k+32|0,7,k,2);kf(k+44|0,7,k,3);c[j>>2]=k;i=k;return i|0}function Ae(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a>>2]|0;f=d[a+4>>0]|0;a=b+3+(f>>>3)&3;b=1<<(f&31);if(!e){e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]&~b}else{e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]|b}eb[c[g+1164+(a*12|0)>>2]&15](c[g+1164+(a*12|0)+4>>2]|0,c[g+1164+(a*12|0)+8>>2]|0,(c[g+1036+(a<<5)+28>>2]|(c[g+1036+(a<<5)+24>>2]|(c[g+1036+(a<<5)+20>>2]|(c[g+1036+(a<<5)+16>>2]|(c[g+1036+(a<<5)+12>>2]|(c[g+1036+(a<<5)+8>>2]|(c[g+1036+(a<<5)+4>>2]|c[g+1036+(a<<5)>>2]))))))|0)!=0&1);return}function Be(a,b){a=a|0;b=b|0;if(b>>>0<4)return a+8+(b*12|0)|0;else ja(16368,16380,140,16386);return 0}function Ce(a){a=a|0;return c[(c[a>>2]|0)+1028>>2]|0}function De(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;if(d>>>0>=7)ja(16405,16380,190,16431);if(e+-1&e|0)ja(16448,16380,191,16431);if(e>>>0<=3)ja(16473,16380,192,16431);i=b+320+(d<<4)|0;if(!(c[i>>2]|0)){c[i>>2]=e;f=f&255;a[b+320+(d<<4)+4>>0]=f;a[b+320+(d<<4)+5>>0]=0;c[b+320+(d<<4)+8>>2]=g;c[b+320+(d<<4)+12>>2]=h;g=(d|0)==6;h=(g?48:(d<<2)+16|0)+(b+56)|0;a[h>>0]=g?0:f;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;return}else ja(16483,16380,194,16431)}function Ee(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return jf(c[(c[a>>2]|0)+1028>>2]|0,b,d,e)|0}function Fe(b,c,d){b=b|0;c=c|0;d=d|0;a[(c&255)+(b+56)>>0]=d;return}function Ge(b,c,d){b=b|0;c=c|0;d=d|0;c=(c&255)+(b+56)|0;a[c>>0]=d;a[c+1>>0]=(d&65535)>>>8;return}function He(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+312|0;f=a[e>>0]|0;g=f&255;h=g+d|0;if((h|0)>256){h=-1;return h|0}a[e>>0]=h;h=b+62|0;a[h>>0]=a[h>>0]|16;ri(b+56+g|0,c|0,d|0)|0;h=b+108|0;a[g+1+(b+56)>>0]=a[h>>0]|0;a[h>>0]=f;h=g;return h|0}function Ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((c[b>>2]|0)!=2){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;f=c[b>>2]|0;a:do if((f|0)>0){e=c[b+8>>2]|0;b=0;while(1){if(!(Og((c[e+(b<<4)+4>>2]|0)+4|0,d)|0))break;b=b+1|0;if((b|0)>=(f|0))break a}if(e+(b<<4)|0){e=e+(b<<4)+8|0;f=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=f;return}}while(0);c[a>>2]=6;c[a+4>>2]=0;return}function Je(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;if((c[a>>2]|0)!=2){d=-1;l=j;return d|0}i=c[a+4>>2]|0;a=c[i>>2]|0;a:do if((a|0)>0){f=c[i+8>>2]|0;e=0;while(1){if(!(Og((c[f+(e<<4)+4>>2]|0)+4|0,b)|0))break;e=e+1|0;if((e|0)>=(a|0)){h=8;break a}}if(f+(e<<4)|0){a=f+(e<<4)+8|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];Ke(g)}else h=8}else h=8;while(0);if((h|0)==8){e=i+4|0;f=c[e>>2]|0;if((a|0)<(f|0))e=c[i+8>>2]|0;else{g=a+1|0;a=(f*3|0)/2|0;a=(g|0)>(a|0)?g:a;g=i+8|0;h=Cg(c[g>>2]|0,a<<4)|0;c[g>>2]=h;c[e>>2]=a;a=c[i>>2]|0;e=h}c[i>>2]=a+1;h=Pg(b)|0;i=Ag(h+5|0)|0;c[i>>2]=h;ri(i+4|0,b|0,h+1|0)|0;c[e+(a<<4)>>2]=0;c[e+(a<<4)+4>>2]=i;a=e+(a<<4)+8|0}i=d;b=c[i+4>>2]|0;d=a;c[d>>2]=c[i>>2];c[d+4>>2]=b;d=0;l=j;return d|0}function Ke(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=l;l=l+16|0;e=f;switch(c[a>>2]|0){case 7:case 0:{Bg(c[a+4>>2]|0);l=f;return}case 3:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=(c[d>>2]|0)+(a<<3)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ke(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Bg(b);l=f;return}case 2:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=c[d>>2]|0;h=g+(a<<4)|0;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];Ke(e);g=g+(a<<4)+8|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ke(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Bg(b);l=f;return}case 6:case 5:case 4:case 1:{l=f;return}default:ra()}}function Le(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[b>>2]|0)!=3){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;if((c[b>>2]|0)>>>0>d>>>0){e=(c[b+8>>2]|0)+(d<<3)|0;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}else{c[a>>2]=6;c[a+4>>2]=0;return}}function Me(a){a=a|0;return ((c[a>>2]|0)==7?(c[a+4>>2]|0)+4|0:0)|0}function Ne(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+272|0;g=e+256|0;f=e;c[g>>2]=d;Xg(f,256,b,g)|0;b=Pg(f)|0;d=Ag(b+5|0)|0;c[d>>2]=b;ri(d+4|0,f|0,b+1|0)|0;c[a>>2]=7;c[a+4>>2]=d;l=e;return}function Oe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+240|0;u=y+224|0;m=y+216|0;i=y+208|0;j=y+200|0;s=y+192|0;p=y+184|0;o=y+176|0;n=y+168|0;h=y+160|0;q=y;w=y+212|0;x=y+152|0;v=y+136|0;k=y+144|0;r=y+128|0;e=c[d>>2]|0;c[w>>2]=e;a:while(1){f=a[e>>0]|0;b:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break a;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break b;default:{}}e=e+1|0}}case 42:break;default:break a}e=e+2|0;c:while(1)switch(a[e>>0]|0){case 0:break b;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break c;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;if(!(f<<24>>24)){Ne(b,16496,h);l=y;return}d:do if((g+-48|0)>>>0<10){u=Sh(e,w,0)|0;v=x;c[v>>2]=1;c[v+4>>2]=u}else switch(f<<24>>24){case 34:{Pe(x,w);break d}case 123:{e=e+1|0;c[w>>2]=e;i=lf(12)|0;c[x>>2]=2;c[x+4>>2]=i;i=k+4|0;h=q+1|0;j=q;e:while(1){f=a[e>>0]|0;f:do if(!(Oh(f<<24>>24)|0)){g:do if(f<<24>>24==47){switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break f;default:{}}e=e+1|0}}case 42:break;default:break g}e=e+2|0;h:while(1)switch(a[e>>0]|0){case 0:break f;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break h;else e=f;break}default:e=e+1|0}e=e+2|0;break f}while(0);c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;switch(f<<24>>24){case 125:{t=38;break e}case 34:{Pe(k,w);e=c[i>>2]|0;if((c[k>>2]|0)==7){t=40;break e}break}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){t=48;break e}a[q>>0]=f;e=e+1|0;g=a[e>>0]|0;t=g<<24>>24;if((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26)))){f=e;e=h;do{if((e-j|0)>126){t=48;break e}a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;t=g<<24>>24}while((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26))))}else{f=e;e=h}c[w>>2]=f;a[e>>0]=0;t=Pg(q)|0;e=Ag(t+5|0)|0;c[e>>2]=t;ri(e+4|0,q|0,t+1|0)|0}}if(!(c[e>>2]|0)){t=48;break e}f=c[w>>2]|0;i:while(1){g=a[f>>0]|0;j:do if(!(Oh(g<<24>>24)|0)){if(g<<24>>24!=47)break i;switch(a[f+1>>0]|0){case 47:{f=f+2|0;while(1){switch(a[f>>0]|0){case 10:case 0:break j;default:{}}f=f+1|0}}case 42:break;default:break i}f=f+2|0;k:while(1)switch(a[f>>0]|0){case 0:break j;case 42:{g=f+1|0;if((a[g>>0]|0)==47)break k;else f=g;break}default:f=f+1|0}f=f+2|0}else f=f+1|0;while(0)}c[w>>2]=f;if((a[f>>0]|0)!=58){t=65;break e}c[w>>2]=f+1;Oe(v,w);c[m>>2]=c[x>>2];c[m+4>>2]=c[x+4>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];Je(m,e+4|0,u)|0;e=c[w>>2]|0;l:while(1){f=a[e>>0]|0;m:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break l;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break m;default:{}}e=e+1|0}}case 42:break;default:break l}e=e+2|0;n:while(1)switch(a[e>>0]|0){case 0:break m;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break n;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 125:break f;case 44:break;default:{t=83;break e}}e=e+1|0;c[w>>2]=e}else e=e+1|0;while(0)}if((t|0)==38){c[w>>2]=e+1;break d}else if((t|0)==40){c[b>>2]=7;c[b+4>>2]=e;l=y;return}else if((t|0)==48){Ne(b,16519,n);l=y;return}else if((t|0)==65){Ne(b,16541,o);l=y;return}else if((t|0)==83){Ne(b,16554,p);l=y;return}break}case 91:{e=e+1|0;c[w>>2]=e;n=lf(12)|0;c[x>>2]=3;c[x+4>>2]=n;o=n+8|0;p=n+4|0;m=n+8|0;q=n+8|0;j=0;o:while(1){p:while(1){f=a[e>>0]|0;q:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break p;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break q;default:{}}e=e+1|0}}case 42:break;default:break p}e=e+2|0;r:while(1)switch(a[e>>0]|0){case 0:break q;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break r;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;if((a[e>>0]|0)==93){t=101;break}Oe(r,w);i=r;h=c[i>>2]|0;i=c[i+4>>2]|0;k=v;c[k>>2]=h;c[k+4>>2]=i;k=j+1|0;e=c[n>>2]|0;if(e>>>0<=j>>>0){if((e|0)==(j|0)){e=c[p>>2]|0;if((e|0)>(j|0)){f=k;g=c[m>>2]|0;e=j}else{e=(e*3|0)/2|0;e=(k|0)>(e|0)?k:e;g=Cg(c[q>>2]|0,e<<3)|0;c[q>>2]=g;c[p>>2]=e;e=c[n>>2]|0;f=e+1|0}c[n>>2]=f;e=g+(e<<3)|0;t=109}}else{e=(c[o>>2]|0)+(j<<3)|0;c[u>>2]=c[e>>2];c[u+4>>2]=c[e+4>>2];Ke(u);e=(c[o>>2]|0)+(j<<3)|0;t=109}if((t|0)==109){t=0;j=e;c[j>>2]=h;c[j+4>>2]=i}e=c[w>>2]|0;s:while(1){f=a[e>>0]|0;t:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break s;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break t;default:{}}e=e+1|0}}case 42:break;default:break s}e=e+2|0;u:while(1)switch(a[e>>0]|0){case 0:break t;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break u;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 44:{e=e+1|0;c[w>>2]=e;break}case 93:break;default:break o}j=k}if((t|0)==101){c[w>>2]=e+1;break d}Ne(b,16575,s);l=y;return}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){Ne(b,16637,i);l=y;return}a[q>>0]=f;f=e+1|0;e=q+1|0;g=a[f>>0]|0;v=g<<24>>24;v:do if((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26)))){h=q;while(1){if((e-h|0)>126)break v;a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;v=g<<24>>24;if(!((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26))))){t=134;break}}}else t=134;while(0);if((t|0)==134){c[w>>2]=f;a[e>>0]=0;if(!(Og(q,16596)|0)){v=x;c[v>>2]=5;c[v+4>>2]=0;break d}if(!(Og(q,16601)|0)){v=x;c[v>>2]=4;c[v+4>>2]=1;break d}if(!(Og(q,16606)|0)){v=x;c[v>>2]=4;c[v+4>>2]=0;break d}}c[j>>2]=q;Ne(b,16612,j);l=y;return}}while(0);c[d>>2]=c[w>>2];d=x;w=c[d+4>>2]|0;x=b;c[x>>2]=c[d>>2];c[x+4>>2]=w;l=y;return}function Pe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+4144|0;r=s+4128|0;q=s+4120|0;p=s+4112|0;o=s+4104|0;n=s+4096|0;m=s;j=m+4095|0;e=(c[d>>2]|0)+1|0;k=m;a:while(1){h=e+1|0;i=a[e>>0]|0;f=i<<24>>24;b:do switch(i<<24>>24){case 0:case 10:{e=3;break a}case 34:{e=23;break a}case 92:{g=e+2|0;f=a[h>>0]|0;switch(f|0){case 92:case 34:case 39:{e=g;break b}case 110:{f=10;e=g;break b}case 114:{f=13;e=g;break b}case 116:{f=9;e=g;break b}case 120:{g=a[g>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=12;break a}else{i=h+-87|0;break}else{i=h+-55|0;break}else i=f;while(0);g=a[e+3>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=17;break a}else{f=h+-87|0;break}else{f=h+-55|0;break}while(0);f=f|i<<4;e=e+4|0;break b}default:{e=19;break a}}}default:e=h}while(0);if(k>>>0>=j>>>0){e=21;break}a[k>>0]=f;k=k+1|0}if((e|0)==3){Ne(b,16658,n);l=s;return}else if((e|0)==12){Ne(b,16678,o);l=s;return}else if((e|0)==17){Ne(b,16678,p);l=s;return}else if((e|0)==19){Ne(b,16696,q);l=s;return}else if((e|0)==21){Ne(b,16716,r);l=s;return}else if((e|0)==23){a[k>>0]=0;c[d>>2]=h;q=Pg(m)|0;r=Ag(q+5|0)|0;c[r>>2]=q;ri(r+4|0,m|0,q+1|0)|0;c[b>>2]=0;c[b+4>>2]=r;l=s;return}}function Qe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;k=n+24|0;m=n+16|0;i=n+20|0;j=n+8|0;g=n;c[i>>2]=d;Oe(g,i);h=c[g>>2]|0;g=c[g+4>>2]|0;f=j;c[f>>2]=h;c[f+4>>2]=g;if((h|0)==7){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return}d=c[i>>2]|0;a:while(1){e=a[d>>0]|0;b:do if(!(Oh(e<<24>>24)|0)){if(e<<24>>24!=47){f=19;break a}switch(a[d+1>>0]|0){case 47:{d=d+2|0;while(1){switch(a[d>>0]|0){case 10:case 0:break b;default:{}}d=d+1|0}}case 42:break;default:{f=8;break a}}d=d+2|0;c:while(1)switch(a[d>>0]|0){case 0:break b;case 42:{e=d+1|0;if((a[e>>0]|0)==47)break c;else d=e;break}default:d=d+1|0}d=d+2|0}else d=d+1|0;while(0)}if((f|0)==8)c[i>>2]=d;else if((f|0)==19?(c[i>>2]=d,e<<24>>24==0):0){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return};c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];Ke(k);Ne(b,16732,m);l=n;return}function Re(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+16|0;g=f;h=Ag(e+1|0)|0;ri(h|0,d|0,e|0)|0;a[h+e>>0]=0;Qe(g,h);d=g;g=c[d>>2]|0;d=c[d+4>>2]|0;Bg(h);e=b;c[e>>2]=g;c[e+4>>2]=d;l=f;return}function Se(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=lf(16)|0;h=lf(1168)|0;j=h+8|0;Qg(j,b)|0;i=yh(j,47)|0;a[((i|0)==0?j:i+1|0)>>0]=0;i=h+1064|0;c[i>>2]=i;c[h+1068>>2]=i;c[h+4>>2]=d;c[h+1036>>2]=e;c[h+1040>>2]=f;c[h>>2]=g;c[g+12>>2]=h;c[g>>2]=10;c[g+4>>2]=2;c[g+8>>2]=3;Yd(b,0,0,g,10,1)|0;return g|0}function Te(a){a=a|0;a=(c[a+12>>2]|0)+1048|0;y=c[a+4>>2]|0;return c[a>>2]|0}function Ue(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=0;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1096|0;g=h;g=ei(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return _e(a,1)|0}function Ve(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=1;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1112|0;g=h;g=ei(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return _e(a,1)|0}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=l;l=l+1280|0;B=G+128|0;E=G+1248|0;D=G+1240|0;C=G+1232|0;o=G+1224|0;n=G+1216|0;k=G+1200|0;i=G+1184|0;h=G+1176|0;g=G+1168|0;j=G+1256|0;x=G+1160|0;z=G+1152|0;f=G+1208|0;m=G+1192|0;A=G;v=G+1264|0;u=a+12|0;w=c[u>>2]|0;if((b|0)<0){t=c[3261]|0;c[g>>2]=0-b;Wh(t,16765,g)|0;Da(1)}Re(f,d,e);r=f;t=c[r>>2]|0;r=c[r+4>>2]|0;s=x;c[s>>2]=t;c[s+4>>2]=r;if((t|0)==7){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[h>>2]=Me(B)|0;ng(18452,h);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((og(B,16808,j)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}s=c[j>>2]|0;t=s<<1;b=w+1056|0;c[b>>2]=t;if((s|0)>=1?(t+-1&t|0)==0:0){a=w+1060|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((og(B,16839,a)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}a=c[a>>2]|0;if((a|0)<1){ng(16847,k);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}s=c[b>>2]|0;s=ki(s|0,((s|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;t=y;r=w+1048|0;c[r>>2]=s;c[r+4>>2]=t;c[w+1072>>2]=0;r=(c[w+4>>2]|0)/(c[j>>2]|0)|0;c[w+1076>>2]=(r|0)>1?r:1;c[w+1136>>2]=-1;c[w+1080>>2]=8;t=ei(s|0,t|0,7,0)|0;t=ii(t|0,y|0,8,0)|0;c[w+1088>>2]=t;c[w+1084>>2]=lf(t<<2)|0;t=w+1160|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((pg(B,16864,t,1)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}if((c[t>>2]|0)>32){ng(16883,n);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ie(m,B,16915);b=m;a=c[b>>2]|0;b=c[b+4>>2]|0;s=z;c[s>>2]=a;c[s+4>>2]=b;if((a|0)!=6){if((a|0)!=3){ng(16924,o);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}q=c[b>>2]|0;a:do if((q|0)>0){p=v+4|0;r=w+1064|0;s=w+1068|0;o=0;b:while(1){b=q-o|0;n=c[t>>2]|0;n=(b|0)<(n|0)?b:n;b=(n|0)>0;c:do if(b){a=0;do{c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];Le(v,B,a+o|0);if((c[v>>2]|0)!=1)break b;c[A+(a<<2)>>2]=c[p>>2];a=a+1|0}while((a|0)<(n|0));if((n|0)==1){d=c[A>>2]|0;b=c[s>>2]|0;d:do if((b|0)!=(r|0)){a=b;while(1){if((c[a+12>>2]|0)==(d|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break d}if((b|0)==(a|0))if(!b)break;else break c;else{j=c[a>>2]|0;k=a+4|0;m=c[k>>2]|0;c[j+4>>2]=m;c[m>>2]=j;c[a>>2]=0;c[k>>2]=0;m=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[k>>2]=m;c[m>>2]=a;break c}}while(0);k=c[u>>2]|0;m=Xe(k,d)|0;j=k+1104|0;i=j;i=ei(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[j>>2]=i;c[j+4>>2]=y;c[D>>2]=k+8;c[D+4>>2]=d;Wg(B,1024,16966,D)|0;Yd(B,0,0,m,11,1)|0}else F=35}else F=35;while(0);if((F|0)==35){F=0;j=(o|0)/(c[t>>2]|0)|0;k=c[u>>2]|0;m=Ag(140)|0;c[m>>2]=k;c[m+4>>2]=j;c[m+8>>2]=n;do if(b){g=k+1064|0;h=k+1068|0;i=m+12|0;a=0;f=0;do{e=c[A+(f<<2)>>2]|0;d=c[h>>2]|0;e:do if((d|0)!=(g|0)){b=d;while(1){if((c[b+12>>2]|0)==(e|0))break;b=c[b+4>>2]|0;if((b|0)==(g|0)){F=44;break e}}if((d|0)==(b|0))if(!d){F=44;break}else{b=0;break}else{H=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;c[H+4>>2]=e;c[e>>2]=H;c[b>>2]=0;c[d>>2]=0;e=c[h>>2]|0;c[h>>2]=b;c[b>>2]=g;c[d>>2]=e;c[e>>2]=b;b=0;break}}else F=44;while(0);if((F|0)==44){F=0;b=Xe(k,e)|0;a=1}c[i+(f<<2)>>2]=b;f=f+1|0}while((f|0)!=(n|0));if(!a){F=48;break}c[E>>2]=k+8;c[E+4>>2]=j;Wg(B,1024,16980,E)|0;Yd(B,0,0,m,12,1)|0}else F=48;while(0);if((F|0)==48){F=0;Bg(m)}}o=n+o|0;if((q|0)<=(o|0))break a}ng(16944,C);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}while(0)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);a=c[w+1036>>2]|0;if(!a){l=G;return}cb[a&15](c[w+1040>>2]|0);l=G;return}ng(16819,i);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}function Xe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=a+1072|0;d=c[h>>2]|0;i=a+1076|0;g=a+1064|0;a:do if((d|0)>=(c[i>>2]|0)?(e=c[g>>2]|0,(e|0)!=(g|0)):0)do{f=e;e=c[e>>2]|0;if((c[f+16>>2]|0)==1){c[h>>2]=d+-1;Ia(f+20|0);j=c[f>>2]|0;d=c[f+4>>2]|0;c[j+4>>2]=d;c[d>>2]=j;Bg(f);d=c[h>>2]|0;if((d|0)<(c[i>>2]|0))break a}}while((e|0)!=(g|0));while(0);j=lf(28)|0;c[j+8>>2]=a;c[j+12>>2]=b;c[j+16>>2]=0;b=j+20|0;Ga(b|0);Ja(b|0,c[a+1056>>2]<<9|0)|0;b=a+1068|0;i=c[b>>2]|0;c[b>>2]=j;c[j>>2]=g;c[j+4>>2]=i;c[i>>2]=j;c[h>>2]=(c[h>>2]|0)+1;return j|0}function Ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((b|0)<0){g=c[3261]|0;c[f>>2]=c[a+12>>2];Wh(g,17138,f)|0;Da(1)}g=c[a+8>>2]|0;if((c[g+1056>>2]<<9|0)!=(e|0))ja(17163,17058,366,17192);b=c[g>>2]|0;f=a+16|0;if(c[f>>2]|0)ja(17095,17058,346,17122);La(a+20|0,0,d|0,e|0);c[f>>2]=1;if((c[a+12>>2]|0)!=(c[g+1136>>2]|0)){l=h;return}_e(b,0)|0;l=h;return}function Ze(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;if((b|0)<0){k=c[3261]|0;c[f>>2]=c[a+4>>2];Wh(k,16994,f)|0;Da(1)}j=c[(c[a>>2]|0)+1056>>2]<<9;k=a+8|0;b=c[k>>2]|0;if((N(j,b)|0)!=(e|0))ja(17019,17058,252,17070);if((b|0)<=0){Bg(a);l=m;return}f=a+12|0;b=0;while(1){e=c[f+(b<<2)>>2]|0;if(e|0){g=c[e+8>>2]|0;h=c[g>>2]|0;i=e+16|0;if(c[i>>2]|0){b=9;break}n=d+(N(b,j)|0)|0;La(e+20|0,0,n|0,c[g+1056>>2]<<9|0);c[i>>2]=1;if((c[e+12>>2]|0)==(c[g+1136>>2]|0))_e(h,0)|0}b=b+1|0;if((b|0)>=(c[k>>2]|0)){b=13;break}}if((b|0)==9)ja(17095,17058,346,17122);else if((b|0)==13){Bg(a);l=m;return}}function _e(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+1040|0;C=E+1024|0;B=E;w=a+12|0;x=c[w>>2]|0;z=x+1144|0;A=x+1140|0;a=c[A>>2]|0;d=(c[z>>2]|0)-a|0;a:do if(d|0){m=x+1128|0;n=x+1080|0;o=x+1084|0;p=x+1056|0;q=x+1136|0;r=x+1064|0;s=x+1068|0;t=x+1120|0;u=x+1156|0;v=x+1092|0;b:while(1){i=m;h=c[i>>2]|0;i=c[i+4>>2]|0;e=c[n>>2]|0;f=((e|0)<0)<<31>>31;k=li(h|0,i|0,e|0,f|0)|0;g=y;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;do if(!j){e=c[p>>2]|0;f=((e|0)<0)<<31>>31;g=li(h|0,i|0,e|0,f|0)|0;f=ki(g|0,y|0,e|0,f|0)|0;f=fi(h|0,i|0,f|0,y|0)|0;e=e-f|0;d=(d|0)<(e|0)?d:e;c[q>>2]=g;e=c[s>>2]|0;if((e|0)==(r|0))break b;a=e;while(1){if((c[a+12>>2]|0)==(g|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break b}if((e|0)==(a|0)){if(!e)break b}else{h=c[a>>2]|0;i=a+4|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[a>>2]=0;c[i>>2]=0;j=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[i>>2]=j;c[j>>2]=a}if(!(c[a+16>>2]|0)){a=1;D=23;break b}if(!(c[t>>2]|0)){Ha(a+20|0,f<<9|0,(c[u>>2]|0)+(c[A>>2]<<9)|0,d<<9|0);a=(c[A>>2]|0)+d|0;c[A>>2]=a;j=m;j=ei(c[j>>2]|0,c[j+4>>2]|0,d|0,((d|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y;c[q>>2]=-1;break}else{h=lf(8)|0;i=c[n>>2]<<9;j=Ag(i)|0;Ga(h|0);Ja(h|0,i|0)|0;c[(c[o>>2]|0)+(k<<2)>>2]=h;k=N(c[n>>2]|0,k)|0;Ha(a+20|0,((c[p>>2]|0)+-1&k)<<9|0,j|0,i|0);La(h|0,0,j|0,i|0);Bg(j);c[v>>2]=(c[v>>2]|0)+1;a=c[A>>2]|0;break}}else{f=ki(k|0,g|0,e|0,f|0)|0;f=fi(h|0,i|0,f|0,y|0)|0;e=e-f|0;e=(d|0)<(e|0)?d:e;f=f<<9;a=(c[u>>2]|0)+(a<<9)|0;d=e<<9;if(!(c[t>>2]|0))Ha(j|0,f|0,a|0,d|0);else La(j|0,f|0,a|0,d|0);a=(c[A>>2]|0)+e|0;c[A>>2]=a;j=m;j=ei(c[j>>2]|0,c[j+4>>2]|0,e|0,((e|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y}while(0);d=(c[z>>2]|0)-a|0;if(!d)break a}if((D|0)==23){l=E;return a|0}b=c[w>>2]|0;D=Xe(b,g)|0;A=b+1104|0;z=A;z=ei(c[z>>2]|0,c[z+4>>2]|0,1,0)|0;c[A>>2]=z;c[A+4>>2]=y;c[C>>2]=b+8;c[C+4>>2]=g;Wg(B,1024,16966,C)|0;Yd(B,0,0,D,11,1)|0;D=1;l=E;return D|0}while(0);if(b|0){D=0;l=E;return D|0}db[c[x+1148>>2]&15](c[x+1152>>2]|0,0);D=0;l=E;return D|0}function $e(){var a=0;a=lf(2592)|0;c[a+2568>>2]=9;c[a+2572>>2]=10;c[a+2576>>2]=2;c[a+2580>>2]=5;return a|0}function af(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;i=c[a>>2]|0;if((i|0)>=32)ja(17207,17248,85,17256);if(!(((e|0)!=0|(f|0)!=0)&((e&4095|0)==0&0==0)))ja(17275,17248,86,17256);c[a>>2]=i+1;h=a+8+(i*80|0)|0;c[h>>2]=a;c[a+8+(i*80|0)+32>>2]=1;c[a+8+(i*80|0)+36>>2]=g&-5;j=a+8+(i*80|0)+8|0;c[j>>2]=b;c[j+4>>2]=d;b=a+8+(i*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(g&4|0)==0;j=a+8+(i*80|0)+24|0;c[j>>2]=b?e:0;c[j+4>>2]=b?f:0;j=a+8+(i*80|0)+40|0;c[j>>2]=0;b=a+8+(i*80|0)+48|0;c[b>>2]=0;d=lf(e)|0;c[j>>2]=d;if(!d){Uh(17325,29,1,c[3261]|0)|0;Da(1)}if(!(g&2))return h|0;f=ni(e|0,f|0,12)|0;f=(f+31|0)>>>5<<2;g=a+8+(i*80|0)+44|0;c[g>>2]=f;j=a+8+(i*80|0)+60|0;c[j>>2]=0;c[a+8+(i*80|0)+52>>2]=lf(f)|0;c[a+8+(i*80|0)+56>>2]=lf(c[g>>2]|0)|0;c[b>>2]=c[a+8+(i*80|0)+52+(c[j>>2]<<2)>>2];return h|0}function bf(a,b){a=a|0;b=b|0;Bg(c[b+40>>2]|0);return}function cf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=b+48|0;i=c[h>>2]|0;f=b+44|0;d=c[f>>2]|0;g=d>>>2;a:do if(g){e=0;while(1){if(c[i+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>=g>>>0)break a}g=b+24|0;if(!((c[g>>2]|0)==0&(c[g+4>>2]|0)==0)){eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);d=c[f>>2]|0}}while(0);f=b+60|0;g=c[f>>2]^1;c[f>>2]=g;b=c[b+52+(g<<2)>>2]|0;c[h>>2]=b;si(b|0,0,d|0)|0;return i|0}function df(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=b+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!f){if(g)return;if(c[b+32>>2]|0)eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);e=b+8|0;c[e>>2]=0;c[e+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;return}if(!g?(f=b+8|0,(c[f>>2]|0)==(d|0)?(c[f+4>>2]|0)==(e|0):0):0)return;if(!(c[b+32>>2]|0))a=b+16|0;else{f=b+16|0;eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[f>>2]|0);a=f}b=b+8|0;c[b>>2]=d;c[b+4>>2]=e;d=a;e=c[d+4>>2]|0;c[h>>2]=c[d>>2];c[h+4>>2]=e;return}function ef(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)<=0){Bg(a);return}e=a+2572|0;d=0;do{if(c[a+8+(d*80|0)+32>>2]|0){db[c[e>>2]&15](a,a+8+(d*80|0)|0);b=c[a>>2]|0}d=d+1|0}while((d|0)<(b|0));Bg(a);return}function ff(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=c[a>>2]|0;if((h|0)<=0){i=0;return i|0}e=0;while(1){f=a+8+(e*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(j=a+8+(e*80|0)+24|0,g=ei(c[j>>2]|0,c[j+4>>2]|0,g|0,f|0)|0,f=y,f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0):0)break;e=e+1|0;if((e|0)>=(h|0)){e=0;i=7;break}}if((i|0)==7)return e|0;j=a+8+(e*80|0)|0;return j|0}function gf(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;k=c[a>>2]|0;if((k|0)>=32)ja(17207,17248,197,17355);if(f>>>0<1|(f|0)==1&e>>>0<0){c[a>>2]=k+1;l=a+8+(k*80|0)|0;c[l>>2]=a;m=a+8+(k*80|0)+8|0;c[m>>2]=b;c[m+4>>2]=d;b=a+8+(k*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(j&16|0)==0;d=a+8+(k*80|0)+24|0;c[d>>2]=b?e:0;c[d+4>>2]=b?f:0;c[a+8+(k*80|0)+32>>2]=0;c[a+8+(k*80|0)+64>>2]=g;c[a+8+(k*80|0)+68>>2]=h;c[a+8+(k*80|0)+72>>2]=i;c[a+8+(k*80|0)+76>>2]=j;return l|0}else ja(17375,17248,198,17355);return 0}function hf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[a>>2]|0;if(c[a+32>>2]|0){gb[c[f+2580>>2]&7](f,a,b,d,e);return}h=a+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!e){if(g)return;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;d=h;c[d>>2]=0;c[d+4>>2]=0;return}f=a+8|0;if(!g?(e=f,(c[e>>2]|0)==(b|0)?(c[e+4>>2]|0)==(d|0):0):0)return;e=f;c[e>>2]=b;c[e+4>>2]=d;a=a+16|0;b=c[a+4>>2]|0;d=h;c[d>>2]=c[a>>2];c[d+4>>2]=b;return}function jf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;i=c[a>>2]|0;if((i|0)<=0){k=0;return k|0}h=0;while(1){f=a+8+(h*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(l=a+8+(h*80|0)+24|0,l=ei(c[l>>2]|0,c[l+4>>2]|0,g|0,f|0)|0,m=y,m>>>0>d>>>0|(m|0)==(d|0)&l>>>0>b>>>0):0)break;f=h+1|0;if((f|0)<(i|0))h=f;else{f=0;k=11;break}}if((k|0)==11)return f|0;if(!(c[a+8+(h*80|0)+32>>2]|0)){m=0;return m|0}f=fi(b|0,d|0,g|0,f|0)|0;if(e|0?(m=c[a+8+(h*80|0)+48>>2]|0,j=m+(f>>>17<<2)|0,m|0):0)c[j>>2]=c[j>>2]|1<<(f>>>12&31);m=(c[a+8+(h*80|0)+40>>2]|0)+f|0;return m|0}function kf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;return}function lf(a){a=a|0;var b=0;b=Ag(a)|0;if(!b){b=0;return b|0}si(b|0,0,a|0)|0;return b|0}function mf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=a[d>>0]|0;a:do if(f<<24>>24){while(1){if((a[b>>0]|0)!=f<<24>>24){b=0;break}b=b+1|0;d=d+1|0;f=a[d>>0]|0;if(!(f<<24>>24))break a}return b|0}while(0);if(!e){e=1;return e|0}c[e>>2]=b;e=1;return e|0}function nf(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function of(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+4|0;i=c[h>>2]|0;j=i+1|0;g=b+8|0;k=c[g>>2]|0;f=(k*3|0)>>>1;f=(j|0)>(f|0)?j:f;e=c[b>>2]|0;if(j>>>0>k>>>0){e=Cg(e,f)|0;c[b>>2]=e;c[g>>2]=f}a[e+i>>0]=d;if(j>>>0<=(c[h>>2]|0)>>>0)return;c[h>>2]=j;return}function pf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+4|0;h=c[g>>2]|0;i=Pg(b)|0;j=i+h|0;f=a+8|0;k=c[f>>2]|0;e=(k*3|0)>>>1;e=(j|0)>(e|0)?j:e;d=c[a>>2]|0;if(j>>>0>k>>>0){d=Cg(d,e)|0;c[a>>2]=d;c[f>>2]=e}ri(d+h|0,b|0,i|0)|0;if(j>>>0<=(c[g>>2]|0)>>>0)return;c[g>>2]=j;return}function qf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;if(!((a|0)!=0&(e|0)!=0)){h=-1;return h|0}switch(b|0){case 128:case 192:case 256:break;default:{h=-2;return h|0}}g=(b|0)==128;do if(!g){f=e+240|0;if((b|0)==192){c[f>>2]=12;break}else{c[f>>2]=14;break}}else c[e+240>>2]=10;while(0);f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);c[e>>2]=f;c[e+4>>2]=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);c[e+8>>2]=(d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0);c[e+12>>2]=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(g){a=0;do{g=c[e+12>>2]|0;f=c[16+((g>>>16&255)<<2)>>2]&-16777216^f^c[16+((g>>>8&255)<<2)>>2]&16711680^c[16+((g&255)<<2)>>2]&65280^c[16+(g>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];h=e;e=e+16|0;c[e>>2]=f;b=c[h+4>>2]^f;c[h+20>>2]=b;b=c[h+8>>2]^b;c[h+24>>2]=b;c[h+28>>2]=b^g;a=a+1|0}while((a|0)!=10);f=0;return f|0}c[e+16>>2]=(d[a+17>>0]|0)<<16|(d[a+16>>0]|0)<<24|(d[a+18>>0]|0)<<8|(d[a+19>>0]|0);c[e+20>>2]=(d[a+21>>0]|0)<<16|(d[a+20>>0]|0)<<24|(d[a+22>>0]|0)<<8|(d[a+23>>0]|0);if((b|0)==192){a=0;while(1){h=c[e+20>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+24|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+28>>2]=g;g=c[e+8>>2]^g;c[e+32>>2]=g;g=c[e+12>>2]^g;c[e+36>>2]=g;a=a+1|0;if((a|0)==8){f=0;break}g=c[e+16>>2]^g;c[e+40>>2]=g;c[e+44>>2]=g^h;e=b}return f|0}c[e+24>>2]=(d[a+25>>0]|0)<<16|(d[a+24>>0]|0)<<24|(d[a+26>>0]|0)<<8|(d[a+27>>0]|0);c[e+28>>2]=(d[a+29>>0]|0)<<16|(d[a+28>>0]|0)<<24|(d[a+30>>0]|0)<<8|(d[a+31>>0]|0);if((b|0)!=256){h=0;return h|0}a=0;while(1){h=c[e+28>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+32|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+36>>2]=g;g=c[e+8>>2]^g;c[e+40>>2]=g;g=c[e+12>>2]^g;c[e+44>>2]=g;a=a+1|0;if((a|0)==7){f=0;break}g=c[16+(g>>>24<<2)>>2]&-16777216^c[e+16>>2]^c[16+((g>>>16&255)<<2)>>2]&16711680^c[16+((g>>>8&255)<<2)>>2]&65280^c[16+((g&255)<<2)>>2]&255;c[e+48>>2]=g;g=c[e+20>>2]^g;c[e+52>>2]=g;g=c[e+24>>2]^g;c[e+56>>2]=g;c[e+60>>2]=g^h;e=b}return f|0}function rf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=qf(a,b,d)|0;if((a|0)<0){d=a;return d|0}e=d+240|0;a=c[e>>2]|0;if((a|0)<=0){d=0;return d|0}a=a<<2;b=0;do{f=d+(b<<2)|0;g=c[f>>2]|0;h=d+(a<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|1)<<2)|0;g=c[h>>2]|0;f=d+((a|1)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;f=d+((b|2)<<2)|0;g=c[f>>2]|0;h=d+((a|2)<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|3)<<2)|0;g=c[h>>2]|0;f=d+((a|3)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;b=b+4|0;a=a+-4|0}while((b|0)<(a|0));if((c[e>>2]|0)<=1){h=0;return h|0}a=d;b=1;do{h=a;a=a+16|0;g=c[a>>2]|0;c[a>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];g=h+20|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];g=h+24|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];h=h+28|0;g=c[h>>2]|0;c[h>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];b=b+1|0}while((b|0)<(c[e>>2]|0));a=0;return a|0}function sf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[6208+((h>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((i>>>8&255)<<2)>>2]^c[8256+((b&255)<<2)>>2]^c[n+16>>2];l=c[6208+((i>>>16&255)<<2)>>2]^c[5184+(h>>>24<<2)>>2]^c[7232+((b>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[n+20>>2];m=c[6208+((b>>>16&255)<<2)>>2]^c[5184+(i>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((h&255)<<2)>>2]^c[n+24>>2];g=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(b>>>24<<2)>>2]^c[7232+((h>>>8&255)<<2)>>2]^c[8256+((i&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[6208+((m>>>16&255)<<2)>>2]^c[5184+(l>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((k&255)<<2)>>2]^c[n+36>>2];q=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(m>>>24<<2)>>2]^c[7232+((k>>>8&255)<<2)>>2]^c[8256+((l&255)<<2)>>2]^c[n+40>>2];k=c[6208+((k>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((l>>>8&255)<<2)>>2]^c[8256+((m&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[6208+((l>>>16&255)<<2)>>2]^c[5184+(i<<2)>>2]^c[7232+((m>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[16+((l>>>16&255)<<2)>>2]&16711680|c[16+(i<<2)>>2]&-16777216|c[16+((m>>>8&255)<<2)>>2]&65280|c[16+((g&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[16+((m>>>16&255)<<2)>>2]&16711680|c[16+(l>>>24<<2)>>2]&-16777216|c[16+((g>>>8&255)<<2)>>2]&65280|c[16+((k&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[16+((g>>>16&255)<<2)>>2]&16711680|c[16+(m>>>24<<2)>>2]&-16777216|c[16+((k>>>8&255)<<2)>>2]&65280|c[16+((l&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[16+((k>>>16&255)<<2)>>2]&16711680|c[16+(g>>>24<<2)>>2]&-16777216|c[16+((l>>>8&255)<<2)>>2]&65280|c[16+((m&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function tf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[2112+((b>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((i>>>8&255)<<2)>>2]^c[4160+((h&255)<<2)>>2]^c[n+16>>2];l=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(h>>>24<<2)>>2]^c[3136+((b>>>8&255)<<2)>>2]^c[4160+((i&255)<<2)>>2]^c[n+20>>2];m=c[2112+((h>>>16&255)<<2)>>2]^c[1088+(i>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((b&255)<<2)>>2]^c[n+24>>2];g=c[2112+((i>>>16&255)<<2)>>2]^c[1088+(b>>>24<<2)>>2]^c[3136+((h>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[2112+((k>>>16&255)<<2)>>2]^c[1088+(l>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((m&255)<<2)>>2]^c[n+36>>2];q=c[2112+((l>>>16&255)<<2)>>2]^c[1088+(m>>>24<<2)>>2]^c[3136+((k>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+40>>2];k=c[2112+((m>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((l>>>8&255)<<2)>>2]^c[4160+((k&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(i<<2)>>2]^c[3136+((m>>>8&255)<<2)>>2]^c[4160+((l&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[9280+((g>>>16&255)<<2)>>2]&16711680|c[9280+(i<<2)>>2]&-16777216|c[9280+((m>>>8&255)<<2)>>2]&65280|c[9280+((l&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[9280+((k>>>16&255)<<2)>>2]&16711680|c[9280+(l>>>24<<2)>>2]&-16777216|c[9280+((g>>>8&255)<<2)>>2]&65280|c[9280+((m&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[9280+((l>>>16&255)<<2)>>2]&16711680|c[9280+(m>>>24<<2)>>2]&-16777216|c[9280+((k>>>8&255)<<2)>>2]&65280|c[9280+((g&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[9280+((m>>>16&255)<<2)>>2]&16711680|c[9280+(g>>>24<<2)>>2]&-16777216|c[9280+((l>>>8&255)<<2)>>2]&65280|c[9280+((k&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function uf(b,c,d,e,f,g){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=l;l=l+16|0;T=U;h=d>>>0>15;if(!g){if(h){i=d+-16|0;j=i&-16;A=j+16|0;g=b+A|0;k=f+1|0;m=f+2|0;n=f+3|0;o=f+4|0;p=f+5|0;q=f+6|0;r=f+7|0;s=f+8|0;t=f+9|0;u=f+10|0;v=f+11|0;w=f+12|0;x=f+13|0;y=f+14|0;z=f+15|0;h=b;b=c;while(1){S=T;Q=h;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));tf(h,b,e);a[b>>0]=a[b>>0]^a[f>>0];S=b+1|0;a[S>>0]=a[S>>0]^a[k>>0];S=b+2|0;a[S>>0]=a[S>>0]^a[m>>0];S=b+3|0;a[S>>0]=a[S>>0]^a[n>>0];S=b+4|0;a[S>>0]=a[S>>0]^a[o>>0];S=b+5|0;a[S>>0]=a[S>>0]^a[p>>0];S=b+6|0;a[S>>0]=a[S>>0]^a[q>>0];S=b+7|0;a[S>>0]=a[S>>0]^a[r>>0];S=b+8|0;a[S>>0]=a[S>>0]^a[s>>0];S=b+9|0;a[S>>0]=a[S>>0]^a[t>>0];S=b+10|0;a[S>>0]=a[S>>0]^a[u>>0];S=b+11|0;a[S>>0]=a[S>>0]^a[v>>0];S=b+12|0;a[S>>0]=a[S>>0]^a[w>>0];S=b+13|0;a[S>>0]=a[S>>0]^a[x>>0];S=b+14|0;a[S>>0]=a[S>>0]^a[y>>0];S=b+15|0;a[S>>0]=a[S>>0]^a[z>>0];S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{h=h+16|0;b=b+16|0}}d=i-j|0;h=c+A|0}else{g=b;h=c}if(!d){l=U;return}S=T;Q=g;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));tf(T,T,e);c=0;do{a[h+c>>0]=a[f+c>>0]^a[T+c>>0];c=c+1|0}while((c|0)!=(d|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}if(h){O=d+-16|0;i=O&-16;P=i+16|0;h=b+P|0;j=f+1|0;k=T+1|0;m=f+2|0;n=T+2|0;o=f+3|0;p=T+3|0;q=f+4|0;r=T+4|0;s=f+5|0;t=T+5|0;u=f+6|0;v=T+6|0;w=f+7|0;x=T+7|0;y=f+8|0;z=T+8|0;A=f+9|0;B=T+9|0;C=f+10|0;D=T+10|0;E=f+11|0;F=T+11|0;G=f+12|0;H=T+12|0;I=f+13|0;J=T+13|0;K=f+14|0;L=T+14|0;M=f+15|0;N=T+15|0;g=b;b=c;while(1){a[T>>0]=a[f>>0]^a[g>>0];a[k>>0]=a[j>>0]^a[g+1>>0];a[n>>0]=a[m>>0]^a[g+2>>0];a[p>>0]=a[o>>0]^a[g+3>>0];a[r>>0]=a[q>>0]^a[g+4>>0];a[t>>0]=a[s>>0]^a[g+5>>0];a[v>>0]=a[u>>0]^a[g+6>>0];a[x>>0]=a[w>>0]^a[g+7>>0];a[z>>0]=a[y>>0]^a[g+8>>0];a[B>>0]=a[A>>0]^a[g+9>>0];a[D>>0]=a[C>>0]^a[g+10>>0];a[F>>0]=a[E>>0]^a[g+11>>0];a[H>>0]=a[G>>0]^a[g+12>>0];a[J>>0]=a[I>>0]^a[g+13>>0];a[L>>0]=a[K>>0]^a[g+14>>0];a[N>>0]=a[M>>0]^a[g+15>>0];sf(T,b,e);S=f;Q=b;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{g=g+16|0;b=b+16|0}}d=O-i|0;c=c+P|0}else h=b;if(!d){l=U;return}g=0;do{a[T+g>>0]=a[f+g>>0]^a[h+g>>0];g=g+1|0}while((g|0)!=(d|0));if(d>>>0<16)ri(T+d|0,f+d|0,16-d|0)|0;sf(T,T,e);S=c;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}function vf(a){a=a|0;var b=0;c[a+40>>2]=0;b=a;c[b>>2]=0;c[b+4>>2]=0;c[a+8>>2]=1779033703;c[a+12>>2]=-1150833019;c[a+16>>2]=1013904242;c[a+20>>2]=-1521486534;c[a+24>>2]=1359893119;c[a+28>>2]=-1694144372;c[a+32>>2]=528734635;c[a+36>>2]=1541459225;return}function wf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=a+40|0;e=c[g>>2]|0;if(e>>>0>64)ra();i=a;f=c[i>>2]|0;i=c[i+4>>2]|0;h=ei(f|0,i|0,d|0,0)|0;j=y;if(j>>>0<i>>>0|(j|0)==(i|0)&h>>>0<f>>>0)ra();if(!d)return;f=a+44|0;while(1){if(!(d>>>0>63&(e|0)==0)){i=64-e|0;i=(d|0)<(i|0)?d:i;ri(a+44+e|0,b|0,i|0)|0;j=(c[g>>2]|0)+i|0;c[g>>2]=j;e=b+i|0;d=d-i|0;if((j|0)==64){xf(a,f);i=a;i=ei(c[i>>2]|0,c[i+4>>2]|0,512,0)|0;j=a;c[j>>2]=i;c[j+4>>2]=y;c[g>>2]=0}}else{xf(a,b);j=a;j=ei(c[j>>2]|0,c[j+4>>2]|0,512,0)|0;e=a;c[e>>2]=j;c[e+4>>2]=y;e=b+64|0;d=d+-64|0}if(!d)break;b=e;e=c[g>>2]|0}return}function xf(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+288|0;f=i+256|0;g=i;h=a+8|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];c[f+24>>2]=c[h+24>>2];c[f+28>>2]=c[h+28>>2];e=0;do{j=b+(e<<2)|0;c[g+(e<<2)>>2]=(d[j+1>>0]|0)<<16|(d[j>>0]|0)<<24|(d[j+2>>0]|0)<<8|(d[j+3>>0]|0);e=e+1|0}while((e|0)!=16);e=16;b=c[g>>2]|0;do{j=c[g+(e+-2<<2)>>2]|0;k=b;b=c[g+(e+-15<<2)>>2]|0;c[g+(e<<2)>>2]=k+(c[g+(e+-7<<2)>>2]|0)+((j>>>19|j<<13)^j>>>10^(j>>>17|j<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);j=f+28|0;q=f+16|0;r=c[q>>2]|0;b=f+24|0;s=c[b>>2]|0;v=f+20|0;e=c[v>>2]|0;k=(c[j>>2]|0)+1116352408+(c[g>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((e^s)&r^s)|0;t=c[f>>2]|0;u=f+4|0;o=c[u>>2]|0;w=f+8|0;n=c[w>>2]|0;m=f+12|0;p=k+(c[m>>2]|0)|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((o|t)&n|o&t)+k|0;c[j>>2]=k;s=s+1899447441+(c[g+4>>2]|0)+(p&(e^r)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=e+-1245643825+(c[g+8>>2]|0)+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=r+-373957723+(c[g+12>>2]|0)+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=p+961987163+(c[g+16>>2]|0)+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=n+1508970993+(c[g+20>>2]|0)+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+24>>2]|0)+-1841331548+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+28>>2]|0)+-1424204075+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+32>>2]|0)+-670586216+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+36>>2]|0)+310598401+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+40>>2]|0)+607225278+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+44>>2]|0)+1426881987+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+48>>2]|0)+1925078388+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+52>>2]|0)+-2132889090+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+56>>2]|0)+-1680079193+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+60>>2]|0)+-1046744716+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+64>>2]|0)+-459576895+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+68>>2]|0)+-272742522+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+72>>2]|0)+264347078+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+76>>2]|0)+604807628+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+80>>2]|0)+770255983+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+84>>2]|0)+1249150122+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+88>>2]|0)+1555081692+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+92>>2]|0)+1996064986+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+96>>2]|0)+-1740746414+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+100>>2]|0)+-1473132947+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+104>>2]|0)+-1341970488+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+108>>2]|0)+-1084653625+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+112>>2]|0)+-958395405+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+116>>2]|0)+-710438585+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+120>>2]|0)+113926993+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+124>>2]|0)+338241895+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+128>>2]|0)+666307205+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+132>>2]|0)+773529912+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+136>>2]|0)+1294757372+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+140>>2]|0)+1396182291+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+144>>2]|0)+1695183700+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+148>>2]|0)+1986661051+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+152>>2]|0)+-2117940946+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+156>>2]|0)+-1838011259+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+160>>2]|0)+-1564481375+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+164>>2]|0)+-1474664885+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+168>>2]|0)+-1035236496+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+172>>2]|0)+-949202525+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+176>>2]|0)+-778901479+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+180>>2]|0)+-694614492+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+184>>2]|0)+-200395387+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+188>>2]|0)+275423344+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+192>>2]|0)+430227734+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+196>>2]|0)+506948616+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+200>>2]|0)+659060556+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+204>>2]|0)+883997877+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+208>>2]|0)+958139571+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+212>>2]|0)+1322822218+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+216>>2]|0)+1537002063+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+220>>2]|0)+1747873779+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+224>>2]|0)+1955562222+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+228>>2]|0)+2024104815+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+232>>2]|0)+-2067236844+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+236>>2]|0)+-1933114872+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+240>>2]|0)+-1866530822+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+244>>2]|0)+-1538233109+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+248>>2]|0)+-1090935817+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;k=(c[g+252>>2]|0)+-965641998+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;g=k+r|0;c[q>>2]=g;k=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+k|0;c[f>>2]=k;c[h>>2]=k+(c[h>>2]|0);k=a+12|0;c[k>>2]=o+(c[k>>2]|0);k=a+16|0;c[k>>2]=n+(c[k>>2]|0);k=a+20|0;c[k>>2]=(c[m>>2]|0)+(c[k>>2]|0);k=a+24|0;c[k>>2]=g+(c[k>>2]|0);k=a+28|0;c[k>>2]=e+(c[k>>2]|0);k=a+32|0;c[k>>2]=(c[b>>2]|0)+(c[k>>2]|0);k=a+36|0;c[k>>2]=(c[j>>2]|0)+(c[k>>2]|0);l=i;return}function yf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=d+40|0;e=c[h>>2]|0;if(e>>>0>63)ra();i=d;i=ei(c[i>>2]|0,c[i+4>>2]|0,e<<3|0,0)|0;g=d;c[g>>2]=i;c[g+4>>2]=y;g=d+44|0;c[h>>2]=e+1;a[d+44+e>>0]=-128;e=c[h>>2]|0;if(e>>>0<=56){if((e|0)!=56)f=9}else{if(e>>>0<64)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<64);xf(d,g);c[h>>2]=0;e=0;f=9}if((f|0)==9)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<56);h=d;i=c[h>>2]|0;h=c[h+4>>2]|0;f=ni(i|0,h|0,56)|0;a[d+100>>0]=f;f=ni(i|0,h|0,48)|0;a[d+101>>0]=f;f=ni(i|0,h|0,40)|0;a[d+102>>0]=f;a[d+103>>0]=h;a[d+104>>0]=i>>>24;a[d+105>>0]=i>>>16;a[d+106>>0]=i>>>8;a[d+107>>0]=i;xf(d,g);i=c[d+8>>2]|0;a[b>>0]=i>>>24;a[b+1>>0]=i>>>16;a[b+2>>0]=i>>>8;a[b+3>>0]=i;i=c[d+12>>2]|0;a[b+4>>0]=i>>>24;a[b+5>>0]=i>>>16;a[b+6>>0]=i>>>8;a[b+7>>0]=i;i=c[d+16>>2]|0;a[b+8>>0]=i>>>24;a[b+9>>0]=i>>>16;a[b+10>>0]=i>>>8;a[b+11>>0]=i;i=c[d+20>>2]|0;a[b+12>>0]=i>>>24;a[b+13>>0]=i>>>16;a[b+14>>0]=i>>>8;a[b+15>>0]=i;i=c[d+24>>2]|0;a[b+16>>0]=i>>>24;a[b+17>>0]=i>>>16;a[b+18>>0]=i>>>8;a[b+19>>0]=i;i=c[d+28>>2]|0;a[b+20>>0]=i>>>24;a[b+21>>0]=i>>>16;a[b+22>>0]=i>>>8;a[b+23>>0]=i;i=c[d+32>>2]|0;a[b+24>>0]=i>>>24;a[b+25>>0]=i>>>16;a[b+26>>0]=i>>>8;a[b+27>>0]=i;i=c[d+36>>2]|0;a[b+28>>0]=i>>>24;a[b+29>>0]=i>>>16;a[b+30>>0]=i>>>8;a[b+31>>0]=i;return}function zf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+112|0;f=e;c[f+40>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[f+8>>2]=1779033703;c[f+12>>2]=-1150833019;c[f+16>>2]=1013904242;c[f+20>>2]=-1521486534;c[f+24>>2]=1359893119;c[f+28>>2]=-1694144372;c[f+32>>2]=528734635;c[f+36>>2]=1541459225;wf(f,a,b);yf(d,f);l=e;return}function Af(b){b=b|0;c[5288]=12968;c[5420]=b;c[5289]=4096;a[21566]=3;a[21565]=32;a[21568]=1;c[5399]=0;c[5406]=c[5406]|1315117;b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256);return 21152}function Bf(a){a=a|0;Bg(a);return}function Cf(b,d){b=b|0;d=d|0;var e=0,f=0;e=21576;e=ei(c[e>>2]|0,c[e+4>>2]|0,d|0,0)|0;f=y;if(!((c[5396]|0)==0&(d|0)>0))return;b=d;while(1){if((a[21565]|0)!=32){b=6;break}Kf(b);if(c[5396]|0){b=7;break}b=21576;b=fi(e|0,f|0,c[b>>2]|0,c[b+4>>2]|0)|0;if((b|0)<=0){b=7;break}}if((b|0)==6)ra();else if((b|0)==7)return}function Df(a){a=a|0;a=a+424|0;y=c[a+4>>2]|0;return c[a>>2]|0}function Ef(a,b){a=a|0;b=b|0;var d=0;d=a+480|0;b=c[d>>2]|b;c[d>>2]=b;d=a+432|0;if(!(c[d>>2]|0))return;if(!(c[a+476>>2]&b))return;c[d>>2]=0;return}function Ff(a,b){a=a|0;b=b|0;a=a+480|0;c[a>>2]=c[a>>2]&~b;return}function Gf(a){a=a|0;return c[a+480>>2]|0}function Hf(a){a=a|0;return c[a+432>>2]|0}function If(a){a=a|0;return c[a+472>>2]|0}function Jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=b+d|0;d=0;do{f=a+2580+(d<<3)|0;g=c[f>>2]|0;if((g|0)!=-1?(g=(c[a+2580+(d<<3)+4>>2]|0)+g|0,g>>>0>=b>>>0&e>>>0>g>>>0):0)c[f>>2]=-1;d=d+1|0}while((d|0)!=256);return}function Kf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;q=v;r=v+12|0;s=v+8|0;if(!f){l=v;return}t=21576;t=ei(c[t>>2]|0,c[t+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;u=y;c[5393]=f;h=c[5407]&c[5408];if(h){switch(a[21566]|0){case 3:{if(!(c[5399]&8))f=0;else f=~c[5410];break}case 1:{f=(c[5399]&2|0)==0?~c[5410]:-1;break}default:f=-1}f=f&h;if(f){g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Lf(g|-2147483648,0);c[5393]=(c[5393]|0)+-1}else i=12}else i=12;a:do if((i|0)==12){c[5397]=-1;c[5322]=0;c[5323]=0;c[5324]=c[5289];f=0;h=0;b:while(1){if(f>>>0<(c[5323]|0)>>>0)f=e[f+2>>1]<<16|e[f>>1];else{i=(c[5324]|0)+h|0;c[5289]=i;if((c[5393]|0)<1){i=40;break}h=c[5407]&c[5408];if(h|0){switch(a[21566]|0){case 3:{if(!(c[5399]&8))f=0;else f=~c[5410];break}case 1:{f=(c[5399]&2|0)==0?~c[5410]:-1;break}default:f=-1}f=f&h;if(f|0){i=21;break}}f=i>>>12&255;if((c[25780+(f<<3)>>2]|0)==(i&-4096|0)){f=(c[25780+(f<<3)+4>>2]|0)+i|0;h=f;c[s>>2]=h}else{if(Mf(s,i)|0){i=39;break}f=c[s>>2]|0;h=f}c[5322]=f;p=4094-(i&4095)|0;c[5323]=h+p;c[5324]=i-f;f=e[h>>1]|0;if((p|0)<=0){if((f&3|0)==3){h=i+2|0;i=h>>>12&255;if((c[25780+(i<<3)>>2]|0)==(h&-4096|0)){h=(c[25780+(i<<3)+4>>2]|0)+h|0;c[q>>2]=h}else{if(Mf(q,h)|0){i=35;break}h=c[q>>2]|0}f=e[h>>1]<<16|f}}else f=e[h+2>>1]<<16|f}h=(c[5393]|0)+-1|0;c[5393]=h;j=f>>>7;p=j&31;k=f>>>15&31;m=f>>>20;o=m&31;c:do switch(f&127){case 124:case 120:case 116:case 112:case 108:case 104:case 100:case 96:case 92:case 88:case 84:case 80:case 76:case 72:case 68:case 64:case 60:case 56:case 52:case 48:case 44:case 40:case 36:case 32:case 28:case 24:case 20:case 16:case 12:case 8:case 4:case 0:{h=f>>>2;k=h&7|8;d:do switch(f>>>13&7){case 0:{h=j&48|f>>>1&960|f>>>4&4|h&8;if(!h){i=494;break b}c[21160+(k<<2)>>2]=(c[5292]|0)+h;break}case 1:{if(!(a[21567]|0)){i=494;break b}f=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f<<1&192)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4089|0)){h=(c[21684+(h<<3)+4>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Nf(21152,q,f,3)|0){i=52;break b}h=q;f=c[h>>2]|0;h=c[h+4>>2]|0}p=21304+(k<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 2:{f=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=58;break b}f=c[q>>2]|0}c[21160+(k<<2)>>2]=f;break}case 3:{if(!(a[21567]|0)){i=494;break b}f=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=65;break b}f=c[q>>2]|0}p=21304+(k<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 5:{if(!(a[21567]|0)){i=494;break b}j=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f<<1&192)|0;h=21304+(k<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;if((c[23732+(i<<3)>>2]|0)!=(j&-4089|0))if(!(Of(21152,j,f,h,3)|0))break d;else{i=496;break b}else{p=(c[23732+(i<<3)+4>>2]|0)+j|0;c[p>>2]=f;c[p+4>>2]=h;break d}}case 6:{i=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;f=c[21160+(k<<2)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break d;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break d}}case 7:{if(!(a[21567]|0)){i=494;break b}i=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;f=c[21304+(k<<3)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break d;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break d}}default:{i=494;break b}}while(0);f=(c[5322]|0)+2|0;c[5322]=f;h=f;break}case 125:case 121:case 117:case 113:case 109:case 105:case 101:case 97:case 93:case 89:case 85:case 81:case 77:case 73:case 69:case 65:case 61:case 57:case 53:case 49:case 45:case 41:case 37:case 33:case 29:case 25:case 21:case 17:case 13:case 9:case 5:case 1:{e:do switch(f>>>13&7){case 0:{h=21160+(p<<2)|0;if(p|0)c[h>>2]=(c[h>>2]|0)+((j&32|f>>>2&31)<<26>>26);break}case 1:{h=f>>>1;p=(c[5324]|0)+(c[5322]|0)|0;c[5291]=p+2;h=p+((h&2048|j&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}case 2:{if(p|0)c[21160+(p<<2)>>2]=(j&32|f>>>2&31)<<26>>26;break}case 3:{switch(j&31){case 0:break e;case 2:break;default:{c[21160+(p<<2)>>2]=(f<<19&-2147483648|f<<24&2080374784)>>14;break e}}h=f>>>3&512|f>>>2&16|f<<1&64|f<<4&384|f<<3&32;if(!h){i=494;break b}c[5292]=(c[5292]|0)+(h<<22>>22);break}case 4:{i=f>>>10;k=j&7|8;switch(i&3){case 1:case 0:{p=j&32;j=p|f>>>2&31;if(p|0){i=494;break b}h=21160+(k<<2)|0;i=c[h>>2]|0;if(!(f&3072)){c[h>>2]=i>>>j;break e}else{c[h>>2]=i>>j;break e}}case 2:{p=21160+(k<<2)|0;c[p>>2]=c[p>>2]&(j&32|f>>>2&31)<<26>>26;break e}case 3:{h=f>>>2&7|8;switch((f>>>5&3|i&4)&7){case 0:{p=21160+(k<<2)|0;c[p>>2]=(c[p>>2]|0)-(c[21160+(h<<2)>>2]|0);break e}case 1:{p=21160+(k<<2)|0;c[p>>2]=c[21160+(h<<2)>>2]^c[p>>2];break e}case 2:{p=21160+(k<<2)|0;c[p>>2]=c[21160+(h<<2)>>2]|c[p>>2];break e}case 3:{p=21160+(k<<2)|0;c[p>>2]=c[21160+(h<<2)>>2]&c[p>>2];break e}default:{i=494;break b}}}default:{i=105;break b}}}case 5:{h=f>>>1;h=(c[5322]|0)+((h&2048|j&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}case 6:{if(!(c[21160+((j&7|8)<<2)>>2]|0)){h=(c[5322]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}break}case 7:{if(c[21160+((j&7|8)<<2)>>2]|0){h=(c[5322]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}break}default:{i=490;break b}}while(0);f=(c[5322]|0)+2|0;c[5322]=f;h=f;break}case 126:case 122:case 118:case 114:case 110:case 106:case 102:case 98:case 94:case 90:case 86:case 82:case 78:case 74:case 70:case 66:case 62:case 58:case 54:case 50:case 46:case 42:case 38:case 34:case 30:case 26:case 22:case 18:case 14:case 10:case 6:case 2:{h=f>>>2;k=h&31;f:do switch(f>>>13&7){case 0:{h=j&32;if(h|0){i=494;break b}f=21160+(p<<2)|0;if(p|0)c[f>>2]=c[f>>2]<<(h|k);break}case 1:{if(!(a[21567]|0)){i=494;break b}f=(c[5292]|0)+(j&32|h&24|f<<4&448)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4089|0)){h=(c[21684+(h<<3)+4>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Nf(21152,q,f,3)|0){i=117;break b}h=q;f=c[h>>2]|0;h=c[h+4>>2]|0}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 2:{f=(c[5292]|0)+(j&32|h&28|f<<4&192)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=124;break b}f=c[q>>2]|0}if(p|0)c[21160+(p<<2)>>2]=f;break}case 3:{if(!(a[21567]|0)){i=494;break b}f=(c[5292]|0)+(j&32|h&28|f<<4&192)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=131;break b}f=c[q>>2]|0}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 4:{h=(k|0)==0;i=(p|0)==0;if(!(f&4096))if(h){if(i){i=494;break b}h=c[21160+(p<<2)>>2]&-2;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}else{if(i)break f;c[21160+(p<<2)>>2]=c[21160+(k<<2)>>2];break f}else if(h){if(i){i=140;break b}f=(c[5322]|0)+2+(c[5324]|0)|0;h=c[21160+(p<<2)>>2]&-2;c[5289]=h;c[5291]=f;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}else{f=21160+(p<<2)|0;if(i)break f;c[f>>2]=(c[21160+(k<<2)>>2]|0)+(c[f>>2]|0);break f}}case 5:{if(!(a[21567]|0)){i=494;break b}j=(c[5292]|0)+(j&56|f>>>1&448)|0;h=21304+(k<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;if((c[23732+(i<<3)>>2]|0)!=(j&-4089|0))if(!(Of(21152,j,f,h,3)|0))break f;else{i=496;break b}else{p=(c[23732+(i<<3)+4>>2]|0)+j|0;c[p>>2]=f;c[p+4>>2]=h;break f}}case 6:{i=(c[5292]|0)+(j&60|f>>>1&192)|0;f=c[21160+(k<<2)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break f;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break f}}case 7:{if(!(a[21567]|0)){i=494;break b}i=(c[5292]|0)+(j&60|f>>>1&192)|0;f=c[21304+(k<<3)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break f;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break f}}default:{i=491;break b}}while(0);f=(c[5322]|0)+2|0;c[5322]=f;h=f;break}case 55:{if(p|0)c[21160+(p<<2)>>2]=f&-4096;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 23:{if(p|0)c[21160+(p<<2)>>2]=(c[5322]|0)+(f&-4096)+(c[5324]|0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 111:{if(p|0)c[21160+(p<<2)>>2]=(c[5322]|0)+4+(c[5324]|0);h=(c[5322]|0)+((m&2046|f&1044480|f>>>11&1048576|f>>>9&2048)<<11>>11)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break}case 103:{h=c[5322]|0;i=c[5324]|0;f=(c[21160+(k<<2)>>2]|0)+(f>>20)&-2;c[5289]=f;if(p|0)c[21160+(p<<2)>>2]=h+4+i;c[5322]=0;c[5323]=0;c[5324]=f;h=0;f=0;break}case 99:{switch(f>>>13&3){case 0:{h=(c[21160+(k<<2)>>2]|0)==(c[21160+(o<<2)>>2]|0);break}case 2:{h=(c[21160+(k<<2)>>2]|0)<(c[21160+(o<<2)>>2]|0);break}case 3:{h=(c[21160+(k<<2)>>2]|0)>>>0<(c[21160+(o<<2)>>2]|0)>>>0;break}default:{i=494;break b}}if((f&4096|0)!=0^h){h=(c[5322]|0)+((f>>>19&4096|m&2016|j&30|f<<4&2048)<<19>>19)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}else{f=(c[5322]|0)+4|0;c[5322]=f;h=f;break c}}case 3:{h=(c[21160+(k<<2)>>2]|0)+(f>>20)|0;g:do switch(f>>>12&7){case 0:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4096|0))f=a[(c[21684+(f<<3)+4>>2]|0)+h>>0]|0;else{if(Nf(21152,q,h,0)|0){i=181;break b}f=c[q>>2]&255}f=f<<24>>24;break}case 1:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4095|0))f=b[(c[21684+(f<<3)+4>>2]|0)+h>>1]|0;else{if(Nf(21152,q,h,1)|0){i=187;break b}f=c[q>>2]&65535}f=f<<16>>16;break}case 2:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4093|0)){f=c[(c[21684+(f<<3)+4>>2]|0)+h>>2]|0;break g}if(Nf(21152,q,h,2)|0){i=192;break b}f=c[q>>2]|0;break}case 4:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4096|0))f=a[(c[21684+(f<<3)+4>>2]|0)+h>>0]|0;else{if(Nf(21152,q,h,0)|0){i=198;break b}f=c[q>>2]&255}f=f&255;break}case 5:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4095|0))f=b[(c[21684+(f<<3)+4>>2]|0)+h>>1]|0;else{if(Nf(21152,q,h,1)|0){i=204;break b}f=c[q>>2]&65535}f=f&65535;break}default:{i=494;break b}}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 35:{i=(c[21160+(k<<2)>>2]|0)+((p|m&4064)<<20>>20)|0;h=c[21160+(o<<2)>>2]|0;h:do switch(f>>>12&7){case 0:{f=i>>>12&255;if((c[23732+(f<<3)>>2]|0)!=(i&-4096|0))if(!(Of(21152,i,h&255,0,0)|0))break h;else{i=496;break b}else{a[(c[23732+(f<<3)+4>>2]|0)+i>>0]=h;break h}}case 1:{f=i>>>12&255;if((c[23732+(f<<3)>>2]|0)!=(i&-4095|0))if(!(Of(21152,i,h&65535,0,1)|0))break h;else{i=496;break b}else{b[(c[23732+(f<<3)+4>>2]|0)+i>>1]=h;break h}}case 2:{f=i>>>12&255;if((c[23732+(f<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,h,0,2)|0))break h;else{i=496;break b}else{c[(c[23732+(f<<3)+4>>2]|0)+i>>2]=h;break h}}default:{i=494;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 19:{h=f>>20;i:do switch(f>>>12&7){case 0:{f=(c[21160+(k<<2)>>2]|0)+h|0;break}case 1:{if(h>>>0>31){i=494;break b}f=c[21160+(k<<2)>>2]<<(h&31);break}case 2:{f=(c[21160+(k<<2)>>2]|0)<(h|0)&1;break}case 3:{f=(c[21160+(k<<2)>>2]|0)>>>0<h>>>0&1;break}case 4:{f=c[21160+(k<<2)>>2]^h;break}case 5:{if(h&-1056|0){i=494;break b}i=c[21160+(k<<2)>>2]|0;h=h&31;if(!(f&1073741824)){f=i>>>h;break i}else{f=i>>h;break i}}case 6:{f=c[21160+(k<<2)>>2]|h;break}default:f=c[21160+(k<<2)>>2]&h}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 51:{i=c[21160+(k<<2)>>2]|0;h=c[21160+(o<<2)>>2]|0;c[r>>2]=h;j:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{f=N(h,i)|0;break j}case 1:{ki(h|0,((h|0)<0)<<31>>31|0,i|0,((i|0)<0)<<31>>31|0)|0;f=y;break j}case 2:{ki(h|0,0,i|0,((i|0)<0)<<31>>31|0)|0;f=y;break j}case 3:{ki(h|0,0,i|0,0)|0;f=y;break j}case 4:{if(!h){f=-1;break j}if((i|0)==-2147483648&(h|0)==-1){f=-2147483648;break j}f=(i|0)/(h|0)|0;break j}case 5:{if(!h){f=-1;break j}f=(i>>>0)/(h>>>0)|0;break j}case 6:{if(!h){f=i;break j}if((i|0)==-2147483648&(h|0)==-1){f=0;break j}f=(i|0)%(h|0)|0;break j}case 7:{if(!h){f=i;break j}f=(i>>>0)%(h>>>0)|0;break j}default:{i=492;break b}}else{if(f&-1107296256|0){i=494;break b}do switch((f>>>12&7|f>>>27&8)&15){case 0:{f=h+i|0;break j}case 8:{f=i-h|0;break j}case 1:{f=i<<(h&31);break j}case 2:{f=(i|0)<(h|0)&1;break j}case 3:{f=i>>>0<h>>>0&1;break j}case 4:{f=h^i;break j}case 5:{f=i>>>(h&31);break j}case 13:{f=i>>(h&31);break j}case 6:{f=h|i;break j}case 7:{f=h&i;break j}default:{i=494;break b}}while(0)}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 115:{if(!(f&16384))i=c[21160+(k<<2)>>2]|0;else i=k;j=f&12288;k:do switch(f>>>12&3){case 1:{o=21576;c[o>>2]=fi(t|0,u|0,h|0,((h|0)<0)<<31>>31|0)|0;c[o+4>>2]=y;if(Pf(r,m,1)|0){i=494;break b}h=Qf(m,i)|0;if((h|0)<0){i=494;break b}if(p|0)c[21160+(p<<2)>>2]=c[r>>2];if((h|0)>0){f=(c[5322]|0)+4+(c[5324]|0)|0;c[5289]=f;if((h|0)!=2)break a;c[5322]=0;c[5323]=0;c[5324]=f;h=0;f=0;break c}break}case 3:case 2:{o=21576;c[o>>2]=fi(t|0,u|0,h|0,((h|0)<0)<<31>>31|0)|0;c[o+4>>2]=y;h=(k|0)!=0;if(Pf(r,m,h&1)|0){i=494;break b}k=c[r>>2]|0;if(h){h=Qf(m,(j|0)==8192?k|i:k&~i)|0;if((h|0)<0){i=494;break b}}else h=0;if(p|0)c[21160+(p<<2)>>2]=k;if((h|0)>0){f=(c[5322]|0)+4+(c[5324]|0)|0;c[5289]=f;if((h|0)!=2)break a;c[5322]=0;c[5323]=0;c[5324]=f;h=0;f=0;break c}break}case 0:{switch(m&4095){case 0:{i=285;break b}case 1:{i=287;break b}case 258:{i=289;break b}case 770:{i=295;break b}case 261:{if((f&32640|0)!=0|(a[21566]|0)==0){i=494;break b}if(!(c[5407]&c[5408])){i=303;break b}else break k}default:{}}if((f&-33521792|0)!=301989888|(a[21566]|0)==0){i=494;break b}if(!k){f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256)}else{f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256)}h=(c[5322]|0)+4+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}default:{i=493;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 15:{switch(f>>>12&7){case 0:{if(f&-267387008|0){i=494;break b}break}case 1:{if((f|0)!=4111){i=494;break b}break}default:{i=494;break b}}f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 47:{if((f&28672|0)!=8192){i=494;break b}n=c[21160+(k<<2)>>2]|0;i=f>>>27&255;l:do switch(i&31){case 2:{if(o|0){i=494;break b}f=n>>>12&255;if((c[21684+(f<<3)>>2]|0)==(n&-4093|0))f=c[(c[21684+(f<<3)+4>>2]|0)+n>>2]|0;else{if(Nf(21152,q,n,2)|0){i=323;break b}f=c[q>>2]|0}c[5419]=n;break}case 3:{if((c[5419]|0)==(n|0)){f=c[21160+(o<<2)>>2]|0;h=n>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(n&-4093|0))if(!(Of(21152,n,f,0,2)|0)){f=0;break l}else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+n>>2]=f;f=0;break l}}else f=1;break}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{k=n>>>12&255;m=n&-4093;if((c[21684+(k<<3)>>2]|0)==(m|0))j=c[(c[21684+(k<<3)+4>>2]|0)+n>>2]|0;else{if(Nf(21152,q,n,2)|0){i=333;break b}j=c[q>>2]|0}h=c[21160+(o<<2)>>2]|0;c[r>>2]=h;switch(i&31){case 1:{f=h;break}case 0:{f=h+j|0;c[r>>2]=f;break}case 4:{f=h^j;c[r>>2]=f;break}case 12:{f=h&j;c[r>>2]=f;break}case 8:{f=h|j;c[r>>2]=f;break}case 16:{if((j|0)<(h|0)){c[r>>2]=j;f=j}else f=h;break}case 20:{if((j|0)>(h|0)){c[r>>2]=j;f=j}else f=h;break}case 24:{if(j>>>0<h>>>0){c[r>>2]=j;f=j}else f=h;break}case 28:{if(j>>>0>h>>>0){c[r>>2]=j;f=j}else f=h;break}default:{i=494;break b}}if((c[23732+(k<<3)>>2]|0)!=(m|0))if(!(Of(21152,n,f,0,2)|0)){f=j;break l}else{i=496;break b}else{c[(c[23732+(k<<3)+4>>2]|0)+n>>2]=f;f=j;break l}}default:{i=494;break b}}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 7:{if(!(a[21567]|0)){i=494;break b}h=(c[21160+(k<<2)>>2]|0)+(f>>20)|0;m:do switch(f>>>12&7){case 2:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4093|0))f=c[(c[21684+(f<<3)+4>>2]|0)+h>>2]|0;else{if(Nf(21152,q,h,2)|0){i=360;break b}f=c[q>>2]|0}h=-1;break}case 3:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4089|0)){h=(c[21684+(f<<3)+4>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break m}if(Nf(21152,q,h,3)|0){i=365;break b}h=q;f=c[h>>2]|0;h=c[h+4>>2]|0;break}default:{i=494;break b}}while(0);p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 39:{if(!(a[21567]|0)){i=494;break b}j=(c[21160+(k<<2)>>2]|0)+((p|m&4064)<<20>>20)|0;n:do switch(f>>>12&7){case 2:{f=c[21304+(o<<3)>>2]|0;h=j>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(j&-4093|0))if(!(Of(21152,j,f,0,2)|0))break n;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+j>>2]=f;break n}}case 3:{h=21304+(o<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;if((c[23732+(i<<3)>>2]|0)!=(j&-4089|0))if(!(Of(21152,j,f,h,3)|0))break n;else{i=496;break b}else{p=(c[23732+(i<<3)+4>>2]|0)+j|0;c[p>>2]=f;c[p+4>>2]=h;break n}}default:{i=494;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 67:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]|0,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 71:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]^-2147483648,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 75:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]^-2147483648,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]|0,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]^-2147483648,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 79:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]^-2147483648,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]^-2147483648,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]^-2147483648,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 83:{if(!(a[21567]|0)){i=494;break b}h=f>>>12;i=h&7;do switch(f>>>25&127){case 0:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Cb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 4:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Eb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 8:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Fb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 12:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Hb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 44:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((o|0)!=0|(h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Ib(c[21304+(k<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 16:{switch(h&7){case 0:{h=21304+(o<<3)|0;f=c[h>>2]&-2147483648|c[21304+(k<<3)>>2]&2147483647;h=c[h+4>>2]|0;break}case 1:{h=21304+(o<<3)|0;f=(c[h>>2]&-2147483648|c[21304+(k<<3)>>2]&2147483647)^-2147483648;h=~c[h+4>>2];break}case 2:{h=21304+(k<<3)|0;o=21304+(o<<3)|0;f=c[o>>2]&-2147483648^c[h>>2];h=c[o+4>>2]^c[h+4>>2];break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 20:{switch(h&7){case 0:{f=Jb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560,2)|0;break}case 1:{f=Kb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560,2)|0;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 96:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=Pb(c[21304+(k<<3)>>2]|0,h,21560)|0;break}case 1:{f=Rb(c[21304+(k<<3)>>2]|0,h,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 80:{switch(h&7){case 0:{f=Mb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560)|0;break}case 1:{f=Nb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560)|0;break}case 2:{f=Lb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 104:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=Sb(c[21160+(k<<2)>>2]|0,h,21560)|0;break}case 1:{f=Tb(c[21160+(k<<2)>>2]|0,h,21560)|0;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 32:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if(!((o|0)==1&(h|0)>-1)){i=494;break b}o=21304+(k<<3)|0;p=21304+(p<<3)|0;c[p>>2]=gc(c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 112:{if(o|0){i=494;break b}switch(h&7){case 0:{f=c[21304+(k<<3)>>2]|0;break}case 1:{f=Ob(c[21304+(k<<3)>>2]|0)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 120:{if(o|i|0){i=494;break b}o=c[21160+(k<<2)>>2]|0;p=21304+(p<<3)|0;c[p>>2]=o;c[p+4>>2]=((o|0)<0)<<31>>31;a[21567]=3;break}case 1:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Ub(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 5:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Wb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 9:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Xb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 13:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Zb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 45:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((o|0)!=0|(h|0)<0){i=494;break b}o=21304+(k<<3)|0;p=21304+(p<<3)|0;c[p>>2]=_b(c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 17:{switch(h&7){case 0:{f=21304+(k<<3)|0;h=c[f>>2]|0;f=c[21304+(o<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647;break}case 1:{f=21304+(k<<3)|0;h=c[f>>2]|0;f=(c[21304+(o<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647)^-2147483648;break}case 2:{f=21304+(k<<3)|0;h=c[f>>2]|0;f=c[21304+(o<<3)+4>>2]&-2147483648^c[f+4>>2];break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=h;c[p+4>>2]=f;a[21567]=3;break}case 21:{switch(h&7){case 0:{h=21304+(k<<3)|0;f=21304+(o<<3)|0;f=$b(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560,2)|0;h=y;break}case 1:{h=21304+(k<<3)|0;f=21304+(o<<3)|0;f=ac(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560,2)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 97:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=21304+(k<<3)|0;f=hc(c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;break}case 1:{f=21304+(k<<3)|0;f=jc(c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 81:{switch(h&7){case 0:{n=21304+(k<<3)|0;f=21304+(o<<3)|0;f=cc(c[n>>2]|0,c[n+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560)|0;break}case 1:{n=21304+(k<<3)|0;f=21304+(o<<3)|0;f=dc(c[n>>2]|0,c[n+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560)|0;break}case 2:{n=21304+(k<<3)|0;f=21304+(o<<3)|0;f=bc(c[n>>2]|0,c[n+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 105:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=kc(c[21160+(k<<2)>>2]|0,h,21560)|0;h=y;break}case 1:{f=lc(c[21160+(k<<2)>>2]|0,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 33:{if(!((o|0)==0&((i|0)==7|i>>>0<5))){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=fc(c[21304+(k<<3)>>2]|0,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 113:{if(!((o|0)==0&(i|0)==1)){i=494;break b}f=21304+(k<<3)|0;f=ec(c[f>>2]|0,c[f+4>>2]|0)|0;if(p|0)c[21160+(p<<2)>>2]=f;break}default:{i=494;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}default:{i=494;break b}}while(0)}switch(i|0){case 21:{g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Lf(g|-2147483648,0);c[5393]=(c[5393]|0)+-1;i=40;break}case 35:{i=39;break}case 52:{i=496;break}case 58:{i=496;break}case 65:{i=496;break}case 105:break;case 117:{i=496;break}case 124:{i=496;break}case 131:{i=496;break}case 140:{c[5397]=3;g=3;i=495;break}case 181:{i=496;break}case 187:{i=496;break}case 192:{i=496;break}case 198:{i=496;break}case 204:{i=496;break}case 285:{if(!(f&1048448)){g=(d[21566]|0)+8|0;c[5397]=g;i=495}else i=494;break}case 287:{if(!(f&1048448)){c[5397]=3;g=3;i=495}else i=494;break}case 289:{g=a[21566]|0;if((f&1048448|0)!=0|g<<24>>24==0)i=494;else{c[5289]=(c[5324]|0)+(c[5322]|0);s=c[5399]|0;f=s>>>8&1;c[5399]=(s>>>5&1)<<f&-289|(1<<f^-289)&s|32;if((f|0)!=(g&255|0)){g=0;do{c[21684+(g<<3)>>2]=-1;c[23732+(g<<3)>>2]=-1;c[25780+(g<<3)>>2]=-1;g=g+1|0}while((g|0)!=256);a[21566]=f}c[5289]=c[5414];break a}break}case 295:{g=a[21566]|0;if((f&1048448|0)!=0|(g&255)<3)i=494;else{c[5289]=(c[5324]|0)+(c[5322]|0);s=c[5399]|0;f=s>>>11&3;c[5399]=(s>>>7&1)<<f&-6273|(1<<f^-6273)&s|128;if((f|0)!=(g&255|0)){g=0;do{c[21684+(g<<3)>>2]=-1;c[23732+(g<<3)>>2]=-1;c[25780+(g<<3)>>2]=-1;g=g+1|0}while((g|0)!=256);a[21566]=f}c[5289]=c[5402];break a}break}case 303:{c[5396]=1;c[5289]=(c[5322]|0)+4+(c[5324]|0);break a}case 323:{i=496;break}case 333:{i=496;break}case 360:{i=496;break}case 365:{i=496;break}case 490:break;case 491:break;case 492:break;case 493:break}if((i|0)==39)i=496;else if((i|0)==40)break;else if((i|0)==494){c[5397]=2;c[5398]=f;g=2;i=495}if((i|0)==495)c[5289]=(c[5324]|0)+(c[5322]|0);else if((i|0)==496){g=c[5397]|0;c[5289]=(c[5324]|0)+(c[5322]|0);if((g|0)<=-1)break}c[5393]=(c[5393]|0)+-1;Lf(g,c[5398]|0)}while(0);s=c[5393]|0;t=fi(t|0,u|0,s|0,((s|0)<0)<<31>>31|0)|0;u=21576;c[u>>2]=t;c[u+4>>2]=y;l=v;return}function Lf(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;h=a[21566]|0;do if((h&255)<2)if((b|0)<0){g=(c[5410]|0)>>>(b&31)&1;f=b&2147483647;i=6;break}else{f=b&2147483647;g=(c[5409]|0)>>>b&1;i=7;break}else{f=b&2147483647;if((b|0)<0){g=0;i=6}}while(0);if((i|0)==6){f=1<<(d[21565]|0)+-1|f;i=7}if((i|0)==7)if(g){c[5415]=f;c[5414]=c[5289];c[5416]=e;e=c[5399]|0;i=h&255;c[5399]=e&-291|i<<8|e>>>i<<5&32;if(h<<24>>24==1){i=21648;i=c[i>>2]|0;c[5289]=i;return}f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256);a[21566]=1;i=21648;i=c[i>>2]|0;c[5289]=i;return}c[5403]=f;c[5402]=c[5289];c[5404]=e;e=c[5399]|0;i=h&255;c[5399]=e&-6281|i<<11|e>>>i<<7&128;if(h<<24>>24==3){i=21600;i=c[i>>2]|0;c[5289]=i;return}f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256);a[21566]=3;i=21600;i=c[i>>2]|0;c[5289]=i;return}function Mf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;d=f;if(Rf(21152,d,b,2)|0){c[5398]=b;c[5397]=12;b=-1;l=f;return b|0}d=c[d>>2]|0;e=ff(c[5420]|0,d,0)|0;if(e|0?c[e+32>>2]|0:0){g=b>>>12&255;e=(c[e+40>>2]|0)+(d-(c[e+8>>2]|0))|0;c[25780+(g<<3)>>2]=b&-4096;c[25780+(g<<3)+4>>2]=e-b;c[a>>2]=e;b=0;l=f;return b|0}c[5398]=b;c[5397]=1;g=-1;l=f;return g|0}function Nf(b,f,g,h){b=b|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;i=q+8|0;m=1<<h;o=m+-1&g;a:do if(!o){if(Rf(b,i,g,0)|0){c[b+440>>2]=g;c[b+436>>2]=13;f=-1;l=q;return f|0}i=c[i>>2]|0;k=ff(c[b+528>>2]|0,i,0)|0;if(!k){f=0;l=q;return f|0}if(!(c[k+32>>2]|0)){j=i-(c[k+8>>2]|0)|0;i=c[k+76>>2]|0;if(i&m|0){n=Xa[c[k+68>>2]&31](c[k+64>>2]|0,j,h)|0;j=0;break}if(!((h|0)==3&(i&4|0)!=0)){n=0;j=0;break}b=k+68|0;p=k+64|0;n=Xa[c[b>>2]&31](c[p>>2]|0,j,2)|0;j=Xa[c[b>>2]&31](c[p>>2]|0,j+4|0,2)|0;break}p=g>>>12&255;i=(c[k+40>>2]|0)+(i-(c[k+8>>2]|0))|0;c[b+532+(p<<3)>>2]=g&-4096;c[b+532+(p<<3)+4>>2]=i-g;switch(h|0){case 0:{n=d[i>>0]|0;j=0;break a}case 1:{n=e[i>>1]|0;j=0;break a}case 2:{n=c[i>>2]|0;j=0;break a}case 3:{j=i;n=c[j>>2]|0;j=c[j+4>>2]|0;break a}default:ra()}}else switch(h|0){case 1:{i=g>>>12&255;do if((c[b+532+(i<<3)>>2]|0)==(g&-4096|0))k=a[(c[b+532+(i<<3)+4>>2]|0)+g>>0]|0;else{i=Nf(b,p,g,0)|0;if(!i){k=c[p>>2]&255;break}f=i;l=q;return f|0}while(0);i=g+1|0;j=i>>>12&255;do if((c[b+532+(j<<3)>>2]|0)==(i&-4096|0))i=a[(c[b+532+(j<<3)+4>>2]|0)+i>>0]|0;else{i=Nf(b,p,i,0)|0;if(!i){i=c[p>>2]&255;break}f=i;l=q;return f|0}while(0);n=(i&255)<<8|k&255;j=0;break a}case 2:{j=g-o|0;i=j>>>12&255;do if((c[b+532+(i<<3)>>2]|0)==(j&-4093|0))m=c[(c[b+532+(i<<3)+4>>2]|0)+j>>2]|0;else{i=Nf(b,p,j,2)|0;if(!i){m=c[p>>2]|0;break}f=i;l=q;return f|0}while(0);i=j+4|0;j=i>>>12&255;do if((c[b+532+(j<<3)>>2]|0)!=(i&-4093|0)){i=Nf(b,p,i,2)|0;if(!i){k=c[p>>2]|0;i=0;break}else{k=0;break}}else{k=c[(c[b+532+(j<<3)+4>>2]|0)+i>>2]|0;i=0}while(0);j=o<<3;if(!i){n=k<<32-j|m>>>j;j=0;break a}l=q;return i|0}case 3:{j=g-o|0;i=j>>>12&255;do if((c[b+532+(i<<3)>>2]|0)==(j&-4089|0)){m=(c[b+532+(i<<3)+4>>2]|0)+j|0;k=c[m>>2]|0;m=c[m+4>>2]|0}else{i=Nf(b,p,j,3)|0;if(!i){m=p;k=c[m>>2]|0;m=c[m+4>>2]|0;break}f=i;l=q;return f|0}while(0);i=j+8|0;j=i>>>12&255;do if((c[b+532+(j<<3)>>2]|0)!=(i&-4089|0)){i=Nf(b,p,i,3)|0;if(!i){n=p;i=0;j=c[n>>2]|0;n=c[n+4>>2]|0;break}else{j=0;n=0;break}}else{n=(c[b+532+(j<<3)+4>>2]|0)+i|0;i=0;j=c[n>>2]|0;n=c[n+4>>2]|0}while(0);p=o<<3;k=ni(k|0,m|0,p|0)|0;m=y;j=oi(j|0,n|0,64-p|0)|0;if(!i){n=j|k;j=y|m;break a}l=q;return i|0}default:ra()}while(0);c[f>>2]=n;c[f+4>>2]=j;f=0;l=q;return f|0}
+function wh(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function xh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;ri(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function yh(a,b){a=a|0;b=b|0;return zh(a,b,(Pg(a)|0)+1|0)|0}function zh(b,c,d){b=b|0;c=c|0;d=d|0;a:do if(!d)d=0;else{c=c&255;while(1){d=d+-1|0;if((a[b+d>>0]|0)==c<<24>>24)break;if(!d){d=0;break a}}d=b+d|0}while(0);return d|0}function Ah(a){a=a|0;var b=0,c=0;b=(Pg(a)|0)+1|0;c=Ag(b)|0;if(!c)a=0;else a=ri(c|0,a|0,b|0)|0;return a|0}function Bh(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=Tg(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=Ch(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=Dh(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=Eh(b,c)|0;break}else{b=Fh(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function Ch(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c>>0]|0)<<8|(d[c+1>>0]|0);c=b+1|0;e=a[c>>0]|0;a:do if(!(e<<24>>24))c=0;else{e=(d[b>>0]|0)<<8|e&255;while(1){b=e&65535;if((b|0)==(f|0))break;c=c+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){c=0;break a}else e=b<<8|e&255}c=c+-1|0}while(0);return c|0}function Dh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=(b|c&255)<<8;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-2|0)|0}function Eh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);e=b+3|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|c&255;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=b<<8|c&255;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-3|0)|0}function Fh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+1056|0;v=x+1024|0;w=x;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;c[v+24>>2]=0;c[v+28>>2]=0;f=a[e>>0]|0;a:do if(f<<24>>24){q=0;do{if(!(a[b+q>>0]|0)){f=0;break a}u=f&255;t=v+(u>>>5<<2)|0;c[t>>2]=c[t>>2]|1<<(u&31);q=q+1|0;c[w+(u<<2)>>2]=q;f=a[e+q>>0]|0}while(f<<24>>24!=0);n=q>>>0>1;if(n){k=1;j=1;m=0;i=-1;o=1;while(1){f=a[e+(j+i)>>0]|0;g=a[e+o>>0]|0;do if(f<<24>>24==g<<24>>24)if((j|0)==(k|0)){h=k;f=1;g=k+m|0;break}else{h=k;f=j+1|0;g=m;break}else if((f&255)>(g&255)){h=o-i|0;f=1;g=o;break}else{h=1;f=1;g=m+1|0;i=m;break}while(0);o=f+g|0;if(o>>>0>=q>>>0)break;else{k=h;j=f;m=g}}if(n){n=1;m=1;o=0;g=-1;p=1;while(1){f=a[e+(m+g)>>0]|0;j=a[e+p>>0]|0;do if(f<<24>>24==j<<24>>24)if((m|0)==(n|0)){f=n;j=1;k=n+o|0;break}else{f=n;j=m+1|0;k=o;break}else if((f&255)<(j&255)){f=p-g|0;j=1;k=p;break}else{f=1;j=1;k=o+1|0;g=o;break}while(0);p=j+k|0;if(p>>>0>=q>>>0){u=q;j=25;break}else{n=f;m=j;o=k}}}else{u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=0;f=1;g=-1;j=25}while(0);b:do if((j|0)==25){s=(g+1|0)>>>0>(i+1|0)>>>0;f=s?f:h;s=s?g:i;t=s+1|0;if(!(Gh(e,e+f|0,t)|0)){n=u-f|0;r=n;m=f}else{n=u-s+-1|0;n=(s>>>0>n>>>0?s:n)+1|0;r=0;m=n;n=u-n|0}o=u|63;p=u+-1|0;q=(r|0)!=0;f=b;k=0;g=b;while(1){h=f;do if((g-h|0)>>>0<u>>>0){i=Ug(g,0,o)|0;if(i)if((i-h|0)>>>0<u>>>0){f=0;break b}else break;else{i=g+o|0;break}}else i=g;while(0);g=d[f+p>>0]|0;c:do if(!(1<<(g&31)&c[v+(g>>>5<<2)>>2])){h=0;g=u}else{g=u-(c[w+(g<<2)>>2]|0)|0;if(g|0){h=0;g=q&(k|0)!=0&g>>>0<m>>>0?n:g;break}j=t>>>0>k>>>0;g=j?t:k;h=a[e+g>>0]|0;d:do if(h<<24>>24){while(1){if(h<<24>>24!=(a[f+g>>0]|0))break;g=g+1|0;h=a[e+g>>0]|0;if(!(h<<24>>24))break d}h=0;g=g-s|0;break c}while(0);if(!j)break b;g=t;while(1){g=g+-1|0;if((a[e+g>>0]|0)!=(a[f+g>>0]|0)){h=r;g=m;break c}if(g>>>0<=k>>>0)break b}}while(0);f=f+g|0;k=h;g=i}}while(0);l=x;return f|0}function Gh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function Hh(a,b,c){a=a|0;b=b|0;c=c|0;c=Kh(a,b,c,-1,0)|0;return c|0}function Ih(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=Jh(a,b,f)|0;l=e;return d|0}function Jh(a,b,c){a=a|0;b=b|0;c=c|0;return Xg(a,2147483647,b,c)|0}function Kh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;Lh(h,0);d=Mh(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function Lh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=e+b;else c[a+100>>2]=d;return}function Mh(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(Jg()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0}while((Oh(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=Nh(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0;if((i|32|0)!=120)if(j){o=8;n=47;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0;if((d[12689+i>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){Lh(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{o=16;n=47}}else{e=j?10:e;if(e>>>0>(d[12689+i>>0]|0)>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;Lh(b,0);c[(Jg()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;do{i=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;e=j+-48|0}while(e>>>0<10&i>>>0<429496729);if(e>>>0<10){m=0;do{f=ki(i|0,m|0,10,0)|0;k=y;l=((e|0)<0)<<31>>31;o=~l;if(k>>>0>o>>>0|(k|0)==(o|0)&f>>>0>~e>>>0){f=10;e=m;n=76;break c}i=ei(f|0,k|0,e|0,l|0)|0;m=y;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;e=j+-48|0}while(e>>>0<10&(m>>>0<429496729|(m|0)==429496729&i>>>0<2576980378));if(e>>>0>9){j=p;e=m}else{f=10;e=m;n=76}}else{j=p;e=0}}else{j=p;e=0;i=0}}else{o=e;n=47}while(0);d:do if((n|0)==47){if(!(o+-1&o)){n=a[19072+((o*23|0)>>>5&7)>>0]|0;f=a[12689+i>>0]|0;e=f&255;if(o>>>0>e>>>0){i=0;do{i=e|i<<n;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;f=a[12689+j>>0]|0;e=f&255}while(i>>>0<134217728&o>>>0>e>>>0);k=e;e=0}else{j=i;k=e;e=0;i=0}l=ni(-1,-1,n|0)|0;m=y;if(o>>>0<=k>>>0|(m>>>0<e>>>0|(m|0)==(e|0)&l>>>0<i>>>0)){f=o;n=76;break}while(1){i=oi(i|0,e|0,n|0)|0;e=y;i=i|f&255;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Nh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0|(e>>>0>m>>>0|(e|0)==(m|0)&i>>>0>l>>>0)){f=o;n=76;break d}}}e=a[12689+i>>0]|0;f=e&255;if(o>>>0>f>>>0){i=0;do{i=f+(N(i,o)|0)|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;e=a[12689+j>>0]|0;f=e&255}while(i>>>0<119304647&o>>>0>f>>>0);k=e;e=0}else{j=i;k=e;i=0;e=0}if(o>>>0>f>>>0){m=li(-1,-1,o|0,0)|0;n=y;f=k;while(1){if(e>>>0>n>>>0|(e|0)==(n|0)&i>>>0>m>>>0){f=o;n=76;break d}k=ki(i|0,e|0,o|0,0)|0;l=y;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=o;n=76;break d}i=ei(k|0,l|0,f|0,0)|0;e=y;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Nh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0){f=o;n=76;break}}}else{f=o;n=76}}while(0);if((n|0)==76)if(f>>>0>(d[12689+j>>0]|0)>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0}while(f>>>0>(d[12689+i>>0]|0)>>>0);c[(Jg()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else j=p;if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0<h>>>0|(e|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(Jg()|0)>>2]=34;g=ei(g|0,h|0,-1,-1)|0;h=y;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(Jg()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=fi(i^j|0,e^g|0,j|0,g|0)|0;h=y}while(0);y=h;return g|0}function Nh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=Ph(b)|0;if((e|0)>=0){f=c[f>>2]|0;i=c[b+8>>2]|0;if(f){h=c[b+4>>2]|0;f=f-(c[b+108>>2]|0)|0;g=i;if((i-h|0)<(f|0))j=9;else c[b+100>>2]=h+(f+-1)}else{g=i;j=9}if((j|0)==9)c[b+100>>2]=i;f=b+4|0;if(!g)f=c[f>>2]|0;else{f=c[f>>2]|0;b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((e|0)!=(d[f>>0]|0|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function Oh(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function Ph(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if((Qh(a)|0)==0?(Xa[c[a+32>>2]&31](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function Qh(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Xa[c[b+36>>2]&31](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function Rh(a,b,c){a=a|0;b=b|0;c=c|0;c=Kh(a,b,c,-1,-1)|0;return c|0}function Sh(a,b,c){a=a|0;b=b|0;c=c|0;c=Kh(a,b,c,-2147483648,0)|0;return c|0}function Th(a,b){a=a|0;b=b|0;var c=0;c=Pg(a)|0;return ((Uh(a,1,c,b)|0)!=(c|0))<<31>>31|0}function Uh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=N(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(_g(e)|0)==0;a=vh(a,f,e)|0;if(!g)$g(e)}else a=vh(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function Vh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(wh(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0<h>>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((Xa[c[b+36>>2]&31](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function Wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=Yg(a,b,f)|0;l=e;return d|0}function Xh(a,b){a=a|0;b=b|0;return Yg(c[3293]|0,a,b)|0}function Yh(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=Yg(c[3293]|0,a,e)|0;l=d;return b|0}function Zh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((c[d+76>>2]|0)>=0?(_g(d)|0)!=0:0){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(i=d+20|0,j=c[i>>2]|0,j>>>0<(c[d+16>>2]|0)>>>0):0){c[i>>2]=j+1;a[j>>0]=f}else e=Vh(d,b)|0;$g(d)}else k=3;do if((k|0)==3){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=f;break}e=Vh(d,b)|0}while(0);return e|0}function _h(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[3293]|0;if((c[f+76>>2]|0)>-1)g=_g(f)|0;else g=0;do if((Th(b,f)|0)<0)b=-1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(Vh(f,10)|0)>>31}while(0);if(g|0)$g(f);return b|0}function $h(){ka(28464);return}function ai(){return 28448}function bi(){return 28456}function ci(){return 28460}function di(){}function ei(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function fi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (y=d,a-c>>>0|0)|0}function gi(a){a=a|0;return (a?31-(Q(a^a-1)|0)|0:32)|0}function hi(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (y=n,f)|0}else{if(!g){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (y=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (y=n,f)|0}g=h-1|0;if(g&h|0){i=(Q(h|0)|0)+33-(Q(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (y=o,p)|0}else{p=gi(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (y=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (y=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (y=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((gi(i|0)|0)>>>0);return (y=o,p)|0}g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (y=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (y=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=ei(m|0,l|0,-1,-1)|0;d=y;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;fi(k|0,d|0,e|0,n|0)|0;p=y;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=fi(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=y;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (y=o,p)|0}function ii(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=fi(j^a|0,i^b|0,j|0,i|0)|0;g=y;a=f^j;b=e^i;return fi((hi(h,g,fi(f^c|0,e^d|0,f|0,e|0)|0,y,0)|0)^a|0,y^b|0,a|0,b|0)|0}function ji(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function ki(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=ji(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function li(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return hi(a,b,c,d,0)|0}function mi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=(b|0)<0?-1:0;return b>>c-32|0}function ni(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function oi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}y=a<<c-32;return 0}function pi(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function qi(a,b,c){a=a|0;b=b|0;c=c|0;b=Q(b)|0;if((b|0)==32)b=b+(Q(a)|0)|0;y=0;return b|0}function ri(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return za(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function si(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function ti(a){a=a|0;var b=0,d=0;d=c[i>>2]|0;b=d+a|0;if((a|0)>0&(b|0)<(d|0)|(b|0)<0){V()|0;la(12);return -1}c[i>>2]=b;if((b|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=d;la(12);return -1}return d|0}function ui(a,b){a=a|0;b=b|0;return Va[a&15](b|0)|0}function vi(a,b,c){a=a|0;b=b|0;c=c|0;return Wa[a&3](b|0,c|0)|0}function wi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Xa[a&31](b|0,c|0,d|0)|0}function xi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Ya[a&3](b|0,c|0,d|0,e|0)|0}function yi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Za[a&7](b|0,c|0,d|0,e|0,f|0)|0}function zi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return _a[a&15](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Ai(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return $a[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)|0}function Bi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return ab[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Ci(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;return bb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0,n|0,o|0,p|0,q|0)|0}function Di(a,b){a=a|0;b=b|0;cb[a&15](b|0)}function Ei(a,b,c){a=a|0;b=b|0;c=c|0;db[a&15](b|0,c|0)}function Fi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;eb[a&15](b|0,c|0,d|0)}function Gi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fb[a&31](b|0,c|0,d|0,e|0)}function Hi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;gb[a&7](b|0,c|0,d|0,e|0,f|0)}function Ii(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;hb[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function Ji(a){a=a|0;R(0);return 0}function Ki(a,b){a=a|0;b=b|0;R(1);return 0}function Li(a,b,c){a=a|0;b=b|0;c=c|0;R(2);return 0}function Mi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(3);return 0}function Ni(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(4);return 0}function Oi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(5);return 0}function Pi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;R(6);return 0}function Qi(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;R(7);return 0}function Ri(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;R(8);return 0}function Si(a){a=a|0;R(9)}function Ti(a,b){a=a|0;b=b|0;R(10)}function Ui(a,b,c){a=a|0;b=b|0;c=c|0;R(11)}function Vi(a,b,c){a=a|0;b=b|0;c=c|0;ua(a|0,b|0,c|0)}function Wi(a,b,c){a=a|0;b=b|0;c=c|0;Qa(a|0,b|0,c|0)}function Xi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(12)}function Yi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(13)}function Zi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(14)}
+
+// EMSCRIPTEN_END_FUNCS
+var Va=[Ji,Af,Df,Gf,Hf,If,Uf,Yf,Fg,Gc,Te,Ji,Ji,Ji,Ji,Ji];var Wa=[Ki,Wf,cf,Ki];var Xa=[Li,Gg,Hg,Lg,xh,Bb,pc,qc,tc,vc,ld,wd,xd,yd,Id,ce,ag,cg,fg,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li];var Ya=[Mi,rd,ud,Mi];var Za=[Ni,nc,Fc,Oc,Tc,Wc,vd,Ni];var _a=[Oi,gd,hd,id,jd,od,pd,qd,sd,af,Oi,Oi,Oi,Oi,Oi,Oi];var $a=[Pi,kd,Ue,Ve];var ab=[Qi,td];var bb=[Ri,md];var cb=[Si,Bf,Tf,Vf,wb,zb,Ab,xb,Uc,dd,Si,Si,Si,Si,Si,Si];var db=[Ti,Cf,Ef,Ff,Xf,Bc,Ic,ed,fd,nd,bf,Ti,Ti,Ti,Ti,Ti];var eb=[Ui,Jf,_f,Vi,Wi,Hc,ye,Ae,$f,eg,sg,vg,Ui,Ui,Ui,Ui];var fb=[Xi,rc,sc,uc,Zc,Jd,Qd,Vd,Wd,de,We,Ye,Ze,bg,dg,gg,tg,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi];var gb=[Yi,Zf,Cd,Md,Od,df,Yi,Yi];var hb=[Zi,yb];return{___divdi3:ii,___emscripten_environ_constructor:$h,___muldi3:ki,___udivdi3:li,__get_daylight:bi,__get_timezone:ci,__get_tzname:ai,_bitshift64Ashr:mi,_bitshift64Lshr:ni,_bitshift64Shl:oi,_console_queue_char:pb,_display_key_event:qb,_display_mouse_event:rb,_display_wheel_event:sb,_free:Bg,_fs_import_file:Td,_i64Add:ei,_i64Subtract:fi,_llvm_bswap_i32:pi,_llvm_ctlz_i64:qi,_malloc:Ag,_memcpy:ri,_memset:si,_net_set_carrier:ub,_net_write_packet:tb,_sbrk:ti,_vm_start:vb,dynCall_ii:ui,dynCall_iii:vi,dynCall_iiii:wi,dynCall_iiiii:xi,dynCall_iiiiii:yi,dynCall_iiiiiii:zi,dynCall_iiiiiiii:Ai,dynCall_iiiiiiiii:Bi,dynCall_iiiiiiiiiiiiiiiii:Ci,dynCall_vi:Di,dynCall_vii:Ei,dynCall_viii:Fi,dynCall_viiii:Gi,dynCall_viiiii:Hi,dynCall_viiiiii:Ii,establishStackSpace:lb,getTempRet0:ob,runPostSets:di,setTempRet0:nb,setThrew:mb,stackAlloc:ib,stackRestore:kb,stackSave:jb}})
+
+
+// EMSCRIPTEN_END_ASM
+(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=asm["___emscripten_environ_constructor"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var __get_daylight=Module["__get_daylight"]=asm["__get_daylight"];var __get_timezone=Module["__get_timezone"]=asm["__get_timezone"];var __get_tzname=Module["__get_tzname"]=asm["__get_tzname"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _console_queue_char=Module["_console_queue_char"]=asm["_console_queue_char"];var _display_key_event=Module["_display_key_event"]=asm["_display_key_event"];var _display_mouse_event=Module["_display_mouse_event"]=asm["_display_mouse_event"];var _display_wheel_event=Module["_display_wheel_event"]=asm["_display_wheel_event"];var _free=Module["_free"]=asm["_free"];var _fs_import_file=Module["_fs_import_file"]=asm["_fs_import_file"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _llvm_ctlz_i64=Module["_llvm_ctlz_i64"]=asm["_llvm_ctlz_i64"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memset=Module["_memset"]=asm["_memset"];var _net_set_carrier=Module["_net_set_carrier"]=asm["_net_set_carrier"];var _net_write_packet=Module["_net_write_packet"]=asm["_net_write_packet"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _vm_start=Module["_vm_start"]=asm["_vm_start"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=asm["dynCall_iiiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=asm["dynCall_iiiiiiiiiiiiiiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;if(memoryInitializer){if(!isDataURI(memoryInitializer)){memoryInitializer=locateFile(memoryInitializer)}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run()
+
+
+
+
diff --git a/jslinux-2019-12-21/riscvemu64-wasm.js b/jslinux-2019-12-21/riscvemu64-wasm.js
new file mode 100644
index 0000000..7975229
--- /dev/null
+++ b/jslinux-2019-12-21/riscvemu64-wasm.js
@@ -0,0 +1,4 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="riscvemu64-wasm.wast";var wasmBinaryFile="riscvemu64-wasm.wasm";var asmjsCodeFile="riscvemu64-wasm.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){err("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){err("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){err("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver).catch((function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource).catch((function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module["wasmMaxTableSize"];if(typeof WebAssembly==="object"&&typeof WebAssembly.Table==="function"){if(MAX_TABLE_SIZE!==undefined){env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,"maximum":MAX_TABLE_SIZE,"element":"anyfunc"})}else{env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,element:"anyfunc"})}}else{env["table"]=new Array(TABLE_SIZE)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+35840;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});var STATIC_BUMP=35840;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=(function(){Module["dynCall_vi"](func,arg)})}else{browserIterationFunc=(function(){Module["dynCall_v"](func)})}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}}),runIter:(function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}if(Module["postMainLoop"])Module["postMainLoop"]()})},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject==="undefined"){console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Module["preloadedImages"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module["preloadedAudios"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module["preloadedAudios"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(function(){});canvas.exitFullscreen=canvas.exitFullscreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?(function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null)||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullscreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullscreen()}}),requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){err("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");Browser.requestFullScreen=(function(lockPointer,resizeCanvas,vrDevice){return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)});return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),asyncLoad:(function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";Module["readAsync"](url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(dep)addRunDependency(dep)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}),wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:(function(){var handle=Browser.nextWgetRequestHandle;Browser.nextWgetRequestHandle++;return handle})};function _emscripten_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.");Module["requestFullScreen"]=Module["requestFullscreen"];Browser.requestFullScreen(lockPointer,resizeCanvas,vrDevice)};Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas,vrDevice){Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=184;Module["wasmMaxTableSize"]=184;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var __get_daylight=Module["__get_daylight"]=(function(){return Module["asm"]["__get_daylight"].apply(null,arguments)});var __get_timezone=Module["__get_timezone"]=(function(){return Module["asm"]["__get_timezone"].apply(null,arguments)});var __get_tzname=Module["__get_tzname"]=(function(){return Module["asm"]["__get_tzname"].apply(null,arguments)});var _console_queue_char=Module["_console_queue_char"]=(function(){return Module["asm"]["_console_queue_char"].apply(null,arguments)});var _display_key_event=Module["_display_key_event"]=(function(){return Module["asm"]["_display_key_event"].apply(null,arguments)});var _display_mouse_event=Module["_display_mouse_event"]=(function(){return Module["asm"]["_display_mouse_event"].apply(null,arguments)});var _display_wheel_event=Module["_display_wheel_event"]=(function(){return Module["asm"]["_display_wheel_event"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _fs_import_file=Module["_fs_import_file"]=(function(){return Module["asm"]["_fs_import_file"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _net_set_carrier=Module["_net_set_carrier"]=(function(){return Module["asm"]["_net_set_carrier"].apply(null,arguments)});var _net_write_packet=Module["_net_write_packet"]=(function(){return Module["asm"]["_net_write_packet"].apply(null,arguments)});var _vm_start=Module["_vm_start"]=(function(){return Module["asm"]["_vm_start"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiijjjjj=Module["dynCall_iiiiiiijjjjj"]=(function(){return Module["asm"]["dynCall_iiiiiiijjjjj"].apply(null,arguments)});var dynCall_iiijii=Module["dynCall_iiijii"]=(function(){return Module["asm"]["dynCall_iiijii"].apply(null,arguments)});var dynCall_iijiiii=Module["dynCall_iijiiii"]=(function(){return Module["asm"]["dynCall_iijiiii"].apply(null,arguments)});var dynCall_iijji=Module["dynCall_iijji"]=(function(){return Module["asm"]["dynCall_iijji"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiji=Module["dynCall_viiji"]=(function(){return Module["asm"]["dynCall_viiji"].apply(null,arguments)});Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run()
+
+
+
diff --git a/jslinux-2019-12-21/riscvemu64-wasm.wasm b/jslinux-2019-12-21/riscvemu64-wasm.wasm
new file mode 100644
index 0000000..81613ec
--- /dev/null
+++ b/jslinux-2019-12-21/riscvemu64-wasm.wasm
Binary files differ
diff --git a/jslinux-2019-12-21/riscvemu64.js b/jslinux-2019-12-21/riscvemu64.js
new file mode 100644
index 0000000..7b86901
--- /dev/null
+++ b/jslinux-2019-12-21/riscvemu64.js
@@ -0,0 +1,20 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+34832;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});memoryInitializer="data:application/octet-stream;base64,AAAAAAAAAABjY2NjfHx8fHd3d3d7e3t78vLy8mtra2tvb29vxcXFxTAwMDABAQEBZ2dnZysrKyv+/v7+19fX16urq6t2dnZ2ysrKyoKCgoLJycnJfX19ffr6+vpZWVlZR0dHR/Dw8PCtra2t1NTU1KKioqKvr6+vnJycnKSkpKRycnJywMDAwLe3t7f9/f39k5OTkyYmJiY2NjY2Pz8/P/f39/fMzMzMNDQ0NKWlpaXl5eXl8fHx8XFxcXHY2NjYMTExMRUVFRUEBAQEx8fHxyMjIyPDw8PDGBgYGJaWlpYFBQUFmpqamgcHBwcSEhISgICAgOLi4uLr6+vrJycnJ7KysrJ1dXV1CQkJCYODg4MsLCwsGhoaGhsbGxtubm5uWlpaWqCgoKBSUlJSOzs7O9bW1tazs7OzKSkpKePj4+MvLy8vhISEhFNTU1PR0dHRAAAAAO3t7e0gICAg/Pz8/LGxsbFbW1tbampqasvLy8u+vr6+OTk5OUpKSkpMTExMWFhYWM/Pz8/Q0NDQ7+/v76qqqqr7+/v7Q0NDQ01NTU0zMzMzhYWFhUVFRUX5+fn5AgICAn9/f39QUFBQPDw8PJ+fn5+oqKioUVFRUaOjo6NAQEBAj4+Pj5KSkpKdnZ2dODg4OPX19fW8vLy8tra2ttra2tohISEhEBAQEP/////z8/Pz0tLS0s3Nzc0MDAwMExMTE+zs7OxfX19fl5eXl0REREQXFxcXxMTExKenp6d+fn5+PT09PWRkZGRdXV1dGRkZGXNzc3NgYGBggYGBgU9PT0/c3NzcIiIiIioqKiqQkJCQiIiIiEZGRkbu7u7uuLi4uBQUFBTe3t7eXl5eXgsLCwvb29vb4ODg4DIyMjI6Ojo6CgoKCklJSUkGBgYGJCQkJFxcXFzCwsLC09PT06ysrKxiYmJikZGRkZWVlZXk5OTkeXl5eefn5+fIyMjINzc3N21tbW2NjY2N1dXV1U5OTk6pqampbGxsbFZWVlb09PT06urq6mVlZWV6enp6rq6urggICAi6urq6eHh4eCUlJSUuLi4uHBwcHKampqa0tLS0xsbGxujo6Ojd3d3ddHR0dB8fHx9LS0tLvb29vYuLi4uKioqKcHBwcD4+Pj61tbW1ZmZmZkhISEgDAwMD9vb29g4ODg5hYWFhNTU1NVdXV1e5ubm5hoaGhsHBwcEdHR0dnp6enuHh4eH4+Pj4mJiYmBERERFpaWlp2dnZ2Y6Ojo6UlJSUm5ubmx4eHh6Hh4eH6enp6c7Ozs5VVVVVKCgoKN/f39+MjIyMoaGhoYmJiYkNDQ0Nv7+/v+bm5uZCQkJCaGhoaEFBQUGZmZmZLS0tLQ8PDw+wsLCwVFRUVLu7u7sWFhYWAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAbAAAANgAAAAAAAAAAUKf0UVNlQX7DpBcall4nOstrqzvxRZ0fq1j6rJMD40tV+jAg9m12rZF2zIglTAL1/NflT9fLKsWARDUmj6NitUlasd5nG7olmA7qReHA/l0CdS/DEvBMgaOXRo3G+dNr51+PA5WckhXrem2/2llSlS2DvtTTIXRYKWngSUTIyY5qicJ1eHmO9Gs+WJndcbkntk/hvhetiPBmrCDJtDrOfRhK32OCMRrlYDNRl0V/U2Lgd2SxhK5ruxyggf6UKwj5WGhIcBn9RY+HbN6Ut/h7UiPTc6viAktyV48f4yqrVWYHKOuyA8K1L5p7xYalCDfT8ocoMLKlvyO6agMCXIIW7Sscz4qStHmn8PIH86HiaU7N9Npl1b4FBh9iNNGK/qbEnVMuNKBV86Iy4YoFdev2pDnsgwuq72BABp9xXlEQbr35iiE+PQbdlq4FPt1GveZNtY1UkQVdxHFv1AYE/xVQYCT7mBmX6b3WzENAiXee2We9QuiwiIuJBzhbGefb7sh5Rwp8oekPQnzJHoT4AAAAAIOGgAlI7SsyrHARHk5yWmz7/w79VjiFDx7Vrj0nOS02ZNkPCiGmXGjRVFubOi42JLFnCgwP51eT0pbutJ6RmxtPxcCAoiDcYWlLd1oWGhIcCrqT4uUqoMBD4CI8HRcbEgsNCQ6tx4vyuai2LcipHhSFGfFXTAd1r7vdme79YH+jnyYB97z1clzFO2ZENH77W3YpQ4vcxiPLaPzttmPx5LjK3DHXEIVjQkAilxMgEcaEfSRKhfg9u9IRMvmubaEpx0svnh3zMLLc7FKGDdDjwXdsFrMrmblwqfpIlBEiZOlHxIz8qBo/8KDYLH1W75AzIsdOSYfB0TjZ/qLKjDYL1JjPgfWmKN56pSaOt9qkv60/5J06LA2SeFCbzF9qYkZ+VMITjfbouNiQXvc5LvWvw4K+gF2ffJPQaakt1W+zEiXPO5msyKd9GBBuY5zoe7s72wl4Js30GFluAbea7KiaT4NlbpXmfub/qgjPvCHm6BXv2Zvnus42b0rUCZ/q1nywKa+ypDExIz8qMJSlxsBmojU3vE50psqC/LDQkOAV2KczSpgE8ffa7EEOUM1/L/aRF43WTXZNsO9DVE2qzN8EluTjtdGeG4hqTLgfLMF/UWVGBOpenV01jAFzdIf6LkEL+1odZ7NS0tuSM1YQ6RNH1m2MYdeaegyhN44U+FmJPBPr7iepzjXJYbft5RzhPLFHelnf0pw/c/JVec4UGL83x3PqzfdTW6r9XxRvPd+G20R4gfOvyj7EaLksNCQ4X0CjwnLDHRYMJeK8i0k8KEGVDf9xAag53rMMCJzktNiQwVZkYYTLe3C2MtV0XGxIQle40Kf0UVBlQX5TpBcaw14nOpZrqzvLRZ0f8Vj6rKsD40uT+jAgVW12rfZ2zIiRTAL1JdflT/zLKsXXRDUmgKNitY9asd5JG7olZw7qRZjA/l3hdS/DAvBMgRKXRo2j+dNrxl+PA+eckhWVem2/61lSldqDvtQtIXRY02ngSSnIyY5EicJ1anmO9Hg+WJlrcbkn3U/hvratiPAXrCDJZjrOfbRK32MYMRrlgjNRl2B/U2JFd2Sx4K5ru4Sggf4cKwj5lGhIcFj9RY8ZbN6Uh/h7UrfTc6sjAkty4o8f41erVWYqKOuyB8K1LwN7xYaaCDfTpYcoMPKlvyOyagMCuoIW7Vwcz4ortHmnkvIH8/DiaU6h9Nplzb4FBtViNNEf/qbEilMuNJ1V86Kg4YoFMuv2pHXsgws572BAqp9xXgYQbr1RiiE++Qbdlj0FPt2uveZNRo1UkbVdxHEF1AYEbxVQYP/7mBkk6b3Wl0NAicye2Wd3QuiwvYuJB4hbGec47sh52wp8oUcPQnzpHoT4yQAAAACGgAmD7SsySHARHqxyWmxO/w79+ziFD1bVrj0eOS02J9kPCmSmXGghVFub0S42JDpnCgyx51eTD5butNKRmxuexcCATyDcYaJLd1ppGhIcFrqT4goqoMDl4CI8QxcbEh0NCQ4Lx4vyrai2LbmpHhTIGfFXhQd1r0zdme67YH+j/SYB95/1cly8O2ZExX77WzQpQ4t2xiPL3Pzttmjx5Lhj3DHXyoVjQhAilxNAEcaEICRKhX09u9L4MvmuEaEpx20vnh1LMLLc81KGDezjwXfQFrMrbLlwqZlIlBH6ZOlHIoz8qMQ/8KAaLH1W2JAzIu9OSYfH0TjZwaLKjP4L1Jg2gfWmz956pSiOt9omv60/pJ06LOSSeFANzF9qm0Z+VGITjfbCuNiQ6Pc5Ll6vw4L1gF2fvpPQaXwt1W+pEiXPs5msyDt9GBCnY5zobrs723t4Js0JGFlu9Lea7AGaT4OobpXmZeb/qn7PvCEI6BXv5pvnutk2b0rOCZ/q1HywKdaypDGvIz8qMZSlxjBmojXAvE50N8qC/KbQkOCw2KczFZgE8Ura7EH3UM1/DvaRFy/WTXaNsO9DTU2qzFQEluTftdGe44hqTBsfLMG4UWVGf+penQQ1jAFddIf6c0EL+y4dZ7Na0tuSUlYQ6TNH1m0TYdeajAyhN3oU+FmOPBPriSepzu7JYbc15Rzh7bFHejzf0pxZc/JVP84UGHk3x3O/zfdT6qr9X1tvPd8U20R4hvOvyoHEaLk+NCQ4LECjwl/DHRZyJeK8DEk8KIuVDf9BAag5cbMMCN7ktNicwVZkkITLe2G2MtVwXGxIdFe40EL0UVCnQX5TZRcaw6QnOpZeqzvLa50f8UX6rKtY40uTAzAgVfp2rfZtzIiRdgL1JUzlT/zXKsXXyzUmgERitY+jsd5JWrolZxvqRZgO/l3hwC/DAnVMgRLwRo2jl9NrxvmPA+dfkhWVnG2/63pSldpZvtQtg3RY0yHgSSlpyY5EyMJ1aomO9Hh5WJlrPrkn3XHhvrZPiPAXrSDJZqzOfbQ632MYShrlgjFRl2AzU2JFf2Sx4Hdru4Sugf4coAj5lCtIcFhoRY8Z/d6Uh2x7Urf4c6sj00ty4gIf41ePVWYqq+uyByi1LwPCxYaaezfTpQgoMPKHvyOypQMCumoW7VyCz4orHHmnkrQH8/DyaU6h4tplzfQFBtW+NNEfYqbEiv4uNJ1T86KgVYoFMuH2pHXrgws57GBAqu9xXgafbr1RECE++Yrdlj0GPt2uBeZNRr1UkbWNxHEFXQYEb9RQYP8VmBkk+73Wl+lAicxD2Wd3nuiwvUKJB4iLGec4W8h52+58oUcKQnzpD4T4yR4AAAAAgAmDhisySO0RHqxwWmxOcg79+/+FD1Y4rj0e1S02JzkPCmTZXGghplub0VQ2JDouCgyxZ1eTD+futNKWmxuekcCAT8XcYaIgd1ppSxIcFhqT4gq6oMDlKiI8Q+AbEh0XCQ4LDYvyrce2LbmoHhTIqfFXhRl1r0wHme673X+j/WAB958mcly89WZExTv7WzR+Q4t2KSPL3Mbttmj85Lhj8THXytxjQhCFlxNAIsaEIBFKhX0ku9L4PfmuETIpx22hnh1LL7Lc8zCGDexSwXfQ47MrbBZwqZm5lBH6SOlHImT8qMSM8KAaP31W2CwzIu+QSYfHTjjZwdHKjP6i1Jg2C/Wmz4F6pSjet9omjq0/pL86LOSdeFANkl9qm8x+VGJGjfbCE9iQ6Lg5Ll73w4L1r12fvoDQaXyT1W+pLSXPsxKsyDuZGBCnfZzobmM723u7Js0JeFlu9Bia7AG3T4OompXmZW7/qn7mvCEIzxXv5ujnutmbb0rONp/q1AmwKdZ8pDGvsj8qMSOlxjCUojXAZk50N7yC/KbKkOCw0KczFdgE8UqY7EH32s1/DlCRFy/2TXaN1u9DTbCqzFRNluTfBNGe47VqTBuILMG4H2VGf1FenQTqjAFdNYf6c3QL+y5BZ7NaHduSUtIQ6TNW1m0TR9eajGGhN3oM+FmOFBPriTypzu4nYbc1yRzh7eVHejyx0pxZ3/JVP3MUGHnOx3O/N/dT6s39X1uqPd8Ub0R4htuvyoHzaLk+xCQ4LDSjwl9AHRZyw+K8DCU8KItJDf9Blag5cQEMCN6ztNic5FZkkMHLe2GEMtVwtmxIdFy40EJXUVCn9H5TZUEaw6QXOpZeJzvLa6sf8UWdrKtY+kuTA+MgVfowrfZtdoiRdsz1JUwCT/zX5cXXyyomgEQ1tY+jYt5JWrElZxu6RZgO6l3hwP7DAnUvgRLwTI2jl0ZrxvnTA+dfjxWVnJK/63ptldpZUtQtg75Y0yF0SSlp4I5EyMl1aonC9Hh5jplrPlgn3XG5vrZP4fAXrYjJZqwgfbQ6zmMYSt/lgjEal2AzUWJFf1Ox4Hdku4Sua/4coIH5lCsIcFhoSI8Z/UWUh2zeUrf4e6sj03Ny4gJL41ePH2Yqq1WyByjrLwPCtYaae8XTpQg3MPKHKCOypb8CumoD7VyCFoorHM+nkrR58/DyB06h4mllzfTaBtW+BdEfYjTEiv6mNJ1TLqKgVfMFMuGKpHXr9gs57INAqu9gXgafcb1REG4++Yohlj0G3d2uBT5NRr3mkbWNVHEFXcQEb9QGYP8VUBkk+5jWl+m9icxDQGd3ntmwvULoB4iLiec4Wxl52+7IoUcKfHzpD0L4yR6EAAAAAAmDhoAySO0rHqxwEWxOclr9+/8OD1Y4hT0e1a42JzktCmTZD2ghplyb0VRbJDouNgyxZwqTD+dXtNKW7huekZuAT8XAYaIg3FppS3ccFhoS4gq6k8DlKqA8Q+AiEh0XGw4LDQnyrceLLbmothTIqR5XhRnxr0wHde673Zmj/WB/958mAVy89XJExTtmWzR++4t2KUPL3MYjtmj87bhj8eTXytwxQhCFYxNAIpeEIBHGhX0kStL4PbuuETL5x22hKR1LL57c8zCyDexShnfQ48ErbBazqZm5cBH6SJRHImTpqMSM/KAaP/BW2Cx9Iu+QM4fHTknZwdE4jP6iypg2C9Smz4H1pSjeetomjrc/pL+tLOSdOlANknhqm8xfVGJGfvbCE42Q6LjYLl73OYL1r8OfvoBdaXyT0G+pLdXPsxIlyDuZrBCnfRjobmOc23u7O80JeCZu9BhZ7AG3moOomk/mZW6Vqn7m/yEIz7zv5ugVutmb50rONm/q1AmfKdZ8sDGvsqQqMSM/xjCUpTXAZqJ0N7xO/KbKguCw0JAzFdin8UqYBEH32ux/DlDNFy/2kXaN1k1DTbDvzFRNquTfBJae47XRTBuIasG4HyxGf1FlnQTqXgFdNYz6c3SH+y5BC7NaHWeSUtLb6TNWEG0TR9aajGHXN3oMoVmOFPjriTwTzu4nqbc1yWHh7eUcejyxR5xZ39JVP3PyGHnOFHO/N8dT6s33X1uq/d8Ubz14httEyoHzr7k+xGg4LDQkwl9AoxZywx28DCXiKItJPP9BlQ05cQGoCN6zDNic5LRkkMFWe2GEy9VwtjJIdFxs0EJXuKVjY8aEfHz4mXd37o17e/YN8vL/vWtr1rFvb95UxcWRUDAwYAMBAQKpZ2fOfSsrVhn+/udi19e15qurTZp2duxFysqPnYKCH0DJyYmHfX36Ffr67+tZWbLJR0eOC/Dw++ytrUFn1NSz/aKiX+qvr0W/nJwj96SkU5ZycuRbwMCbwre3dRz9/eGuk5M9aiYmTFo2NmxBPz9+Avf39U/MzINcNDRo9KWlUTTl5dEI8fH5k3Fx4nPY2KtTMTFiPxUVKgwEBAhSx8eVZSMjRl7Dw50oGBgwoZaWNw8FBQq1mpovCQcHDjYSEiSbgIAbPeLi3ybr681pJydOzbKyf591deobCQkSnoODHXQsLFguGho0LRsbNrJubtzuWlq0+6CgW/ZSUqRNOzt2YdbWt86zs317KSlSPuPj3XEvL16XhIQT9VNTpmjR0bkAAAAALO3twWAgIEAf/PzjyLGxee1bW7a+amrURsvLjdm+vmdLOTly3kpKlNRMTJjoWFiwSs/PhWvQ0Lsq7+/F5aqqTxb7++3FQ0OG101NmlUzM2aUhYURz0VFihD5+ekGAgIEgX9//vBQUKBEPDx4up+fJeOoqEvzUVGi/qOjXcBAQICKj48FrZKSP7ydnSFIODhwBPX18d+8vGPBtrZ3ddrar2MhIUIwEBAgGv//5Q7z8/1t0tK/TM3NgRQMDBg1ExMmL+zsw+FfX76il5c1zEREiDkXFy5XxMST8qenVYJ+fvxHPT16rGRkyOddXborGRkylXNz5qBgYMCYgYEZ0U9Pnn/c3KNmIiJEfioqVKuQkDuDiIgLykZGjCnu7sfTuLhrPBQUKHne3qfiXl68HQsLFnbb26074ODbVjIyZE46OnQeCgoU20lJkgoGBgxsJCRI5FxcuF3Cwp9u09O976ysQ6ZiYsSokZE5pJWVMTfk5NOLeXnyMufn1UPIyItZNzdut21t2oyNjQFk1dWx0k5OnOCpqUm0bGzY+lZWrAf09PMl6urPr2Vlyo56evTprq5HGAgIENW6um+IeHjwbyUlSnIuLlwkHBw48aamV8e0tHNRxsaXI+joy3zd3aGcdHToIR8fPt1LS5bcvb1hhouLDYWKig+QcHDgQj4+fMS1tXGqZmbM2EhIkAUDAwYB9vb3Eg4OHKNhYcJfNTVq+VdXrtC5uWmRhoYXWMHBmScdHTq5np4nOOHh2RP4+OuzmJgrMxERIrtpadJw2dmpiY6OB6eUlDO2m5stIh4ePJKHhxUg6enJSc7Oh/9VVap4KChQet/fpY+MjAP4oaFZgImJCRcNDRrav79lMebm18ZCQoS4aGjQw0FBgrCZmSl3LS1aEQ8PHsuwsHv8VFSo1ru7bToWFixjY8alfHz4hHd37pl7e/aN8vL/DWtr1r1vb96xxcWRVDAwYFABAQIDZ2fOqSsrVn3+/ucZ19e1YqurTeZ2duyaysqPRYKCH53JyYlAfX36h/r67xVZWbLrR0eOyfDw+wutrUHs1NSzZ6KiX/2vr0XqnJwjv6SkU/dycuSWwMCbW7e3dcL9/eEck5M9riYmTGo2NmxaPz9+Qff39QLMzINPNDRoXKWlUfTl5dE08fH5CHFx4pPY2KtzMTFiUxUVKj8EBAgMx8eVUiMjRmXDw51eGBgwKJaWN6EFBQoPmpovtQcHDgkSEiQ2gIAbm+Li3z3r680mJydOabKyf811deqfCQkSG4ODHZ4sLFh0Gho0LhsbNi1ubtyyWlq07qCgW/tSUqT2Ozt2TdbWt2Gzs33OKSlSe+Pj3T4vL15xhIQTl1NTpvXR0bloAAAAAO3twSwgIEBg/PzjH7GxechbW7btamrUvsvLjUa+vmfZOTlyS0pKlN5MTJjUWFiw6M/PhUrQ0Ltr7+/FKqqqT+X7++0WQ0OGxU1NmtczM2ZVhYURlEVFis/5+ekQAgIEBn9//oFQUKDwPDx4RJ+fJbqoqEvjUVGi86OjXf5AQIDAj48FipKSP62dnSG8ODhwSPX18QS8vGPftrZ3wdrar3UhIUJjEBAgMP//5Rrz8/0O0tK/bc3NgUwMDBgUExMmNezswy9fX77hl5c1okREiMwXFy45xMSTV6enVfJ+fvyCPT16R2RkyKxdXbrnGRkyK3Nz5pVgYMCggYEZmE9PntHc3KN/IiJEZioqVH6QkDuriIgLg0ZGjMru7scpuLhr0xQUKDze3qd5Xl684gsLFh3b26124ODbOzIyZFY6OnROCgoUHklJktsGBgwKJCRIbFxcuOTCwp9d09O9bqysQ+9iYsSmkZE5qJWVMaTk5NM3eXnyi+fn1TLIyItDNzduWW1t2reNjQGM1dWxZE5OnNKpqUngbGzYtFZWrPr09PMH6urPJWVlyq96evSOrq5H6QgIEBi6um/VeHjwiCUlSm8uLlxyHBw4JKamV/G0tHPHxsaXUejoyyPd3aF8dHTonB8fPiFLS5bdvb1h3IuLDYaKig+FcHDgkD4+fEK1tXHEZmbMqkhIkNgDAwYF9vb3AQ4OHBJhYcKjNTVqX1dXrvm5uWnQhoYXkcHBmVgdHTonnp4nueHh2Tj4+OsTmJgrsxERIjNpadK72dmpcI6OB4mUlDOnm5stth4ePCKHhxWS6enJIM7Oh0lVVar/KChQeN/fpXqMjAOPoaFZ+ImJCYANDRoXv79l2ubm1zFCQoTGaGjQuEFBgsOZmSmwLS1adw8PHhGwsHvLVFSo/Lu7bdYWFiw6Y8alY3z4hHx37pl3e/aNe/L/DfJr1r1rb96xb8WRVMUwYFAwAQIDAWfOqWcrVn0r/ucZ/te1YterTearduyadsqPRcqCH52CyYlAyX36h3367xX6WbLrWUeOyUfw+wvwrUHsrdSzZ9SiX/2ir0Xqr5wjv5ykU/ekcuSWcsCbW8C3dcK3/eEc/ZM9rpMmTGomNmxaNj9+QT/39QL3zINPzDRoXDSlUfSl5dE05fH5CPFx4pNx2Ktz2DFiUzEVKj8VBAgMBMeVUscjRmUjw51ewxgwKBiWN6GWBQoPBZovtZoHDgkHEiQ2EoAbm4Di3z3i680m6ydOaSeyf82ydeqfdQkSGwmDHZ6DLFh0LBo0LhobNi0bbtyyblq07lqgW/ugUqT2Ujt2TTvWt2HWs33OsylSeynj3T7jL15xL4QTl4RTpvVT0blo0QAAAADtwSztIEBgIPzjH/yxecixW7btW2rUvmrLjUbLvmfZvjlySzlKlN5KTJjUTFiw6FjPhUrP0Ltr0O/FKu+qT+Wq++0W+0OGxUNNmtdNM2ZVM4URlIVFis9F+ekQ+QIEBgJ//oF/UKDwUDx4RDyfJbqfqEvjqFGi81GjXf6jQIDAQI8Fio+SP62SnSG8nThwSDj18QT1vGPfvLZ3wbbar3XaIUJjIRAgMBD/5Rr/8/0O89K/bdLNgUzNDBgUDBMmNRPswy/sX77hX5c1opdEiMxEFy45F8STV8SnVfKnfvyCfj16Rz1kyKxkXbrnXRkyKxlz5pVzYMCgYIEZmIFPntFP3KN/3CJEZiIqVH4qkDurkIgLg4hGjMpG7scp7rhr07gUKDwU3qd53l684l4LFh0L26122+DbO+AyZFYyOnROOgoUHgpJkttJBgwKBiRIbCRcuORcwp9dwtO9btOsQ++sYsSmYpE5qJGVMaSV5NM35Hnyi3nn1TLnyItDyDduWTdt2rdtjQGMjdWxZNVOnNJOqUngqWzYtGxWrPpW9PMH9OrPJeplyq9levSOeq5H6a4IEBgIum/VunjwiHglSm8lLlxyLhw4JBymV/GmtHPHtMaXUcboyyPo3aF83XTonHQfPiEfS5bdS71h3L2LDYaLig+FinDgkHA+fEI+tXHEtWbMqmZIkNhIAwYFA/b3AfYOHBIOYcKjYTVqXzVXrvlXuWnQuYYXkYbBmVjBHTonHZ4nuZ7h2Tjh+OsT+Jgrs5gRIjMRadK7admpcNmOB4mOlDOnlJsttpsePCIehxWSh+nJIOnOh0nOVar/VShQeCjfpXrfjAOPjKFZ+KGJCYCJDRoXDb9l2r/m1zHmQoTGQmjQuGhBgsNBmSmwmS1ady0PHhEPsHvLsFSo/FS7bda7Fiw6FsalY2P4hHx87pl3d/aNe3v/DfLy1r1ra96xb2+RVMXFYFAwMAIDAQHOqWdnVn0rK+cZ/v61YtfXTearq+yadnaPRcrKH52CgolAycn6h3197xX6+rLrWVmOyUdH+wvw8EHsra2zZ9TUX/2iokXqr68jv5ycU/ekpOSWcnKbW8DAdcK3t+Ec/f09rpOTTGomJmxaNjZ+QT8/9QL394NPzMxoXDQ0UfSlpdE05eX5CPHx4pNxcatz2NhiUzExKj8VFQgMBASVUsfHRmUjI51ew8MwKBgYN6GWlgoPBQUvtZqaDgkHByQ2EhIbm4CA3z3i4s0m6+tOaScnf82ysuqfdXUSGwkJHZ6Dg1h0LCw0LhoaNi0bG9yybm607lpaW/ugoKT2UlJ2TTs7t2HW1n3Os7NSeykp3T7j415xLy8Tl4SEpvVTU7lo0dEAAAAAwSzt7UBgICDjH/z8ecixsbbtW1vUvmpqjUbLy2fZvr5ySzk5lN5KSpjUTEyw6FhYhUrPz7tr0NDFKu/vT+Wqqu0W+/uGxUNDmtdNTWZVMzMRlIWFis9FRekQ+fkEBgIC/oF/f6DwUFB4RDw8Jbqfn0vjqKii81FRXf6jo4DAQEAFio+PP62SkiG8nZ1wSDg48QT19WPfvLx3wba2r3Xa2kJjISEgMBAQ5Rr///0O8/O/bdLSgUzNzRgUDAwmNRMTwy/s7L7hX181opeXiMxERC45FxeTV8TEVfKnp/yCfn56Rz09yKxkZLrnXV0yKxkZ5pVzc8CgYGAZmIGBntFPT6N/3NxEZiIiVH4qKjurkJALg4iIjMpGRscp7u5r07i4KDwUFKd53t684l5eFh0LC61229vbO+DgZFYyMnROOjoUHgoKkttJSQwKBgZIbCQkuORcXJ9dwsK9btPTQ++srMSmYmI5qJGRMaSVldM35OTyi3l51TLn54tDyMhuWTc32rdtbQGMjY2xZNXVnNJOTkngqanYtGxsrPpWVvMH9PTPJerqyq9lZfSOenpH6a6uEBgICG/VurrwiHh4Sm8lJVxyLi44JBwcV/GmpnPHtLSXUcbGyyPo6KF83d3onHR0PiEfH5bdS0th3L29DYaLiw+FiorgkHBwfEI+PnHEtbXMqmZmkNhISAYFAwP3Afb2HBIODsKjYWFqXzU1rvlXV2nQubkXkYaGmVjBwTonHR0nuZ6e2Tjh4esT+Pgrs5iYIjMREdK7aWmpcNnZB4mOjjOnlJQttpubPCIeHhWSh4fJIOnph0nOzqr/VVVQeCgopXrf3wOPjIxZ+KGhCYCJiRoXDQ1l2r+/1zHm5oTGQkLQuGhogsNBQSmwmZlady0tHhEPD3vLsLCo/FRUbda7uyw6FhZSUlJSCQkJCWpqamrV1dXVMDAwMDY2NjalpaWlODg4OL+/v79AQEBAo6Ojo56enp6BgYGB8/Pz89fX19f7+/v7fHx8fOPj4+M5OTk5goKCgpubm5svLy8v/////4eHh4c0NDQ0jo6OjkNDQ0NERERExMTExN7e3t7p6enpy8vLy1RUVFR7e3t7lJSUlDIyMjKmpqamwsLCwiMjIyM9PT097u7u7kxMTEyVlZWVCwsLC0JCQkL6+vr6w8PDw05OTk4ICAgILi4uLqGhoaFmZmZmKCgoKNnZ2dkkJCQksrKysnZ2dnZbW1tboqKioklJSUltbW1ti4uLi9HR0dElJSUlcnJycvj4+Pj29vb2ZGRkZIaGhoZoaGhomJiYmBYWFhbU1NTUpKSkpFxcXFzMzMzMXV1dXWVlZWW2tra2kpKSkmxsbGxwcHBwSEhISFBQUFD9/f397e3t7bm5ubna2traXl5eXhUVFRVGRkZGV1dXV6enp6eNjY2NnZ2dnYSEhISQkJCQ2NjY2Kurq6sAAAAAjIyMjLy8vLzT09PTCgoKCvf39/fk5OTkWFhYWAUFBQW4uLi4s7Ozs0VFRUUGBgYG0NDQ0CwsLCweHh4ej4+Pj8rKyso/Pz8/Dw8PDwICAgLBwcHBr6+vr729vb0DAwMDAQEBARMTExOKioqKa2trazo6OjqRkZGREREREUFBQUFPT09PZ2dnZ9zc3Nzq6urql5eXl/Ly8vLPz8/Pzs7OzvDw8PC0tLS05ubm5nNzc3OWlpaWrKysrHR0dHQiIiIi5+fn562tra01NTU1hYWFheLi4uL5+fn5Nzc3N+jo6OgcHBwcdXV1dd/f399ubm5uR0dHR/Hx8fEaGhoacXFxcR0dHR0pKSkpxcXFxYmJiYlvb29vt7e3t2JiYmIODg4OqqqqqhgYGBi+vr6+GxsbG/z8/PxWVlZWPj4+PktLS0vGxsbG0tLS0nl5eXkgICAgmpqamtvb29vAwMDA/v7+/nh4eHjNzc3NWlpaWvT09PQfHx8f3d3d3aioqKgzMzMziIiIiAcHBwfHx8fHMTExMbGxsbESEhISEBAQEFlZWVknJycngICAgOzs7OxfX19fYGBgYFFRUVF/f39/qampqRkZGRm1tbW1SkpKSg0NDQ0tLS0t5eXl5Xp6enqfn5+fk5OTk8nJycmcnJyc7+/v76CgoKDg4ODgOzs7O01NTU2urq6uKioqKvX19fWwsLCwyMjIyOvr6+u7u7u7PDw8PIODg4NTU1NTmZmZmWFhYWEXFxcXKysrKwQEBAR+fn5+urq6und3d3fW1tbWJiYmJuHh4eFpaWlpFBQUFGNjY2NVVVVVISEhIQwMDAx9fX19EQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AAAAAAAAAAAASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAAAAAAD/////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAOg9AADSPQAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAFAAAAAQAAAPJDAAACAAAABgAAAAMAAAABAAAABAAAAAcAAAABAAAAAgAAAPgyAAAFAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAWIAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeDMAAAUAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAAAmE4AAAAEAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAr/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMyHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAtPmZzX2NvdW50ID09IDEAanNlbXUuYwBpbml0X3ZtX2ZzAHAtPmRyaXZlX2NvdW50ID09IDEAaW5pdF92bV9kcml2ZQBwLT5ldGhfY291bnQgPT0gMQBpbml0X3ZtAHNoaWZ0ID49IDAALi9zb2Z0ZnBfdGVtcGxhdGUuaABub3JtYWxpemVfc2YzMgBub3JtYWxpemUyX3NmMzIAbm9ybWFsaXplX3NmNjQAbm9ybWFsaXplMl9zZjY0AGExIDwgYgBkaXZyZW1fdTY0AHZpcnRpb18lMDR4AHdyaXRlX3NpemUgPj0gMQB2aXJ0aW8uYwB2aXJ0aW9fYmxvY2tfcmVjdl9yZXF1ZXN0AHZpcnRpb190YWJsZXQAdmlydGlvX21vdXNlAHZpcnRpb19rZXlib2FyZAB3d2RkZGRkZHcAd3cAd3N3d3cAUXcAd3NzdwBRAHdzd3d3dwB3AHMAd2QAZFF3d3dkZGRkZGRkZGRkZGRkZGQAd3d3d3dkZGRkZAB3ZHcAd2J3ZGR3cwBiAHdiZGR3cwBiZGR3cwB3d3MAd3N3dwB3c3dzAHdzdwB3cwA5UDIwMDAuTAB3d3NzdwBoAHd3aAA5cDogdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlkPSVkCgBidWYgKyAxIDw9IGJ1Zl9lbmQAbWFyc2hhbGwAYnVmICsgMiA8PSBidWZfZW5kAGJ1ZiArIDQgPD0gYnVmX2VuZABidWYgKyA4IDw9IGJ1Zl9lbmQAbGVuIDw9IDY1NTM1AGJ1ZiArIDIgKyBsZW4gPD0gYnVmX2VuZABidWYgKyAxMyA8PSBidWZfZW5kAG4tPnR5cGUgPT0gRlRfRElSAGZzX25ldC5jAGlub2RlX2Rpcl9hZGQALi4Abi0+cmVmY291bnQgPj0gMQBpbm9kZV9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA9PSAwAGZsdXNoX2RpcgBuLT5yZWZjb3VudCA9PSAwAGlub2RlX2ZyZWUAbi0+b3Blbl9jb3VudCA9PSAwAGZzLT5mc19ibG9ja3MgPj0gMABmcy0+aW5vZGVfY2FjaGVfc2l6ZSA+PSAwAG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0FESU5HAGZzX3dnZXRfc2V0X2Vycm9yAGxpc3RfZW1wdHkoJm4tPnUuZGlyLmRlX2xpc3QpAGZzLT5pbm9kZV9jb3VudCA+PSAwAGJ1LT5yZWZfY291bnQgPj0gMQBmc19iYXNlX3VybF9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA+PSAwAGlub2RlX2RpcmVudF9kZWxldGVfbm9fZGVjcmVmAHhocgAhZnMtPmZzX2F0dGFjaChmcywgJnJvb3RfZmQsICZxaWQsIHVpZCwgIiIsICIiKQBmc19jbWRfeGhyAG4tPnR5cGUgPT0gRlRfUkVHICYmIG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0NBTABzZXRfYmFzZV91cmwAcmVzZXRfYmFzZV91cmwAZnNfaXNfbmV0KGZzMSkAZnNfbmV0X3Jlc2V0X2Jhc2VfdXJsAHNldF91cmwAZXhwb3J0X2ZpbGUAcGJrZGYyAHNldF9pbXBvcnRfZGlyAHVua25vd24gY29tbWFuZDogJyVzJwoAZnNfd3JpdGUAZnNfdHJ1bmNhdGUAZnNfbmV0X3NldF91cmwAZnNfbmV0X3NldF9iYXNlX3VybABuLT5vcGVuX2NvdW50ID49IDEAaW5vZGVfZGVjX29wZW4Abi0+dS5yZWcuc3RhdGUgPT0gUkVHX1NUQVRFX1VOTE9BREVEAGZzX29wZW5fd2dldABuLT51LnJlZy5zdGF0ZSA9PSBSRUdfU1RBVEVfTE9BREVEAGZzX3RyaW1fY2FjaGUAZnNfd2dldF9zZXRfbG9hZGVkAGxpc3RfZW1wdHkoJmZzLT5pbm9kZV9jYWNoZV9saXN0KQBmc19tZW1fZW5kAC90bXAAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAwLCAiIiwgIiIpAGZzX2NyZWF0ZV9jbWQALmZzY21kACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCByb290X2ZkLCBGU0NNRF9OQU1FLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjY2LCAwKQAhZnMtPmZzX2F0dGFjaChmcywgJnMtPnJvb3RfZmQsICZxaWQsIDAsICIiLCAiIikAZnNfaW5pdGlhbF9zeW5jAGhlYWQ/bm9jYWNoZT0lbGxkAC5oZWFkACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBoZWFkX2ZkLCAiLmhlYWQiLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjQ0LCAwKQBjb3VsZCBub3QgbG9hZCAnaGVhZCcgZmlsZSAoSFRUUCBlcnJvcj0lZCkAaW52YWxpZCBoZWFkIHZlcnNpb24AUm9vdElEAGV4cGVjdGVkIFJvb3RJRCB0YWcARlNNYXhTaXplAGZzX25ldF9zZXRfZnNfbWF4X3NpemUAZmlsZXMALwAuZmlsZWxpc3QudHh0ACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBuZXdfZmlsZWxpc3RfZmQsICIuZmlsZWxpc3QudHh0IiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDY0NCwgMCkAaGVhZF9sb2FkZWQAY291bGQgbm90IGxvYWQgZmlsZSBsaXN0IChIVFRQIGVycm9yPSVkKQBlcnJvciB3aGlsZSBwYXJzaW5nIGZpbGUgbGlzdAAucHJlbG9hZDIvcHJlbG9hZC50eHQALnByZWxvYWQAaW52YWxpZCBmaWxlbmFtZQoAaW52YWxpZCBwcmVsb2FkIGZpbGU6ICclcycKAGZpbGVuYW1lIHdpdGhvdXQgdGFyZ2V0OiAlcwoAaW52YWxpZCBzaXplCgBpbnZhbGlkIGZpbGUgaWQKAGludmFsaWQgbW9kZQoAaW52YWxpZCB1aWQKAGludmFsaWQgZ2lkCgBpbnZhbGlkIG1ham9yCgBpbnZhbGlkIG1pbm9yCgBpbnZhbGlkIG10aW1lCgBpbnZhbGlkIHN5bWxpbmsgbmFtZQoARXJyb3I6IABmc19pc19uZXQoZnMpAGZzX25ldF9zZXRfcHdkAC5mc2NtZF9wd2QAIWZzLT5mc19jcmVhdGUoZnMsICZxaWQsIHJvb3RfZmQsICIuZnNjbWRfcHdkIiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDYwMCwgMCkAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAxMDAwLCAiIiwgIiIpAGZzX2ltcG9ydF9maWxlAFBPU1QAR0VUAHNhbHRfbGVuIDw9IFNBTFRfTEVOX01BWABmc193Z2V0LmMAcGJrZGYyX2htYWNfc2hhMjU2APui6QElMDE2bGx4AAoKAFZlcnNpb24AaHR0cDoAaHR0cHM6AGZpbGU6AGlycV9udW0gPCA0AHBjaS5jAHBjaV9kZXZpY2VfZ2V0X2lycQBiYXJfbnVtIDwgUENJX05VTV9SRUdJT05TAHBjaV9yZWdpc3Rlcl9iYXIAKHNpemUgJiAoc2l6ZSAtIDEpKSA9PSAwAHNpemUgPj0gNAByLT5zaXplID09IDAAdW5leHBlY3RlZCBlbmQgb2YgZmlsZQBJbnZhbGlkIHByb3BlcnR5IG5hbWUAJzonIGV4cGVjdGVkAGV4cGVjdGluZyAnLCcgb3IgJ30nAGV4cGVjdGluZyAnLCcgb3IgJ10nAG51bGwAdHJ1ZQBmYWxzZQB1bmtub3duIGlkZW50aWZpZXI6ICclcycAdW5leHBlY3RlZCBjaGFyYWN0ZXIAdW50ZXJtaW5hdGVkIHN0cmluZwBpbnZhbGlnIGhleCBkaWdpdAB1bmtub3duIGVzY2FwZSBjb2RlAHN0cmluZyB0b28gbG9uZwB1bmV4cGVjdGVkIGNoYXJhY3RlcnMgYXQgdGhlIGVuZABDb3VsZCBub3QgbG9hZCBibG9jayBkZXZpY2UgZmlsZSAoZXJyPSVkKQoAYmxvY2tfc2l6ZQBpbnZhbGlkIGJsb2NrX3NpemUKAG5fYmxvY2sAaW52YWxpZCBuX2Jsb2NrCgBwcmVmZXRjaF9ncm91cF9sZW4AcHJlZmV0Y2hfZ3JvdXBfbGVuIGlzIHRvbyBsYXJnZQBwcmVmZXRjaABleHBlY3RpbmcgYW4gYXJyYXkKAGV4cGVjdGluZyBhbiBpbnRlZ2VyCgAlc2JsayUwOXUuYmluACVzZ3JwJTA5dS5iaW4AQ291bGQgbm90IGxvYWQgZ3JvdXAgJXUKAHNpemUgPT0gYmxvY2tfYnl0ZXMgKiByZXEtPm5fYmxvY2tfbnVtAGJsb2NrX25ldC5jAGJmX3ByZWZldGNoX2dyb3VwX29ubG9hZABiLT5zdGF0ZSA9PSBDQkxPQ0tfTE9BRElORwBiZl91cGRhdGVfYmxvY2sAQ291bGQgbm90IGxvYWQgYmxvY2sgJXUKAHNpemUgPT0gYmYtPmJsb2NrX3NpemUgKiA1MTIAYmZfcmVhZF9vbmxvYWQAcy0+bl9waHlzX21lbV9yYW5nZSA8IFBIWVNfTUVNX1JBTkdFX01BWABpb21lbS5jAHJlZ2lzdGVyX3JhbV9lbnRyeQAoc2l6ZSAmIChERVZSQU1fUEFHRV9TSVpFIC0gMSkpID09IDAgJiYgc2l6ZSAhPSAwAENvdWxkIG5vdCBhbGxvY2F0ZSBWTSBtZW1vcnkKAGNwdV9yZWdpc3Rlcl9kZXZpY2UAc2l6ZSA8PSAweGZmZmZmZmZmAHJpc2N2MzIscmlzY3Y2NCxyaXNjdjEyOAByaXNjdjMyAHJpc2N2NjQAcmlzY3YxMjgAdW5zdXBwb3J0ZWQgbWFjaGluZTogJXMKAHVuc3VwcG9ydGVkIG1heF94bGVuPSVkCgBzaW1wbGVmYgB1bnN1cHBvcnRlZCBkaXNwbGF5IGRldmljZTogJXMKAHZpcnRpbwB1bnN1cHBvcnRlZCBpbnB1dCBkZXZpY2U6ICVzCgBObyBiaW9zIGZvdW5kAEJJT1MgdG9vIGJpZwoAa2VybmVsIHRvbyBiaWcAaW5pdHJkIHRvbyBiaWcAI2FkZHJlc3MtY2VsbHMAI3NpemUtY2VsbHMAY29tcGF0aWJsZQB1Y2JiYXIscmlzY3ZlbXUtYmFyX2RldgBtb2RlbAB1Y2JiYXIscmlzY3ZlbXUtYmFyZQBjcHVzAHRpbWViYXNlLWZyZXF1ZW5jeQBjcHUAZGV2aWNlX3R5cGUAcmVnAHN0YXR1cwBva2F5AHJpc2N2AHJ2JWQAcmlzY3YsaXNhAHJpc2N2LHN2MzIAcmlzY3Ysc3Y0OABtbXUtdHlwZQBjbG9jay1mcmVxdWVuY3kAaW50ZXJydXB0LWNvbnRyb2xsZXIAI2ludGVycnVwdC1jZWxscwByaXNjdixjcHUtaW50YwBwaGFuZGxlAG1lbW9yeQBodGlmAHVjYixodGlmMAB1Y2JiYXIscmlzY3ZlbXUtYmFyLXNvYwBzaW1wbGUtYnVzAHJhbmdlcwBjbGludAByaXNjdixjbGludDAAaW50ZXJydXB0cy1leHRlbmRlZABwbGljAHJpc2N2LHBsaWMwAHJpc2N2LG5kZXYAdmlydGlvLG1taW8AZnJhbWVidWZmZXIAc2ltcGxlLWZyYW1lYnVmZmVyAHN0cmlkZQBmb3JtYXQAYThyOGc4YjgAY2hvc2VuAGJvb3RhcmdzAHJpc2N2LGtlcm5lbC1zdGFydAByaXNjdixrZXJuZWwtZW5kAGxpbnV4LGluaXRyZC1zdGFydABsaW51eCxpbml0cmQtZW5kAHMtPm9wZW5fbm9kZV9jb3VudCA9PSAwAHJpc2N2X21hY2hpbmUuYwBmZHRfb3V0cHV0ACVzQCVsbHgAc2l6ZV9sb2cyID09IDIAaHRpZl93cml0ZQAKUG93ZXIgb2ZmLgBIVElGOiB1bnN1cHBvcnRlZCB0b2hvc3Q9MHglMDE2bGx4CgBodGlmX3JlYWQAcGxpY193cml0ZQBwbGljX3JlYWQAY2xpbnRfd3JpdGUAY2xpbnRfcmVhZABleHBlY3RpbmcgJyVzJyBwcm9wZXJ0eQoAJXM6IGludGVnZXIgZXhwZWN0ZWQKAEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlsZQoAZXJyb3I6ICVzCgB2ZXJzaW9uAFRoZSBlbXVsYXRvciBpcyB0b28gb2xkIHRvIHJ1biB0aGlzIFZNOiBwbGVhc2UgdXBncmFkZQoAVGhlIFZNIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gb2xkIGZvciB0aGlzIGVtdWxhdG9yIHZlcnNpb246IHBsZWFzZSB1cGdyYWRlIHRoZSBWTSBjb25maWd1cmF0aW9uIGZpbGUKAG1hY2hpbmUAJXM6IHN0cmluZyBleHBlY3RlZAoAVW5rbm93biBtYWNoaW5lIG5hbWU6ICVzCgBtZW1vcnlfc2l6ZQBiaW9zAGtlcm5lbABpbml0cmQAY21kbGluZQBUWgBVVEMlYyUwMmQ6JTAyZABkcml2ZSVkAFRvbyBtYW55IGRyaXZlcwoAZmlsZQBkZXZpY2UAZnMlZABUb28gbWFueSBmaWxlc3lzdGVtcwoAdGFnAC9kZXYvcm9vdAAvZGV2L3Jvb3QlZABldGglZABUb28gbWFueSBldGhlcm5ldCBpbnRlcmZhY2VzCgBkcml2ZXIAdGFwAGlmbmFtZQBkaXNwbGF5MAB3aWR0aABoZWlnaHQAdmdhX2Jpb3MAaW5wdXRfZGV2aWNlAGFjY2VsAG5vbmUAYXV0bwB1bnN1cHBvcnRlZCAnYWNjZWwnIGNvbmZpZzogJXMKAHJ0Y19sb2NhbF90aW1lACVzOiBib29sZWFuIGV4cGVjdGVkCgAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAG5hbgBOQU4ALgAAAQIEBwMGBQ==";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=(function(){Module["dynCall_vi"](func,arg)})}else{browserIterationFunc=(function(){Module["dynCall_v"](func)})}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}}),runIter:(function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}if(Module["postMainLoop"])Module["postMainLoop"]()})},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject==="undefined"){console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Module["preloadedImages"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module["preloadedAudios"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module["preloadedAudios"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(function(){});canvas.exitFullscreen=canvas.exitFullscreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?(function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null)||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullscreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullscreen()}}),requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){err("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");Browser.requestFullScreen=(function(lockPointer,resizeCanvas,vrDevice){return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)});return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),asyncLoad:(function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";Module["readAsync"](url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(dep)addRunDependency(dep)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}),wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:(function(){var handle=Browser.nextWgetRequestHandle;Browser.nextWgetRequestHandle++;return handle})};function _emscripten_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.");Module["requestFullScreen"]=Module["requestFullscreen"];Browser.requestFullScreen(lockPointer,resizeCanvas,vrDevice)};Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas,vrDevice){Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==="boolean"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,"base64")}catch(_){buf=new Buffer(s,"base64")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16){var sp=stackSave();try{return Module["dynCall_iiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_iiiiiiii":invoke_iiiiiiii,"invoke_iiiiiiiii":invoke_iiiiiiiii,"invoke_iiiiiiiiiiiiiiiii":invoke_iiiiiiiiiiiiiiiii,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiii":invoke_viiiiii,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"__exit":__exit,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_get_now":_emscripten_get_now,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_emscripten_set_main_loop":_emscripten_set_main_loop,"_emscripten_set_main_loop_timing":_emscripten_set_main_loop_timing,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_get_new_handle":_file_buffer_get_new_handle,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"_tzset":_tzset,"flush_NO_FILESYSTEM":flush_NO_FILESYSTEM,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM
+var asm=(/** @suppress {uselessCode} */ function(global,env,buffer) {
+"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iii;var Y=env.invoke_iiii;var Z=env.invoke_iiiii;var _=env.invoke_iiiiii;var $=env.invoke_iiiiiii;var aa=env.invoke_iiiiiiii;var ba=env.invoke_iiiiiiiii;var ca=env.invoke_iiiiiiiiiiiiiiiii;var da=env.invoke_vi;var ea=env.invoke_vii;var fa=env.invoke_viii;var ga=env.invoke_viiii;var ha=env.invoke_viiiii;var ia=env.invoke_viiiiii;var ja=env.___assert_fail;var ka=env.___buildEnvironment;var la=env.___setErrNo;var ma=env.___syscall140;var na=env.___syscall146;var oa=env.___syscall54;var pa=env.___syscall6;var qa=env.__exit;var ra=env._abort;var sa=env._clock_gettime;var ta=env._console_get_size;var ua=env._console_write;var va=env._emscripten_async_call;var wa=env._emscripten_async_wget3_data;var xa=env._emscripten_get_now;var ya=env._emscripten_get_now_is_monotonic;var za=env._emscripten_memcpy_big;var Aa=env._emscripten_random;var Ba=env._emscripten_set_main_loop;var Ca=env._emscripten_set_main_loop_timing;var Da=env._exit;var Ea=env._fb_refresh;var Fa=env._file_buffer_get_new_handle;var Ga=env._file_buffer_init;var Ha=env._file_buffer_read;var Ia=env._file_buffer_reset;var Ja=env._file_buffer_resize;var Ka=env._file_buffer_set;var La=env._file_buffer_write;var Ma=env._fs_export_file;var Na=env._fs_wget_update_downloading;var Oa=env._gettimeofday;var Pa=env._localtime_r;var Qa=env._net_recv_packet;var Ra=env._time;var Sa=env._tzset;var Ta=env.flush_NO_FILESYSTEM;var Ua=0.0;
+// EMSCRIPTEN_START_FUNCS
+function ib(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function jb(){return l|0}function kb(a){a=a|0;l=a}function lb(a,b){a=a|0;b=b|0;l=a;m=b}function mb(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function nb(a){a=a|0;y=a}function ob(){return y|0}function pb(b){b=b|0;var d=0,e=0;d=c[8544]|0;if(d>>>0>=1024)return;e=c[8545]|0;a[19088+e>>0]=b;b=e+1|0;c[8545]=(b|0)==1024?0:b;c[8544]=d+1;return}function qb(a,b){a=a|0;b=b|0;var d=0;d=c[8546]|0;if(!d)return;eb[c[(c[d>>2]|0)+32>>2]&15](d,a,b&65535);return}function rb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[8546]|0;if(!e)return;Va[c[(c[e>>2]|0)+24>>2]&15](e)|0;g=c[8547]|0;h=g+-1|0;e=c[8548]|0;f=e+-1|0;a=(((h|0)>(a|0)?a:h)<<15|0)/(g|0)|0;e=(((f|0)>(b|0)?b:f)<<15|0)/(e|0)|0;c[8549]=a;c[8550]=e;c[8551]=d;b=c[8546]|0;gb[c[(c[b>>2]|0)+28>>2]&7](b,a,e,0,d);return}function sb(a){a=a|0;var b=0;b=c[8546]|0;if(!b)return;gb[c[(c[b>>2]|0)+28>>2]&7](b,c[8549]|0,c[8550]|0,a,c[8551]|0);return}function tb(a,b){a=a|0;b=b|0;var d=0;d=c[(c[8546]|0)+4>>2]|0;if(!d)return;eb[c[d+24>>2]&15](d,a,b);return}function ub(a){a=a|0;var b=0;c[8552]=a;b=c[8546]|0;if(!b)return;b=c[b+4>>2]|0;if(!b)return;db[c[b+28>>2]&15](b,a);return}function vb(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=vf(20)|0;c[i+4>>2]=b;c[i+8>>2]=Lh(d)|0;if(e|0)c[i+16>>2]=Lh(e)|0;c[8547]=f;c[8548]=g;c[i+12>>2]=h;h=vf(248)|0;c[i>>2]=h;Kg(h);Bg(c[i>>2]|0,a,4,i);return}function wb(a){a=a|0;var b=0,d=0,e=0;e=c[a>>2]|0;b=c[e+164>>2]|0;if((b|0)>0){if((b|0)!=1)ja(13668,13685,207,13693);d=Vd(c[e+108>>2]|0,5,a)|0;c[e+112>>2]=d;b=c[a+16>>2]|0;if(!b)return;ae(d,b);return}b=c[e+96>>2]|0;if((b|0)<=0){Ab(a);return}if((b|0)!=1)ja(13704,13685,224,13724);c[e+56>>2]=af(c[e+52>>2]|0,131072,6,a)|0;return}function xb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+144|0;d=h;e=h+132|0;f=h+128|0;g=a+8|0;b=c[g>>2]|0;if(b|0?Tc(b)|0:0){b=Uc(c[g>>2]|0)|0;i=c[a+12>>2]|0;b=Xa[c[i+8>>2]&31](c[i>>2]|0,d,(b|0)<128?b:128)|0;if((b|0)>0)Vc(c[g>>2]|0,d,b)|0;if(c[8553]|0){ta(e|0,f|0);Wc(c[g>>2]|0,c[e>>2]|0,c[f>>2]|0);c[8553]=0}}b=c[a+16>>2]|0;if(b|0)eb[c[b+24>>2]&15](b,1,0);if(!(Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0)){b=0;while(1){db[c[(c[a>>2]|0)+20>>2]&15](a,2e5);d=Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0;if(b>>>0>13|(d|0)!=0)break;else b=b+1|0}if(!d){va(7,a|0,0);l=h;return}}va(7,a|0,10);l=h;return}function yb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[a+8>>2]|0;Ea(b|0,(c[a+12>>2]|0)+(N(h,e)|0)+(d<<2)|0,d|0,e|0,f|0,g|0,h|0);return}function zb(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;d=c[b+96>>2]|0;if((d|0)<=0){Ab(a);return}if((d|0)!=1)ja(13704,13685,224,13724);c[b+56>>2]=af(c[b+52>>2]|0,131072,6,a)|0;return}function Ab(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b>>2]|0;c[g+24>>2]=1;d=c[b+4>>2]<<20;h=g+16|0;c[h>>2]=d;c[h+4>>2]=((d|0)<0)<<31>>31;h=b+8|0;d=c[h>>2]|0;if(d|0?a[d>>0]|0:0)Hg(c[b>>2]|0,d);e=c[8547]|0;d=c[8548]|0;if((e|0)>0&(d|0)>0){f=g+32|0;if(!(c[f>>2]|0)){c[f>>2]=Lh(17494)|0;e=c[8547]|0;d=c[8548]|0}c[g+36>>2]=e;c[g+40>>2]=d}else{c[8553]=1;f=vf(12)|0;c[f+4>>2]=3;c[f+8>>2]=5;c[g+44>>2]=f}e=g+180|0;d=c[e>>2]|0;do if((d|0)>0)if(c[b+12>>2]|0)if((d|0)==1){f=vf(32)|0;a[f>>0]=2;a[f+1>>0]=~~(+Aa()*256.0);a[f+2>>0]=~~(+Aa()*256.0);a[f+3>>0]=~~(+Aa()*256.0);a[f+4>>0]=~~(+Aa()*256.0);a[f+5>>0]=~~(+Aa()*256.0);c[f+8>>2]=4;c[f+12>>2]=0;c[g+176>>2]=f;break}else ja(13738,13685,269,13756);else{d=0;do{Mg(c[g+168+(d*12|0)+4>>2]|0);Mg(c[g+168+(d*12|0)>>2]|0);d=d+1|0}while((d|0)<(c[e>>2]|0));c[e>>2]=0;break}while(0);f=Jg(g)|0;c[8546]=f;Ig(c[b>>2]|0);d=c[f+4>>2]|0;if(d|0)db[c[d+28>>2]&15](d,c[8552]|0);Mg(c[b>>2]|0);Mg(c[h>>2]|0);d=b+16|0;e=c[d>>2]|0;if(!e){Mg(b);va(7,f|0,0);return}Fi(e|0,0,_g(e)|0)|0;Mg(c[d>>2]|0);Mg(b);va(7,f|0,0);return}function Bb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[8544]|0;a=(e|0)>(d|0)?d:e;c[8544]=e-a;if(!a){b=0;return b|0}e=0;d=c[8554]|0;do{f=1024-d|0;f=(a|0)<(f|0)?a:f;Ei(b+e|0,19088+d|0,f|0)|0;a=a-f|0;e=f+e|0;f=f+d|0;d=(f|0)==1024?0:f}while((a|0)!=0);c[8554]=d;f=e;return f|0}function Cb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=(a&2147483647)>>>0<(b&2147483647)>>>0;i=f?a:b;b=f?b:a;f=b>>>31;k=i>>>31;g=b>>>23;j=i>>>23&255;a=b<<3&67108856;h=i<<3&67108856;switch((g&255)<<24>>24){case -1:{if(!a){if((f|0)==(k|0)|(j|0)!=255){e=b;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(b&4194304|0?(i&8388607|0)==0|(i&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{i=a;g=1;break}default:{i=a|67108864;g=g&255}}b=(j|0)==0;a=b?h:h|67108864;b=g-(b?1:j)|0;do if(b)if((b|0)>31){a=(a|0)!=0&1;break}else{a=a>>>b|((1<<b)+134217727&a|0)!=0;break}while(0);if((f|0)==(k|0))a=a+i|0;else{a=i-a|0;f=(a|0)==0?(d|0)==2&1:f}b=Q(a|0)|0;if(!b)ja(13764,13775,183,13795);e=Db(f,g+4+(1-b)|0,a<<b+-1,d,e)|0;return e|0}function Db(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;switch(e|0){case 4:case 0:{j=64;break}case 1:{j=0;break}default:j=(e&1|0)==(a|0)?0:127}if((b|0)<1){h=(b|0)!=0|(j+d|0)>-1;b=1-b|0;do if(b)if((b|0)>31){d=(d|0)!=0&1;break}else{d=d>>>b|((1<<b)+-1&d|0)!=0;break}while(0);g=d&127;if(h&(g|0)!=0){i=c[f>>2]|2;c[f>>2]=i;h=d;b=1;d=i;i=14}else{b=1;i=12}}else{g=d&127;i=12}if((i|0)==12)if(!g)g=0;else{h=d;d=c[f>>2]|0;i=14}if((i|0)==14){c[f>>2]=d|1;d=h}d=(d+j|0)>>>7;d=(e|0)==0&(g|0)==64?d&33554430:d;g=(d>>>24)+b|0;if(d>>>0<8388608){f=0;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}b=(j|0)==0;if((g|0)<=254){f=g;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}c[f>>2]=c[f>>2]|5;f=b?254:255;j=b?8388607:0;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}function Eb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Cb(a,b^-2147483648,c,d)|0}function Fb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;m=b^a;n=m>>>31;h=a>>>23&255;g=b>>>23&255;i=a&8388607;l=b&8388607;j=(h|0)==255;k=(g|0)==255;if(j|k){f=(i|0)!=0;if(!((a&2139095040|0)==2139095040&f)?(l|0)==0|(b&2139095040|0)!=2139095040:0){if(!(j&(g|l|0)==0)?!((h|i|0)==0&k):0){e=m&-2147483648|2139095040;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(!((a&2143289344|0)==2139095040&f)?(l|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}do if(!h){if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break}e=m&-2147483648;return e|0}else a=i|8388608;while(0);do if(!g){if(l|0){g=Q(l|0)|0;f=l<<g+-8;g=9-g|0;break}e=m&-2147483648;return e|0}else f=l|8388608;while(0);f=vi(f<<8|0,0,a<<7|0,0)|0;f=(f|0)!=0|y;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);e=Db(n,h+-126+g+(1-a)|0,f<<a+-1,d,e)|0;return e|0}function Gb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=d>>>31;o=b^a;j=o>>>31;i=a>>>23&255;h=b>>>23&255;g=d>>>23&255;k=a&8388607;q=b&8388607;r=d&8388607;l=(i|0)==255;m=(h|0)==255;p=l|m;n=(g|0)==255;if(p|n){g=(k|0)!=0;if((!((a&2139095040|0)==2139095040&g)?(q|0)==0|(b&2139095040|0)!=2139095040:0)?(r|0)==0|(d&2139095040|0)!=2139095040:0){if((!(l&(h|q|0)==0)?!((i|k|0)==0&m):0)?(j|0)==(s|0)|p&n^1:0)if(n){f=d&-2147483648|2139095040;return f|0}else{f=o&-2147483648|2139095040;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}if((!((a&2143289344|0)==2139095040&g)?(q|0)==0|(b&2143289344|0)!=2139095040:0)?(r|0)==0|(d&2143289344|0)!=2139095040:0){f=2143289344;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}do if(!i)if(!k){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{i=Q(k|0)|0;b=k<<i+-8;i=9-i|0;break}else b=k|8388608;while(0);do if(!h)if(!q){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{h=Q(q|0)|0;a=q<<h+-8;h=9-h|0;break}else a=q|8388608;while(0);q=vi(a<<7|0,0,b<<7|0,0)|0;m=y;n=m>>>0<536870912;d=Bi(m|0,0,1)|0;b=q<<(n&1);m=n?q>>>31|d:m;n=h+i+(n?-126:-125)|0;do if(!g){if(r|0){g=Q(r|0)|0;h=r<<g+-8;g=9-g|0;break}g=m|(b|0)!=0;t=Q(g|0)|0;a=t+-1|0;if(!t)ja(13764,13775,183,13795);f=Db(j,n-a|0,g<<a,e,f)|0;return f|0}else h=r|8388608;while(0);a=g+1|0;h=h<<6;if((n|0)>(a|0)){l=s;k=0;g=h;o=n;i=m}else{r=(n|0)!=(a|0)|m>>>0<h>>>0;l=r?j:s;k=r?b:0;g=r?m:h;j=r?s:j;o=r?a:n;i=r?h:m;b=r?0:b;a=r?n:a}h=o-a|0;a:do if((h|0)>63){a=(k|g|0)!=0&1;g=0}else{if((h|0)>32){a=h+-32|0;a=g>>>a|((1<<a)+-1&g|0)!=0;g=0;break}switch(h|0){case 0:{a=k;break a}case 32:{a=g|(k|0)!=0;g=0;break a}default:{a=g<<32-h|k>>>h|((1<<h)+-1&k|0)!=0;g=g>>>h;break a}}}while(0);if((j|0)==(l|0)){s=a+b|0;b=g+i+(s>>>0<a>>>0&1)|0;i=s}else{s=b-a|0;r=i-g+((s>>>0>b>>>0)<<31>>31)|0;b=r;i=s;j=(r|s|0)==0?(e|0)==2&1:j}if(!b){a=Q(i|0)|0;h=a+31|0;g=o-h|0;if((a+32|0)>>>0<33){a=32;t=50}else a=i<<a+-1}else{a=Q(b|0)|0;h=a+-1|0;if(!a)ja(13764,13775,201,13810);g=o-h|0;if(!h)a=b|(i|0)!=0;else t=50}if((t|0)==50)a=i>>>(33-a|0)|b<<h|(i<<h|0)!=0;f=Db(j,g,a,e,f)|0;return f|0}function Hb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=b^a;m=l>>>31;g=a>>>23&255;f=b>>>23;h=f&255;k=a&8388607;i=b&8388607;if((g|0)==255){f=(k|0)==0;if(f)if((i|0)==0|(b&2139095040|0)!=2139095040)if((h|0)==255){c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}else{e=l&-2147483648|2139095040;return e|0}else j=5;else if(f|(a&2143289344|0)!=2139095040)j=5;if((j|0)==5?(i|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}a:do switch((f&255)<<24>>24){case -1:{if(!i){e=l&-2147483648;return e|0}if(!((a&2143289344|0)==2139095040&(k|0)!=0|(b&2143289344|0)==2139095040)){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break a}f=c[e>>2]|0;if(!(g|k)){c[e>>2]=f|16;e=2143289344;return e|0}else{c[e>>2]=f|8;e=l&-2147483648|2139095040;return e|0}}default:a=i|8388608}while(0);do if(!g){if(k|0){f=Q(k|0)|0;g=9-f|0;f=k<<f+-8;break}e=l&-2147483648;return e|0}else f=k|8388608;while(0);l=a<<2;a=xi(0,f|0,l|0,0)|0;l=vi(a|0,y|0,l|0,0)|0;f=qi(0,f|0,l|0,y|0)|0;a=((f|0)!=0|(y|0)!=0)&1|a;f=Q(a|0)|0;if(!f)ja(13764,13775,183,13795);e=Db(m,127-h+g+(1-f)|0,a<<f+-1,d,e)|0;return e|0}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=a>>>31;f=a>>>23&255;g=a&8388607;do if((f|0)==255){if(!g){if(e)break;return a|0}if((a&2143289344|0)!=2139095040){d=2143289344;return d|0}c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}else{if(e|0){if(f|g)break;return a|0}do if(!f)if(!g){d=0;return d|0}else{e=Q(g|0)|0;a=9-e|0;e=g<<e+-8;break}else{a=f;e=g|8388608}while(0);i=a+-127|0;h=(i&1|0)==0;i=((h?i:a+-128|0)>>1)+127|0;a=e<<((h^1)&1)<<5;if(!a)a=0;else{e=Bi(1,0,(65-(Q(a+-1|0)|0)|0)>>>1|0)|0;f=y;while(1){g=xi(0,a|0,e|0,f|0)|0;g=pi(g|0,y|0,e|0,f|0)|0;g=Ai(g|0,y|0,1)|0;h=y;if(h>>>0<f>>>0|(h|0)==(f|0)&g>>>0<e>>>0){e=g;f=h}else break}h=vi(e|0,f|0,e|0,f|0)|0;a=(0!=(h|0)|(a|0)!=(y|0))&1|e}e=Q(a|0)|0;if(!e)ja(13764,13775,183,13795);d=Db(0,i+(1-e)|0,a<<e+-1,b,d)|0;return d|0}while(0);c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}function Jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?b:a;return b|0}else{b=(f|0)==0?b:a;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?a:b;return b|0}else{b=(f|0)==0?a:b;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Lb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(a&8388607|0)!=0;if(!((a&2139095040|0)==2139095040&e)?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0)return ((a|0)==(b|0)|((b|a)&2147483647|0)==0)&1|0;if(!((a&2143289344|0)==2139095040&e)?(b&8388607|0)==0|(b&2143289344|0)!=2139095040:0)return 0;c[d>>2]=c[d>>2]|16;return 0}function Mb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d|((b|a)&2147483647|0)==0;break}if(d){d=a>>>0>=b>>>0;break}else{d=a>>>0<=b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Nb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d&((b|a)&2147483647|0)!=0;break}if(d){d=a>>>0>b>>>0;break}else{d=a>>>0<b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Ob(a){a=a|0;var b=0,c=0;b=a>>>31;c=a&8388607;a:do switch((a>>>23&255)<<24>>24){case -1:if(!c){a=(b|0)==0?128:1;break a}else{a=(a>>>14&256)+256|0;break a}case 0:{a=(b|0)!=0;if(!c){a=a?8:16;break a}else{a=a?4:32;break a}}default:a=(b|0)==0?64:2}while(0);return a|0}function Pb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,0)|0}function Qb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=a>>>23&255;h=a&8388607;j=(h|0)!=0&(g|0)==255?0:a>>>31;a=(g|0)==0;g=a?-149:g+-150|0;a=a?h:h|8388608;h=a<<7;i=(e|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)>-1)if((g|0)<9?(f=a<<g,f>>>0<=i>>>0):0)a=14;else a=4;else{f=0-g|0;if((g|0)<-31)f=(a|0)!=0&1;else f=h>>>f|((1<<f)+2147483647&h|0)!=0;switch(b|0){case 4:case 0:{a=64;break}case 1:{a=0;break}default:a=(j|0)==(b&1|0)?0:127}e=f&127;f=(a+f|0)>>>7;f=(b|0)==0&(e|0)==64?f&33554430:f;if(f>>>0<=i>>>0)if(!e)a=14;else{c[d>>2]=c[d>>2]|1;a=14}else a=4}if((a|0)==4){c[d>>2]=c[d>>2]|16;j=i;return j|0}else if((a|0)==14){j=(j|0)==0?f:0-f|0;return j|0}return 0}function Rb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,1)|0}function Sb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-31|0;f=(e|0)>31;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=Q(g|0)|0;d=h+-1|0;if(!h)ja(13764,13775,183,13795);else return Db(a>>>31,(f?e+126|0:157)-d|0,g<<d,b,c)|0;return 0}function Tb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-31|0;f=(e|0)>31;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=Q(d|0)|0;a=g+-1|0;if(!g)ja(13764,13775,183,13795);else return Db(0,(f?e+126|0:157)-a|0,d<<a,b,c)|0;return 0}function Ub(a,b,c){a=a|0;b=b|0;c=c|0;c=Vb(a,b,c,0)|0;return c|0}function Vb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;h=a>>>23&255;i=a&8388607;k=(i|0)!=0&(h|0)==255?0:a>>>31;a=(h|0)==0;h=a?-149:h+-150|0;a=a?i:i|8388608;i=a<<7;if(!e){j=qi(0,-2147483648,k^1|0,0)|0;e=y}else{j=pi(k|0,0,-1,-1)|0;e=y}if((h|0)>-1)if((h|0)<41?(g=Bi(a|0,0,h|0)|0,f=y,!(f>>>0>e>>>0|(f|0)==(e|0)&g>>>0>j>>>0)):0)a=17;else a=7;else{f=0-h|0;if((h|0)<-31)f=(a|0)!=0&1;else f=i>>>f|((1<<f)+2147483647&i|0)!=0;switch(b|0){case 4:case 0:{g=64;break}case 1:{g=0;break}default:g=(k|0)==(b&1|0)?0:127}a=f&127;g=(g+f|0)>>>7;g=(b|0)==0&(a|0)==64?g&33554430:g;if(!(e>>>0<0|(e|0)==0&j>>>0<g>>>0))if(!a){f=0;a=17}else{c[d>>2]=c[d>>2]|1;f=0;a=17}else a=7}if((a|0)==7){c[d>>2]=c[d>>2]|16;d=e;k=j;y=d;return k|0}else if((a|0)==17){j=(k|0)==0;k=qi(0,0,g|0,f|0)|0;d=j?f:y;k=j?g:k;y=d;return k|0}return 0}function Wb(a,b,c){a=a|0;b=b|0;c=c|0;c=Vb(a,b,c,1)|0;return c|0}function Xb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=(b|0)<0;e=qi(0,0,a|0,b|0)|0;e=f?e:a;f=f?y:b;g=Ai(a|0,b|0,63)|0;a=Di(e|0,f|0,0)|0;a=64-a|0;if((a|0)>31){b=a+-31|0;i=Bi(1,0,b|0)|0;i=pi(i|0,y|0,-1,-1)|0;h=y&f;f=Ai(e|0,f|0,b|0)|0;b=a+126|0;e=((i&e|0)!=0|(h|0)!=0)&1|f}else b=157;i=Q(e|0)|0;a=i+-1|0;if(!i)ja(13764,13775,183,13795);else return Db(g,b-a|0,e<<a,c,d)|0;return 0}function Yb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=Di(a|0,b|0,0)|0;e=64-e|0;if((e|0)>31){h=e+-31|0;g=Bi(1,0,h|0)|0;g=pi(g|0,y|0,-1,-1)|0;f=y&b;b=Ai(a|0,b|0,h|0)|0;e=e+126|0;a=((g&a|0)!=0|(f|0)!=0)&1|b}else e=157;h=Q(a|0)|0;b=h+-1|0;if(!h)ja(13764,13775,183,13795);else return Db(0,e-b|0,a<<b,c,d)|0;return 0}function Zb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=b&2147483647;o=e&2147483647;o=k>>>0<o>>>0|(k|0)==(o|0)&a>>>0<d>>>0;k=o?a:d;l=o?b:e;i=o?d:a;d=o?e:b;a=Ai(i|0,d|0,63)|0;o=Ai(k|0,l|0,63)|0;b=Ai(i|0,d|0,52)|0;n=Ai(k|0,l|0,52)|0;n=n&2047;e=Bi(i|0,d|0,3)|0;e=e&-8;h=y&8388607;j=Bi(k|0,l|0,3)|0;j=j&-8;m=y&8388607;switch(b&2047){case 2047:{if((e|0)==0&(h|0)==0){if((a|0)==(o|0)|(n|0)!=2047){f=d;g=i;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}if(!(0==0&(d&524288|0)==0)?(k|0)==0&(l&1048575|0)==0|(0!=0|(l&2146959360|0)!=2146435072):0){f=2146959360;g=0;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}case 0:{k=1;i=e;break}default:{k=b&2047;i=e;h=h|8388608}}b=(n|0)==0;e=b?j:j;d=b?m:m|8388608;b=k-(b?1:n)|0;do if(b)if((b|0)>63){b=((e|0)!=0|(d|0)!=0)&1;d=0;break}else{m=Bi(1,0,b|0)|0;m=pi(m|0,y|0,-1,16777215)|0;n=y;b=Ai(e|0,d|0,b|0)|0;b=b|((m&e|0)!=0|(n&d|0)!=0)&1;d=y;break}else b=e;while(0);if((a|0)==(o|0)){d=pi(b|0,d|0,i|0,h|0)|0;b=y}else{d=qi(i|0,h|0,b|0,d|0)|0;b=y;a=(d|0)==0&(b|0)==0?(f|0)==2&1:a}e=Di(d|0,b|0,0)|0;if((e|0)<=0)ja(13764,13775,183,13826);o=Bi(d|0,b|0,e+-1|0)|0;g=_b(a,k+7+(1-e)|0,o,y,f,g)|0;f=y;y=f;return g|0}function _b(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;switch(f|0){case 4:case 0:{l=512;break}case 1:{l=0;break}default:l=(f&1|0)==(a|0)?0:1023}if((b|0)<1){i=pi(l|0,0,d|0,e|0)|0;h=y;i=(b|0)!=0|((h|0)>-1|(h|0)==-1&i>>>0>4294967295);h=1-b|0;do if(h)if((h|0)>63){d=((d|0)!=0|(e|0)!=0)&1;e=0;break}else{j=Bi(1,0,h|0)|0;j=pi(j|0,y|0,-1,-1)|0;k=y;b=Ai(d|0,e|0,h|0)|0;d=b|((j&d|0)!=0|(k&e|0)!=0)&1;e=y;break}while(0);h=d&1023;if(i&(h|0)!=0){j=c[g>>2]|2;c[g>>2]=j;i=1;b=0;k=14}else{i=1;b=0;k=12}}else{h=d&1023;i=b;b=((b|0)<0)<<31>>31;k=12}if((k|0)==12)if(!h)h=0;else{j=c[g>>2]|0;k=14}if((k|0)==14)c[g>>2]=j|1;k=pi(d|0,e|0,l|0,0)|0;k=Ai(k|0,y|0,10)|0;d=y;f=(f|0)==0&(h|0)==512;h=f?k&-2:k;d=f?d&4194303:d;f=Ai(h|0,d|0,53)|0;b=pi(f|0,y|0,i|0,b|0)|0;if(!(d>>>0<1048576|(d|0)==1048576&h>>>0<0)){e=(l|0)==0;if((b|0)>2046){c[g>>2]=c[g>>2]|5;b=e?2046:2047;d=e?1048575:0;h=e?-1:0}}else b=0;g=Bi(a|0,0,63)|0;l=y;a=Bi(b|0,0,52)|0;y=d&1048575|l|y;return h|g|a|0}function $b(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;f=Zb(a,b,c,d^-2147483648,e,f)|0;return f|0}function ac(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=e^b;q=Ai(d^a|0,o|0,63)|0;j=Ai(a|0,b|0,52)|0;j=j&2047;i=Ai(d|0,e|0,52)|0;i=i&2047;n=b&1048575;p=e&1048575;k=(j|0)==2047;l=(i|0)==2047;if(k|l){h=(a|0)!=0|(n|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&h)?(m=(d|0)==0&(p|0)==0,m|(0!=0|(e&2146435072|0)!=2146435072)):0){if(!(m&(k&(i|0)==0))?!((a|0)==0&(n|0)==0&((j|0)==0&l)):0){q=o&-2147483648|2146435072;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&h)?(d|0)==0&(p|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){q=2146959360;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}do if(!j){if(!((a|0)==0&(n|0)==0)){j=Di(a|0,n|0,0)|0;a=Bi(a|0,n|0,j+-11|0)|0;j=12-j|0;b=y;break}q=o&-2147483648;g=0;y=q;return g|0}else b=n|1048576;while(0);do if(!i){if(!((d|0)==0&(p|0)==0)){i=Di(d|0,p|0,0)|0;d=Bi(d|0,p|0,i+-11|0)|0;i=12-i|0;h=y;break}q=o&-2147483648;g=0;y=q;return g|0}else h=p|1048576;while(0);p=Bi(a|0,b|0,10)|0;e=Bi(d|0,h|0,11)|0;o=Ai(a|0,b|0,22)|0;h=Ai(d|0,h|0,21)|0;p=p&-1024;d=e&-2048;b=vi(d|0,0,p|0,0)|0;e=y;p=vi(h|0,0,p|0,0)|0;n=y;d=vi(d|0,0,o|0,0)|0;m=y;o=vi(h|0,0,o|0,0)|0;h=y;p=pi(e|0,0,p&-1024|0,0)|0;d=pi(p|0,y|0,d&-2048|0,0)|0;p=y;n=pi(m|0,0,n|0,0)|0;n=pi(n|0,y|0,o|0,0)|0;p=pi(n|0,y|0,p|0,0)|0;pi(0,y&7|0,o|0,h|0)|0;h=y;d=p|((b&-2097152|0)!=0|(d|0)!=0)&1;b=Di(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);p=Bi(d|0,h|0,b+-1|0)|0;g=_b(q,j+-1022+i+(1-b)|0,p,y,f,g)|0;q=y;y=q;return g|0}function bc(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=Ai(f|0,g|0,63)|0;m=e^b;n=Ai(d^a|0,m|0,63)|0;o=Ai(a|0,b|0,52)|0;o=o&2047;l=Ai(d|0,e|0,52)|0;l=l&2047;k=Ai(f|0,g|0,52)|0;k=k&2047;u=b&1048575;v=e&1048575;w=g&1048575;p=(o|0)==2047;q=(l|0)==2047;t=p|q;r=(k|0)==2047;if(t|r){j=(a|0)!=0|(u|0)!=0;if((!(0==0&(b&2146435072|0)==2146435072&j)?(s=(d|0)==0&(v|0)==0,s|(0!=0|(e&2146435072|0)!=2146435072)):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146435072|0)!=2146435072):0){if((!(s&(p&(l|0)==0))?!((a|0)==0&(u|0)==0&((o|0)==0&q)):0)?(n|0)==(x|0)|t&r^1:0)if(r){h=g&-2147483648|2146435072;i=0;y=h;return i|0}else{h=m&-2147483648|2146435072;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}if((!(0==0&(b&2146959360|0)==2146435072&j)?(d|0)==0&(v|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146959360|0)!=2146435072):0){h=2146959360;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}do if(!o)if((a|0)==0&(u|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=Bi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{o=Di(a|0,u|0,0)|0;a=Bi(a|0,u|0,o+-11|0)|0;o=12-o|0;b=y;break}else b=u|1048576;while(0);do if(!l)if((d|0)==0&(v|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=Bi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{l=Di(d|0,v|0,0)|0;d=Bi(d|0,v|0,l+-11|0)|0;l=12-l|0;j=y;break}else j=v|1048576;while(0);g=Bi(a|0,b|0,10)|0;q=Bi(d|0,j|0,10)|0;b=Ai(a|0,b|0,22)|0;e=Ai(d|0,j|0,22)|0;g=g&-1024;q=q&-1024;p=vi(q|0,0,g|0,0)|0;v=y;g=vi(e|0,0,g|0,0)|0;m=y;q=vi(q|0,0,b|0,0)|0;u=y;b=vi(e|0,0,b|0,0)|0;e=y;g=pi(v|0,0,g&-1024|0,0)|0;q=pi(g|0,y|0,q&-1024|0,0)|0;g=y;m=pi(u|0,0,m|0,0)|0;m=pi(m|0,y|0,b|0,0)|0;m=pi(m|0,y|0,g|0,0)|0;pi(0,y&7|0,b|0,e|0)|0;e=y;b=e>>>0<536870912|(e|0)==536870912&m>>>0<0;u=Bi(m|0,e|0,1)|0;v=y;g=Ai(q|0,g|0,31)|0;q=Bi(p&-1048576|0,q|0,b&1|0)|0;p=y;m=b?u|g&1:m;e=b?v:e;b=l+o+(b?-1022:-1021)|0;do if(!k){if(!((f|0)==0&(w|0)==0)){k=Di(f|0,w|0,0)|0;d=Bi(f|0,w|0,k+-11|0)|0;k=12-k|0;j=y;break}j=m|((q|0)!=0|(p|0)!=0)&1;z=Di(j|0,e|0,0)|0;k=z+-1|0;if((z|0)<=0)ja(13764,13775,183,13826);z=Bi(j|0,e|0,k|0)|0;i=_b(n,b-k|0,z,y,h,i)|0;h=y;y=h;return i|0}else{d=f;j=w|1048576}while(0);k=k+1|0;l=Bi(d|0,j|0,9)|0;o=y;if((b|0)>(k|0)){r=x;s=b;d=k;k=l;a=0;j=o;b=0;l=e}else{w=(b|0)!=(k|0)|(e>>>0<o>>>0|(e|0)==(o|0)&m>>>0<l>>>0);r=w?n:x;n=w?x:n;s=w?k:b;d=w?b:k;k=w?m:l;a=w?q:0;j=w?e:o;b=w?p:0;q=w?0:q;p=w?0:p;m=w?l:m;l=w?o:e}d=s-d|0;a:do if((d|0)>127){a=((a|k|0)!=0|(b|j|0)!=0)&1;b=0;k=0;j=0}else{if((d|0)>64){x=d+-64|0;b=Bi(1,0,x|0)|0;b=pi(b|0,y|0,-1,-1)|0;a=y;x=Ai(k|0,j|0,x|0)|0;a=x|((b&k|0)!=0|(a&j|0)!=0)&1;b=y;k=0;j=0;break}switch(d|0){case 0:break a;case 64:{a=k|((a|0)!=0|(b|0)!=0)&1;b=j;k=0;j=0;break a}default:{f=pi(Bi(1,0,d|0)|0,y|0,-1,-1)|0;w=y;g=Bi(k|0,j|0,64-d|0)|0;x=y;v=Ai(a|0,b|0,d|0)|0;x=x|y;a=g|v|((f&a|0)!=0|(w&b|0)!=0)&1;b=x;k=Ai(k|0,j|0,d|0)|0;j=y;break a}}}while(0);if((n|0)==(r|0)){w=pi(a|0,b|0,q|0,p|0)|0;x=y;j=pi(k|0,j|0,m|0,l|0)|0;a=pi(j|0,y|0,(x>>>0<b>>>0|(x|0)==(b|0)&w>>>0<a>>>0)&1|0,0)|0;j=y;l=w;m=x}else{w=qi(q|0,p|0,a|0,b|0)|0;x=y;j=qi(m|0,l|0,k|0,j|0)|0;a=(x>>>0>p>>>0|(x|0)==(p|0)&w>>>0>q>>>0)<<31>>31;a=pi(j|0,y|0,a|0,((a|0)<0)<<31>>31|0)|0;j=y;n=(a|w|0)==0&(j|x|0)==0?(h|0)==2&1:n;l=w;m=x}if((a|0)==0&(j|0)==0){k=Di(l|0,m|0,0)|0;b=k+63|0;d=s-b|0;if((k+64|0)>>>0<65){k=64;z=50}else{k=Bi(l|0,m|0,k+-1|0)|0;j=y}}else{k=Di(a|0,j|0,0)|0;b=k+-1|0;if((k|0)<=0)ja(13764,13775,201,13841);d=s-b|0;if(!b)k=a|((l|0)!=0|(m|0)!=0)&1;else z=50}if((z|0)==50){z=Bi(a|0,j|0,b|0)|0;j=y;x=Ai(l|0,m|0,65-k|0)|0;j=y|j;k=Bi(l|0,m|0,b|0)|0;k=x|z|((k|0)!=0|(y|0)!=0)&1}i=_b(n,d,k,j,h,i)|0;h=y;y=h;return i|0}function cc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;n=e^b;p=Ai(d^a|0,n|0,63)|0;l=Ai(a|0,b|0,52)|0;l=l&2047;h=Ai(d|0,e|0,52)|0;i=h&2047;m=b&1048575;k=e&1048575;if((l|0)==2047){h=(a|0)==0&(m|0)==0;if(h)if((d|0)==0&(k|0)==0|(0!=0|(e&2146435072|0)!=2146435072))if((i|0)==2047){c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}else{p=n&-2147483648|2146435072;g=0;y=p;return g|0}else j=5;else if(h|(0!=0|(b&2146959360|0)!=2146435072))j=5;if((j|0)==5?(d|0)==0&(k|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}a:do switch(h&2047){case 2047:{if((d|0)==0&(k|0)==0){p=n&-2147483648;g=0;y=p;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&((a|0)!=0|(m|0)!=0)|0==0&(e&2146959360|0)==2146435072)){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}case 0:{if(!((d|0)==0&(k|0)==0)){o=Di(d|0,k|0,0)|0;d=Bi(d|0,k|0,o+-11|0)|0;o=12-o|0;i=y;break a}h=c[g>>2]|0;if((a|0)==0&(m|0)==0&(l|0)==0){c[g>>2]=h|16;p=2146959360;g=0;y=p;return g|0}else{c[g>>2]=h|8;p=n&-2147483648|2146435072;g=0;y=p;return g|0}}default:{o=i;i=k|1048576}}while(0);do if(!l){if(!((a|0)==0&(m|0)==0)){n=Di(a|0,m|0,0)|0;h=Bi(a|0,m|0,n+-11|0)|0;n=12-n|0;b=y;break}p=n&-2147483648;g=0;y=p;return g|0}else{n=l;b=m|1048576;h=a}while(0);k=Bi(d|0,i|0,2)|0;l=y;if(!(b>>>0<l>>>0|(b|0)==(l|0)&h>>>0<k>>>0))ja(13857,13775,571,13864);j=0;d=0;e=0;do{r=Bi(h|0,b|0,1)|0;q=y;m=Ai(d|0,e|0,63)|0;r=m|r;q=y|q;m=(b|0)>-1|(b|0)==-1&h>>>0>4294967295;a=q>>>0<l>>>0|(q|0)==(l|0)&r>>>0<k>>>0;i=m&a;h=qi(r|0,q|0,(i?0:k)|0,(i?0:l)|0)|0;b=y;i=Bi(d|0,e|0,1)|0;e=y;d=i|(m&a^1)&1;j=j+1|0}while((j|0)!=64);h=(h|0)==0&(b|0)==0;d=h?d:i|1;h=h?e:e;b=Di(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);r=Bi(d|0,h|0,b+-1|0)|0;r=_b(p,1023-o+n+(1-b)|0,r,y,f,g)|0;q=y;y=q;return r|0}function dc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=Ai(a|0,b|0,63)|0;f=Ai(a|0,b|0,52)|0;f=f&2047;i=b&1048575;do if((f|0)==2047){if((a|0)==0&(i|0)==0){if(h)break;y=b;return a|0}if(!(0==0&(b&2146959360|0)==2146435072)){d=2146959360;e=0;y=d;return e|0}c[e>>2]=c[e>>2]|16;d=2146959360;e=0;y=d;return e|0}else{g=(f|0)==0;if(h|0){if(!((a|0)==0&(i|0)==0&g))break;y=b;return a|0}do if(g)if((a|0)==0&(i|0)==0){d=0;e=0;y=d;return e|0}else{f=Di(a|0,i|0,0)|0;a=Bi(a|0,i|0,f+-11|0)|0;f=12-f|0;b=y;break}else b=i|1048576;while(0);m=f+-1023|0;l=(m&1|0)==0;k=Bi(a|0,b|0,(l^1)&1|0)|0;m=((l?m:f+-1024|0)>>1)+1023|0;k=Bi(k|0,y|0,8)|0;l=y;do if(!((k|0)==0&(l|0)==0)){b=pi(k|0,l|0,-1,-1)|0;b=Di(b|0,y|0,1)|0;b=Bi(1,0,(129-b|0)>>>1|0)|0;a=y;if(!(a>>>0>l>>>0|(a|0)==(l|0)&b>>>0>k>>>0))ja(13857,13775,571,13864);while(1){f=0;g=k;h=l;i=0;j=0;do{t=Bi(g|0,h|0,1)|0;s=y;q=Ai(i|0,j|0,63)|0;t=q|t;s=y|s;q=(h|0)>-1|(h|0)==-1&g>>>0>4294967295;p=s>>>0<a>>>0|(s|0)==(a|0)&t>>>0<b>>>0;r=q&p;g=qi(t|0,s|0,(r?0:b)|0,(r?0:a)|0)|0;h=y;r=Bi(i|0,j|0,1)|0;j=y;i=r|(q&p^1)&1;f=f+1|0}while((f|0)!=64);g=pi(i|0,j|0,b|0,a|0)|0;g=Ai(g|0,y|0,1)|0;f=y;if(!(f>>>0<a>>>0|(f|0)==(a|0)&g>>>0<b>>>0)){f=21;break}if(f>>>0>l>>>0|(f|0)==(l|0)&g>>>0>k>>>0){a=f;b=g}else{f=17;break}}if((f|0)==17)ja(13857,13775,571,13864);else if((f|0)==21){t=vi(b|0,0,b|0,0)|0;o=y;n=vi(a|0,0,b|0,0)|0;q=y;r=vi(a|0,0,a|0,0)|0;s=y;n=Bi(n|0,q|0,1)|0;o=pi(n&-2|0,y&1|0,o|0,0)|0;n=y;q=Bi(q|0,0,1)|0;q=pi(q|0,y|0,r|0,0)|0;n=pi(q|0,y|0,n|0,0)|0;pi(0,y&7|0,r|0,s|0)|0;n=b|((t|0)!=0|(o|0)!=0|((n|0)!=(k|0)|(y|0)!=(l|0)))&1;o=a;break}}else{n=0;o=0}while(0);a=Di(n|0,o|0,0)|0;if((a|0)<=0)ja(13764,13775,183,13826);t=Bi(n|0,o|0,a+-1|0)|0;t=_b(0,m+(1-a)|0,t,y,d,e)|0;s=y;y=s;return t|0}while(0);c[e>>2]=c[e>>2]|16;s=2146959360;t=0;y=s;return t|0}function ec(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?e:b;e=g?d:a;y=b;return e|0}else{g=(h|0)==0;b=g?e:b;e=g?d:a;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function fc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?b:e;e=g?a:d;y=b;return e|0}else{g=(h|0)==0;b=g?b:e;e=g?a:d;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function gc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=(a|0)!=0|(b&1048575|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0)return ((a|0)==(d|0)&(b|0)==(e|0)|(d|a|0)==0&((e|b)&2147483647|0)==0)&1|0;if(!(0==0&(b&2146959360|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)return 0;c[f>>2]=c[f>>2]|16;return 0}function hc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f|(d|a|0)==0&((e|b)&2147483647|0)==0;h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>=d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<=d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function ic(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f&((d|a|0)!=0|((e|b)&2147483647|0)!=0);h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function jc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=Ai(a|0,b|0,63)|0;e=Ai(a|0,b|0,52)|0;d=b&1048575;switch(e&2047){case 2047:if((a|0)==0&(d|0)==0){e=(c|0)==0?128:1;return e|0}else{e=Ai(a|0,b|0,43)|0;e=(e&256)+256|0;return e|0}case 0:{b=(c|0)!=0;if((a|0)==0&(d|0)==0){e=b?8:16;return e|0}else{e=b?4:32;return e|0}}default:{e=(c|0)==0?64:2;return e|0}}return 0}function kc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=a>>>31;e=a>>>23;d=a&8388607;a:do switch((e&255)<<24>>24){case -1:{if(!d){f=Bi(f|0,0,63)|0;e=y|2146435072;y=e;return f|0}if((a&2143289344|0)!=2139095040){e=2146959360;f=0;y=e;return f|0}c[b>>2]=c[b>>2]|16;e=2146959360;f=0;y=e;return f|0}case 0:{if(d|0){a=Q(d|0)|0;d=d<<a+-8;a=9-a|0;break a}f=Bi(f|0,0,63)|0;e=y;y=e;return f|0}default:a=e&255}while(0);b=Bi(d|0,0,29)|0;e=y;f=Bi(f|0,0,63)|0;g=y;d=Bi(a+896|0,0,52)|0;e=y|g|e&1048575;f=d|f|b&-536870912;y=e;return f|0}function lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=Ai(a|0,b|0,63)|0;g=y;h=Ai(a|0,b|0,52)|0;f=b&1048575;a:do switch(h&2047){case 2047:{if((a|0)==0&(f|0)==0){i=Bi(i|0,g|0,31)|0;i=i|2139095040;return i|0}if(!(0==0&(b&2146959360|0)==2146435072)){i=2143289344;return i|0}c[e>>2]=c[e>>2]|16;i=2143289344;return i|0}case 0:{if(!((a|0)==0&(f|0)==0)){b=Di(a|0,f|0,0)|0;b=12-b|0;break a}i=Bi(i|0,g|0,31)|0;return i|0}default:{b=h&2047;f=f|1048576}}while(0);f=Ai(a|0,f|0,22)|0;f=f|((a&4194303|0)!=0|0!=0)&1;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);i=Db(i,b+-896+(1-a)|0,f<<a+-1,d,e)|0;return i|0}function mc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return nc(a,b,c,d,0)|0}function nc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=Ai(a|0,b|0,63)|0;g=Ai(a|0,b|0,52)|0;g=g&2047;b=b&1048575;j=((a|0)!=0|(b|0)!=0)&(g|0)==2047?0:j;i=(g|0)==0;g=i?-1074:g+-1075|0;b=Bi(a|0,b|0,10)|0;a=y;b=i?b:b;a=i?a:a|1073741824;i=(f|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)<=-1){if((g|0)<-63){b=((b|0)!=0|(a|0)!=0)&1;f=0}else{g=0-g|0;h=Bi(1,0,g|0)|0;h=pi(h|0,y|0,-1,2147483647)|0;f=y;g=Ai(b|0,a|0,g|0)|0;b=g|((h&b|0)!=0|(f&a|0)!=0)&1;f=y}switch(d|0){case 4:case 0:{a=512;g=0;break}case 1:{a=0;g=0;break}default:{g=(j|0)==(d&1|0);a=g?0:1023;g=g?0:0}}h=b&1023;b=pi(a|0,g|0,b|0,f|0)|0;b=Ai(b|0,y|0,10)|0;f=y;d=(d|0)==0&(h|0)==512;b=d?b&-2:b;d=d?f&4194303:f;if(!(d>>>0>0|(d|0)==0&b>>>0>i>>>0)){if(h|0)c[e>>2]=c[e>>2]|1;e=(j|0)==0?b:0-b|0;return e|0}}c[e>>2]=c[e>>2]|16;e=i;return e|0}function oc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return nc(a,b,c,d,1)|0}function pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-63|0;f=(e|0)>63;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=Di(g|0,0,0)|0;d=h+-1|0;if((h|0)>0){h=Bi(g|0,0,d|0)|0;h=_b(a>>>31,(f?e+1022|0:1085)-d|0,h,y,b,c)|0;return h|0}else ja(13764,13775,183,13826);return 0}function qc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-63|0;f=(e|0)>63;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=Di(d|0,0,0)|0;a=g+-1|0;if((g|0)>0){g=Bi(d|0,0,a|0)|0;g=_b(0,(f?e+1022|0:1085)-a|0,g,y,b,c)|0;return g|0}else ja(13764,13775,183,13826);return 0}function rc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=sc(a,b,c,d,0)|0;return d|0}function sc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=Ai(a|0,b|0,63)|0;k=Ai(a|0,b|0,52)|0;k=k&2047;i=b&1048575;m=((a|0)!=0|(i|0)!=0)&(k|0)==2047?0:m;j=(k|0)==0;k=j?-1074:k+-1075|0;b=j?a:a;a=j?i:i|1048576;i=Bi(b|0,a|0,10)|0;j=y;if(!f){l=qi(0,-2147483648,m^1|0,0)|0;f=y}else{l=pi(m|0,0,-1,-1)|0;f=y}if((k|0)>-1)if((k|0)<12?(h=Bi(b|0,a|0,k|0)|0,g=y,!(g>>>0>f>>>0|(g|0)==(f|0)&h>>>0>l>>>0)):0)b=17;else b=7;else{if((k|0)<-63){g=((b|0)!=0|(a|0)!=0)&1;a=0}else{k=0-k|0;a=Bi(1,0,k|0)|0;a=pi(a|0,y|0,-1,2147483647)|0;g=y;k=Ai(i|0,j|0,k|0)|0;g=k|((a&i|0)!=0|(g&j|0)!=0)&1;a=y}switch(d|0){case 4:case 0:{h=512;b=0;break}case 1:{h=0;b=0;break}default:{b=(m|0)==(d&1|0);h=b?0:1023;b=b?0:0}}i=g&1023;h=pi(h|0,b|0,g|0,a|0)|0;h=Ai(h|0,y|0,10)|0;g=y;d=(d|0)==0&(i|0)==512;h=d?h&-2:h;g=d?g&4194303:g;if(!(g>>>0>f>>>0|(g|0)==(f|0)&h>>>0>l>>>0))if(!i)b=17;else{c[e>>2]=c[e>>2]|1;b=17}else b=7}if((b|0)==7){c[e>>2]=c[e>>2]|16;e=f;m=l;y=e;return m|0}else if((b|0)==17){l=(m|0)==0;m=qi(0,0,h|0,g|0)|0;e=l?g:y;m=l?h:m;y=e;return m|0}return 0}function tc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=sc(a,b,c,d,1)|0;return d|0}function uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=(b|0)<0;f=qi(0,0,a|0,b|0)|0;f=e?f:a;e=e?y:b;h=Ai(a|0,b|0,63)|0;b=Di(f|0,e|0,0)|0;a=64-b|0;if((a|0)>63){i=a+-63|0;g=Bi(1,0,i|0)|0;g=pi(g|0,y|0,-1,-1)|0;b=y&e;i=Ai(f|0,e|0,i|0)|0;e=y;f=i|((g&f|0)!=0|(b|0)!=0)&1;b=Di(f|0,e|0,0)|0;g=a+1022|0}else g=1085;a=b+-1|0;if((b|0)>0){i=Bi(f|0,e|0,a|0)|0;i=_b(h,g-a|0,i,y,c,d)|0;return i|0}else ja(13764,13775,183,13826);return 0}function vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=Di(a|0,b|0,0)|0;e=64-f|0;if((e|0)>63){h=e+-63|0;g=Bi(1,0,h|0)|0;g=pi(g|0,y|0,-1,-1)|0;f=y&b;h=Ai(a|0,b|0,h|0)|0;b=y;a=h|((g&a|0)!=0|(f|0)!=0)&1;f=Di(a|0,b|0,0)|0;g=e+1022|0}else g=1085;e=f+-1|0;if((f|0)>0){h=Bi(a|0,b|0,e|0)|0;h=_b(0,g-e|0,h,y,c,d)|0;return h|0}else ja(13764,13775,183,13826);return 0}function wc(b,d){b=b|0;d=d|0;var e=0,f=0;e=vf(572)|0;yc(e,b,2,8,1);c[e+544>>2]=d;b=Va[c[d>>2]&15](d)|0;d=y;a[e+288>>0]=b;a[e+289>>0]=b>>>8;a[e+290>>0]=b>>>16;a[e+291>>0]=b>>>24;a[e+292>>0]=d;f=Ai(b|0,d|0,40)|0;a[e+293>>0]=f;f=Ai(b|0,d|0,48)|0;a[e+294>>0]=f;d=Ai(b|0,d|0,56)|0;a[e+295>>0]=d;return e|0}function xc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;h=k;i=c[a+544>>2]|0;j=a+548|0;if(c[j>>2]|0){j=-1;l=k;return j|0}if((Kc(a,h,b,d,0,16,0)|0)<0){j=0;l=k;return j|0}m=c[h>>2]|0;g=a+552|0;c[g>>2]=m;c[g+12>>2]=b;c[g+16>>2]=d;switch(m|0){case 0:{b=Lg(f)|0;c[g+4>>2]=b;c[g+8>>2]=f;m=h+8|0;b=$a[c[i+4>>2]&3](i,c[m>>2]|0,c[m+4>>2]|0,b,(f+-1|0)/512|0,5,a)|0;if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Mc(a,b);m=0;l=k;return m|0}}case 1:{if((f|0)<=0)ja(13887,13903,1097,13912);f=e+-16|0;m=Lg(f)|0;Kc(a,m,b,d,16,f,0)|0;b=h+8|0;b=$a[c[i+8>>2]&3](i,c[b>>2]|0,c[b+4>>2]|0,m,(f|0)/512|0,5,a)|0;Mg(m);if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Mc(a,b);m=0;l=k;return m|0}}default:{m=0;l=k;return m|0}}return 0}function yc(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+64|0;m=n+32|0;k=n;Fi(d|0,0,544)|0;if(!(c[e>>2]|0)){k=c[e+4>>2]|0;c[d>>2]=k;c[d+12>>2]=c[e+16>>2];m=e+8|0;c[d+4>>2]=rf(k,c[m>>2]|0,c[m+4>>2]|0,4096,0,d,8,3,7)|0;c[d+16>>2]=9}else{switch(f|0){case 1:{i=4096;j=512;break}case 2:{i=4097;j=256;break}case 3:{i=4099;j=1920;break}case 9:{i=4169;j=2;break}case 18:{i=4178;j=2432;break}default:ra()}c[m>>2]=i&65535;fh(k,32,13875,m)|0;v=Je(c[e>>2]|0,k,-1,6900,i,0,j)|0;k=d+8|0;c[k>>2]=v;Qe(v,44,6900);Qe(c[k>>2]|0,46,f&65535);Pe(c[k>>2]|0,61,1);c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;v=m+2|0;a[v>>0]=16;u=m+3|0;a[u>>0]=1;t=m+4|0;a[t>>0]=4;s=m+8|0;r=m+9|0;q=m+10|0;p=m+11|0;o=m+12|0;i=m+13|0;c[s>>2]=0;a[s+4>>0]=0;a[i>>0]=16;j=m+14|0;a[j>>0]=0;e=m+15|0;a[e>>0]=0;Re(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=3;a[t>>0]=4;a[s>>0]=0;a[r>>0]=16;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Re(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=4;a[t>>0]=4;a[s>>0]=0;a[r>>0]=32;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Re(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;a[m>>0]=9;a[v>>0]=20;a[u>>0]=2;a[t>>0]=4;a[s>>0]=0;a[r>>0]=48;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;c[m+16>>2]=0;Re(c[k>>2]|0,m,20)|0;c[d+16>>2]=6;c[d+12>>2]=Le(c[k>>2]|0,0)|0;m=Me(c[k>>2]|0)|0;c[d>>2]=m;c[d+4>>2]=rf(m,0,0,16384,0,d,7,1,23)|0;Ne(c[k>>2]|0,4,16384,0,d,2)}c[d+264>>2]=f;c[d+268>>2]=65535;c[d+284>>2]=g;c[d+276>>2]=h;v=d+24|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[d+44>>2]=16;c[d+52>>2]=0;c[d+56>>2]=0;c[d+60>>2]=0;b[d+48>>1]=0;c[d+68>>2]=0;c[d+72>>2]=16;c[d+80>>2]=0;c[d+84>>2]=0;c[d+88>>2]=0;b[d+76>>1]=0;c[d+96>>2]=0;c[d+100>>2]=16;c[d+108>>2]=0;c[d+112>>2]=0;c[d+116>>2]=0;b[d+104>>1]=0;c[d+124>>2]=0;c[d+128>>2]=16;c[d+136>>2]=0;c[d+140>>2]=0;c[d+144>>2]=0;b[d+132>>1]=0;c[d+152>>2]=0;c[d+156>>2]=16;c[d+164>>2]=0;c[d+168>>2]=0;c[d+172>>2]=0;b[d+160>>1]=0;c[d+180>>2]=0;c[d+184>>2]=16;c[d+192>>2]=0;c[d+196>>2]=0;c[d+200>>2]=0;b[d+188>>1]=0;c[d+208>>2]=0;c[d+212>>2]=16;c[d+220>>2]=0;c[d+224>>2]=0;c[d+228>>2]=0;b[d+216>>1]=0;c[d+236>>2]=0;c[d+240>>2]=16;c[d+248>>2]=0;c[d+252>>2]=0;c[d+256>>2]=0;b[d+244>>1]=0;l=n;return}function zc(a,b,d){a=a|0;b=b|0;d=d|0;return Oe(c[a+8>>2]|0,b,0,d)|0}function Ac(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;f=b&4095;switch(b>>>12&1048575|0){case 0:switch(e|0){case 2:switch(b&4095){case 4:{b=c[a+32>>2]|0;switch(b|0){case 0:{a=c[a+272>>2]|0;return a|0}case 1:{a=b;return a|0}default:{a=0;return a|0}}}case 0:{a=c[a+32>>2]|0;return a|0}case 32:{a=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;return a|0}case 40:{a=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;return a|0}case 48:{a=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;return a|0}default:{a=0;return a|0}}case 1:{f=f+-18|0;switch(f>>>1|f<<31|0){case 0:{a=16;return a|0}case 2:{a=c[a+36>>2]|0;return a|0}case 3:{a=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;return a|0}case 5:{a=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;return a|0}default:{a=0;return a|0}}}default:{if(!((e|0)==0&(f|0)==20)){a=0;return a|0}a=c[a+28>>2]|0;return a|0}}case 1:{if(f|e|0){a=0;return a|0}e=a+24|0;f=c[e>>2]|0;c[e>>2]=0;a=c[a+12>>2]|0;eb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);a=f;return a|0}case 2:{switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=f>>>0){a=0;return a|0}a=d[a+288+f>>0]|0;return a|0}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0);return a|0}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0)|(d[a+2>>0]|0)<<16|(d[a+3>>0]|0)<<24;return a|0}default:ra()}break}default:{a=0;return a|0}}return 0}function Bc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0;g=d&4095;switch(d>>>12&1048575|0){case 0:switch(f|0){case 2:switch(g>>>3|d<<29|0){case 0:{c[a+32>>2]=e;return}case 4:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 5:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 6:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}default:return}case 1:switch(d&4095){case 22:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 24:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 28:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}default:return}default:{if(!((g|0)==20&(f|0)==0))return;c[a+28>>2]=e;if(e|0)return;g=c[a+12>>2]|0;eb[c[g>>2]&15](c[g+4>>2]|0,c[g+8>>2]|0,0);g=a+24|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}}case 2:{Gc(a,g,e,f);return}case 3:{if(e>>>0>=8)return;Hc(a,e);return}default:return}}function Cc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;sf(c[a+4>>2]|0,d,0,e);return}function Dc(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;a:do if(b>>>0<=255)if((e|0)==2)do switch(b|0){case 0:{f=1953655158;break a}case 4:{f=2;break a}case 8:{f=c[a+264>>2]|0;break a}case 12:{f=c[a+268>>2]|0;break a}case 16:{f=c[a+32>>2]|0;switch(f|0){case 1:break a;case 0:{f=c[a+272>>2]|0;break a}default:{f=0;break a}}}case 20:{f=c[a+32>>2]|0;break a}case 48:{f=c[a+36>>2]|0;break a}case 52:{f=16;break a}case 56:{f=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;break a}case 128:{f=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;break a}case 144:{f=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;break a}case 160:{f=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;break a}case 68:{f=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;break a}case 96:{f=c[a+24>>2]|0;break a}case 112:{f=c[a+28>>2]|0;break a}case 252:{f=0;break a}default:{f=0;break a}}while(0);else f=0;else{b=b+-256|0;switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=b>>>0){f=0;break a}f=d[a+288+b>>0]|0;break a}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0);break a}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;break a}default:ra()}}while(0);return f|0}function Ec(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;if(d>>>0>255){Gc(a,d+-256|0,e,f);return}if((f|0)!=2)return;do switch(d|0){case 20:{c[a+32>>2]=e;return}case 48:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 56:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 128:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 144:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 160:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}case 112:{c[a+28>>2]=e;if(e|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);f=a+24|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}case 68:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}case 80:{if(e>>>0>=8)return;Hc(a,e);return}case 100:{d=a+24|0;f=c[d>>2]&~e;c[d>>2]=f;if(f|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);return}default:return}while(0)}function Fc(a,b,d){a=a|0;b=b|0;d=d|0;return tf(c[a>>2]|0,b,0,d)|0}function Gc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;switch(f|0){case 0:{if((c[b+284>>2]|0)>>>0<=d>>>0)return;a[b+288+d>>0]=e;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 1:{if(((c[b+284>>2]|0)+-1|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=(e&65535)>>>8;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 2:{if(((c[b+284>>2]|0)+-3|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=e>>>8;a[d+2>>0]=e>>>16;a[d+3>>0]=e>>>24;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}default:return}}function Hc(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;k=p+4|0;m=p;if(c[a+40+(d*28|0)+24>>2]|0){l=p;return}o=a+40+(d*28|0)+16|0;f=(c[o>>2]|0)+2|0;if((f&1|0)==0?(e=Xa[c[a+16>>2]&31](a,f,0)|0,(e|0)!=0):0)f=b[e>>1]|0;else f=0;g=a+276|0;h=a+40+(d*28|0)+8|0;e=b[h>>1]|0;if(e<<16>>16==f<<16>>16){l=p;return}i=a+40+(d*28|0)+4|0;j=a+16|0;while(1){e=(c[o>>2]|0)+4+(((c[i>>2]|0)+65535&(e&65535))<<1)|0;if((e&1|0)==0?(n=Xa[c[j>>2]&31](a,e,0)|0,(n|0)!=0):0)e=b[n>>1]|0;else e=0;e=e&65535;if((Ic(a,k,m,d,e)|0)==0?(Za[c[g>>2]&7](a,d,e,c[k>>2]|0,c[m>>2]|0)|0)<0:0){e=13;break}e=(b[h>>1]|0)+1<<16>>16;b[h>>1]=e;if(e<<16>>16==f<<16>>16){e=13;break}}if((e|0)==13){l=p;return}}function Ic(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;Jc(a,p,g,h);o=p+12|0;j=e[o>>1]|0;a:do if(!(j&2)){i=p+8|0;k=p+14|0;h=0;do{h=(c[i>>2]|0)+h|0;if(!(j&1)){i=0;break a}Jc(a,p,g,e[k>>1]|0);m=b[o>>1]|0;j=m&65535}while(!(j&2|0));j=m&65535;n=6}else{h=0;n=6}while(0);b:do if((n|0)==6){k=p+8|0;m=p+14|0;i=0;while(1){i=(c[k>>2]|0)+i|0;if(!(j&1))break b;Jc(a,p,g,e[m>>1]|0);j=e[o>>1]|0;if(!(j&2)){h=-1;break}}l=q;return h|0}while(0);c[d>>2]=h;c[f>>2]=i;f=0;l=q;return f|0}function Jc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a+16|0;g=16;e=(c[a+40+(d*28|0)+12>>2]|0)+(e<<4)|0;while(1){d=4096-(e&4095)|0;d=(g|0)<(d|0)?g:d;f=Xa[c[h>>2]&31](a,e,0)|0;if(!f){b=4;break}Ei(b|0,f|0,d|0)|0;g=g-d|0;if((g|0)<=0){b=4;break}else{b=b+d|0;e=d+e|0}}if((b|0)==4)return}function Kc(a,d,f,g,h,i,j){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;y=z;if(!i){y=0;l=z;return y|0}x=a+40+(f*28|0)+12|0;w=a+16|0;m=y;n=16;g=(c[x>>2]|0)+(g<<4)|0;while(1){f=4096-(g&4095)|0;f=(n|0)<(f|0)?n:f;k=Xa[c[w>>2]&31](a,g,0)|0;if(!k)break;Ei(m|0,k|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{m=m+f|0;g=f+g|0}}u=(j|0)!=0;v=y+12|0;k=b[v>>1]|0;f=k&65535;g=f&2;a:do if(u)if(!g){j=y+14|0;while(1){if(!(f&1)){q=-1;break}g=y;k=16;m=((e[j>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;Ei(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}k=b[v>>1]|0;f=k&65535;g=f&2;if(g){t=2;break a}}l=z;return q|0}else t=2;else t=0;while(0);if((g|0)!=(t|0)){y=-1;l=z;return y|0}r=y+8|0;s=y+14|0;m=h;while(1){p=c[r>>2]|0;if(m>>>0<p>>>0){f=21;break}if(!(f&1)){q=-1;f=40;break}o=m-p|0;g=y;n=16;j=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(j&4095)|0;f=(n|0)<(f|0)?n:f;h=Xa[c[w>>2]&31](a,j,0)|0;if(!h)break;Ei(g|0,h|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{g=g+f|0;j=f+j|0}}g=b[v>>1]|0;f=g&65535;if((f&2|0)!=(t|0)){q=-1;f=40;break}else{m=o;k=g}}if((f|0)==21){n=d;g=i;f=k;b:while(1){q=n;d=g;do{o=p-m|0;o=(d|0)<(o|0)?d:o;k=m+(c[y>>2]|0)|0;g=(o|0)>0;c:do if(u){if(g){n=o;j=q;while(1){g=4096-(k&4095)|0;g=(n|0)<(g|0)?n:g;h=Xa[c[w>>2]&31](a,k,1)|0;if(!h)break c;Ei(h|0,j|0,g|0)|0;n=n-g|0;if((n|0)<=0)break;else{k=g+k|0;j=j+g|0}}}}else if(g){j=q;h=o;while(1){g=4096-(k&4095)|0;g=(h|0)<(g|0)?h:g;n=Xa[c[w>>2]&31](a,k,0)|0;if(!n)break c;Ei(j|0,n|0,g|0)|0;h=h-g|0;if((h|0)<=0)break;else{j=j+g|0;k=g+k|0}}}while(0);d=d-o|0;if(!d){q=0;f=40;break b}m=o+m|0;q=q+o|0}while((m|0)!=(p|0));if(!(f&1)){q=-1;f=40;break}g=y;k=16;m=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;Ei(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}f=b[v>>1]|0;if((t|0)!=(f&2|0)){q=-1;f=40;break}n=q;g=d;m=0;p=c[r>>2]|0}if((f|0)==40){l=z;return q|0}}else if((f|0)==40){l=z;return q|0}return 0}function Lc(a,b){a=a|0;b=b|0;Mc(a,b);c[a+548>>2]=0;Hc(a,c[a+564>>2]|0);return}function Mc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;e=i;f=b+552|0;g=c[f+12>>2]|0;h=c[f+16>>2]|0;switch(c[f>>2]|0){case 0:{e=c[f+8>>2]|0;f=c[f+4>>2]|0;a[f+(e+-1)>>0]=d>>>31;Kc(b,f,g,h,0,e,1)|0;Mg(f);Nc(b,g,h,e);l=i;return}case 1:{a[e>>0]=d>>>31;Kc(b,e,g,h,0,1,1)|0;Nc(b,g,h,1);l=i;return}default:ra()}}function Nc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=a+40+(d*28|0)+20|0;h=(c[j>>2]|0)+2|0;if(!(h&1)){i=a+16|0;g=Xa[c[i>>2]&31](a,h,0)|0;if(!g)g=0;else g=b[g>>1]|0;g=g&65535;h=Xa[c[i>>2]&31](a,h,1)|0;if(h)b[h>>1]=g+1}else g=0;g=(c[j>>2]|0)+4+(((c[a+40+(d*28|0)+4>>2]|0)+65535&g)<<3)|0;if((g&3|0)==0?(k=Xa[c[a+16>>2]&31](a,g,1)|0,k|0):0)c[k>>2]=e;g=g+4|0;if((g&3|0)==0?(l=Xa[c[a+16>>2]&31](a,g,1)|0,l|0):0)c[l>>2]=f;l=a+24|0;c[l>>2]=c[l>>2]|1;l=c[a+12>>2]|0;eb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}function Oc(d,e){d=d|0;e=e|0;var f=0;f=vf(552)|0;yc(f,d,1,8,2);c[f+272>>2]=32;c[f+64>>2]=1;c[f+544>>2]=e;d=f+288|0;c[d>>2]=c[e>>2];b[d+4>>1]=b[e+4>>1]|0;a[f+294>>0]=0;a[f+295>>0]=0;c[f+548>>2]=12;c[e+16>>2]=f;c[e+20>>2]=9;c[e+24>>2]=5;c[e+28>>2]=6;return f|0}function Pc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=c[a+544>>2]|0;if((b|0)!=1){l=h;return 0}f=a+548|0;if((Kc(a,h,1,d,0,c[f>>2]|0,0)|0)<0){l=h;return 0}f=c[f>>2]|0;b=e-f|0;e=Lg(b)|0;Kc(a,e,1,d,f,b,0)|0;eb[c[g+8>>2]&15](g,e,b);Mg(e);Nc(a,1,d,0);l=h;return 0}function Qc(a){a=a|0;var d=0,e=0;e=c[a+16>>2]|0;if(!(c[e+40>>2]|0)){e=0;return e|0}a=(c[e+56>>2]|0)+2|0;if((a&1|0)==0?(d=Xa[c[e+16>>2]&31](e,a,0)|0,(d|0)!=0):0)a=b[d>>1]|0;else a=0;e=(b[e+48>>1]|0)!=a<<16>>16&1;return e|0}function Rc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;m=o+8|0;j=o+4|0;n=o;k=c[a+16>>2]|0;if(!(c[k+40>>2]|0)){l=o;return}g=k+56|0;a=(c[g>>2]|0)+2|0;if((a&1|0)==0?(f=Xa[c[k+16>>2]&31](k,a,0)|0,(f|0)!=0):0)a=b[f>>1]|0;else a=0;i=k+48|0;f=b[i>>1]|0;if(f<<16>>16==a<<16>>16){l=o;return}a=(c[g>>2]|0)+4+(((c[k+44>>2]|0)+65535&(f&65535))<<1)|0;if((a&1|0)==0?(h=Xa[c[k+16>>2]&31](k,a,0)|0,(h|0)!=0):0)a=b[h>>1]|0;else a=0;h=a&65535;if(Ic(k,j,n,0,h)|0){l=o;return}a=k+548|0;f=c[a>>2]|0;g=f+e|0;if((g|0)>(c[n>>2]|0)){l=o;return}Fi(m|0,0,f|0)|0;Kc(k,m,0,h,0,f,1)|0;Kc(k,d,0,h,c[a>>2]|0,e,1)|0;Nc(k,0,h,g);b[i>>1]=(b[i>>1]|0)+1<<16>>16;l=o;return}function Sc(a,b){a=a|0;b=b|0;return}function Tc(a){a=a|0;var d=0,e=0;if(!(c[a+40>>2]|0)){a=0;return a|0}e=(c[a+56>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;a=(b[a+48>>1]|0)!=d<<16>>16&1;return a|0}function Uc(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j+4|0;i=j;if(!(c[a+40>>2]|0)){i=0;l=j;return i|0}f=a+56|0;e=(c[f>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;e=b[a+48>>1]|0;if(e<<16>>16==d<<16>>16){i=0;l=j;return i|0}d=(c[f>>2]|0)+4+(((c[a+44>>2]|0)+65535&(e&65535))<<1)|0;if((d&1|0)==0?(g=Xa[c[a+16>>2]&31](a,d,0)|0,(g|0)!=0):0)d=b[g>>1]|0;else d=0;h=(Ic(a,h,i,0,d&65535)|0)==0;i=h?c[i>>2]|0:0;l=j;return i|0}function Vc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(c[a+40>>2]|0)){e=0;return e|0}i=a+56|0;g=(c[i>>2]|0)+2|0;if((g&1|0)==0?(f=Xa[c[a+16>>2]&31](a,g,0)|0,(f|0)!=0):0)f=b[f>>1]|0;else f=0;h=a+48|0;g=b[h>>1]|0;if(g<<16>>16==f<<16>>16){e=0;return e|0}f=(c[i>>2]|0)+4+(((c[a+44>>2]|0)+65535&(g&65535))<<1)|0;if((f&1|0)==0?(j=Xa[c[a+16>>2]&31](a,f,0)|0,(j|0)!=0):0)f=b[j>>1]|0;else f=0;j=f&65535;Kc(a,d,0,j,0,e,1)|0;Nc(a,0,j,e);b[h>>1]=(b[h>>1]|0)+1<<16>>16;return e|0}function Wc(b,d,e){b=b|0;d=d|0;e=e|0;a[b+288>>0]=d;a[b+289>>0]=(d&65535)>>>8;a[b+290>>0]=e;a[b+291>>0]=(e&65535)>>>8;e=b+24|0;c[e>>2]=c[e>>2]|2;e=c[b+12>>2]|0;eb[c[e>>2]&15](c[e+4>>2]|0,c[e+8>>2]|0,1);return}function Xc(a,b){a=a|0;b=b|0;var d=0;d=vf(548)|0;yc(d,a,3,4,3);c[d+272>>2]=1;c[d+64>>2]=1;c[d+544>>2]=b;return d|0}function Yc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[a+544>>2]|0;if((b|0)!=1)return 0;b=Lg(e)|0;Kc(a,b,1,d,0,e,0)|0;eb[c[f+4>>2]&15](c[f>>2]|0,b,e);Mg(b);Nc(a,1,d,0);return 0}function Zc(a,b,d){a=a|0;b=b|0;d=d|0;if(c[a+544>>2]|0){a=-1;return a|0}b=_c(a,1,d,b)|0;if(b|0){a=b;return a|0}a=_c(a,0,0,0)|0;return a|0}function _c(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;if(!(c[d+40>>2]|0)){j=-1;l=k;return j|0}a[j>>0]=e;a[j+1>>0]=(e&65535)>>>8;a[j+2>>0]=f;a[j+3>>0]=(f&65535)>>>8;a[j+4>>0]=g;a[j+5>>0]=g>>>8;a[j+6>>0]=g>>>16;a[j+7>>0]=g>>>24;g=d+56|0;e=(c[g>>2]|0)+2|0;if((e&1|0)==0?(h=Xa[c[d+16>>2]&31](d,e,0)|0,(h|0)!=0):0)e=b[h>>1]|0;else e=0;h=d+48|0;f=b[h>>1]|0;if(f<<16>>16==e<<16>>16){j=-1;l=k;return j|0}e=(c[g>>2]|0)+4+(((c[d+44>>2]|0)+65535&(f&65535))<<1)|0;if((e&1|0)==0?(i=Xa[c[d+16>>2]&31](d,e,0)|0,(i|0)!=0):0)e=b[i>>1]|0;else e=0;i=e&65535;Kc(d,j,0,i,0,8,1)|0;Nc(d,0,i,8);b[h>>1]=(b[h>>1]|0)+1<<16>>16;j=0;l=k;return j|0}function $c(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[a+544>>2]|0;if((g+-1|0)>>>0>=2){i=-1;return i|0}if((g|0)==1){b=_c(a,2,0,b)|0;if(b|0){i=b;return i|0}b=_c(a,2,1,d)|0;if(b|0){i=b;return i|0}}else{b=_c(a,3,0,b)|0;if(b|0){i=b;return i|0}b=_c(a,3,1,d)|0;if(b|0){i=b;return i|0}}if(e|0?(h=_c(a,2,8,e)|0,h|0):0){i=h;return i|0}d=a+548|0;b=c[d>>2]|0;if((b|0)!=(f|0)){g=f&1;do if((g|0)!=(b&1|0)){b=_c(a,1,272,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>1&1;do if((g|0)!=(b>>>1&1|0)){b=_c(a,1,273,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>2&1;if((g|0)!=(b>>>2&1|0)?(i=_c(a,1,274,g)|0,i|0):0)return i|0;c[d>>2]=f}i=_c(a,0,0,0)|0;return i|0}function ad(a,b){a=a|0;b=b|0;var d=0;d=vf(552)|0;yc(d,a,18,256,4);c[d+64>>2]=1;c[d+272>>2]=0;c[d+280>>2]=8;c[d+544>>2]=b;return d|0}function bd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if((b|0)!=1)return 0;Nc(a,1,c,0);return 0}function cd(b){b=b|0;var e=0,f=0;switch(a[b+288>>0]|0){case 1:{switch(c[b+544>>2]|0){case 0:{e=13965;break}case 1:{e=13952;break}case 2:{e=13938;break}default:ra()}f=_g(e)|0;a[b+290>>0]=f;Ei(b+296|0,e|0,f|0)|0;return}case 18:{if((c[b+544>>2]|0)!=2)return;if((d[b+289>>0]|0)>=2)return;a[b+290>>0]=20;e=b+296|0;a[e>>0]=0;a[e+1>>0]=0;a[e+2>>0]=0;a[e+3>>0]=0;a[b+300>>0]=-1;a[b+301>>0]=127;e=b+302|0;f=e+14|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));return}case 17:{e=b+290|0;a[e>>0]=0;switch(c[b+544>>2]|0){case 0:switch(a[b+289>>0]|0){case 1:{a[e>>0]=16;e=b+296|0;f=e+16|0;do{a[e>>0]=255;e=e+1|0}while((e|0)<(f|0));return}case 20:{a[e>>0]=1;return}default:return}case 1:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=3;a[b+297>>0]=1;return}default:return}case 2:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=0;a[b+297>>0]=1;return}case 3:{a[e>>0]=1;a[b+296>>0]=3;return}default:return}default:ra()}break}case 0:return;default:{a[b+290>>0]=0;return}}}function dd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=_g(e)|0;f=vf(564)|0;yc(f,b,9,g+2|0,5);c[f+272>>2]=1;a[f+288>>0]=g;a[f+289>>0]=g>>>8;Ei(f+290|0,e|0,g|0)|0;c[f+544>>2]=d;c[f+548>>2]=8192;e=f+552|0;c[e>>2]=e;c[f+556>>2]=e;return f|0}function ed(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;Va=l;l=l+3008|0;Ta=Va+2984|0;A=Va+2976|0;z=Va+2968|0;fa=Va+2960|0;y=Va+2944|0;x=Va+2928|0;Ia=Va+2920|0;Ga=Va+2912|0;Ea=Va+2904|0;w=Va+2888|0;v=Va+2880|0;za=Va+2872|0;u=Va+2848|0;t=Va+2840|0;s=Va+2832|0;r=Va+2816|0;q=Va+2800|0;Q=Va+2792|0;o=Va+2776|0;n=Va+2760|0;Aa=Va+2736|0;ea=Va+2712|0;xa=Va+2704|0;J=Va+2672|0;I=Va+2664|0;G=Va+2648|0;F=Va+2608|0;R=Va+2464|0;E=Va+2456|0;qa=Va+2448|0;D=Va+2440|0;pa=Va+2432|0;C=Va+2408|0;oa=Va+2400|0;B=Va+2384|0;na=Va+2376|0;p=Va+2352|0;H=Va+2344|0;m=Va+2288|0;Sa=Va+2240|0;Ha=Va+2992|0;Oa=Va+1024|0;Pa=Va;Na=Va+2120|0;Ma=Va+2988|0;Ka=Va+2104|0;Ja=Va+2088|0;Fa=Va+2072|0;ja=Va+2064|0;ka=Va+2056|0;la=Va+2048|0;La=f+544|0;Qa=c[La>>2]|0;if(g|0){h=0;l=Va;return h|0}P=f+560|0;if(c[P>>2]|0){h=-1;l=Va;return h|0}c[Ha>>2]=0;a:do if(!(Kc(f,Oa,0,h,0,7,0)|0)){Ra=a[Oa+4>>0]|0;i=a[Oa+5>>0]|0;g=(d[Oa+6>>0]<<8|i&255)&65535;c[Ha>>2]=(c[Ha>>2]|0)+7;Ra=Ra&255;Wa=Ra+-8|0;j=(g&65535)>>>8&255;do switch(Wa>>>1|Wa<<31|0){case 11:{k=-524;break a}case 0:{db[c[Qa+8>>2]&15](Qa,Sa);Ta=c[Sa>>2]|0;Ja=Sa+8|0;Ia=c[Ja>>2]|0;Ja=c[Ja+4>>2]|0;La=Sa+16|0;Ka=c[La>>2]|0;La=c[La+4>>2]|0;Na=Sa+24|0;Ma=c[Na>>2]|0;Na=c[Na+4>>2]|0;Qa=Sa+32|0;Pa=c[Qa>>2]|0;Qa=c[Qa+4>>2]|0;Ua=Sa+40|0;Wa=c[Ua>>2]|0;Ua=c[Ua+4>>2]|0;c[m>>2]=0;c[m+4>>2]=Ta;Ta=m+8|0;c[Ta>>2]=Ia;c[Ta+4>>2]=Ja;Ta=m+16|0;c[Ta>>2]=Ka;c[Ta+4>>2]=La;Ta=m+24|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Na;Ta=m+32|0;c[Ta>>2]=Pa;c[Ta+4>>2]=Qa;Ta=m+40|0;c[Ta>>2]=Wa;c[Ta+4>>2]=Ua;c[m+48>>2]=0;c[m+52>>2]=256;Ta=fd(0,Oa,1024,13981,m)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}case 2:{c[H>>2]=Sa;c[H+4>>2]=Pa;b:do if((gd(f,0,h,Ha,13991,H)|0)==0?(W=c[Sa>>2]|0,X=f+552|0,k=c[f+556>>2]|0,(k|0)!=(X|0)):0){while(1){if((c[k+8>>2]|0)==(W|0))break;k=c[k+4>>2]|0;if((k|0)==(X|0))break b}if(k|0?(ia=c[k+12>>2]|0,ia|0):0){j=Lg(16)|0;c[j>>2]=f;c[j+4>>2]=0;c[j+8>>2]=h;b[j+12>>1]=g;i=_a[c[Qa+24>>2]&15](Qa,Na,ia,c[Pa>>2]|0,4,j)|0;if((i|0)<1)id(Na,i,j);else c[P>>2]=1;Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 3:{c[p>>2]=Sa;c[p+4>>2]=Ka;c[p+8>>2]=Pa;c[p+12>>2]=Na;c[p+16>>2]=Ma;if(gd(f,0,h,Ha,13994,p)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;c:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=25;break c}}if((k|0)!=0?(ra=c[k+12>>2]|0,(ra|0)!=0):0){k=$a[c[Qa+28>>2]&3](Qa,Ja,ra,c[Ka>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0)|0;Mg(c[Ka>>2]|0);if(!k){Ta=(c[f+548>>2]|0)+-24|0;c[na>>2]=Ja;c[na+4>>2]=Ta;Ta=fd(0,Oa,1024,14e3,na)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=25}else Ua=25;while(0);if((Ua|0)==25){Mg(c[Ka>>2]|0);k=-71}break a}case 4:{c[B>>2]=Sa;c[B+4>>2]=Na;c[B+8>>2]=Ma;c[B+12>>2]=Pa;if(gd(f,0,h,Ha,14003,B)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;d:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break d}}if((k|0)!=0?(sa=c[k+12>>2]|0,(sa|0)!=0):0)k=_a[c[Qa+60>>2]&15](Qa,Ka,sa,c[Na>>2]|0,c[Ma>>2]|0,c[Pa>>2]|0)|0;else k=-71}else k=-71;while(0);Mg(c[Na>>2]|0);Mg(c[Ma>>2]|0);if(k|0)break a;c[oa>>2]=Ka;Ta=fd(0,Oa,1024,14008,oa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}case 5:{c[C>>2]=Sa;c[C+4>>2]=Ja;c[C+8>>2]=Pa;c[C+12>>2]=Na;c[C+16>>2]=Ma;c[C+20>>2]=Ka;e:do if(!(gd(f,0,h,Ha,14010,C)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;f:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break f}if(k|0?(ta=c[k+12>>2]|0,ta|0):0){k=ab[c[Qa+64>>2]&1](Qa,Fa,ta,c[Ja>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;Mg(c[Ja>>2]|0);if(k|0){g=5;break e}c[pa>>2]=Fa;Wa=fd(0,Oa,1024,14008,pa)|0;k=Wa+7|0;g=Lg(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ei(g+7|0,Oa|0,Wa|0)|0;Kc(f,g,0,h,0,k,1)|0;Nc(f,0,h,k);Mg(g);g=0;k=0;break e}}while(0);Mg(c[Ja>>2]|0);g=5;k=-71}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 7:{c[D>>2]=Sa;if(gd(f,0,h,Ha,14017,D)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;g:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break g}}if((k|0)!=0?(ua=c[k+12>>2]|0,(ua|0)!=0):0){k=Ya[c[Qa+68>>2]&3](Qa,Pa,1024,ua)|0;if(!k){c[qa>>2]=Pa;Ta=fd(0,Oa,1024,14019,qa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);break a}case 8:{c[E>>2]=Sa;c[E+4>>2]=Pa;h:do if((gd(f,0,h,Ha,14021,E)|0)==0?(Y=c[Sa>>2]|0,Z=f+552|0,K=c[f+556>>2]|0,(K|0)!=(Z|0)):0){k=K;while(1){if((c[k+8>>2]|0)==(Y|0))break;k=c[k+4>>2]|0;if((k|0)==(Z|0))break h}if(k|0?(_=c[k+12>>2]|0,_|0):0){k=Xa[c[Qa+32>>2]&31](Qa,_,Na)|0;if(k|0)break a;ua=Pa;va=c[ua+4>>2]|0;xa=c[Na+16>>2]|0;ya=c[Na+20>>2]|0;Ta=c[Na+24>>2]|0;Aa=Na+32|0;za=c[Aa>>2]|0;Aa=c[Aa+4>>2]|0;Ca=Na+40|0;Ba=c[Ca>>2]|0;Ca=c[Ca+4>>2]|0;Ea=Na+48|0;Da=c[Ea>>2]|0;Ea=c[Ea+4>>2]|0;Ga=Na+56|0;Fa=c[Ga>>2]|0;Ga=c[Ga+4>>2]|0;Ia=Na+64|0;Ha=c[Ia>>2]|0;Ia=c[Ia+4>>2]|0;Ka=Na+72|0;Ja=c[Ka>>2]|0;Ka=c[Ka+4>>2]|0;La=c[Na+80>>2]|0;Pa=Na+88|0;Ma=c[Pa>>2]|0;Pa=c[Pa+4>>2]|0;Qa=c[Na+96>>2]|0;Wa=Na+104|0;Sa=c[Wa>>2]|0;Wa=c[Wa+4>>2]|0;Ua=c[Na+112>>2]|0;wa=R;c[wa>>2]=c[ua>>2];c[wa+4>>2]=va;c[R+8>>2]=Na;c[R+12>>2]=xa;c[R+16>>2]=ya;c[R+20>>2]=Ta;Ta=R+24|0;c[Ta>>2]=za;c[Ta+4>>2]=Aa;Ta=R+32|0;c[Ta>>2]=Ba;c[Ta+4>>2]=Ca;Ta=R+40|0;c[Ta>>2]=Da;c[Ta+4>>2]=Ea;Ta=R+48|0;c[Ta>>2]=Fa;c[Ta+4>>2]=Ga;Ta=R+56|0;c[Ta>>2]=Ha;c[Ta+4>>2]=Ia;Ta=R+64|0;c[Ta>>2]=Ja;c[Ta+4>>2]=Ka;Ta=R+72|0;c[Ta>>2]=La;c[Ta+4>>2]=0;Ta=R+80|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Pa;Ta=R+88|0;c[Ta>>2]=Qa;c[Ta+4>>2]=0;Ta=R+96|0;c[Ta>>2]=Sa;c[Ta+4>>2]=Wa;Ta=R+104|0;c[Ta>>2]=Ua;c[Ta+4>>2]=0;Ta=R+112|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+120|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+128|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+136|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=fd(0,Oa,1024,14024,R)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 9:{c[F>>2]=Sa;c[F+4>>2]=Pa;c[F+8>>2]=Na;c[F+12>>2]=Ma;c[F+16>>2]=Ka;c[F+20>>2]=Ja;c[F+24>>2]=Fa;c[F+28>>2]=ja;c[F+32>>2]=ka;c[F+36>>2]=la;i:do if(!(gd(f,0,h,Ha,14045,F)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){g=4;k=0;break i}}if((k|0)!=0?(va=c[k+12>>2]|0,(va|0)!=0):0){La=Fa;Oa=ja;Wa=ka;k=la;k=bb[c[Qa+36>>2]&1](Qa,va,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0,c[Ja>>2]|0,c[Ja+4>>2]|0,c[La>>2]|0,c[La+4>>2]|0,c[Oa>>2]|0,c[Oa+4>>2]|0,c[Wa>>2]|0,c[Wa+4>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0;if(!k){g=Lg(7)|0;a[g>>0]=7;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Kc(f,g,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(g);g=0;k=0}else g=5}else{g=4;k=0}}else{g=4;k=0}}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:case 4:{Ua=262;break a}default:i=0}l=Va;return i|0}case 16:{c[G>>2]=Sa;c[G+4>>2]=Na;c[G+8>>2]=Pa;j:do if((gd(f,0,h,Ha,14056,G)|0)==0?($=c[Sa>>2]|0,aa=f+552|0,L=c[f+556>>2]|0,(L|0)!=(aa|0)):0){k=L;while(1){if((c[k+8>>2]|0)==($|0))break;k=c[k+4>>2]|0;if((k|0)==(aa|0))break j}if(k|0?(ma=c[k+12>>2]|0,ma|0):0){k=c[Pa>>2]|0;g=Lg(k+4|0)|0;Wa=Na;k=_a[c[Qa+44>>2]&15](Qa,ma,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0)break a;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,g|0,k+4|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Mg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 21:{c[I>>2]=Sa;if(gd(f,0,h,Ha,14017,I)|0){Ua=262;break a}Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}case 22:{n=Pa+28|0;c[J>>2]=Sa;c[J+4>>2]=Pa;c[J+8>>2]=Pa+4;c[J+12>>2]=Pa+8;c[J+16>>2]=Pa+16;c[J+20>>2]=Pa+24;c[J+24>>2]=n;if(gd(f,0,h,Ha,14060,J)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;k:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=106;break k}}if((k|0)!=0?(ya=c[k+12>>2]|0,(ya|0)!=0):0){k=Xa[c[Qa+80>>2]&31](Qa,ya,Pa)|0;Mg(c[n>>2]|0);if((k|0)>=0){c[xa>>2]=k;Ta=fd(0,Oa,1024,14068,xa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=106}else Ua=106;while(0);if((Ua|0)==106){Mg(c[n>>2]|0);k=-71}break a}case 23:{n=Pa+8|0;o=Pa+16|0;p=Pa+24|0;q=Pa+28|0;c[ea>>2]=Sa;c[ea+4>>2]=Pa;c[ea+8>>2]=n;c[ea+12>>2]=o;c[ea+16>>2]=p;c[ea+20>>2]=q;if(gd(f,0,h,Ha,14070,ea)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;l:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break l}}if((k|0)!=0?(Ba=c[k+12>>2]|0,(Ba|0)!=0):0){k=Xa[c[Qa+84>>2]&31](Qa,Ba,Pa)|0;if((k|0)>=0){c[Aa>>2]=Pa;c[Aa+4>>2]=n;c[Aa+8>>2]=o;c[Aa+12>>2]=p;c[Aa+16>>2]=q;Ta=fd(0,Oa,1024,14077,Aa)|0;Mg(c[q>>2]|0);Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);Mg(c[q>>2]|0);break a}case 31:{c[n>>2]=Sa;c[n+4>>2]=Pa;c[n+8>>2]=Na;if(gd(f,0,h,Ha,14083,n)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;m:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=127;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==127)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=134;break m}}if((k|0)!=0?(Ca=c[k+12>>2]|0,(m|0)!=0&(Ca|0)!=0):0){k=Ya[c[Qa+56>>2]&3](Qa,m,Ca,c[Na>>2]|0)|0;Mg(c[Na>>2]|0);if(!k){Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=134}else Ua=134;while(0);if((Ua|0)==134){Mg(c[Na>>2]|0);k=-71}break a}case 32:{c[o>>2]=Sa;c[o+4>>2]=Ma;c[o+8>>2]=Pa;c[o+12>>2]=Na;n:do if((gd(f,0,h,Ha,14087,o)|0)==0?(ba=c[Sa>>2]|0,ca=f+552|0,M=c[f+556>>2]|0,(M|0)!=(ca|0)):0){k=M;while(1){if((c[k+8>>2]|0)==(ba|0))break;k=c[k+4>>2]|0;if((k|0)==(ca|0))break n}if(k|0?(da=c[k+12>>2]|0,da|0):0){k=_a[c[Qa+20>>2]&15](Qa,Ka,da,c[Ma>>2]|0,c[Pa>>2]|0,c[Na>>2]|0)|0;if(k|0)break a;c[Q>>2]=Ka;Ta=fd(0,Oa,1024,14008,Q)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 33:{c[q>>2]=Sa;c[q+4>>2]=Na;c[q+8>>2]=Pa;c[q+12>>2]=Ma;if(gd(f,0,h,Ha,14092,q)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;o:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=156;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==156)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){k=-71;break o}}if((k|0)!=0?(Da=c[k+12>>2]|0,(m|0)!=0&(Da|0)!=0):0)k=Za[c[Qa+72>>2]&7](Qa,m,c[Na>>2]|0,Da,c[Ma>>2]|0)|0;else k=-71}else k=-71;while(0);Mg(c[Na>>2]|0);Mg(c[Ma>>2]|0);if(k|0)break a;Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}case 34:{c[r>>2]=Sa;c[r+4>>2]=Na;c[r+8>>2]=Pa;if(gd(f,0,h,Ha,14097,r)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;p:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=174;break p}}if((k|0)!=0?(wa=c[k+12>>2]|0,(wa|0)!=0):0){k=Xa[c[Qa+76>>2]&31](Qa,wa,c[Na>>2]|0)|0;Mg(c[Na>>2]|0);if(!k){Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=174}else Ua=174;while(0);if((Ua|0)==174){Mg(c[Na>>2]|0);k=-71}break a}case 46:{c[s>>2]=Sa;c[s+4>>2]=Pa;if(gd(f,0,h,Ha,14101,s)|0){Ua=262;break a}Ta=f+548|0;c[Ta>>2]=c[Sa>>2];Mg(c[Pa>>2]|0);c[t>>2]=c[Ta>>2];c[t+4>>2]=14104;Ta=fd(0,Oa,1024,14101,t)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}case 48:{c[u>>2]=Sa;c[u+4>>2]=Pa;c[u+8>>2]=Ma;c[u+12>>2]=Ka;c[u+16>>2]=Na;if(!(gd(f,0,h,Ha,14113,u)|0)){k=_a[c[Qa+12>>2]&15](Qa,Fa,Ja,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;if(!k){p=c[Sa>>2]|0;m=c[Fa>>2]|0;n=f+552|0;o=f+556|0;g=c[o>>2]|0;q:do if((g|0)!=(n|0)){k=g;while(1){if((c[k+8>>2]|0)==(p|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=190;break q}}if(k){Qa=c[La>>2]|0;Wa=k+12|0;db[c[Qa+4>>2]&15](Qa,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=190}else Ua=190;while(0);if((Ua|0)==190){Wa=Lg(16)|0;c[Wa+8>>2]=p;c[Wa+12>>2]=m;c[o>>2]=Wa;c[Wa>>2]=n;c[Wa+4>>2]=g;c[g>>2]=Wa}Mg(c[Ma>>2]|0);Mg(c[Ka>>2]|0);c[za>>2]=Ja;Wa=fd(0,Oa,1024,14008,za)|0;k=Wa+7|0;g=Lg(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ei(g+7|0,Oa|0,Wa|0)|0;Kc(f,g,0,h,0,k,1)|0;Nc(f,0,h,k);Mg(g);g=0;k=0}else g=5}else{g=2;k=0}switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 50:{c[v>>2]=Sa;if(gd(f,0,h,Ha,14119,v)|0){Ua=262;break a}Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}case 51:{c[w>>2]=Sa;c[w+4>>2]=Pa;c[w+8>>2]=Na;r:do if(!(gd(f,0,h,Ha,14121,w)|0)){g=c[Sa>>2]|0;p=f+552|0;q=f+556|0;k=c[q>>2]|0;s:do if((k|0)!=(p|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0))break s}if(k|0){k=c[k+12>>2]|0;c[Ma>>2]=k;if(!k)break r;m=vf(e[Na>>1]<<2)|0;Wa=b[Na>>1]|0;n=Lg((Wa&65535)<<4)|0;t:do if(!(Wa<<16>>16)){g=0;Ua=209}else{k=0;do{c[Ea>>2]=m+(k<<2);k=k+1|0;if(gd(f,0,h,Ha,14019,Ea)|0){k=-71;break t}g=b[Na>>1]|0}while(k>>>0<(g&65535)>>>0);g=g&65535;k=c[Ma>>2]|0;Ua=209}while(0);if((Ua|0)==209)k=_a[c[Qa+16>>2]&15](Qa,Ma,n,k,g,m)|0;if(b[Na>>1]|0){g=0;do{Mg(c[m+(g<<2)>>2]|0);g=g+1|0}while(g>>>0<(e[Na>>1]|0)>>>0)}Mg(m);if((k|0)<0){Mg(n);break a}c[Ga>>2]=k;g=fd(0,Oa,1024,14119,Ga)|0;if(!k)o=g;else{m=0;do{c[Ia>>2]=n+(m<<4);g=(fd(0,Oa+g|0,1024-g|0,14008,Ia)|0)+g|0;m=m+1|0}while((m|0)<(k|0));o=g}Mg(n);n=c[Pa>>2]|0;m=c[Ma>>2]|0;g=c[q>>2]|0;u:do if((g|0)!=(p|0)){k=g;while(1){if((c[k+8>>2]|0)==(n|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0)){Ua=223;break u}}if(k){Ta=c[La>>2]|0;Wa=k+12|0;db[c[Ta+4>>2]&15](Ta,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=223}else Ua=223;while(0);if((Ua|0)==223){Wa=Lg(16)|0;c[Wa+8>>2]=n;c[Wa+12>>2]=m;c[q>>2]=Wa;c[Wa>>2]=p;c[Wa+4>>2]=g;c[g>>2]=Wa}Ua=o+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,o|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);c[Ma>>2]=0}while(0);Ua=262;break a}case 54:{c[x>>2]=Sa;c[x+4>>2]=Na;c[x+8>>2]=Pa;v:do if((gd(f,0,h,Ha,14056,x)|0)==0?(S=c[Sa>>2]|0,T=f+552|0,N=c[f+556>>2]|0,(N|0)!=(T|0)):0){k=N;while(1){if((c[k+8>>2]|0)==(S|0))break;k=c[k+4>>2]|0;if((k|0)==(T|0))break v}if(k|0?(ga=c[k+12>>2]|0,ga|0):0){k=c[Pa>>2]|0;g=Lg(k+4|0)|0;Wa=Na;k=_a[c[Qa+48>>2]&15](Qa,ga,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0){Mg(g);break a}a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,g|0,k+4|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Mg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 55:{c[y>>2]=Sa;c[y+4>>2]=Na;c[y+8>>2]=Pa;w:do if((gd(f,0,h,Ha,14056,y)|0)==0?(U=c[Sa>>2]|0,V=f+552|0,O=c[f+556>>2]|0,(O|0)!=(V|0)):0){k=O;while(1){if((c[k+8>>2]|0)==(U|0))break;k=c[k+4>>2]|0;if((k|0)==(V|0))break w}if(k|0?(ha=c[k+12>>2]|0,ha|0):0){Wa=c[Pa>>2]|0;g=Lg(Wa)|0;if(Kc(f,g,0,h,c[Ha>>2]|0,Wa,0)|0){Mg(g);break}k=Na;k=_a[c[Qa+52>>2]&15](Qa,ha,c[k>>2]|0,c[k+4>>2]|0,g,c[Pa>>2]|0)|0;Mg(g);if((k|0)<0)break a;c[fa>>2]=k;Ta=fd(0,Oa,1024,14017,fa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 56:{c[z>>2]=Sa;if(gd(f,0,h,Ha,14017,z)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;x:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break x}if(k|0){Ua=c[La>>2]|0;db[c[Ua+4>>2]&15](Ua,c[k+12>>2]|0);Ua=c[k>>2]|0;Wa=c[k+4>>2]|0;c[Ua+4>>2]=Wa;c[Wa>>2]=Ua;Mg(k)}}while(0);Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}default:{c[A>>2]=Ra;hi(14125,A)|0;Ua=262;break a}}while(0)}else{i=0;j=0;Ua=262}while(0);if((Ua|0)==262)k=-71;c[Ta>>2]=0-k;Ta=fd(0,Sa,4,14017,Ta)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=7;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Sa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}function fd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;c[k>>2]=g;j=d+e|0;e=a[f>>0]|0;if(!(e<<24>>24)){k=d;d=k-d|0;l=m;return d|0}b=d;a:while(1){f=f+1|0;switch(e<<24>>24|0){case 98:{e=b+1|0;if(e>>>0>j>>>0){e=5;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;b=e;break}case 104:{e=b+2|0;if(e>>>0>j>>>0){e=8;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;b=e;break}case 119:{e=b+4|0;if(e>>>0>j>>>0){e=11;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=i>>>8;a[b+2>>0]=i>>>16;a[b+3>>0]=i>>>24;b=e;break}case 100:{e=b+8|0;if(e>>>0>j>>>0){e=14;break a}g=(c[k>>2]|0)+(8-1)&~(8-1);i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;c[k>>2]=g+8;a[b>>0]=h;a[b+1>>0]=h>>>8;a[b+2>>0]=h>>>16;a[b+3>>0]=h>>>24;a[b+4>>0]=i;a[b+5>>0]=Ai(h|0,i|0,40)|0;a[b+6>>0]=Ai(h|0,i|0,48)|0;a[b+7>>0]=Ai(h|0,i|0,56)|0;b=e;break}case 115:{i=(c[k>>2]|0)+(4-1)&~(4-1);h=c[i>>2]|0;c[k>>2]=i+4;i=_g(h)|0;if((i|0)>=65536){e=17;break a}e=b+2|0;g=e+i|0;if(g>>>0>j>>>0){e=19;break a}a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;Ei(e|0,h|0,i|0)|0;b=g;break}case 81:{e=b+13|0;if(e>>>0>j>>>0){e=22;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=a[i>>0]|0;h=c[i+4>>2]|0;a[b+1>>0]=h;a[b+2>>0]=h>>>8;a[b+3>>0]=h>>>16;a[b+4>>0]=h>>>24;i=i+8|0;h=c[i>>2]|0;i=c[i+4>>2]|0;a[b+5>>0]=h;a[b+6>>0]=h>>>8;a[b+7>>0]=h>>>16;a[b+8>>0]=h>>>24;a[b+9>>0]=i;a[b+10>>0]=Ai(h|0,i|0,40)|0;a[b+11>>0]=Ai(h|0,i|0,48)|0;a[b+12>>0]=Ai(h|0,i|0,56)|0;b=e;break}default:{e=24;break a}}e=a[f>>0]|0;if(!(e<<24>>24)){e=26;break}}if((e|0)==5)ja(14158,13903,1783,14177);else if((e|0)==8)ja(14186,13903,1793,14177);else if((e|0)==11)ja(14205,13903,1803,14177);else if((e|0)==14)ja(14224,13903,1813,14177);else if((e|0)==17)ja(14243,13903,1832,14177);else if((e|0)==19)ja(14256,13903,1833,14177);else if((e|0)==22)ja(14281,13903,1843,14177);else if((e|0)==24)ra();else if((e|0)==26){k=b;d=k-d|0;l=m;return d|0}return 0}function gd(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;x=l;l=l+32|0;u=x+16|0;v=x;m=c[h>>2]|0;c[u>>2]=j;k=a[i>>0]|0;a:do if(k<<24>>24){n=v+1|0;o=v+2|0;p=v+3|0;q=v+4|0;r=v+5|0;s=v+6|0;t=v+7|0;j=m;b:while(1){i=i+1|0;switch(k<<24>>24|0){case 98:{if(Kc(e,v,f,g,j,1,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;a[m>>0]=a[v>>0]|0;j=j+1|0;break}case 104:{if(Kc(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;b[m>>1]=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;break}case 119:{if(Kc(e,v,f,g,j,4,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;j=j+4|0;break}case 100:{if(Kc(e,v,f,g,j,8,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;k=(d[r>>0]|0)<<8|(d[q>>0]|0)|(d[s>>0]|0)<<16|(d[t>>0]|0)<<24;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;c[m+4>>2]=k;j=j+8|0;break}case 115:{if(Kc(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}m=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;k=Lg(m+1|0)|0;if(Kc(e,k,f,g,j,m,0)|0){j=-1;k=18;break b}a[k+m>>0]=0;z=(c[u>>2]|0)+(4-1)&~(4-1);y=c[z>>2]|0;c[u>>2]=z+4;c[y>>2]=k;j=m+j|0;break}default:{k=15;break b}}k=a[i>>0]|0;if(!(k<<24>>24)){w=j;break a}}if((k|0)==15)ra();else if((k|0)==18){l=x;return j|0}}else w=m;while(0);c[h>>2]=w;z=0;l=x;return z|0}function hd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[e>>2]|0;a=c[e+4>>2]|0;id(b,d,e);c[f+560>>2]=0;Hc(f,a);return}function id(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+64|0;k=m+40|0;j=m+32|0;g=m+48|0;h=m;i=c[f>>2]|0;if((e|0)<0){d=c[f+4>>2]|0;h=c[f+8>>2]|0;n=b[f+12>>1]|0;c[j>>2]=0-e;e=fd(0,g,4,14017,j)|0;j=e+7|0;k=Lg(j)|0;a[k>>0]=j;a[k+1>>0]=j>>>8;a[k+2>>0]=j>>>16;a[k+3>>0]=j>>>24;a[k+4>>0]=7;a[k+5>>0]=n;a[k+6>>0]=(n&65535)>>>8;Ei(k+7|0,g|0,e|0)|0;Kc(i,k,d,h,0,j,1)|0;Nc(i,d,h,j);Mg(k);Mg(f);l=m;return}else{e=(c[i+548>>2]|0)+-24|0;c[k>>2]=d;c[k+4>>2]=e;e=fd(0,h,32,14e3,k)|0;g=c[f+4>>2]|0;j=c[f+8>>2]|0;d=b[f+12>>1]|0;k=e+7|0;n=Lg(k)|0;a[n>>0]=k;a[n+1>>0]=k>>>8;a[n+2>>0]=k>>>16;a[n+3>>0]=k>>>24;a[n+4>>0]=13;a[n+5>>0]=d;a[n+6>>0]=(d&65535)>>>8;Ei(n+7|0,h|0,e|0)|0;Kc(i,n,g,j,0,k,1)|0;Nc(i,g,j,k);Mg(n);Mg(f);l=m;return}}function jd(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+32|0;d=e+16|0;c[d>>2]=b;_a[c[a+16>>2]&15](a,d,e,b,0,0)|0;l=e;return c[d>>2]|0}function kd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;p=r+20|0;j=r+24|0;k=r+16|0;q=r;c[p>>2]=d;i=(f|0)==0;n=b+16|0;o=b+4|0;m=1;g=(a[e>>0]|0)==47?e+1|0:e;while(1){h=ch(g,47)|0;if(!h){c[j>>2]=g;if(!i){e=5;break}g=1;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0}else{e=h-g|0;s=Lg(e+1|0)|0;c[j>>2]=s;Ei(s|0,g|0,e|0)|0;a[s+e>>0]=0;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0;Mg(c[j>>2]|0);g=0}if(!m)db[c[o>>2]&15](b,c[p>>2]|0);d=c[k>>2]|0;c[p>>2]=d;if((e|0)<1){e=13;break}if(g){e=15;break}else{m=0;g=h+1|0}}if((e|0)==5){c[f>>2]=g;if(!m){s=d;l=r;return s|0}if((_a[c[n>>2]&15](b,p,q,d,0,0)|0)<0){c[p>>2]=0;s=0;l=r;return s|0}else{s=c[p>>2]|0;l=r;return s|0}}else if((e|0)==13){db[c[o>>2]&15](b,d);c[p>>2]=0;s=0;l=r;return s|0}else if((e|0)==15){l=r;return d|0}return 0}function ld(a,b,c){a=a|0;b=b|0;c=c|0;return kd(a,b,c,0)|0}function md(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=l;l=l+16|0;e=m;b=vf(208)|0;c[b>>2]=9;c[b+4>>2]=7;c[b+8>>2]=8;c[b+12>>2]=1;c[b+16>>2]=2;c[b+20>>2]=3;c[b+24>>2]=4;c[b+28>>2]=1;c[b+32>>2]=10;c[b+36>>2]=1;c[b+40>>2]=9;c[b+44>>2]=5;c[b+48>>2]=6;c[b+52>>2]=7;c[b+56>>2]=1;c[b+60>>2]=8;c[b+64>>2]=1;c[b+68>>2]=2;c[b+72>>2]=6;c[b+76>>2]=11;c[b+80>>2]=12;c[b+84>>2]=13;n=b+88|0;c[n>>2]=n;o=b+92|0;c[o>>2]=n;j=b+128|0;f=j;c[f>>2]=1;c[f+4>>2]=0;f=b+136|0;c[f>>2]=12;g=b+140|0;c[g>>2]=4096;h=b+104|0;c[h>>2]=1048576;c[h+4>>2]=0;h=b+120|0;c[h>>2]=262144;c[h+4>>2]=0;h=b+148|0;c[h>>2]=h;c[b+152>>2]=h;h=b+168|0;c[h>>2]=67108864;c[h+4>>2]=0;h=b+176|0;c[h>>2]=h;c[b+180>>2]=h;h=b+184|0;c[h>>2]=h;c[b+188>>2]=h;h=b+192|0;c[h>>2]=h;c[b+196>>2]=h;h=vf(104)|0;i=h+16|0;c[i>>2]=1;c[h+20>>2]=0;p=j;d=c[p+4>>2]|0;k=h+8|0;c[k>>2]=c[p>>2];c[k+4>>2]=d;k=j;k=pi(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[j>>2]=k;c[j+4>>2]=y;j=h+24|0;c[j>>2]=4;c[h+28>>2]=511;c[h+32>>2]=0;c[h+36>>2]=0;k=h+56|0;c[k>>2]=k;c[h+60>>2]=k;d=c[o>>2]|0;c[o>>2]=h;c[h>>2]=n;c[h+4>>2]=d;c[d>>2]=h;d=b+96|0;n=d;n=pi(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;c[d>>2]=n;c[d+4>>2]=y;Oa(e|0,0)|0;d=c[e>>2]|0;c[h+40>>2]=d;e=(c[e+4>>2]|0)*1e3|0;c[h+48>>2]=e;c[h+44>>2]=d;c[h+52>>2]=e;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)!=4)ja(14301,14319,456,14328);p=vf(18)|0;c[p+8>>2]=h;d=p+13|0;a[d>>0]=46;a[d+1>>0]=0;d=h+64|0;e=c[d>>2]|0;o=e+18|0;t=pi(c[g>>2]|0,0,-1,-1)|0;s=y;n=pi(t|0,s|0,o|0,((o|0)<0)<<31>>31|0)|0;r=c[f>>2]|0;n=Ai(n|0,y|0,r|0)|0;q=y;e=pi(t|0,s|0,e|0,((e|0)<0)<<31>>31|0)|0;r=Ai(e|0,y|0,r|0)|0;e=b+112|0;s=e;r=qi(c[s>>2]|0,c[s+4>>2]|0,r|0,y|0)|0;q=pi(r|0,y|0,n|0,q|0)|0;n=e;c[n>>2]=q;c[n+4>>2]=y;c[d>>2]=o;o=c[k>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[p+4>>2]=k;c[k>>2]=p;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)==4){t=vf(19)|0;c[t+8>>2]=h;o=t+13|0;a[o>>0]=a[14342]|0;a[o+1>>0]=a[14343]|0;a[o+2>>0]=a[14344]|0;o=c[d>>2]|0;s=o+19|0;j=pi(c[g>>2]|0,0,-1,-1)|0;n=y;r=pi(j|0,n|0,s|0,((s|0)<0)<<31>>31|0)|0;p=c[f>>2]|0;r=Ai(r|0,y|0,p|0)|0;q=y;o=pi(j|0,n|0,o|0,((o|0)<0)<<31>>31|0)|0;p=Ai(o|0,y|0,p|0)|0;o=e;p=qi(c[o>>2]|0,c[o+4>>2]|0,p|0,y|0)|0;q=pi(p|0,y|0,r|0,q|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;c[d>>2]=s;s=c[k>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[t+4>>2]=k;c[k>>2]=t;c[b+144>>2]=h;l=m;return b|0}else ja(14301,14319,456,14328);return 0}function nd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+88|0;b=c[a+92>>2]|0;if((b|0)!=(h|0))do{e=b;b=c[b+4>>2]|0;c[e+16>>2]=0;if((c[e+24>>2]|0)==4){g=e+56|0;f=e+60|0;d=c[f>>2]|0;if((d|0)!=(g|0))do{j=d+4|0;i=d;d=c[j>>2]|0;k=c[i>>2]|0;c[k+4>>2]=d;c[d>>2]=k;c[i>>2]=0;c[j>>2]=0;Mg(i)}while((d|0)!=(g|0));c[g>>2]=g;c[f>>2]=g}Kd(a,e)}while((b|0)!=(h|0));k=a+148|0;if((c[k+4>>2]|0)==(k|0)){Mg(c[a+200>>2]|0);return}else ja(15144,14319,1527,15178)}function od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+8|0;if(c[d>>2]|0)c[d>>2]=0;d=b+16|0;e=c[d>>2]|0;if(e|0){f=c[e+4>>2]|0;if(f|0)c[f>>2]=0;Mg(e);c[d>>2]=0}d=c[b+4>>2]|0;e=d+20|0;f=c[e>>2]|0;if((f|0)<=0)ja(14992,14319,397,15011);c[e>>2]=f+-1;if((f|0)!=1){Mg(b);return}if((c[d+16>>2]|0)>=1){Mg(b);return}Kd(a,d);Mg(b);return}function pd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=1024;d=a+120|0;e=d;f=a+136|0;e=Bi(c[e>>2]|0,c[e+4>>2]|0,(c[f>>2]|0)+-10|0)|0;g=b+8|0;c[g>>2]=e;c[g+4>>2]=y;g=a+112|0;g=qi(c[d>>2]|0,c[d+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0)|0;f=Bi(g|0,y|0,(c[f>>2]|0)+-10|0)|0;g=y;d=b+16|0;c[d>>2]=f;c[d+4>>2]=g;d=b+24|0;c[d>>2]=f;c[d+4>>2]=g;d=a+104|0;g=d;f=c[g+4>>2]|0;e=b+32|0;c[e>>2]=c[g>>2];c[e+4>>2]=f;a=a+96|0;a=qi(c[d>>2]|0,c[d+4>>2]|0,c[a>>2]|0,c[a+4>>2]|0)|0;b=b+40|0;c[b>>2]=a;c[b+4>>2]=y;return}function qd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=b+144|0;g=c[b>>2]|0;h=vf(20)|0;i=g+20|0;c[i>>2]=(c[i>>2]|0)+1;c[h+4>>2]=g;c[h>>2]=f;c[d>>2]=h;b=c[b>>2]|0;d=c[b+24>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;g=b+8|0;h=c[g+4>>2]|0;i=e+8|0;c[i>>2]=c[g>>2];c[i+4>>2]=h;return 0}function rd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=c[f+4>>2]|0;a:do if((g|0)>0){b=0;do{k=c[h+(b<<2)>>2]|0;if((c[i+24>>2]|0)!=4)break a;l=i+56|0;j=c[i+60>>2]|0;if((j|0)==(l|0))break a;while(1){if(!(Zg(j+13|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(l|0))break a}if(!j)break a;i=c[j+8>>2]|0;j=e+(b<<4)|0;k=c[i+24>>2]|0;do if((k|0)!=4)if((k|0)==10){a[j>>0]=2;break}else{a[j>>0]=0;break}else a[j>>0]=-128;while(0);c[e+(b<<4)+4>>2]=0;j=i+8|0;k=c[j+4>>2]|0;l=e+(b<<4)+8|0;c[l>>2]=c[j>>2];c[l+4>>2]=k;b=b+1|0}while((b|0)<(g|0))}else b=0;while(0);h=c[f>>2]|0;f=vf(20)|0;g=i+20|0;c[g>>2]=(c[g>>2]|0)+1;c[f+4>>2]=i;c[f>>2]=h;c[d>>2]=f;return b|0}function sd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;s=l;l=l+16|0;n=s;q=c[e+4>>2]|0;r=q+24|0;if((c[r>>2]|0)!=4){d=-20;l=s;return d|0}p=q+56|0;i=c[q+60>>2]|0;a:do if((i|0)!=(p|0)){while(1){if(!(Zg(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(p|0))break a}if(i|0){d=-17;l=s;return d|0}}while(0);j=c[e>>2]|0;k=vf(104)|0;e=k+16|0;c[e>>2]=1;c[k+20>>2]=0;m=b+128|0;u=m;t=c[u+4>>2]|0;o=k+8|0;i=o;c[i>>2]=c[u>>2];c[i+4>>2]=t;i=m;i=pi(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[m>>2]=i;c[m+4>>2]=y;m=k+24|0;c[m>>2]=4;c[k+28>>2]=g&4095;c[k+32>>2]=j;c[k+36>>2]=h;j=k+56|0;c[j>>2]=j;c[k+60>>2]=j;g=b+92|0;h=c[g>>2]|0;c[g>>2]=k;c[k>>2]=b+88;c[k+4>>2]=h;c[h>>2]=k;h=b+96|0;g=h;g=pi(c[g>>2]|0,c[g+4>>2]|0,1,0)|0;c[h>>2]=g;c[h+4>>2]=y;Oa(n|0,0)|0;h=c[n>>2]|0;c[k+40>>2]=h;n=(c[n+4>>2]|0)*1e3|0;c[k+48>>2]=n;c[k+44>>2]=h;c[k+52>>2]=n;c[e>>2]=(c[e>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);u=vf(18)|0;c[u+8>>2]=k;e=u+13|0;a[e>>0]=46;a[e+1>>0]=0;e=k+64|0;i=c[e>>2]|0;t=i+18|0;g=b+140|0;z=pi(c[g>>2]|0,0,-1,-1)|0;x=y;v=pi(z|0,x|0,t|0,((t|0)<0)<<31>>31|0)|0;h=b+136|0;w=c[h>>2]|0;v=Ai(v|0,y|0,w|0)|0;n=y;i=pi(z|0,x|0,i|0,((i|0)<0)<<31>>31|0)|0;w=Ai(i|0,y|0,w|0)|0;i=b+112|0;b=i;b=qi(c[b>>2]|0,c[b+4>>2]|0,w|0,y|0)|0;n=pi(b|0,y|0,v|0,n|0)|0;b=i;c[b>>2]=n;c[b+4>>2]=y;c[e>>2]=t;t=c[j>>2]|0;c[t+4>>2]=u;c[u>>2]=t;c[u+4>>2]=j;c[j>>2]=u;u=q+16|0;c[u>>2]=(c[u>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);z=vf(19)|0;c[z+8>>2]=q;t=z+13|0;a[t>>0]=a[14342]|0;a[t+1>>0]=a[14343]|0;a[t+2>>0]=a[14344]|0;t=c[e>>2]|0;x=t+19|0;n=pi(c[g>>2]|0,0,-1,-1)|0;b=y;w=pi(n|0,b|0,x|0,((x|0)<0)<<31>>31|0)|0;u=c[h>>2]|0;w=Ai(w|0,y|0,u|0)|0;v=y;t=pi(n|0,b|0,t|0,((t|0)<0)<<31>>31|0)|0;u=Ai(t|0,y|0,u|0)|0;t=i;u=qi(c[t>>2]|0,c[t+4>>2]|0,u|0,y|0)|0;v=pi(u|0,y|0,w|0,v|0)|0;w=i;c[w>>2]=v;c[w+4>>2]=y;c[e>>2]=x;x=c[j>>2]|0;c[x+4>>2]=z;c[z>>2]=x;c[z+4>>2]=j;c[j>>2]=z;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);x=_g(f)|0;w=x+17|0;z=vf(w)|0;c[z+8>>2]=k;Ei(z+13|0,f|0,x+1|0)|0;x=q+64|0;r=c[x>>2]|0;w=r+w|0;f=pi(c[g>>2]|0,0,-1,-1)|0;q=y;u=pi(f|0,q|0,w|0,((w|0)<0)<<31>>31|0)|0;t=c[h>>2]|0;u=Ai(u|0,y|0,t|0)|0;v=y;r=pi(f|0,q|0,r|0,((r|0)<0)<<31>>31|0)|0;t=Ai(r|0,y|0,t|0)|0;r=i;t=qi(c[r>>2]|0,c[r+4>>2]|0,t|0,y|0)|0;v=pi(t|0,y|0,u|0,v|0)|0;c[i>>2]=v;c[i+4>>2]=y;c[x>>2]=w;i=c[p>>2]|0;c[i+4>>2]=z;c[z>>2]=i;c[z+4>>2]=p;c[p>>2]=z;i=c[m>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;w=o;x=c[w+4>>2]|0;z=d+8|0;c[z>>2]=c[w>>2];c[z+4>>2]=x;z=0;l=s;return z|0}function td(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=c[e+4>>2]|0;l=e+8|0;if(c[l>>2]|0)c[l>>2]=0;i=e+16|0;j=c[i>>2]|0;if(j|0){k=c[j+4>>2]|0;if(k|0)c[k>>2]=0;Mg(j);c[i>>2]=0}j=u+24|0;i=c[j>>2]|0;a:do if(f&65536){if((i|0)!=4){h=-20;return h|0}}else{switch(i|0){case 4:case 8:break a;default:i=-22}return i|0}while(0);c[e+12>>2]=f;b:do if((c[j>>2]|0)==8){if(!((f&512|0)==0|(f&3|0)==0))Qd(b,u,0,0)|0;t=u+56|0;c:do switch(c[t>>2]|0){case 0:break b;case 1:{k=u+80|0;j=c[k>>2]|0;k=c[k+4>>2]|0;f=b+176|0;i=c[b+180>>2]|0;d:do if((i|0)!=(f|0)){while(1){s=i+8|0;if((c[s>>2]|0)==(j|0)?(c[s+4>>2]|0)==(k|0):0)break;i=c[i+4>>2]|0;if((i|0)==(f|0))break d}s=i+16|0;i=c[i+20>>2]|0;if((i|0)!=(s|0)){q=b+184|0;r=b+188|0;do{k=c[i+12>>2]|0;e:do if(!(c[i+8>>2]|0)){j=Od(b,k)|0;if((j|0?(c[j+24>>2]|0)==8:0)?(c[j+56>>2]|0)==1:0)Rd(b,j,0)|0}else{j=c[r>>2]|0;if((j|0)!=(q|0)){while(1){if(!(Zg(c[j+8>>2]|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(q|0))break e}if(j|0){o=Od(b,k)|0;do if((o|0?(c[o+24>>2]|0)==8:0)?(c[o+56>>2]|0)==1:0){p=j+12|0;n=j+16|0;k=c[n>>2]|0;if((k|0)==(p|0))break e;f=0;d=0;m=0;do{l=Od(b,c[k+24>>2]|0)|0;do if(l){if((c[l+24>>2]|0)!=8)break;f=(c[l+56>>2]|0)==1?1:f}while(0);l=k+16|0;m=pi(c[l>>2]|0,c[l+4>>2]|0,m|0,d|0)|0;d=y;k=c[k+4>>2]|0}while((k|0)!=(p|0));if(!f)break e;if(!((d|0)==0?(m|0)==(c[o+60>>2]|0):0))break;Rd(b,o,1)|0;j=c[n>>2]|0;if((j|0)==(p|0))break e;m=o+96|0;l=0;d=0;while(1){k=j+24|0;f=Od(b,c[k>>2]|0)|0;f:do if(f|0){if((c[f+24>>2]|0)!=8)break;if((c[f+56>>2]|0)!=1)break;o=j+16|0;do if((c[o+4>>2]|0)==0?(c[o>>2]|0)==(c[f+60>>2]|0):0){n=f+80|0;o=j+8|0;if(!((c[n>>2]|0)==(c[o>>2]|0)?(c[n+4>>2]|0)==(c[o+4>>2]|0):0))break;Rd(b,f,2)|0;o=f+96|0;k=c[o>>2]|0;f=k+24|0;n=(c[m>>2]|0)+40|0;v=c[n>>2]|0;c[v+4>>2]=f;c[f>>2]=v;c[k+28>>2]=n;c[n>>2]=f;o=(c[o>>2]|0)+32|0;c[o>>2]=l;c[o+4>>2]=d;break f}while(0);k=Od(b,c[k>>2]|0)|0;if(!k)break;if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Rd(b,k,0)|0}while(0);v=j+16|0;l=pi(c[v>>2]|0,c[v+4>>2]|0,l|0,d|0)|0;j=c[j+4>>2]|0;if((j|0)==(p|0))break e;else d=y}}while(0);f=j+12|0;j=c[j+16>>2]|0;if((j|0)!=(f|0))do{k=Od(b,c[j+24>>2]|0)|0;do if(k|0){if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Rd(b,k,0)|0}while(0);j=c[j+4>>2]|0}while((j|0)!=(f|0))}}}while(0);i=c[i+4>>2]|0}while((i|0)!=(s|0));if((c[t>>2]|0)==2)break c}}while(0);i=Rd(b,u,0)|0;if(i|0){v=i;return v|0}v=c[u+96>>2]|0;c[v+48>>2]=e;c[v+52>>2]=g;c[v+56>>2]=h;v=1;return v|0}case 2:break;case 3:{h=u+88|0;v=c[h>>2]|0;g=u+92|0;e=c[g>>2]|0;c[v+4>>2]=e;c[e>>2]=v;c[h>>2]=0;c[g>>2]=0;e=b+148|0;b=e+4|0;v=c[b>>2]|0;c[b>>2]=h;c[h>>2]=e;c[g>>2]=v;c[v>>2]=h;break b}default:ra()}while(0);i=c[u+96>>2]|0;j=i+52|0;if(c[j>>2]|0){v=-5;return v|0}c[i+48>>2]=e;c[j>>2]=g;c[i+56>>2]=h;v=1;return v|0}while(0);c[l>>2]=1;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=u+8|0;h=c[g+4>>2]|0;v=d+8|0;c[v>>2]=c[g>>2];c[v+4>>2]=h;v=0;return v|0}function ud(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+16|0;u=x;w=e+4|0;v=c[w>>2]|0;r=v+24|0;if((c[r>>2]|0)!=4){d=-20;l=x;return d|0}s=v+56|0;j=c[v+60>>2]|0;a:do if((j|0)!=(s|0)){while(1){if(!(Zg(j+13|0,f)|0))break;j=c[j+4>>2]|0;if((j|0)==(s|0))break a}if(j|0){d=-17;l=x;return d|0}}while(0);t=e+8|0;if(c[t>>2]|0)c[t>>2]=0;j=e+16|0;k=c[j>>2]|0;if(k|0){m=c[k+4>>2]|0;if(m|0)c[m>>2]=0;Mg(k);c[j>>2]=0}m=c[e>>2]|0;n=vf(104)|0;c[n+16>>2]=1;o=n+20|0;c[o>>2]=0;p=b+128|0;z=p;j=c[z+4>>2]|0;q=n+8|0;k=q;c[k>>2]=c[z>>2];c[k+4>>2]=j;k=p;k=pi(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[p>>2]=k;c[p+4>>2]=y;p=n+24|0;c[p>>2]=8;c[n+28>>2]=h&4095;c[n+32>>2]=m;c[n+36>>2]=i;Ga(n+64|0);h=b+92|0;i=c[h>>2]|0;c[h>>2]=n;c[n>>2]=b+88;c[n+4>>2]=i;c[i>>2]=n;i=b+96|0;h=i;h=pi(c[h>>2]|0,c[h+4>>2]|0,1,0)|0;c[i>>2]=h;c[i+4>>2]=y;Oa(u|0,0)|0;i=c[u>>2]|0;c[n+40>>2]=i;u=(c[u+4>>2]|0)*1e3|0;c[n+48>>2]=u;c[n+44>>2]=i;c[n+52>>2]=u;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);k=_g(f)|0;m=k+17|0;j=vf(m)|0;c[j+8>>2]=n;Ei(j+13|0,f|0,k+1|0)|0;k=v+64|0;z=c[k>>2]|0;m=z+m|0;f=pi(c[b+140>>2]|0,0,-1,-1)|0;h=y;u=pi(f|0,h|0,m|0,((m|0)<0)<<31>>31|0)|0;i=c[b+136>>2]|0;u=Ai(u|0,y|0,i|0)|0;v=y;z=pi(f|0,h|0,z|0,((z|0)<0)<<31>>31|0)|0;i=Ai(z|0,y|0,i|0)|0;z=b+112|0;h=z;i=qi(c[h>>2]|0,c[h+4>>2]|0,i|0,y|0)|0;v=pi(i|0,y|0,u|0,v|0)|0;c[z>>2]=v;c[z+4>>2]=y;c[k>>2]=m;k=c[s>>2]|0;c[k+4>>2]=j;c[j>>2]=k;c[j+4>>2]=s;c[s>>2]=j;j=c[w>>2]|0;k=j+20|0;m=c[k>>2]|0;if((m|0)<=0)ja(14992,14319,397,15011);c[k>>2]=m+-1;if((m|0)==1?(c[j+16>>2]|0)<1:0)Kd(b,j);c[o>>2]=(c[o>>2]|0)+1;c[w>>2]=n;c[t>>2]=1;c[e+12>>2]=g;j=c[p>>2]|0;do if((j|0)!=4)if((j|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=q;w=c[g+4>>2]|0;z=d+8|0;c[z>>2]=c[g>>2];c[z+4>>2]=w;z=0;l=x;return z|0}function vd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;h=i+24|0;d=c[h>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;d=i+8|0;g=c[d+4>>2]|0;f=e+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=g;c[e+16>>2]=c[h>>2]<<12|c[i+28>>2];c[e+20>>2]=c[i+32>>2];c[e+24>>2]=c[i+36>>2];f=c[i+16>>2]|0;g=e+32|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;switch(c[h>>2]|0){case 2:case 6:{d=c[i+56>>2]<<8|c[i+60>>2];f=0;break}default:{d=0;f=0}}g=e+40|0;c[g>>2]=d;c[g+4>>2]=f;g=b+140|0;f=e+56|0;c[f>>2]=c[g>>2];c[f+4>>2]=0;switch(c[h>>2]|0){case 8:{d=c[i+60>>2]|0;f=0;break}case 10:{d=_g(c[i+56>>2]|0)|0;f=0;break}case 4:{f=c[i+64>>2]|0;d=f;f=((f|0)<0)<<31>>31;break}default:{d=0;f=0}}h=e+48|0;c[h>>2]=d;c[h+4>>2]=f;g=c[g>>2]|0;h=pi(d|0,f|0,-1,-1)|0;g=pi(h|0,y|0,g|0,0)|0;b=c[b+136>>2]|0;g=Ai(g|0,y|0,b|0)|0;b=Bi(g|0,y|0,b+-9|0)|0;g=e+64|0;c[g>>2]=b;c[g+4>>2]=y;g=i+40|0;b=e+72|0;c[b>>2]=c[g>>2];c[b+4>>2]=0;b=i+48|0;c[e+80>>2]=c[b>>2];h=e+88|0;c[h>>2]=c[g>>2];c[h+4>>2]=0;c[e+96>>2]=c[b>>2];b=e+104|0;c[b>>2]=c[i+44>>2];c[b+4>>2]=0;c[e+112>>2]=c[i+52>>2];return 0}function wd(a,b,d,e,f,g,h,i,j,k,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;var s=0;p=l;l=l+16|0;n=p;m=c[b+4>>2]|0;if(d&1|0)c[m+28>>2]=e;if(d&2|0)c[m+32>>2]=f;if(d&4|0)c[m+36>>2]=g;if(d&8|0?(s=Qd(a,m,h,i)|0,s|0):0){i=s;l=p;return i|0}do if(d&32|0)if(!(d&256)){Oa(n|0,0)|0;c[m+40>>2]=c[n>>2];c[m+48>>2]=(c[n+4>>2]|0)*1e3;break}else{c[m+40>>2]=o;c[m+48>>2]=q;break}while(0);if(!(d&64)){i=0;l=p;return i|0}Oa(n|0,0)|0;c[m+44>>2]=c[n>>2];c[m+52>>2]=(c[n+4>>2]|0)*1e3;i=0;l=p;return i|0}function xd(a,b){a=a|0;b=b|0;var d=0;a=b+8|0;if(c[a>>2]|0)c[a>>2]=0;a=b+16|0;b=c[a>>2]|0;if(!b)return;d=c[b+4>>2]|0;if(d|0)c[d>>2]=0;Mg(b);c[a>>2]=0;return}function yd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;return h|0}if((c[b+24>>2]|0)!=4){h=-71;return h|0}m=b+56|0;b=c[b+60>>2]|0;a:do if((e|0)==0&(f|0)==0){e=b;i=0;d=0}else{i=0;d=0;while(1){if((b|0)==(m|0)){b=0;break}i=pi(i|0,d|0,1,0)|0;d=y;b=c[b+4>>2]|0;if(!(d>>>0<f>>>0|(d|0)==(f|0)&i>>>0<e>>>0)){e=b;break a}}return b|0}while(0);if((e|0)==(m|0)){h=0;return h|0}b=0;while(1){f=e+13|0;j=_g(f)|0;k=b+24|0;l=k+j|0;if((l|0)>(h|0)){d=11;break}i=pi(i|0,d|0,1,0)|0;d=y;p=c[e+8>>2]|0;n=p+24|0;o=c[n>>2]|0;a[g+b>>0]=(o|0)==4?-128:(o|0)==10?2:0;o=g+(b+1)|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;a[o+3>>0]=0;o=g+(b+5)|0;p=p+8|0;q=c[p>>2]|0;p=c[p+4>>2]|0;a[o>>0]=q;a[o+1>>0]=q>>>8;a[o+2>>0]=q>>>16;a[o+3>>0]=q>>>24;a[o+4>>0]=p;r=Ai(q|0,p|0,40)|0;a[o+5>>0]=r;r=Ai(q|0,p|0,48)|0;a[o+6>>0]=r;p=Ai(q|0,p|0,56)|0;a[o+7>>0]=p;o=g+(b+13)|0;a[o>>0]=i;a[o+1>>0]=i>>>8;a[o+2>>0]=i>>>16;a[o+3>>0]=i>>>24;a[o+4>>0]=d;p=Ai(i|0,d|0,40)|0;a[o+5>>0]=p;p=Ai(i|0,d|0,48)|0;a[o+6>>0]=p;p=Ai(i|0,d|0,56)|0;a[o+7>>0]=p;a[g+(b+21)>>0]=c[n>>2];b=g+(b+22)|0;a[b>>0]=j;a[b+1>>0]=(j&65535)>>>8;Ei(g+k|0,f|0,j|0)|0;e=c[e+4>>2]|0;if((e|0)==(m|0)){b=l;d=11;break}else b=l}if((d|0)==11)return b|0;return 0}function zd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=c[b+4>>2]|0;if(!(c[b+8>>2]|0)){g=-71;return g|0}if((c[h+24>>2]|0)!=8){g=-5;return g|0}if((c[b+12>>2]&3|0)==1){g=-5;return g|0}if(!(c[h+100>>2]|0)){i=c[h+60>>2]|0;a=qi(i|0,0,d|0,e|0)|0;b=y;if(!(0>e>>>0|0==(e|0)&i>>>0>d>>>0)){i=0;return i|0}i=((g|0)<0)<<31>>31;i=b>>>0<i>>>0|(b|0)==(i|0)&a>>>0<g>>>0?a:g;Ha(h+64|0,d|0,f|0,i|0);return i|0}else{a=c[b+16>>2]|0;if(!a){i=-5;return i|0}i=c[a+8>>2]|0;i=(i|0)<(g|0)?i:g;Ei(f|0,a+12|0,i|0)|0;return i|0}return 0}function Ad(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=l;l=l+4480|0;k=L+4448|0;A=L+4472|0;F=L+3408|0;H=L+2384|0;B=L+1360|0;J=L+336|0;x=L+208|0;v=L+80|0;z=L+4432|0;I=L+4464|0;w=L+4460|0;G=L+64|0;q=L+4456|0;m=L+4452|0;j=L;s=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;l=L;return h|0}if((c[s+24>>2]|0)!=8){h=-5;l=L;return h|0}if(!(c[d+12>>2]&3)){h=-5;l=L;return h|0}if(!h){h=0;l=L;return h|0}if(!(c[s+100>>2]|0)){f=pi(h|0,((h|0)<0)<<31>>31|0,e|0,f|0)|0;i=y;j=s+60|0;if(i>>>0>0|((i|0)==0?f>>>0>(c[j>>2]|0)>>>0:0)?(p=Qd(b,s,f,i)|0,p|0):0){h=p;l=L;return h|0}Oa(A|0,0)|0;c[s+40>>2]=c[A>>2];c[s+48>>2]=(c[A+4>>2]|0)*1e3;f=s+56|0;do if((c[f>>2]|0)==3){K=s+88|0;H=c[K>>2]|0;J=s+92|0;I=c[J>>2]|0;c[H+4>>2]=I;c[I>>2]=H;c[K>>2]=0;c[J>>2]=0;J=b+160|0;K=J;K=qi(c[K>>2]|0,c[K+4>>2]|0,c[j>>2]|0,0)|0;b=y;c[J>>2]=K;c[J+4>>2]=b;if((b|0)>-1|(b|0)==-1&K>>>0>4294967295){c[f>>2]=0;break}else ja(14470,14319,1283,14936)}while(0);La(s+64|0,e|0,g|0,h|0);l=L;return h|0}e=Lg(h+1|0)|0;Ei(e|0,g|0,h|0)|0;a[e+h>>0]=0;c[m>>2]=e;a:do if((se(j,64,m)|0)<0)K=104;else{do if(!(Zg(j,14688)|0)){f=c[d>>2]|0;c[A>>2]=c[m>>2];p=d+16|0;b:do if((((((c[p>>2]|0)==0?(se(J,1024,A)|0)>=0:0)?(se(x,128,A)|0)>=0:0)?(se(v,128,A)|0)>=0:0)?(se(H,1024,A)|0)>=0:0)?(se(F,1024,A)|0)>=0:0){do if(((se(B,1024,A)|0)>=0?(r=_g(B)|0,(r&1|0)==0):0)?(t=r>>1,(r|0)<=33):0){if((ze(G,B,t)|0)<0)break;if((r|0)<0){f=-5;break b}if((ve(q,A)|0)<0){f=-5;break b}o=(t|0)==0;if((t|16|0)!=16){f=-5;break b}m=(a[x>>0]|0)==0?0:x;k=(a[v>>0]|0)==0?0:v;if(_a[c[b+12>>2]&15](b,I,z,f,34812,34812)|0)ja(14692,14319,2526,14740);n=kd(b,c[I>>2]|0,F,w)|0;do if(!n){f=-2;i=b+4|0}else{Xa[c[b+76>>2]&31](b,n,c[w>>2]|0)|0;f=$a[c[b+28>>2]&3](b,z,n,c[w>>2]|0,514,384,0)|0;c:do if((f|0)<0)j=0;else{do if(a[H>>0]|0){j=ld(b,c[I>>2]|0,H)|0;if(!j){j=0;f=-2;break c}f=_a[c[b+24>>2]&15](b,z,j,0,0,0)|0;if((f|0)<0)break c;f=c[j+4>>2]|0;if((c[f+24>>2]|0)!=8)ja(14751,14319,2555,14740);if(!(c[f+56>>2]|0)){C=j;D=c[f+60>>2]|0;E=0;break}else ja(14751,14319,2555,14740)}else{C=0;D=0;E=0}while(0);i=vf(260)|0;c[i+4>>2]=c[I>>2];c[i+8>>2]=n;c[i+12>>2]=C;if(o)f=0;else{f=i+16|0;Bf(G,128,f)|0}I=vf(76)|0;c[I>>2]=0;c[I+8>>2]=0;c[I+4>>2]=i;c[i>>2]=d;c[p>>2]=I;le(b,n,J,m,k,C,D,E,2,i,f);f=0;break b}while(0);i=b+4|0;db[c[i>>2]&15](b,n);if(!j)break;db[c[i>>2]&15](b,j)}while(0);db[c[i>>2]&15](b,c[I>>2]|0);break b}while(0);f=-5}else f=-5;while(0)}else{if(!(Zg(j,14806)|0)){c[A>>2]=c[m>>2];d:do if((((se(H,1024,A)|0)>=0?(se(J,1024,A)|0)>=0:0)?(se(x,128,A)|0)>=0:0)?(se(v,128,A)|0)>=0:0){do if(((se(B,1024,A)|0)>=0?(i=_g(B)|0,(i&1|0)==0):0)?(o=i>>1,(i|0)<=33):0){if((ze(G,B,o)|0)<0)break;if((i|0)<0){f=-22;break d}j=(a[x>>0]|0)==0?0:x;i=(a[v>>0]|0)==0?0:v;switch(o|0){case 0:{f=0;break}case 16:{Bf(G,128,F)|0;f=F;break}default:{f=-22;break d}}Nd(b,H,J,j,i,f);f=0;break d}while(0);f=-22}else f=-22;while(0);break}if(!(Zg(j,14819)|0)){c[A>>2]=c[m>>2];e:do if((se(B,1024,A)|0)>=0){if((c[b>>2]|0)!=9)ja(14834,14319,1665,14849);i=b+192|0;f=c[i+4>>2]|0;if((f|0)!=(i|0)){while(1){if(!(Zg(c[f+12>>2]|0,B)|0))break;f=c[f+4>>2]|0;if((f|0)==(i|0)){f=0;break e}}if(f){Ld(f);f=0}else f=0}else f=0}else f=-22;while(0);break}if(!(Zg(j,14871)|0)){c[A>>2]=c[m>>2];if((((se(J,1024,A)|0)>=0?(se(B,1024,A)|0)>=0:0)?(xe(F,A)|0)>=0:0)?(ue(H,A)|0)>=0:0){f=Od(b,J)|0;if(!f)f=-2;else{I=F;J=H;f=Pd(b,f,B,c[I>>2]|0,c[I+4>>2]|0,c[J>>2]|0,c[J+4>>2]|0)|0}}else f=-22;break}if(!(Zg(j,14879)|0)){c[A>>2]=c[m>>2];f:do if((se(B,1024,A)|0)>=0){f=Od(b,B)|0;if(f)if((c[f+24>>2]|0)==8){switch(c[f+56>>2]|0){case 3:case 0:break;default:{f=-5;break f}}I=Jh(B,47)|0;J=f+60|0;b=Lg(c[J>>2]|0)|0;Ha(f+64|0,0,b|0,c[J>>2]|0);Ma(((I|0)==0?B:I+1|0)|0,b|0,c[J>>2]|0);Mg(b);f=0}else f=-5;else f=-2}else f=-5;while(0);break}if(Zg(j,14891)|0){if(Zg(j,14898)|0){c[k>>2]=j;hi(14913,k)|0;K=104;break a}c[A>>2]=c[m>>2];if((se(B,1024,A)|0)<0)f=-22;else{f=b+200|0;Mg(c[f>>2]|0);c[f>>2]=Lh(B)|0;f=0}break}c[A>>2]=c[m>>2];j=d+16|0;g:do if(!(c[j>>2]|0)){do if(((se(B,1024,A)|0)>=0?(n=_g(B)|0,(n&1|0)==0):0)?(u=n>>1,(n|0)<=2049):0){if((ze(J,B,u)|0)<0)break;if((n|0)<0){f=-22;break g}do if((se(B,1024,A)|0)<0)f=-1;else{f=_g(B)|0;if(f&1|0){f=-1;break}i=f>>1;if((f|0)>257){f=-1;break}f=(ze(x,B,i)|0)<0;f=f?-1:i}while(0);if((ve(F,A)|0)<0){f=-22;break g}if((ve(H,A)|0)<0){f=-22;break g}if(((c[H>>2]|0)+-1|0)>>>0>63){f=-22;break g}b=vf(76)|0;c[b>>2]=1;I=c[H>>2]|0;c[b+8>>2]=I;oe(J,u,x,f,c[F>>2]|0,I,b+12|0);c[j>>2]=b;f=0;break g}while(0);f=-22}else f=-5;while(0)}while(0);Mg(e);f=(f|0)==0?h:f}while(0);if((K|0)==104){Mg(e);f=-5}h=f;l=L;return h|0}function Bd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[b+4>>2]|0;g=c[d+4>>2]|0;if((c[g+24>>2]|0)==4){e=-1;return e|0}d=h+24|0;a:do if((c[d>>2]|0)==4?(i=h+56|0,f=c[h+60>>2]|0,(f|0)!=(i|0)):0){b=f;while(1){if(!(Zg(b+13|0,e)|0))break;b=c[b+4>>2]|0;if((b|0)==(i|0))break a}if(b|0){e=-17;return e|0}}while(0);i=g+16|0;c[i>>2]=(c[i>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);j=_g(e)|0;l=j+17|0;i=vf(l)|0;c[i+8>>2]=g;Ei(i+13|0,e|0,j+1|0)|0;e=h+56|0;h=h+64|0;j=c[h>>2]|0;g=j+l|0;l=pi(c[a+140>>2]|0,0,-1,-1)|0;k=y;d=pi(l|0,k|0,g|0,((g|0)<0)<<31>>31|0)|0;b=c[a+136>>2]|0;d=Ai(d|0,y|0,b|0)|0;f=y;j=pi(l|0,k|0,j|0,((j|0)<0)<<31>>31|0)|0;b=Ai(j|0,y|0,b|0)|0;a=a+112|0;j=a;b=qi(c[j>>2]|0,c[j+4>>2]|0,b|0,y|0)|0;f=pi(b|0,y|0,d|0,f|0)|0;c[a>>2]=f;c[a+4>>2]=y;c[h>>2]=g;a=c[e>>2]|0;c[a+4>>2]=i;c[i>>2]=a;c[i+4>>2]=e;c[e>>2]=i;e=0;return e|0}function Cd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=l;l=l+16|0;k=o;m=c[e+4>>2]|0;n=m+24|0;a:do if((c[n>>2]|0)==4?(j=m+56|0,i=c[m+60>>2]|0,(i|0)!=(j|0)):0){while(1){if(!(Zg(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(j|0))break a}if(i|0){d=-17;l=o;return d|0}}while(0);p=c[e>>2]|0;i=vf(104)|0;c[i+16>>2]=1;c[i+20>>2]=0;j=b+128|0;s=j;r=c[s+4>>2]|0;e=i+8|0;q=e;c[q>>2]=c[s>>2];c[q+4>>2]=r;q=j;q=pi(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[j>>2]=q;c[j+4>>2]=y;j=i+24|0;c[j>>2]=10;c[i+28>>2]=511;c[i+32>>2]=p;c[i+36>>2]=h;p=b+92|0;h=c[p>>2]|0;c[p>>2]=i;c[i>>2]=b+88;c[i+4>>2]=h;c[h>>2]=i;h=b+96|0;p=h;p=pi(c[p>>2]|0,c[p+4>>2]|0,1,0)|0;c[h>>2]=p;c[h+4>>2]=y;Oa(k|0,0)|0;h=c[k>>2]|0;c[i+40>>2]=h;k=(c[k+4>>2]|0)*1e3|0;c[i+48>>2]=k;c[i+44>>2]=h;c[i+52>>2]=k;c[i+56>>2]=Lh(g)|0;if((c[n>>2]|0)!=4)ja(14301,14319,456,14328);r=_g(f)|0;q=r+17|0;s=vf(q)|0;c[s+8>>2]=i;Ei(s+13|0,f|0,r+1|0)|0;i=m+56|0;r=m+64|0;p=c[r>>2]|0;q=p+q|0;g=pi(c[b+140>>2]|0,0,-1,-1)|0;h=y;m=pi(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;k=c[b+136>>2]|0;m=Ai(m|0,y|0,k|0)|0;n=y;p=pi(g|0,h|0,p|0,((p|0)<0)<<31>>31|0)|0;k=Ai(p|0,y|0,k|0)|0;p=b+112|0;h=p;k=qi(c[h>>2]|0,c[h+4>>2]|0,k|0,y|0)|0;n=pi(k|0,y|0,m|0,n|0)|0;c[p>>2]=n;c[p+4>>2]=y;c[r>>2]=q;r=c[i>>2]|0;c[r+4>>2]=s;c[s>>2]=r;c[s+4>>2]=i;c[i>>2]=s;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;q=e;r=c[q+4>>2]|0;s=d+8|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;s=0;l=o;return s|0}function Dd(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;s=l;l=l+16|0;q=s;n=c[e+4>>2]|0;r=g>>>12;o=r&15;r=r&255;switch(r&15){case 1:case 2:case 6:case 8:case 12:break;default:{d=-22;l=s;return d|0}}p=n+24|0;a:do if((c[p>>2]|0)==4?(m=n+56|0,k=c[n+60>>2]|0,(k|0)!=(m|0)):0){while(1){if(!(Zg(k+13|0,f)|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break a}if(k|0){d=-17;l=s;return d|0}}while(0);t=c[e>>2]|0;k=vf(104)|0;c[k+16>>2]=1;c[k+20>>2]=0;m=b+128|0;w=m;v=c[w+4>>2]|0;e=k+8|0;u=e;c[u>>2]=c[w>>2];c[u+4>>2]=v;u=m;u=pi(c[u>>2]|0,c[u+4>>2]|0,1,0)|0;c[m>>2]=u;c[m+4>>2]=y;m=k+24|0;c[m>>2]=o;c[k+28>>2]=g&4095;c[k+32>>2]=t;c[k+36>>2]=j;switch(r&15){case 8:{Ga(k+64|0);break}case 4:{w=k+56|0;c[w>>2]=w;c[k+60>>2]=w;break}default:{}}w=b+92|0;v=c[w>>2]|0;c[w>>2]=k;c[k>>2]=b+88;c[k+4>>2]=v;c[v>>2]=k;v=b+96|0;w=v;w=pi(c[w>>2]|0,c[w+4>>2]|0,1,0)|0;c[v>>2]=w;c[v+4>>2]=y;Oa(q|0,0)|0;v=c[q>>2]|0;c[k+40>>2]=v;w=(c[q+4>>2]|0)*1e3|0;c[k+48>>2]=w;c[k+44>>2]=v;c[k+52>>2]=w;if((o|4|0)==6){c[k+56>>2]=h;c[k+60>>2]=i}if((c[p>>2]|0)!=4)ja(14301,14319,456,14328);v=_g(f)|0;u=v+17|0;w=vf(u)|0;c[w+8>>2]=k;Ei(w+13|0,f|0,v+1|0)|0;k=n+56|0;v=n+64|0;t=c[v>>2]|0;u=t+u|0;h=pi(c[b+140>>2]|0,0,-1,-1)|0;i=y;q=pi(h|0,i|0,u|0,((u|0)<0)<<31>>31|0)|0;j=c[b+136>>2]|0;q=Ai(q|0,y|0,j|0)|0;r=y;t=pi(h|0,i|0,t|0,((t|0)<0)<<31>>31|0)|0;j=Ai(t|0,y|0,j|0)|0;t=b+112|0;i=t;j=qi(c[i>>2]|0,c[i+4>>2]|0,j|0,y|0)|0;r=pi(j|0,y|0,q|0,r|0)|0;c[t>>2]=r;c[t+4>>2]=y;c[v>>2]=u;v=c[k>>2]|0;c[v+4>>2]=w;c[w>>2]=v;c[w+4>>2]=k;c[k>>2]=w;k=c[m>>2]|0;do if((k|0)!=4)if((k|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;u=e;v=c[u+4>>2]|0;w=d+8|0;c[w>>2]=c[u>>2];c[w+4>>2]=v;w=0;l=s;return w|0}function Ed(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[f+4>>2]|0;if((c[b+24>>2]|0)!=10){e=-5;return e|0}f=c[b+56>>2]|0;b=_g(f)|0;e=e+-1|0;e=(b|0)<(e|0)?b:e;Ei(d|0,f|0,e|0)|0;a[d+e>>0]=0;e=0;return e|0}function Fd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=b+4|0;b=c[l>>2]|0;if((c[b+24>>2]|0)!=4){a=-2;return a|0}h=b+56|0;b=c[b+60>>2]|0;if((b|0)==(h|0)){a=-2;return a|0}k=b;while(1){if(!(Zg(k+13|0,d)|0))break;b=c[k+4>>2]|0;if((b|0)==(h|0)){b=-2;i=28;break}else k=b}if((i|0)==28)return b|0;if(!k){a=-2;return a|0}e=e+4|0;h=c[e>>2]|0;d=h+24|0;a:do if((c[d>>2]|0)==4?(j=h+56|0,g=c[h+60>>2]|0,(g|0)!=(j|0)):0){while(1){if(!(Zg(g+13|0,f)|0))break;b=c[g+4>>2]|0;if((b|0)==(j|0)){e=0;break a}else g=b}if(g){b=c[g+8>>2]|0;if((c[b+24>>2]|0)==4){a=-17;return a|0}else{Jd(a,h,g);h=c[e>>2]|0;e=b;d=h+24|0;break}}else e=0}else e=0;while(0);b=k+8|0;g=c[b>>2]|0;j=g+16|0;c[j>>2]=(c[j>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);i=_g(f)|0;p=i+17|0;j=vf(p)|0;c[j+8>>2]=g;Ei(j+13|0,f|0,i+1|0)|0;g=h+56|0;h=h+64|0;i=c[h>>2]|0;f=i+p|0;p=pi(c[a+140>>2]|0,0,-1,-1)|0;o=y;m=pi(p|0,o|0,f|0,((f|0)<0)<<31>>31|0)|0;n=c[a+136>>2]|0;m=Ai(m|0,y|0,n|0)|0;d=y;i=pi(p|0,o|0,i|0,((i|0)<0)<<31>>31|0)|0;n=Ai(i|0,y|0,n|0)|0;i=a+112|0;o=i;n=qi(c[o>>2]|0,c[o+4>>2]|0,n|0,y|0)|0;d=pi(n|0,y|0,m|0,d|0)|0;c[i>>2]=d;c[i+4>>2]=y;c[h>>2]=f;h=c[g>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[j+4>>2]=g;c[g>>2]=j;h=c[b>>2]|0;Jd(a,c[l>>2]|0,k);b=h+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)==1?(c[h+20>>2]|0)<1:0)Kd(a,h);if(!e){p=0;return p|0}b=e+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)!=1){p=0;return p|0}if((c[e+20>>2]|0)>=1){p=0;return p|0}Kd(a,e);p=0;return p|0}function Gd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!(Zg(d,19070)|0)){o=-2;return o|0}if(!(Zg(d,14342)|0)){o=-2;return o|0}m=b+4|0;g=c[m>>2]|0;if((c[g+24>>2]|0)!=4){o=-2;return o|0}f=g+56|0;b=c[g+60>>2]|0;if((b|0)==(f|0)){o=-2;return o|0}while(1){if(!(Zg(b+13|0,d)|0))break;e=c[b+4>>2]|0;if((e|0)==(f|0)){k=-2;l=30;break}else b=e}if((l|0)==30)return k|0;if(!b){o=-2;return o|0}i=b+8|0;j=c[i>>2]|0;do if((c[j+24>>2]|0)==4){h=j+56|0;e=c[j+60>>2]|0;a:do if((e|0)!=(h|0)){f=e;do{d=f+13|0;if(Zg(d,19070)|0?Zg(d,14342)|0:0){k=-39;l=30;break}f=c[f+4>>2]|0}while((f|0)!=(h|0));if((l|0)==30)return k|0;while(1){d=e;e=c[e+4>>2]|0;f=c[d+8>>2]|0;Jd(a,j,d);d=f+16|0;g=c[d>>2]|0;if((g|0)<=0)break;c[d>>2]=g+-1;if((g|0)==1?(c[f+20>>2]|0)<1:0)Kd(a,f);if((e|0)==(h|0))break a}ja(14345,14319,389,14362)}while(0);if(!(c[j+64>>2]|0)){n=c[m>>2]|0;o=c[i>>2]|0;break}else ja(14375,14319,576,14394)}else{n=g;o=j}while(0);Jd(a,n,b);b=o+16|0;e=c[b>>2]|0;if((e|0)<=0)ja(14345,14319,389,14362);c[b>>2]=e+-1;if((e|0)!=1){o=0;return o|0}if((c[o+20>>2]|0)>=1){o=0;return o|0}Kd(a,o);o=0;return o|0}function Hd(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Id(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Jd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=_g(d+13|0)|0;e=b+64|0;i=c[e>>2]|0;b=-17-k+i|0;k=pi(c[a+140>>2]|0,0,-1,-1)|0;j=y;f=pi(k|0,j|0,b|0,((b|0)<0)<<31>>31|0)|0;h=c[a+136>>2]|0;f=Ai(f|0,y|0,h|0)|0;g=y;i=pi(k|0,j|0,i|0,((i|0)<0)<<31>>31|0)|0;h=Ai(i|0,y|0,h|0)|0;a=a+112|0;i=a;h=qi(c[i>>2]|0,c[i+4>>2]|0,h|0,y|0)|0;g=pi(h|0,y|0,f|0,g|0)|0;f=a;c[f>>2]=g;c[f+4>>2]=y;c[e>>2]=b;if((b|0)<=-1)ja(14639,14319,554,14658);k=a;j=c[k+4>>2]|0;if((j|0)>-1|(j|0)==-1&(c[k>>2]|0)>>>0>4294967295){j=c[d>>2]|0;k=c[d+4>>2]|0;c[j+4>>2]=k;c[k>>2]=j;Mg(d);return}else ja(14451,14319,555,14658)}function Kd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c[b+16>>2]|0)ja(14404,14319,334,14421);if(c[b+20>>2]|0)ja(14432,14319,335,14421);a:do switch(c[b+24>>2]|0){case 8:{d=b+60|0;k=c[a+140>>2]|0;k=Ai(pi(pi(c[d>>2]|0,0,-1,-1)|0,y|0,k|0,0)|0,y|0,c[a+136>>2]|0)|0;h=a+112|0;i=h;k=qi(c[i>>2]|0,c[i+4>>2]|0,k|0,y|0)|0;i=y;c[h>>2]=k;c[h+4>>2]=i;if(!((i|0)>-1|(i|0)==-1&k>>>0>4294967295))ja(14451,14319,339,14421);Ia(b+64|0);switch(c[b+56>>2]|0){case 0:break a;case 3:{k=b+88|0;h=c[k>>2]|0;i=b+92|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[k>>2]=0;c[i>>2]=0;i=a+160|0;k=i;k=qi(c[k>>2]|0,c[k+4>>2]|0,c[d>>2]|0,0)|0;j=y;c[i>>2]=k;c[i+4>>2]=j;if((j|0)>-1|(j|0)==-1&k>>>0>4294967295){Ld(c[b+72>>2]|0);break a}else ja(14470,14319,348,14421);break}case 2:{k=c[b+96>>2]|0;d=c[k+8>>2]|0;if(d|0)fe(d);i=k+4|0;d=c[i>>2]|0;do if((d|0)==1){h=k+40|0;d=c[k+44>>2]|0;if((d|0)!=(h|0)){while(1){e=d;d=c[d+4>>2]|0;e=c[e+-12>>2]|0;f=e+56|0;if((c[f>>2]|0)!=2){e=18;break}g=c[e+96>>2]|0;c[f>>2]=1;Ia(e+64|0);e=c[g+52>>2]|0;if(e|0)fb[e&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){e=g+24|0;m=c[e>>2]|0;f=g+28|0;l=c[f>>2]|0;c[m+4>>2]=l;c[l>>2]=m;c[e>>2]=0;c[f>>2]=0}e=c[g+16>>2]|0;if(e|0)ke(e);Mg(g);if((d|0)==(h|0)){e=26;break}}if((e|0)==18)ja(14496,14319,754,14532);else if((e|0)==26){j=c[i>>2]|0;e=27;break}}}else{j=d;e=27}while(0);if((e|0)==27?(j|0)==2:0){l=k+24|0;i=c[l>>2]|0;m=k+28|0;j=c[m>>2]|0;c[i+4>>2]=j;c[j>>2]=i;c[l>>2]=0;c[m>>2]=0}d=c[k+16>>2]|0;if(d|0)ke(d);Mg(k);Ld(c[b+72>>2]|0);break a}case 1:{Ld(c[b+72>>2]|0);break a}default:ra()}break}case 10:{Mg(c[b+56>>2]|0);break}case 4:{if((c[b+60>>2]|0)!=(b+56|0))ja(14550,14319,376,14421);break}default:{}}while(0);m=c[b>>2]|0;l=c[b+4>>2]|0;c[m+4>>2]=l;c[l>>2]=m;Mg(b);b=a+96|0;l=b;m=c[l>>2]|0;l=c[l+4>>2]|0;a=pi(m|0,l|0,-1,-1)|0;c[b>>2]=a;c[b+4>>2]=y;if((l|0)>0|(l|0)==0&m>>>0>0)return;else ja(14580,14319,384,14421)}function Ld(a){a=a|0;var b=0,d=0;b=a+8|0;d=c[b>>2]|0;if((d|0)<=0)ja(14601,14319,1609,14620);d=d+-1|0;c[b>>2]=d;if(d|0)return;Mg(c[a+12>>2]|0);Mg(c[a+16>>2]|0);Mg(c[a+20>>2]|0);Mg(c[a+24>>2]|0);b=c[a>>2]|0;d=c[a+4>>2]|0;c[b+4>>2]=d;c[d>>2]=b;Mg(a);return}function Md(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;d=c[g+8>>2]|0;if(d|0)db[c[b+4>>2]&15](b,d);h=c[g+12>>2]|0;d=b+4|0;if(h|0)db[c[d>>2]&15](b,h);db[c[d>>2]&15](b,c[g+4>>2]|0);d=c[g>>2]|0;if(!d){Mg(g);return}b=c[d+16>>2]|0;h=(f|0)<0;e=h?e:0;a[b+12>>0]=e;a[b+13>>0]=e>>>8;a[b+14>>0]=e>>>16;a[b+15>>0]=e>>>24;c[b+8>>2]=4;c[b+4>>2]=0;Mg(g);return}function Nd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((c[a>>2]|0)!=9)ja(14834,14319,1629,14972);h=a+192|0;a=c[h+4>>2]|0;a:do if((a|0)!=(h|0)){while(1){if(!(Zg(c[a+12>>2]|0,b)|0))break;a=c[a+4>>2]|0;if((a|0)==(h|0)){i=8;break a}}if(a){Mg(c[a+16>>2]|0);Mg(c[a+20>>2]|0);Mg(c[a+24>>2]|0);h=a}else i=8}else i=8;while(0);if((i|0)==8){i=vf(276)|0;c[i+12>>2]=Lh(b)|0;c[i+8>>2]=1;b=c[h>>2]|0;c[b+4>>2]=i;c[i>>2]=b;c[i+4>>2]=h;c[h>>2]=i;h=i}c[h+16>>2]=Lh(d)|0;if(!e)a=0;else a=Lh(e)|0;c[h+20>>2]=a;if(!f)a=0;else a=Lh(f)|0;c[h+24>>2]=a;a=h+28|0;if(!g){c[a>>2]=0;return}else{c[a>>2]=1;Ei(h+32|0,g|0,244)|0;return}}function Od(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+1024|0;g=h;if(!b){g=0;l=h;return g|0}b=c[b+144>>2]|0;d=(a[d>>0]|0)==47?d+1|0:d;a:do if(a[d>>0]|0)while(1){e=ch(d,47)|0;if(!e){f=_g(d)|0;e=0}else{f=e-d|0;e=e+1|0}if(f>>>0>1023){b=0;break a}Ei(g|0,d|0,f|0)|0;a[g+f>>0]=0;if((c[b+24>>2]|0)!=4){b=0;break a}d=b+56|0;b=c[b+60>>2]|0;if((b|0)==(d|0)){b=0;break a}while(1){if(!(Zg(b+13|0,g)|0))break;b=c[b+4>>2]|0;if((b|0)==(d|0)){b=0;break a}}if(!b){b=0;break a}b=c[b+8>>2]|0;if(!e)break;else d=e}while(0);g=b;l=h;return g|0}function Pd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if((c[a>>2]|0)!=9)ja(14834,14319,1687,14957);k=a+192|0;i=c[k+4>>2]|0;if((i|0)==(k|0)){l=-2;return l|0}j=i;while(1){if(!(Zg(c[j+12>>2]|0,d)|0))break;i=c[j+4>>2]|0;if((i|0)==(k|0)){i=-2;l=13;break}else j=i}if((l|0)==13)return i|0;if(!j){l=-2;return l|0}if((c[b+24>>2]|0)!=8){l=-5;return l|0}i=b+56|0;if(c[i>>2]|0){l=-5;return l|0}if(c[b+68>>2]|0){l=-5;return l|0}if((g|0)==0&(h|0)==0){l=0;return l|0}c[i>>2]=1;c[b+72>>2]=j;l=j+8|0;c[l>>2]=(c[l>>2]|0)+1;c[b+60>>2]=g;l=c[a+140>>2]|0;g=pi(g|0,h|0,-1,-1)|0;g=pi(g|0,y|0,l|0,0)|0;g=Ai(g|0,y|0,c[a+136>>2]|0)|0;l=a+112|0;h=l;h=pi(g|0,y|0,c[h>>2]|0,c[h+4>>2]|0)|0;c[l>>2]=h;c[l+4>>2]=y;l=b+80|0;c[l>>2]=e;c[l+4>>2]=f;l=0;return l|0}function Qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((c[b+24>>2]|0)!=8){l=-22;return l|0}if(e>>>0>0|(e|0)==0&d>>>0>4294967295){l=-28;return l|0}j=b+60|0;f=c[j>>2]|0;h=d-f|0;if(!h){l=0;return l|0}m=pi(c[a+140>>2]|0,0,-1,-1)|0;g=y;i=pi(m|0,g|0,d|0,e|0)|0;k=c[a+136>>2]|0;i=Ai(i|0,y|0,k|0)|0;l=y;g=pi(m|0,g|0,f|0,0)|0;k=Ai(g|0,y|0,k|0)|0;k=qi(i|0,l|0,k|0,y|0)|0;l=b+56|0;a:do switch(c[l>>2]|0){case 1:{if((d|0)==0&(e|0)==0)c[l>>2]=0;break}case 0:case 3:{if((h|0)<=0){f=(c[b+68>>2]<<2>>>0)/5|0;if(!(0<e>>>0|0==(e|0)&f>>>0<d>>>0)?(Ja(b+64|0,f|0)|0)<0:0){m=-28;return m|0}}else{i=a+112|0;i=pi(c[i>>2]|0,c[i+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;n=y;m=a+120|0;g=c[m+4>>2]|0;if(n>>>0>g>>>0|((n|0)==(g|0)?i>>>0>(c[m>>2]|0)>>>0:0)){n=-28;return n|0}i=b+64|0;g=c[b+68>>2]|0;do if(0<e>>>0|0==(e|0)&g>>>0<d>>>0){n=(g*5|0)>>>2;if((Ja(i|0,(0<e>>>0|0==(e|0)&n>>>0<d>>>0?d:n)|0)|0)<0){n=-28;return n|0}else{f=c[j>>2]|0;break}}while(0);Ka(i|0,f|0,0,h|0)}if((c[l>>2]|0)==3){n=b+88|0;i=c[n>>2]|0;b=b+92|0;m=c[b>>2]|0;c[i+4>>2]=m;c[m>>2]=i;c[n>>2]=0;c[b>>2]=0;b=a+160|0;n=b;n=qi(c[n>>2]|0,c[n+4>>2]|0,c[j>>2]|0,0)|0;m=y;c[b>>2]=n;c[b+4>>2]=m;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){c[l>>2]=0;break a}else ja(14470,14319,1240,14945)}break}case 2:{n=-5;return n|0}default:ra()}while(0);l=a+112|0;n=l;n=pi(c[n>>2]|0,c[n+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;m=y;c[l>>2]=n;c[l+4>>2]=m;if(!((m|0)>-1|(m|0)==-1&n>>>0>4294967295))ja(14451,14319,1248,14945);c[j>>2]=d;n=0;return n|0}function Rd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;p=q;j=b+56|0;if((c[j>>2]|0)!=1)ja(15026,14319,848,15063);k=b+60|0;m=c[k>>2]|0;o=a+160|0;r=o;r=pi(c[r>>2]|0,c[r+4>>2]|0,m|0,0)|0;t=y;h=a+168|0;g=h;s=c[g+4>>2]|0;do if((t|0)>(s|0)|((t|0)==(s|0)?r>>>0>(c[g>>2]|0)>>>0:0)?(i=a+148|0,e=c[i>>2]|0,(e|0)!=(i|0)):0){f=e+-32|0;if((c[f>>2]|0)!=3)ja(15076,14319,684,15111);g=e;while(1){e=g;g=c[g>>2]|0;if(!(c[e+-68>>2]|0)){Ia(e+-24|0);c[f>>2]=1;s=c[e>>2]|0;f=e+4|0;t=c[f>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[e>>2]=0;c[f>>2]=0;f=o;e=qi(c[f>>2]|0,c[f+4>>2]|0,c[e+-28>>2]|0,0)|0;f=y;t=o;c[t>>2]=e;c[t+4>>2]=f;if(!((f|0)>-1|(f|0)==-1&e>>>0>4294967295)){f=10;break}s=pi(e|0,f|0,m|0,0)|0;f=y;t=h;r=c[t+4>>2]|0;if((g|0)==(i|0)|((f|0)<(r|0)|((f|0)==(r|0)?s>>>0<=(c[t>>2]|0)>>>0:0))){f=14;break}}else if((g|0)==(i|0)){f=14;break}f=g+-32|0;if((c[f>>2]|0)!=3){f=7;break}}if((f|0)==7)ja(15076,14319,684,15111);else if((f|0)==10)ja(14470,14319,697,15111);else if((f|0)==14){n=c[k>>2]|0;break}}else n=m;while(0);if((Ja(b+64|0,n|0)|0)<0){t=-5;l=q;return t|0}c[j>>2]=2;g=vf(64)|0;c[g+20>>2]=0;c[g>>2]=a;c[g+12>>2]=b;c[g+4>>2]=d;switch(d|0){case 2:break;case 1:{f=g+40|0;c[f>>2]=f;c[g+44>>2]=f;f=18;break}default:f=18}if((f|0)==18){f=b+80|0;ye(p,c[f>>2]|0,c[f+4>>2]|0)|0;f=c[b+72>>2]|0;e=pe(c[f+16>>2]|0,p)|0;if(c[f+28>>2]|0)c[g+16>>2]=he(f+32|0,14,g)|0;c[g+8>>2]=ge(e,c[f+20>>2]|0,c[f+24>>2]|0,g,5,0)|0}c[b+96>>2]=g;t=0;l=q;return t|0}function Sd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a+12>>2]|0;a=a+20|0;e=c[a>>2]|0;g=(c[f+60>>2]|0)-e|0;d=g>>>0>d>>>0?d:g;La(f+64|0,e|0,b|0,d|0);c[a>>2]=d+(c[a>>2]|0);return 0}function Td(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1024|0;n=q;j=a+12|0;p=c[j>>2]|0;do if((b|0)>=0){f=a+16|0;g=c[f>>2]|0;if(!g){g=p+60|0;m=a+20|0;r=c[m>>2]|0;f=(c[g>>2]|0)-r|0;f=f>>>0>e>>>0?e:f;La(p+64|0,r|0,d|0,f|0);f=f+(c[m>>2]|0)|0;c[m>>2]=f;if(b){l=q;return}}else{if((ie(g,d,e)|0)<0)break;if(b|0){l=q;return}if((je(c[f>>2]|0)|0)<0)break;g=p+60|0;f=c[a+20>>2]|0}if((f|0)==(c[g>>2]|0)){if((c[a+4>>2]|0)==1?(o=a+40|0,i=c[a+44>>2]|0,(i|0)!=(o|0)):0){m=(c[j>>2]|0)+64|0;do{f=i;i=c[i+4>>2]|0;j=c[f+-12>>2]|0;k=j+60|0;g=c[k>>2]|0;if(g|0){b=f+8|0;a=j+64|0;f=0;h=0;d=0;e=c[b>>2]|0;b=c[b+4>>2]|0;while(1){f=qi(g|0,f|0,h|0,d|0)|0;r=y;s=r>>>0<0|(r|0)==0&f>>>0<1024;f=s?f:1024;r=s?r:0;Ha(m|0,e|0,n|0,f|0);La(a|0,h|0,n|0,f|0);e=pi(f|0,r|0,e|0,b|0)|0;b=y;h=pi(f|0,r|0,h|0,d|0)|0;d=y;g=c[k>>2]|0;if(!(d>>>0<0|(d|0)==0&h>>>0<g>>>0))break;else f=0}}Ud(j)}while((i|0)!=(o|0))}Ud(p);l=q;return}}while(0);a:do if((c[a+4>>2]|0)==1?(k=a+40|0,h=c[a+44>>2]|0,(h|0)!=(k|0)):0){while(1){f=h;h=c[h+4>>2]|0;f=c[f+-12>>2]|0;g=f+56|0;if((c[g>>2]|0)!=2)break;d=c[f+96>>2]|0;c[g>>2]=1;Ia(f+64|0);f=c[d+52>>2]|0;if(f|0)fb[f&31](c[d>>2]|0,0,-5,c[d+56>>2]|0);if((c[d+4>>2]|0)==2){r=d+24|0;n=c[r>>2]|0;s=d+28|0;o=c[s>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[r>>2]=0;c[s>>2]=0}f=c[d+16>>2]|0;if(f|0)ke(f);Mg(d);if((h|0)==(k|0))break a}ja(14496,14319,754,14532)}while(0);f=p+56|0;if((c[f>>2]|0)!=2)ja(14496,14319,754,14532);g=c[p+96>>2]|0;c[f>>2]=1;Ia(p+64|0);f=c[g+52>>2]|0;if(f|0)fb[f&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){r=g+24|0;o=c[r>>2]|0;s=g+28|0;p=c[s>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[r>>2]=0;c[s>>2]=0}f=c[g+16>>2]|0;if(f|0)ke(f);Mg(g);l=q;return}function Ud(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;e=g;d=b+56|0;if((c[d>>2]|0)!=2)ja(14496,14319,735,15125);f=c[b+96>>2]|0;h=c[f>>2]|0;c[d>>2]=3;i=b+88|0;j=h+152|0;d=c[j>>2]|0;c[j>>2]=i;c[i>>2]=h+148;c[b+92>>2]=d;c[d>>2]=i;d=h+160|0;h=d;h=pi(c[h>>2]|0,c[h+4>>2]|0,c[b+60>>2]|0,0)|0;c[d>>2]=h;c[d+4>>2]=y;d=f+52|0;if(c[d>>2]|0){c[(c[f+48>>2]|0)+8>>2]=1;h=c[b+24>>2]|0;a[e>>0]=(h|0)==4?-128:(h|0)==10?2:0;c[e+4>>2]=0;h=b+8|0;i=c[h+4>>2]|0;j=e+8|0;c[j>>2]=c[h>>2];c[j+4>>2]=i;fb[c[d>>2]&31](c[f>>2]|0,e,0,c[f+56>>2]|0)}if((c[f+4>>2]|0)==2){i=f+24|0;e=c[i>>2]|0;j=f+28|0;h=c[j>>2]|0;c[e+4>>2]=h;c[h>>2]=e;c[i>>2]=0;c[j>>2]=0}d=c[f+16>>2]|0;if(!d){Mg(f);l=g;return}ke(d);Mg(f);l=g;return}function Vd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;i=o+144|0;m=o+128|0;g=o;h=o+152|0;n=md()|0;if(!(c[8555]|0))c[8555]=n;c[n+200>>2]=Lh(15189)|0;e=n+12|0;if(_a[c[e>>2]&15](n,m,g,0,34812,34812)|0)ja(15194,14319,2070,15240);j=n+28|0;if($a[c[j>>2]&3](n,g,c[m>>2]|0,15254,514,438,0)|0)ja(15261,14319,2072,15240);k=c[m>>2]|0;c[(c[k+4>>2]|0)+100>>2]=1;db[c[n+4>>2]&15](n,k);if(!a){l=o;return n|0}k=vf(28)|0;c[k>>2]=n;f=k+4|0;c[f>>2]=Lh(a)|0;c[k+8>>2]=b;c[k+12>>2]=d;a=k+16|0;if(_a[c[e>>2]&15](n,a,m,0,34812,34812)|0)ja(15340,14319,2145,15389);Oa(h|0,0)|0;b=c[h>>2]|0;b=vi(b|0,((b|0)<0)<<31>>31|0,1e6,0)|0;h=c[h+4>>2]|0;h=pi(b|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;fh(g,128,15405,i)|0;b=qe(c[f>>2]|0,g)|0;a=jd(n,c[a>>2]|0)|0;if($a[c[j>>2]&3](n,m,a,15423,514,420,0)|0)ja(15429,14319,2154,15389);le(n,a,b,0,0,0,0,0,3,k,0);Mg(b);l=o;return n|0}function Wd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;h=n+64|0;j=n;k=n+56|0;m=n+40|0;i=n+32|0;if((f|0)<0){c[h>>2]=0-e;Xd(15505,h)}f=Lg(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);d=g+16|0;Xa[c[b+76>>2]&31](b,c[d>>2]|0,15423)|0;if((Ee(f)|0)!=1)Xd(15548,n+72|0);if((De(k,f,15569)|0)<0)Xd(15576,n+80|0);e=(Ce(i,f,15596)|0)==0;h=i;f=c[h>>2]|0;h=c[h+4>>2]|0;do if(e&(h>>>0>0|(h|0)==0&f>>>0>1048575))if((c[b>>2]|0)==9){e=c[b+140>>2]|0;i=pi(f|0,h|0,-1,-1)|0;e=pi(i|0,y|0,e|0,0)|0;e=Ai(e|0,y|0,c[b+136>>2]|0)|0;i=b+120|0;c[i>>2]=e;c[i+4>>2]=y;break}else ja(14834,14319,1677,15606);while(0);h=qe(c[g+4>>2]|0,15629)|0;Nd(b,15635,h,0,0,0);f=jd(b,c[d>>2]|0)|0;if(!($a[c[b+28>>2]&3](b,m,f,15637,514,420,0)|0)){m=k;ye(j,c[m>>2]|0,c[m+4>>2]|0)|0;m=qe(h,j)|0;le(b,f,m,0,0,0,0,0,4,g,0);Mg(h);Mg(m);l=n;return}else ja(15651,14319,2196,15743)}function Xd(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;b=c[3261]|0;di(16070,7,1,b)|0;hh(b,a,d)|0;ii(10,b)|0;Da(1)}
+function ag(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=b+584|0;i=v;j=c[i>>2]|0;if((h|0)!=2&((j&131072|0)!=0|0!=0)){u=Ai(j|0,c[i+4>>2]|0,11)|0;u=u&3}else u=d[b+550>>0]|0;if((u|0)==3){h=a[b+549>>0]|0;v=(h&255)<64;h=Bi(1,0,h&255|0)|0;h=pi(h|0,y|0,-1,-1)|0;w=e;c[w>>2]=(v?h:-1)&f;c[w+4>>2]=(v?y:-1)&g;g=0;return g|0}j=b+704|0;i=c[j>>2]|0;j=c[j+4>>2]|0;k=Ai(i|0,j|0,60)|0;if(!k){w=e;c[w>>2]=f;c[w+4>>2]=g;g=0;return g|0}t=k+-5|0;s=(N(t,-9)|0)+52|0;r=Bi(f|0,g|0,s|0)|0;s=zi(r|0,y|0,s|0)|0;if(!((s|0)==(f|0)&(y|0)==(g|0)&(k|0)>5)){g=-1;return g|0}o=Bi(i|0,j|0,12)|0;l=k+-6|0;p=b+728|0;j=0;o=o&-4096;s=y&16777215;while(1){q=((l-j|0)*9|0)+12|0;r=Ai(f|0,g|0,q|0)|0;r=o|r<<3&4088;i=qf(c[p>>2]|0,r,s)|0;if(!i){i=-1;j=26;break}if(!(c[i+32>>2]|0)){i=-1;j=26;break}k=c[i+40>>2]|0;m=i+8|0;m=qi(r|0,s|0,c[m>>2]|0,c[m+4>>2]|0)|0;m=k+m|0;k=c[m>>2]|0;m=c[m+4>>2]|0;if((k&1|0)==0&0==0){i=-1;j=26;break}o=Ai(k|0,m|0,10)|0;o=Bi(o|0,y|0,12)|0;n=y;b=Ai(k|0,m|0,1)|0;b=b&7;j=j+1|0;if(b|0){j=15;break}if((j|0)>=(t|0)){i=-1;j=26;break}else s=n}if((j|0)==15){if((b|4|0)==6){g=-1;return g|0}i=(k&16|0)!=0|0!=0;if((u|0)==1){if(i?(c[v>>2]&262144|0)==0&0==0:0){g=-1;return g|0}}else if(!i){g=-1;return g|0}if(!((((c[v>>2]&524288|0)==0&0==0?0:b>>>2)|b)&1<<h)){g=-1;return g|0}u=(k&64|0)==0&0==0;h=(h|0)==1;v=h&((k&128|0)==0&0==0);i=h?192:64;i=k|i;if((u|v?(w=qf(c[p>>2]|0,r,s)|0,w|0):0)?c[w+32>>2]|0:0){v=c[w+40>>2]|0;w=w+8|0;w=qi(r|0,s|0,c[w>>2]|0,c[w+4>>2]|0)|0;w=v+w|0;c[w>>2]=i;c[w+4>>2]=m}u=Bi(1,0,q|0)|0;h=y;v=pi(u|0,h|0,-1,-1)|0;w=y&g;h=qi(0,0,u|0,h|0)|0;g=e;c[g>>2]=o&h|v&f;c[g+4>>2]=n&y|w;g=0;return g|0}else if((j|0)==26)return i|0;return 0}function bg(b,d){b=b|0;d=d|0;if((d|0)!=64){d=0;return d|0}c[5288]=12968;c[5470]=b;b=21160;c[b>>2]=4096;c[b+4>>2]=0;a[21702]=3;a[21701]=64;a[21704]=2;b=21736;c[b>>2]=0;c[b+4>>2]=10;c[5448]=c[5448]|1315117;b=0;do{d=21888+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=25984+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=30080+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;b=b+1|0}while((b|0)!=256);b=21152;return b|0}function cg(a){a=a|0;return}function dg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;z=l;l=l+96|0;x=z+80|0;u=z+72|0;q=z+64|0;o=z+56|0;n=z+48|0;k=z+40|0;f=z+32|0;d=z+24|0;e=z+88|0;m=z;b=c[a+8>>2]|0;if(Zg(b,17419)|0)if(Zg(b,17427)|0)if(!(Zg(b,17435)|0))b=128;else{c[d>>2]=b;yg(17444,d);x=0;l=z;return x|0}else b=64;else b=32;r=vf(488)|0;c[r>>2]=c[a+4>>2];d=a+16|0;t=d;j=c[t+4>>2]|0;s=r+32|0;p=s;c[p>>2]=c[t>>2];c[p+4>>2]=j;p=r+24|0;c[p>>2]=b;j=kf()|0;t=r+20|0;c[t>>2]=j;c[j+2584>>2]=r;c[(c[t>>2]|0)+2588>>2]=8;j=bg(c[t>>2]|0,b)|0;c[r+28>>2]=j;if(!j){c[f>>2]=b;yg(17469,f);x=0;l=z;return x|0}i=c[t>>2]|0;j=d;_a[c[i+2568>>2]&15](i,-2147483648,0,c[j>>2]|0,c[j+4>>2]|0,0)|0;j=c[t>>2]|0;_a[c[j+2568>>2]&15](j,0,0,65536,0,0)|0;j=a+24|0;c[r+40>>2]=c[j>>2];if(c[j>>2]|0){sa(1,e|0)|0;j=c[e>>2]|0;j=vi(j|0,((j|0)<0)<<31>>31|0,1e7,0)|0;i=(c[e+4>>2]|0)/100|0;i=pi(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;j=r+48|0;c[j>>2]=i;c[j+4>>2]=y}rf(c[t>>2]|0,33554432,0,786432,0,r,16,13,4)|0;rf(c[t>>2]|0,1074790400,0,4194304,0,r,17,14,4)|0;j=r+72|0;b=1;do{uf(j+(b*12|0)|0,9,r,b);b=b+1|0}while((b|0)!=32);rf(c[t>>2]|0,1073774592,0,16,0,r,18,15,4)|0;b=a+44|0;c[r+12>>2]=c[b>>2];c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+4>>2]=c[t>>2];i=m+8|0;h=i;c[h>>2]=1073807360;c[h+4>>2]=0;b=c[b>>2]|0;if(!b)b=1;else{c[m+16>>2]=r+84;c[r+8>>2]=Xc(m,b)|0;h=i;h=pi(c[h>>2]|0,c[h+4>>2]|0,4096,0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;b=r+480|0;c[b>>2]=(c[b>>2]|0)+1;b=2}e=a+180|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+4|0;h=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);B=a+168+(d*12|0)+8|0;Oc(m,c[B>>2]|0)|0;c[g>>2]=c[B>>2];B=i;B=pi(c[B>>2]|0,c[B+4>>2]|0,4096,0)|0;A=i;c[A>>2]=B;c[A+4>>2]=y;b=b+1|0;c[h>>2]=(c[h>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+96|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);wc(m,c[a+48+(d*12|0)+8>>2]|0)|0;A=i;A=pi(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+164|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);dd(m,c[a+100+(d<<4)+12>>2]|0,c[a+100+(d<<4)+4>>2]|0)|0;A=i;A=pi(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0));e=b}else e=b;b=a+32|0;do if(c[b>>2]|0){d=vf(28)|0;c[r+16>>2]=d;b=c[b>>2]|0;if(!(Zg(b,17494)|0)){He(c[t>>2]|0,1090519040,0,d,c[a+36>>2]|0,c[a+40>>2]|0)|0;break}else{c[k>>2]=b;yg(17503,k);Da(1)}}while(0);b=c[a+192>>2]|0;do if(b|0)if(!(Zg(b,17535)|0)){n=m+16|0;c[n>>2]=j+(e*12|0);c[r+472>>2]=ad(m,0)|0;A=i;A=pi(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;B=r+480|0;c[B>>2]=(c[B>>2]|0)+1;c[n>>2]=j+((e+1|0)*12|0);c[r+476>>2]=ad(m,2)|0;n=i;n=pi(c[n>>2]|0,c[n+4>>2]|0,4096,0)|0;A=i;c[A>>2]=n;c[A+4>>2]=y;c[B>>2]=(c[B>>2]|0)+1;break}else{c[n>>2]=b;yg(17542,n);Da(1)}while(0);b=a+200|0;if(!(c[b>>2]|0))yg(17572,o);e=c[a+204>>2]|0;f=c[a+224>>2]|0;h=c[a+228>>2]|0;i=c[a+236>>2]|0;j=c[a+240>>2]|0;g=c[a+184>>2]|0;A=((e|0)<0)<<31>>31;B=s;a=c[B+4>>2]|0;if(a>>>0<A>>>0|((a|0)==(A|0)?(c[B>>2]|0)>>>0<e>>>0:0)){yg(17586,q);Da(1)}B=c[b>>2]|0;d=tf(c[t>>2]|0,-2147483648,0,1)|0;Ei(d|0,B|0,e|0)|0;if((h|0)>0){b=(c[p>>2]|0)==32?4194304:2097152;b=e+-1+b&0-b;Ei(d+b|0,f|0,h|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+h|0)>>>0:0)){yg(17600,u);Da(1)}else w=b}else w=0;if((j|0)>0){b=s;b=Ai(c[b>>2]|0,c[b+4>>2]|0,1)|0;b=b>>>0<134217728?b:134217728;Ei(d+b|0,i|0,j|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+j|0)>>>0:0)){yg(17615,x);Da(1)}else v=b}else v=0;B=tf(c[t>>2]|0,0,0,1)|0;sg(r,B+4160|0,w^-2147483648,0,h,((h|0)<0)<<31>>31,v|-2147483648,0,j,((j|0)<0)<<31>>31,g);c[B+4096>>2]=2147480215;c[B+4100>>2]=1431;c[B+4104>>2]=63276435;c[B+4108>>2]=-247454349;c[B+4112>>2]=163943;B=r;l=z;return B|0}function eg(a){a=a|0;var b=0;b=c[a+28>>2]|0;cb[c[(c[b>>2]|0)+4>>2]&15](b);pf(c[a+20>>2]|0);Mg(a);return}function fg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;d=i;e=a+28|0;h=c[e>>2]|0;do if(!((Va[c[(c[h>>2]|0)+24>>2]&15](h)|0)&128)){g=a+56|0;f=c[g>>2]|0;g=c[g+4>>2]|0;if(!(c[a+40>>2]|0)){a=c[e>>2]|0;a=Va[c[(c[a>>2]|0)+12>>2]&15](a)|0;a=Ai(a|0,y|0,4)|0;d=y}else{sa(1,d|0)|0;e=c[d>>2]|0;e=vi(e|0,((e|0)<0)<<31>>31|0,1e7,0)|0;d=(c[d+4>>2]|0)/100|0;d=pi(e|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;a=a+48|0;a=qi(d|0,y|0,c[a>>2]|0,c[a+4>>2]|0)|0;d=y}a=qi(f|0,g|0,a|0,d|0)|0;d=y;if((d|0)<0|(d|0)==0&a>>>0<1){db[c[(c[h>>2]|0)+16>>2]&15](h,128);b=0;break}else{g=xi(a|0,d|0,1e4,0)|0;e=y;f=((b|0)<0)<<31>>31;b=(e|0)<(f|0)|(e|0)==(f|0)&g>>>0<b>>>0?g:b;break}}while(0);h=(Va[c[(c[h>>2]|0)+28>>2]&15](h)|0)==0;l=i;return (h?0:b)|0}function gg(a,b){a=a|0;b=b|0;a=c[a+28>>2]|0;db[c[(c[a>>2]|0)+8>>2]&15](a,b);return}function hg(a){a=a|0;return 1}function ig(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;a=c[a+476>>2]|0;if(!a)return;$c(a,b,d,e,f)|0;return}function jg(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+472>>2]|0;if(!a)return;Zc(a,b,d)|0;return}function kg(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+28>>2]|0;eb[c[(c[a>>2]|0)+36>>2]&15](a,b,d);return}function lg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((d|0)!=2)ja(18248,18213,200,18365);if((b|0)<49144)switch(b|0){case 16384:{e=c[a+56>>2]|0;l=f;return e|0}case 16388:{e=c[a+56+4>>2]|0;l=f;return e|0}default:{e=0;l=f;return e|0}}switch(b|0){case 49144:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=Ai(e|0,y|0,4)|0;l=f;return e|0}else{sa(1,e|0)|0;d=c[e>>2]|0;d=vi(d|0,((d|0)<0)<<31>>31|0,1e7,0)|0;d=pi(d|0,y|0,(c[e+4>>2]|0)/100|0|0,0)|0;e=a+48|0;e=qi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;l=f;return e|0}case 49148:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=Ai(e|0,y|0,36)|0;l=f;return e|0}else{sa(1,e|0)|0;b=c[e>>2]|0;b=vi(b|0,((b|0)<0)<<31>>31|0,1e7,0)|0;d=(c[e+4>>2]|0)/100|0;d=pi(b|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;e=a+48|0;qi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;e=y;l=f;return e|0}default:{e=0;l=f;return e|0}}return 0}function mg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,226,18353);switch(b|0){case 16384:{e=a+56|0;c[e>>2]=d;c[e+4>>2]=0;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}case 16388:{b=a+56|0;e=b;c[e>>2]=c[b>>2];c[e+4>>2]=d;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}default:return}}function ng(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;if((d|0)!=2)ja(18248,18213,261,18343);if((b|0)!=2097156){h=0;return h|0}h=c[a+64>>2]|0;f=a+68|0;g=c[f>>2]|0;d=h&~g;if(!d){h=0;return h|0}b=0;while(1){if(1<<b&d|0){e=b;break}b=b+1|0;if(b>>>0>=32){e=32;break}}g=1<<e|g;c[f>>2]=g;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(h&~g))db[c[d+20>>2]&15](b,2560);else db[c[d+16>>2]&15](b,2560);h=e+1|0;return h|0}function og(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,289,18332);if((b|0)!=2097156)return;b=d+-1|0;if(b>>>0>=32)return;d=a+68|0;e=c[d>>2]&~(1<<b);c[d>>2]=e;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(c[a+64>>2]&~e)){db[c[d+20>>2]&15](b,2560);return}else{db[c[d+16>>2]&15](b,2560);return}}function pg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;b=1<<b+-1;if(!d){e=a+64|0;d=c[e>>2]&~b;c[e>>2]=d}else{e=a+64|0;d=c[e>>2]|b;c[e>>2]=d}b=c[a+28>>2]|0;e=c[b>>2]|0;if(!(d&~c[a+68>>2])){db[c[e+20>>2]&15](b,2560);return}else{db[c[e+16>>2]&15](b,2560);return}}function qg(a,b,d){a=a|0;b=b|0;d=d|0;if((d|0)!=2)ja(18248,18213,108,18322);switch(b>>>2|b<<30|0){case 0:{d=c[a+456>>2]|0;return d|0}case 1:{d=c[a+456+4>>2]|0;return d|0}case 2:{d=c[a+464>>2]|0;return d|0}case 3:{d=c[a+464+4>>2]|0;return d|0}default:{d=0;return d|0}}return 0}function rg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;i=k+8|0;if((f|0)!=2)ja(18248,18213,158,18263);switch(d>>>2|d<<30|0){case 0:{j=b+456|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 1:{d=b+456|0;f=c[d>>2]|0;g=d;c[g>>2]=f;c[g+4>>2]=e;g=e>>>16&255;if((f|0)==1&(e|0)==0){ji(18274)|0;Da(0)}h=(e&-16777216|0)==16777216&0==0;if(h&(g|0)==1){a[i>>0]=f;j=c[b+12>>2]|0;eb[c[j+4>>2]&15](c[j>>2]|0,i,1);j=d;c[j>>2]=0;c[j+4>>2]=0;j=b+464|0;c[j>>2]=0;c[j+4>>2]=16842752;l=k;return}if(h&(g|0)==0){j=d;c[j>>2]=0;c[j+4>>2]=0;l=k;return}else{i=j;c[i>>2]=f;c[i+4>>2]=e;hi(18286,j)|0;l=k;return}}case 2:{j=b+464|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 3:{i=b+464|0;j=i;c[j>>2]=c[i>>2];c[j+4>>2]=e;l=k;return}default:{l=k;return}}}function sg(b,d,e,f,g,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+160|0;v=D+136|0;t=D+128|0;u=D;A=vf(28)|0;B=A+4|0;r=c[B>>2]|0;o=r+1|0;C=A+8|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){p=A;q=c[A>>2]|0;o=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}a[q+(o<<2)>>0]=0;o=(c[p>>2]|0)+(c[B>>2]<<2)+1|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;z=A+12|0;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}x=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=x;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[A>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;ug(A,17657,17668,24);ug(A,17692,17698,21);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+2|0;p=c[C>>2]|0;if((p|0)<(o|0)){p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}else{p=A;q=c[A>>2]|0;o=r}o=q+(o<<2)|0;a[o>>0]=a[17719]|0;a[o+1>>0]=a[17720]|0;a[o+2>>0]=a[17721]|0;a[o+3>>0]=a[17722]|0;a[o+4>>0]=a[17723]|0;o=(c[p>>2]|0)+(c[B>>2]<<2)+5|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+2|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+3|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17724)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=-2137614336;vg(A,17743,0,0);ug(A,17747,17743,4);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;ug(A,17763,17770,5);ug(A,17657,17775,6);q=c[b+24>>2]|0;r=c[b+28>>2]|0;r=Va[c[(c[r>>2]|0)+32>>2]&15](r)|0;c[t>>2]=q;p=0;o=u+(fh(u,128,17781,t)|0)|0;do{if(1<<p&r){a[o>>0]=p+97;o=o+1|0}p=p+1|0}while((p|0)!=26);a[o>>0]=0;ug(A,17786,u,(_g(u)|0)+1|0);ug(A,17818,(q|0)<33?17796:17807,11);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17827)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=9713015;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;q=c[B>>2]|0;o=q+6|0;p=c[C>>2]|0;if((p|0)<(o|0)){r=(p*3|0)/2|0;r=(r|0)<(o|0)?o:r;p=Ng(c[A>>2]|0,r<<2)|0;c[A>>2]=p;c[C>>2]=r;r=A;o=c[B>>2]|0}else{r=A;p=c[A>>2]|0;o=q}o=p+(o<<2)|0;p=17843;q=o+21|0;do{a[o>>0]=a[p>>0]|0;o=o+1|0;p=p+1|0}while((o|0)<(q|0));o=(c[r>>2]|0)+(c[B>>2]<<2)+21|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+6|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+7|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;ug(A,17843,0,0);ug(A,17657,17881,15);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;vg(A,17904,-2147483648,0);ug(A,17747,17904,7);t=b+32|0;u=c[t>>2]|0;t=c[t+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){x=A;w=A;q=c[A>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;x=A;p=o+1|0;w=A}r=Ci(s|0)|0;c[B>>2]=p;c[q+(o<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=128;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;r=p+(o<<2)|0;a[r>>0]=a[17911]|0;a[r+1>>0]=a[17912]|0;a[r+2>>0]=a[17913]|0;a[r+3>>0]=a[17914]|0;a[r+4>>0]=a[17915]|0;r=(c[x>>2]|0)+(c[B>>2]<<2)+5|0;a[r>>0]=0;a[r+1>>0]=0;a[r+2>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;ug(A,17657,17916,10);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))p=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}o=p+(o<<2)|0;a[o>>0]=115;a[o+1>>0]=111;a[o+2>>0]=99;a[o+3>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[v>>2]=17926;c[v+4>>2]=17950;c[v+8>>2]=0;wg(A,0,v);ug(A,17961,0,0);vg(A,17968,33554432,0);ug(A,17657,17974,13);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=117440512;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=2;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=3072;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;vg(A,18007,1074790400,0);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;ug(A,17843,0,0);ug(A,17657,18012,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18024)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=520093696;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=4160;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16384;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=150994944;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=184549376;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;v=b+480|0;if((c[v>>2]|0)>0){u=0;do{t=(u<<12)+1073807360|0;vg(A,17535,t,0);ug(A,17657,18035,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=1048576;u=u+1|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}while((u|0)<(c[v>>2]|0))}u=c[b+16>>2]|0;if(u|0){vg(A,18047,1090519040,0);ug(A,17657,18059,19);t=c[u+16>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=65;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t>>31|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18898)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18904)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+8>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18078)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;ug(A,18085,18092,9);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;b=p+(o<<2)|0;a[b>>0]=a[18101]|0;a[b+1>>0]=a[18102]|0;a[b+2>>0]=a[18103]|0;a[b+3>>0]=a[18104]|0;a[b+4>>0]=a[18105]|0;a[b+5>>0]=a[18106]|0;a[b+6>>0]=a[18107]|0;a[(c[x>>2]|0)+(c[B>>2]<<2)+7>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;n=(n|0)==0?34812:n;ug(A,18108,n,(_g(n)|0)+1|0);if(!((g|0)==0&(h|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18117)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(f|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=Ci(e|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=pi(g|0,h|0,e|0,f|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18136)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}h=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=h}if(!((k|0)==0&(m|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18153)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(j|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=Ci(i|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=pi(k|0,m|0,i|0,j|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18172)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}m=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=m}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0)){k=p;m=c[x>>2]|0;C=o;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;xg(A,d)|0;C=c[w>>2]|0;Mg(C);C=A+16|0;C=c[C>>2]|0;Mg(C);Mg(A);l=D;return}else{k=(q*3|0)/2|0;k=(k|0)<(p|0)?p:k;m=Ng(c[w>>2]|0,k<<2)|0;c[w>>2]=m;c[C>>2]=k;C=c[B>>2]|0;k=C+1|0;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;xg(A,d)|0;C=c[w>>2]|0;Mg(C);C=A+16|0;C=c[C>>2]|0;Mg(C);Mg(A);l=D;return}}function tg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+20|0;h=c[i>>2]|0;a:do if((h|0)>0){e=c[a+16>>2]|0;d=0;while(1){f=e+d|0;if(!(Zg(f,b)|0))break;d=d+1+(_g(f)|0)|0;if((d|0)>=(h|0))break a}return d|0}while(0);f=(_g(b)|0)+1|0;g=f+h|0;d=a+24|0;e=c[d>>2]|0;if((g|0)>(e|0)){h=(e*3|0)/2|0;h=(g|0)>(h|0)?g:h;a=a+16|0;e=Ng(c[a>>2]|0,h)|0;c[a>>2]=e;c[d>>2]=h;d=c[i>>2]|0}else{e=c[a+16>>2]|0;d=h}Ei(e+d|0,b|0,f|0)|0;c[i>>2]=g;i=d;return i|0}function ug(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=a+4|0;f=c[j>>2]|0;g=f+1|0;k=a+8|0;h=c[k>>2]|0;if((h|0)>(f|0))h=c[a>>2]|0;else{f=(h*3|0)/2|0;f=(f|0)<(g|0)?g:f;h=Ng(c[a>>2]|0,f<<2)|0;c[a>>2]=h;c[k>>2]=f;f=c[j>>2]|0;g=f+1|0}c[j>>2]=g;c[h+(f<<2)>>2]=50331648;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Ng(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=Ci(e|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;b=tg(a,b)|0;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Ng(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=Ci(b|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;f=(e+3|0)/4|0;g=c[j>>2]|0;h=g+f|0;i=c[k>>2]|0;if((i|0)<(h|0)){i=(i*3|0)/2|0;i=(i|0)<(h|0)?h:i;b=Ng(c[a>>2]|0,i<<2)|0;c[a>>2]=b;c[k>>2]=i;k=a;a=c[j>>2]|0;a=b+(a<<2)|0;Ei(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;Fi(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}else{k=a;b=c[a>>2]|0;a=g;a=b+(a<<2)|0;Ei(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;Fi(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}}function vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+272|0;j=m+256|0;k=m;c[j>>2]=b;f=j+8|0;c[f>>2]=d;c[f+4>>2]=e;fh(k,256,18240,j)|0;j=a+4|0;f=c[j>>2]|0;b=f+1|0;i=a+8|0;d=c[i>>2]|0;if((d|0)>(f|0)){e=c[a>>2]|0;d=f}else{d=(d*3|0)/2|0;d=(d|0)<(b|0)?b:d;e=Ng(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=c[j>>2]|0;b=d+1|0}c[j>>2]=b;c[e+(d<<2)>>2]=16777216;f=_g(k)|0;g=f+1|0;h=(f+4|0)/4|0;b=c[j>>2]|0;d=h+b|0;e=c[i>>2]|0;if((e|0)<(d|0)){e=(e*3|0)/2|0;d=(e|0)<(d|0)?d:e;e=Ng(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=a;b=c[j>>2]|0}else{d=a;e=c[a>>2]|0}Ei(e+(b<<2)|0,k|0,g|0)|0;Fi((c[d>>2]|0)+(c[j>>2]<<2)+g|0,0,f&3^3|0)|0;c[j>>2]=(c[j>>2]|0)+h;k=a+12|0;c[k>>2]=(c[k>>2]|0)+1;l=m;return}function wg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4;if(!e)b=0;else{b=0;do{b=b+1+(_g(e)|0)|0;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4}while((e|0)!=0)}f=Lg(b)|0;c[g>>2]=d;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4;if(!e){g=0;ug(a,17657,f,g);Mg(f);l=h;return}b=0;do{d=(_g(e)|0)+1|0;Ei(f+b|0,e|0,d|0)|0;b=d+b|0;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4}while((e|0)!=0);ug(a,17657,f,b);Mg(f);l=h;return}function xg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c[b+12>>2]|0)ja(18189,18213,536,18229);i=b+4|0;e=c[i>>2]|0;f=e+1|0;g=b+8|0;h=c[g>>2]|0;if((h|0)>(e|0)){h=b;g=c[b>>2]|0}else{e=(h*3|0)/2|0;e=(e|0)<(f|0)?f:e;j=Ng(c[b>>2]|0,e<<2)|0;c[b>>2]=j;c[g>>2]=e;e=c[i>>2]|0;f=e+1|0;h=b;g=j}c[i>>2]=f;c[g+(e<<2)>>2]=150994944;e=c[i>>2]<<2;g=c[b+20>>2]|0;c[d>>2]=-302117424;c[d+20>>2]=285212672;c[d+24>>2]=268435456;c[d+28>>2]=0;c[d+32>>2]=Ci(g|0)|0;c[d+36>>2]=Ci(e|0)|0;c[d+8>>2]=671088640;Ei(d+40|0,c[h>>2]|0,e|0)|0;e=e+40|0;if(e&4)while(1){f=e+1|0;a[d+e>>0]=0;if(!(f&7)){e=f;break}else e=f}c[d+16>>2]=Ci(e|0)|0;j=d+e|0;i=j;c[i>>2]=0;c[i+4>>2]=0;j=j+8|0;c[j>>2]=0;c[j+4>>2]=0;e=e+16|0;c[d+12>>2]=Ci(e|0)|0;Ei(d+e|0,c[b+16>>2]|0,g|0)|0;e=e+g|0;if(!(e&7)){j=e;b=Ci(j|0)|0;d=d+4|0;c[d>>2]=b;return j|0}f=e;while(1){e=f+1|0;a[d+f>>0]=0;if(!(e&7))break;else f=e}b=Ci(e|0)|0;j=d+4|0;c[j>>2]=b;return e|0}function yg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;gi(a,e)|0;l=d;return}function zg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+24|0;f=g+16|0;e=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Se(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[e>>2]=b;yg(18376,e);i=-1;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;yg(18401,f);i=-1;l=g;return i|0}}return 0}function Ag(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+16|0;f=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Se(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[d>>2]=e;i=0;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;yg(18401,f);i=-1;l=g;return i|0}}return 0}function Bg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=vf(24)|0;c[f>>2]=a;c[f+4>>2]=d;c[f+8>>2]=e;c[a>>2]=Lh(b)|0;if(!(Fe(b)|0))Cg();else{c[f+12>>2]=10;c[f+16>>2]=f;ge(b,0,0,f,16,1)|0;return}}function Cg(){ra()}function Dg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;oa=l;l=l+816|0;ma=oa+796|0;na=oa+744|0;ja=oa+736|0;ga=oa+728|0;fa=oa+720|0;ea=oa+712|0;da=oa+704|0;ca=oa+696|0;ba=oa+688|0;aa=oa+680|0;$=oa+672|0;_=oa+664|0;Y=oa+656|0;X=oa+648|0;W=oa+640|0;V=oa+632|0;U=oa+624|0;T=oa+616|0;ia=oa+608|0;P=oa+600|0;O=oa+592|0;N=oa+584|0;M=oa+576|0;L=oa+568|0;K=oa+560|0;ha=oa+552|0;H=oa+544|0;G=oa+536|0;F=oa+528|0;E=oa+520|0;D=oa+512|0;J=oa+504|0;A=oa+488|0;v=oa+480|0;u=oa+472|0;t=oa+464|0;s=oa+456|0;r=oa+448|0;q=oa+440|0;p=oa+432|0;j=oa+424|0;i=oa+416|0;n=oa+408|0;m=oa+400|0;k=oa+392|0;h=oa+384|0;g=oa+376|0;C=oa+288|0;w=oa+256|0;x=oa+792|0;z=oa+748|0;S=oa;la=oa+368|0;pa=oa+360|0;B=oa+352|0;I=oa+344|0;R=oa+336|0;Z=oa+328|0;f=oa+320|0;ka=c[b>>2]|0;$e(pa,d,e);e=pa;d=c[e>>2]|0;e=c[e+4>>2]|0;pa=la;c[pa>>2]=d;c[pa+4>>2]=e;if((d|0)==7){c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];c[g>>2]=We(ma)|0;yg(18452,g);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);Da(1)}pa=w;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18463);pa=C;d=c[pa+4>>2]|0;a:do switch(c[pa>>2]|0){case 6:{c[h>>2]=18463;yg(18376,h);Q=6;break}case 1:{if((d|0)!=1)if((d|0)>1){yg(18471,m);Da(1)}else{yg(18527,n);Da(1)}m=la;n=c[m+4>>2]|0;pa=w;c[pa>>2]=c[m>>2];c[pa+4>>2]=n;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18633);switch(c[C>>2]|0){case 6:{c[i>>2]=18633;yg(18376,i);break}case 0:{g=Lh((c[C+4>>2]|0)+4|0)|0;c[ka+8>>2]=g;d=c[3252]|0;e=ch(d,44)|0;b:do if(!e){o=d;Q=20}else{h=_g(g)|0;while(1){if((e-d|0)==(h|0)?(Rh(g,d,h)|0)==0:0)break b;d=e+1|0;e=ch(d,44)|0;if(!e){o=d;Q=20;break}}}while(0);if((Q|0)==20?Zg(g,o)|0:0){c[ka+4>>2]=0;c[p>>2]=g;yg(18662,p);break a}c[ka+4>>2]=13008;cb[c[13012>>2]&15](ka);pa=la;d=c[pa+4>>2]|0;e=w;c[e>>2]=c[pa>>2];c[e+4>>2]=d;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18688);e=C;d=c[e>>2]|0;e=c[e+4>>2]|0;switch(d|0){case 6:{c[q>>2]=18688;yg(18376,q);break}case 1:{q=ka+16|0;c[q>>2]=Bi(zi(d|0,e|0,32)|0,y|0,20)|0;c[q+4>>2]=y;q=la;r=c[q+4>>2]|0;pa=w;c[pa>>2]=c[q>>2];c[pa+4>>2]=r;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18700);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+196>>2]=Lh((c[C+4>>2]|0)+4|0)|0;break}default:{c[s>>2]=18700;yg(18641,s);break a}}r=la;s=c[r+4>>2]|0;pa=w;c[pa>>2]=c[r>>2];c[pa+4>>2]=s;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18705);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+220>>2]=Lh((c[C+4>>2]|0)+4|0)|0;break}default:{c[t>>2]=18705;yg(18641,t);break a}}s=la;t=c[s+4>>2]|0;pa=w;c[pa>>2]=c[s>>2];c[pa+4>>2]=t;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18712);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+232>>2]=Lh((c[C+4>>2]|0)+4|0)|0;break}default:{c[u>>2]=18712;yg(18641,u);break a}}t=la;u=c[t+4>>2]|0;pa=w;c[pa>>2]=c[t>>2];c[pa+4>>2]=u;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18719);switch(c[C>>2]|0){case 6:break;case 0:{d=(c[C+4>>2]|0)+4|0;xf(ma);h=C;i=z+36|0;c:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 0:break c;case 36:{e=d+1|0;if((a[e>>0]|0)==123){e=C;g=d+2|0;d:while(1){d=a[g>>0]|0;switch(d<<24>>24){case 0:case 125:break d;default:{}}if((e-h|0)>>>0<31){a[e>>0]=d;d=e+1|0}else d=e;e=d;g=g+1|0}a[e>>0]=0;d=(a[g>>0]|0)==125?g+1|0:g;if(!(Zg(C,18727)|0)){Ra(x|0)|0;Pa(x|0,z|0)|0;u=c[i>>2]|0;v=(u|0)/60|0;u=(u|0)<-59;v=u?0-v|0:v;pa=(v|0)/60|0;c[A>>2]=u?43:45;c[A+4>>2]=pa;c[A+8>>2]=v-(pa*60|0);fh(w,32,18730,A)|0;zf(ma,w)}}else{d=e;Q=52}break}default:{d=d+1|0;Q=52}}if((Q|0)==52){Q=0;yf(ma,g)}}yf(ma,0);c[ka+184>>2]=c[ma>>2];break}default:{c[v>>2]=18719;yg(18641,v);break a}}i=ka+96|0;c[J>>2]=c[i>>2];fh(S,256,18745,J)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(B,ma,S);e=B;d=c[e>>2]|0;e:do if((d|0)==6)Q=68;else{h=J+4|0;g=J+4|0;e=c[e+4>>2]|0;f:while(1){if((c[i>>2]|0)>3){Q=58;break}pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Se(J,ma,18770);switch(c[J>>2]|0){case 6:{Q=60;break f}case 0:break;default:{Q=61;break f}}pa=Lh((c[h>>2]|0)+4|0)|0;c[ka+48+((c[i>>2]|0)*12|0)+4>>2]=pa;pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Se(J,ma,18775);switch(c[J>>2]|0){case 6:{d=0;break}case 0:{d=Lh((c[g>>2]|0)+4|0)|0;break}default:{Q=65;break f}}c[ka+48+((c[i>>2]|0)*12|0)>>2]=d;e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[H>>2]=e;fh(S,256,18745,H)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(B,ma,S);e=B;d=c[e>>2]|0;if((d|0)==6){Q=68;break e}else e=c[e+4>>2]|0}if((Q|0)==58){yg(18753,D);break}else if((Q|0)==60){c[E>>2]=18770;yg(18376,E)}else if((Q|0)==61){c[F>>2]=18770;yg(18641,F)}else if((Q|0)==65){c[G>>2]=18775;yg(18641,G);break a}break a}while(0);g:do if((Q|0)==68){j=ka+164|0;c[ha>>2]=c[j>>2];fh(S,256,18782,ha)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(I,ma,S);e=I;d=c[e>>2]|0;h:do if((d|0)!=6){h=ha+4|0;i=ha+4|0;e=c[e+4>>2]|0;i:while(1){if((c[j>>2]|0)>3){Q=71;break}pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Se(ha,ma,18770);switch(c[ha>>2]|0){case 6:{Q=73;break i}case 0:break;default:{Q=74;break i}}pa=Lh((c[h>>2]|0)+4|0)|0;c[ka+100+(c[j>>2]<<4)+8>>2]=pa;pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Se(ha,ma,18809);j:do switch(c[ha>>2]|0){case 6:{d=c[j>>2]|0;if(!d){d=S;e=18813;g=d+10|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(g|0));d=S;break j}else{c[O>>2]=d;fh(S,256,18823,O)|0;d=S;break j}}case 0:{d=(c[i>>2]|0)+4|0;break}default:{Q=77;break i}}while(0);d=Lh(d)|0;e=c[j>>2]|0;c[ka+100+(e<<4)+4>>2]=d;e=e+1|0;c[j>>2]=e;c[P>>2]=e;fh(S,256,18782,P)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(I,ma,S);e=I;d=c[e>>2]|0;if((d|0)==6)break h;else e=c[e+4>>2]|0}if((Q|0)==71){yg(18787,K);break g}else if((Q|0)==73){c[L>>2]=18770;yg(18376,L)}else if((Q|0)==74){c[M>>2]=18770;yg(18641,M)}else if((Q|0)==77){c[N>>2]=18809;yg(18641,N);break a}break a}while(0);i=ka+180|0;c[ia>>2]=c[i>>2];fh(S,256,18835,ia)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(R,ma,S);e=R;d=c[e>>2]|0;k:do if((d|0)!=6){g=ia+4|0;h=ia+4|0;e=c[e+4>>2]|0;l:while(1){if((c[i>>2]|0)>0){Q=86;break}pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18871);switch(c[ia>>2]|0){case 6:{Q=88;break l}case 0:break;default:{Q=89;break l}}pa=(c[g>>2]|0)+4|0;P=Lh(pa)|0;c[ka+168+((c[i>>2]|0)*12|0)>>2]=P;if(!(Zg(pa,18878)|0)){pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18882);switch(c[ia>>2]|0){case 6:{Q=93;break l}case 0:break;default:{Q=94;break l}}pa=Lh((c[h>>2]|0)+4|0)|0;c[ka+168+((c[i>>2]|0)*12|0)+4>>2]=pa}e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[Y>>2]=e;fh(S,256,18835,Y)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(R,ma,S);e=R;d=c[e>>2]|0;if((d|0)==6)break k;else e=c[e+4>>2]|0}if((Q|0)==86){yg(18841,T);break g}else if((Q|0)==88){c[U>>2]=18871;yg(18376,U);Q=90}else if((Q|0)==89){c[V>>2]=18871;yg(18641,V);Q=90}else if((Q|0)==93){c[W>>2]=18882;yg(18376,W);Q=95}else if((Q|0)==94){c[X>>2]=18882;yg(18641,X);Q=95}if((Q|0)==90)break a;else if((Q|0)==95)break a}while(0);d=ka+32|0;c[d>>2]=0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(Z,ma,18889);g=Z;e=c[g>>2]|0;g=c[g+4>>2]|0;m:do if((e|0)!=6){pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18775);switch(c[ia>>2]|0){case 6:{c[_>>2]=18775;yg(18376,_);break}case 0:{c[d>>2]=Lh((c[ia+4>>2]|0)+4|0)|0;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18898);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[aa>>2]=18898;yg(18376,aa);break}case 1:{c[ka+36>>2]=d;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18904);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[ca>>2]=18904;yg(18376,ca);break}case 1:{c[ka+40>>2]=d;pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18911);switch(c[ia>>2]|0){case 6:break m;case 0:{c[ka+208>>2]=Lh((c[ia+4>>2]|0)+4|0)|0;break m}default:{c[ea>>2]=18911;yg(18641,ea);break a}}}default:{c[da>>2]=18904;yg(18401,da)}}break a}default:{c[ba>>2]=18898;yg(18401,ba)}}break a}default:{c[$>>2]=18775;yg(18641,$)}}break a}while(0);da=la;ea=c[da+4>>2]|0;pa=ha;c[pa>>2]=c[da>>2];c[pa+4>>2]=ea;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18920);switch(c[ia>>2]|0){case 6:{d=0;break}case 0:{d=Lh((c[ia+4>>2]|0)+4|0)|0;break}default:{c[fa>>2]=18920;yg(18641,fa);break a}}c[ka+192>>2]=d;ea=la;fa=c[ea+4>>2]|0;pa=ha;c[pa>>2]=c[ea>>2];c[pa+4>>2]=fa;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18933);n:do switch(c[ia>>2]|0){case 6:break;case 0:{d=(c[ia+4>>2]|0)+4|0;if(!(Zg(d,18939)|0)){c[ka+188>>2]=0;break n}if(!(Zg(d,18944)|0)){c[ka+188>>2]=1;break n}c[ja>>2]=d;yg(18949,ja);Da(1);break}default:{c[ga>>2]=18933;yg(18641,ga);break a}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(f,ma,18981);switch(c[f>>2]|0){case 4:{c[ka+28>>2]=c[f+4>>2];c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);pa=b+20|0;c[pa>>2]=0;Fg(b);l=oa;return}case 6:{c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);pa=b+20|0;c[pa>>2]=0;Fg(b);l=oa;return}default:{c[na>>2]=18981;yg(18996,na);break a}}}while(0);Da(1);break}default:{c[r>>2]=18688;yg(18401,r)}}break a}default:{c[j>>2]=18633;yg(18641,j)}}break}default:{c[k>>2]=18463;yg(18401,k);Q=6}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);Da(1)}function Eg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if((b|0)<0){c[f>>2]=0-b;yg(18423,f);Da(1)}else{eb[c[a+12>>2]&15](c[a+16>>2]|0,d,e);l=g;return}}function Fg(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=c[b>>2]|0;f=b+20|0;d=c[f>>2]|0;a:do if((d|0)<4)while(1){e=c[g+196+(d*12|0)>>2]|0;if(e|0)break a;e=d+1|0;c[f>>2]=e;if((d|0)<3)d=e;else{d=e;h=5;break}}else h=5;while(0);do if((h|0)==5){if((d|0)!=4){e=c[g+196+(d*12|0)>>2]|0;break}d=c[b+4>>2]|0;if(d|0)cb[d&15](c[b+8>>2]|0);Mg(b);return}while(0);d=c[g>>2]|0;if((((d|0)!=0?(ch(e,58)|0)==0:0)?(a[e>>0]|0)!=47:0)?(i=Jh(d,47)|0,(i|0)!=0):0){g=i+1-d|0;h=(_g(e)|0)+1|0;i=Lg(h+g|0)|0;Ei(i|0,d|0,g|0)|0;Ei(i+g|0,e|0,h|0)|0;d=i}else d=Lh(e)|0;if(!(Fe(d)|0))Cg();c[b+12>>2]=11;c[b+16>>2]=b;ge(d,0,0,b,16,1)|0;Mg(d);return}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;g=Lg(d)|0;e=a+20|0;c[f+196+((c[e>>2]|0)*12|0)+4>>2]=g;Ei(c[f+196+((c[e>>2]|0)*12|0)+4>>2]|0,b|0,d|0)|0;c[f+196+((c[e>>2]|0)*12|0)+8>>2]=d;c[e>>2]=(c[e>>2]|0)+1;Fg(a);return}function Hg(b,d){b=b|0;d=d|0;var e=0,f=0;if((a[d>>0]|0)==33){e=Lh(d+1|0)|0;d=b+184|0;b=c[d>>2]|0;Mg(b);c[d>>2]=e;return}else{e=b+184|0;f=c[e>>2]|0;f=(f|0)==0?34812:f;b=_g(f)|0;b=Lg(b+2+(_g(d)|0)|0)|0;$g(b,f)|0;f=b+(_g(b)|0)|0;a[f>>0]=32;a[f+1>>0]=0;ah(b,d)|0;d=b;b=c[e>>2]|0;Mg(b);c[e>>2]=d;return}}function Ig(a){a=a|0;var b=0,d=0;Mg(c[a+8>>2]|0);Mg(c[a+184>>2]|0);Mg(c[a+196>>2]|0);Mg(c[a+200>>2]|0);Mg(c[a+208>>2]|0);Mg(c[a+212>>2]|0);Mg(c[a+220>>2]|0);Mg(c[a+224>>2]|0);Mg(c[a+232>>2]|0);Mg(c[a+236>>2]|0);d=a+96|0;if((c[d>>2]|0)>0){b=0;do{Mg(c[a+48+(b*12|0)+4>>2]|0);Mg(c[a+48+(b*12|0)>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+164|0;if((c[d>>2]|0)>0){b=0;do{Mg(c[a+100+(b<<4)+8>>2]|0);Mg(c[a+100+(b<<4)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+180|0;if((c[d>>2]|0)<=0){d=a+192|0;d=c[d>>2]|0;Mg(d);d=a+32|0;d=c[d>>2]|0;Mg(d);a=c[a>>2]|0;Mg(a);return}b=0;do{Mg(c[a+168+(b*12|0)>>2]|0);Mg(c[a+168+(b*12|0)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0));d=a+192|0;d=c[d>>2]|0;Mg(d);d=a+32|0;d=c[d>>2]|0;Mg(d);a=c[a>>2]|0;Mg(a);return}function Jg(a){a=a|0;return Va[c[(c[a+4>>2]|0)+8>>2]&15](a)|0}function Kg(a){a=a|0;Fi(a|0,0,248)|0;return}function Lg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;o=x;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;n=c[8557]|0;d=n>>>a;if(d&3|0){b=(d&1^1)+a|0;a=34268+(b<<1<<2)|0;d=a+8|0;e=c[d>>2]|0;f=e+8|0;g=c[f>>2]|0;if((g|0)==(a|0))c[8557]=n&~(1<<b);else{c[g+12>>2]=a;c[d>>2]=g}w=b<<3;c[e+4>>2]=w|3;w=e+w+4|0;c[w>>2]=c[w>>2]|1;w=f;l=x;return w|0}m=c[8559]|0;if(k>>>0>m>>>0){if(d|0){b=2<<a;b=d<<a&(b|0-b);b=(b&0-b)+-1|0;i=b>>>12&16;b=b>>>i;d=b>>>5&8;b=b>>>d;g=b>>>2&4;b=b>>>g;a=b>>>1&2;b=b>>>a;e=b>>>1&1;e=(d|i|g|a|e)+(b>>>e)|0;b=34268+(e<<1<<2)|0;a=b+8|0;g=c[a>>2]|0;i=g+8|0;d=c[i>>2]|0;if((d|0)==(b|0)){a=n&~(1<<e);c[8557]=a}else{c[d+12>>2]=b;c[a>>2]=d;a=n}w=e<<3;h=w-k|0;c[g+4>>2]=k|3;f=g+k|0;c[f+4>>2]=h|1;c[g+w>>2]=h;if(m|0){e=c[8562]|0;b=m>>>3;d=34268+(b<<1<<2)|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[8559]=h;c[8562]=f;w=i;l=x;return w|0}g=c[8558]|0;if(g){d=(g&0-g)+-1|0;f=d>>>12&16;d=d>>>f;e=d>>>5&8;d=d>>>e;h=d>>>2&4;d=d>>>h;i=d>>>1&2;d=d>>>i;j=d>>>1&1;j=c[34532+((e|f|h|i|j)+(d>>>j)<<2)>>2]|0;d=j;i=j;j=(c[j+4>>2]&-8)-k|0;while(1){a=c[d+16>>2]|0;if(!a){a=c[d+20>>2]|0;if(!a)break}h=(c[a+4>>2]&-8)-k|0;f=h>>>0<j>>>0;d=a;i=f?a:i;j=f?h:j}h=i+k|0;if(h>>>0>i>>>0){f=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){d=0;break}}while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);do if(f|0){b=c[i+28>>2]|0;a=34532+(b<<2)|0;if((i|0)==(c[a>>2]|0)){c[a>>2]=d;if(!d){c[8558]=g&~(1<<b);break}}else{w=f+16|0;c[((c[w>>2]|0)==(i|0)?w:f+20|0)>>2]=d;if(!d)break}c[d+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}b=c[i+20>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}while(0);if(j>>>0<16){w=j+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[h+4>>2]=j|1;c[h+j>>2]=j;if(m|0){e=c[8562]|0;b=m>>>3;d=34268+(b<<1<<2)|0;b=1<<b;if(!(b&n)){c[8557]=b|n;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[8559]=j;c[8562]=h}w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=k}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;e=c[8558]|0;if(e){f=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)j=31;else{n=(a+1048320|0)>>>16&8;r=a<<n;i=(r+520192|0)>>>16&4;r=r<<i;j=(r+245760|0)>>>16&2;j=14-(i|n|j)+(r<<j>>>15)|0;j=k>>>(j+7|0)&1|j<<1}else j=0;d=c[34532+(j<<2)>>2]|0;a:do if(!d){d=0;a=0;r=61}else{a=0;i=k<<((j|0)==31?0:25-(j>>>1)|0);g=0;while(1){h=(c[d+4>>2]&-8)-k|0;if(h>>>0<f>>>0)if(!h){a=d;f=0;r=65;break a}else{a=d;f=h}r=c[d+20>>2]|0;d=c[d+16+(i>>>31<<2)>>2]|0;g=(r|0)==0|(r|0)==(d|0)?g:r;if(!d){d=g;r=61;break}else i=i<<1}}while(0);if((r|0)==61){if((d|0)==0&(a|0)==0){a=2<<j;a=(a|0-a)&e;if(!a){n=k;break}n=(a&0-a)+-1|0;h=n>>>12&16;n=n>>>h;g=n>>>5&8;n=n>>>g;i=n>>>2&4;n=n>>>i;j=n>>>1&2;n=n>>>j;d=n>>>1&1;a=0;d=c[34532+((g|h|i|j|d)+(n>>>d)<<2)>>2]|0}if(!d){i=a;h=f}else r=65}if((r|0)==65){g=d;while(1){n=(c[g+4>>2]&-8)-k|0;d=n>>>0<f>>>0;f=d?n:f;a=d?g:a;d=c[g+16>>2]|0;if(!d)d=c[g+20>>2]|0;if(!d){i=a;h=f;break}else g=d}}if(((i|0)!=0?h>>>0<((c[8559]|0)-k|0)>>>0:0)?(m=i+k|0,m>>>0>i>>>0):0){g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){b=0;break}}while(1){f=b+20|0;d=c[f>>2]|0;if(!d){f=b+16|0;d=c[f>>2]|0;if(!d)break;else{b=d;a=f}}else{b=d;a=f}}c[a>>2]=0}else{w=c[i+8>>2]|0;c[w+12>>2]=b;c[b+8>>2]=w}while(0);do if(g){a=c[i+28>>2]|0;d=34532+(a<<2)|0;if((i|0)==(c[d>>2]|0)){c[d>>2]=b;if(!b){e=e&~(1<<a);c[8558]=e;break}}else{w=g+16|0;c[((c[w>>2]|0)==(i|0)?w:g+20|0)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[i+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[i+20>>2]|0;if(a){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);b:do if(h>>>0<16){w=h+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[m+4>>2]=h|1;c[m+h>>2]=h;b=h>>>3;if(h>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=m;c[b+12>>2]=m;c[m+8>>2]=b;c[m+12>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;d=(w+245760|0)>>>16&2;d=14-(u|v|d)+(w<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=34532+(d<<2)|0;c[m+28>>2]=d;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<d;if(!(e&a)){c[8558]=e|a;c[b>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(h|0)){e=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(h|0)){b=a;break c}else{e=e<<1;b=a}}c[d>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break b}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=m;c[v>>2]=m;c[m+8>>2]=w;c[m+12>>2]=b;c[m+24>>2]=0}while(0);w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=-1;while(0);d=c[8559]|0;if(d>>>0>=n>>>0){b=d-n|0;a=c[8562]|0;if(b>>>0>15){w=a+n|0;c[8562]=w;c[8559]=b;c[w+4>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=n|3}else{c[8559]=0;c[8562]=0;c[a+4>>2]=d|3;w=a+d+4|0;c[w>>2]=c[w>>2]|1}w=a+8|0;l=x;return w|0}h=c[8560]|0;if(h>>>0>n>>>0){u=h-n|0;c[8560]=u;w=c[8563]|0;v=w+n|0;c[8563]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}if(!(c[8675]|0)){c[8677]=4096;c[8676]=4096;c[8678]=-1;c[8679]=-1;c[8680]=0;c[8668]=0;c[8675]=o&-16^1431655768;a=4096}else a=c[8677]|0;i=n+48|0;j=n+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=n>>>0){w=0;l=x;return w|0}a=c[8667]|0;if(a|0?(m=c[8665]|0,o=m+k|0,o>>>0<=m>>>0|o>>>0>a>>>0):0){w=0;l=x;return w|0}d:do if(!(c[8668]&4)){d=c[8563]|0;e:do if(d){e=34676;while(1){o=c[e>>2]|0;if(o>>>0<=d>>>0?(o+(c[e+4>>2]|0)|0)>>>0>d>>>0:0)break;a=c[e+8>>2]|0;if(!a){r=128;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=Gi(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[e+4>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;r=145;break d}}else{e=a;r=136}}else b=0}else r=128;while(0);do if((r|0)==128){d=Gi(0)|0;if((d|0)!=(-1|0)?(b=d,p=c[8676]|0,q=p+-1|0,b=((q&b|0)==0?0:(q+b&0-p)-b|0)+k|0,p=c[8665]|0,q=b+p|0,b>>>0>n>>>0&b>>>0<2147483647):0){o=c[8667]|0;if(o|0?q>>>0<=p>>>0|q>>>0>o>>>0:0){b=0;break}a=Gi(b|0)|0;if((a|0)==(d|0)){h=b;g=d;r=145;break d}else{e=a;r=136}}else b=0}while(0);do if((r|0)==136){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;r=145;break d}a=c[8677]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;r=145;break d}if((Gi(a|0)|0)==(-1|0)){Gi(d|0)|0;b=0;break}else{h=a+b|0;g=e;r=145;break d}}while(0);c[8668]=c[8668]|4;r=143}else{b=0;r=143}while(0);if(((r|0)==143?k>>>0<2147483647:0)?(u=Gi(k|0)|0,q=Gi(0)|0,s=q-u|0,t=s>>>0>(n+40|0)>>>0,!((u|0)==(-1|0)|t^1|u>>>0<q>>>0&((u|0)!=(-1|0)&(q|0)!=(-1|0))^1)):0){h=t?s:b;g=u;r=145}if((r|0)==145){b=(c[8665]|0)+h|0;c[8665]=b;if(b>>>0>(c[8666]|0)>>>0)c[8666]=b;j=c[8563]|0;f:do if(j){b=34676;while(1){a=c[b>>2]|0;d=c[b+4>>2]|0;if((g|0)==(a+d|0)){r=154;break}e=c[b+8>>2]|0;if(!e)break;else b=e}if(((r|0)==154?(v=b+4|0,(c[b+12>>2]&8|0)==0):0)?g>>>0>j>>>0&a>>>0<=j>>>0:0){c[v>>2]=d+h;w=(c[8560]|0)+h|0;u=j+8|0;u=(u&7|0)==0?0:0-u&7;v=j+u|0;u=w-u|0;c[8563]=v;c[8560]=u;c[v+4>>2]=u|1;c[j+w+4>>2]=40;c[8564]=c[8679];break}if(g>>>0<(c[8561]|0)>>>0)c[8561]=g;d=g+h|0;b=34676;while(1){if((c[b>>2]|0)==(d|0)){r=162;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((r|0)==162?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;m=b+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;k=m+n|0;i=b-m-n|0;c[m+4>>2]=n|3;g:do if((j|0)==(b|0)){w=(c[8560]|0)+i|0;c[8560]=w;c[8563]=k;c[k+4>>2]=w|1}else{if((c[8562]|0)==(b|0)){w=(c[8559]|0)+i|0;c[8559]=w;c[8562]=k;c[k+4>>2]=w|1;c[k+w>>2]=w;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;e=a>>>3;h:do if(a>>>0<256){a=c[b+8>>2]|0;d=c[b+12>>2]|0;if((d|0)==(a|0)){c[8557]=c[8557]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}else{g=c[b+24>>2]|0;a=c[b+12>>2]|0;do if((a|0)==(b|0)){d=b+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{w=c[b+8>>2]|0;c[w+12>>2]=a;c[a+8>>2]=w}while(0);if(!g)break;d=c[b+28>>2]|0;e=34532+(d<<2)|0;do if((c[e>>2]|0)!=(b|0)){w=g+16|0;c[((c[w>>2]|0)==(b|0)?w:g+20|0)>>2]=a;if(!a)break h}else{c[e>>2]=a;if(a|0)break;c[8558]=c[8558]&~(1<<d);break h}while(0);c[a+24>>2]=g;d=b+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(!d)break;c[a+20>>2]=d;c[d+24>>2]=a}while(0);b=b+h|0;f=h+i|0}else f=i;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;b=f>>>3;if(f>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=k;c[b+12>>2]=k;c[k+8>>2]=b;c[k+12>>2]=d;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=34532+(e<<2)|0;c[k+28>>2]=e;a=k+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[8558]|0;d=1<<e;if(!(a&d)){c[8558]=a|d;c[b>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break}b=c[b>>2]|0;i:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break i}else{e=e<<1;b=a}}c[d>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break g}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=k;c[v>>2]=k;c[k+8>>2]=w;c[k+12>>2]=b;c[k+24>>2]=0}while(0);w=m+8|0;l=x;return w|0}b=34676;while(1){a=c[b>>2]|0;if(a>>>0<=j>>>0?(w=a+(c[b+4>>2]|0)|0,w>>>0>j>>>0):0)break;b=c[b+8>>2]|0}f=w+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=j+16|0;a=a>>>0<f>>>0?j:a;b=a+8|0;d=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=d-u|0;c[8563]=v;c[8560]=u;c[v+4>>2]=u|1;c[g+d+4>>2]=40;c[8564]=c[8679];d=a+4|0;c[d>>2]=27;c[b>>2]=c[8669];c[b+4>>2]=c[8670];c[b+8>>2]=c[8671];c[b+12>>2]=c[8672];c[8669]=g;c[8670]=h;c[8672]=0;c[8671]=b;b=a+24|0;do{v=b;b=b+4|0;c[b>>2]=7}while((v+8|0)>>>0<w>>>0);if((a|0)!=(j|0)){g=a-j|0;c[d>>2]=c[d>>2]&-2;c[j+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=j;c[b+12>>2]=j;c[j+8>>2]=b;c[j+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=34532+(e<<2)|0;c[j+28>>2]=e;c[j+20>>2]=0;c[f>>2]=0;b=c[8558]|0;a=1<<e;if(!(b&a)){c[8558]=b|a;c[d>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}b=c[d>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(g|0)){b=a;break j}else{e=e<<1;b=a}}c[d>>2]=j;c[j+24>>2]=b;c[j+12>>2]=j;c[j+8>>2]=j;break f}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=j;c[v>>2]=j;c[j+8>>2]=w;c[j+12>>2]=b;c[j+24>>2]=0}}else{w=c[8561]|0;if((w|0)==0|g>>>0<w>>>0)c[8561]=g;c[8669]=g;c[8670]=h;c[8672]=0;c[8566]=c[8675];c[8565]=-1;c[8570]=34268;c[8569]=34268;c[8572]=34276;c[8571]=34276;c[8574]=34284;c[8573]=34284;c[8576]=34292;c[8575]=34292;c[8578]=34300;c[8577]=34300;c[8580]=34308;c[8579]=34308;c[8582]=34316;c[8581]=34316;c[8584]=34324;c[8583]=34324;c[8586]=34332;c[8585]=34332;c[8588]=34340;c[8587]=34340;c[8590]=34348;c[8589]=34348;c[8592]=34356;c[8591]=34356;c[8594]=34364;c[8593]=34364;c[8596]=34372;c[8595]=34372;c[8598]=34380;c[8597]=34380;c[8600]=34388;c[8599]=34388;c[8602]=34396;c[8601]=34396;c[8604]=34404;c[8603]=34404;c[8606]=34412;c[8605]=34412;c[8608]=34420;c[8607]=34420;c[8610]=34428;c[8609]=34428;c[8612]=34436;c[8611]=34436;c[8614]=34444;c[8613]=34444;c[8616]=34452;c[8615]=34452;c[8618]=34460;c[8617]=34460;c[8620]=34468;c[8619]=34468;c[8622]=34476;c[8621]=34476;c[8624]=34484;c[8623]=34484;c[8626]=34492;c[8625]=34492;c[8628]=34500;c[8627]=34500;c[8630]=34508;c[8629]=34508;c[8632]=34516;c[8631]=34516;w=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=w-u|0;c[8563]=v;c[8560]=u;c[v+4>>2]=u|1;c[g+w+4>>2]=40;c[8564]=c[8679]}while(0);b=c[8560]|0;if(b>>>0>n>>>0){u=b-n|0;c[8560]=u;w=c[8563]|0;v=w+n|0;c[8563]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}}c[(Ug()|0)>>2]=12;w=0;l=x;return w|0}function Mg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;d=a+-8|0;f=c[8561]|0;a=c[a+-4>>2]|0;b=a&-8;j=d+b|0;do if(!(a&1)){e=c[d>>2]|0;if(!(a&3))return;h=d+(0-e)|0;g=e+b|0;if(h>>>0<f>>>0)return;if((c[8562]|0)==(h|0)){a=j+4|0;b=c[a>>2]|0;if((b&3|0)!=3){i=h;b=g;break}c[8559]=g;c[a>>2]=b&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}d=e>>>3;if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[8557]=c[8557]&~(1<<d);i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){b=h+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){a=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;d=34532+(b<<2)|0;if((c[d>>2]|0)==(h|0)){c[d>>2]=a;if(!a){c[8558]=c[8558]&~(1<<b);i=h;b=g;break}}else{i=f+16|0;c[((c[i>>2]|0)==(h|0)?i:f+20|0)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=h+16|0;d=c[b>>2]|0;if(d|0){c[a+16>>2]=d;c[d+24>>2]=a}b=c[b+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=d;h=d}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;e=c[a>>2]|0;if(!(e&1))return;if(!(e&2)){if((c[8563]|0)==(j|0)){j=(c[8560]|0)+b|0;c[8560]=j;c[8563]=i;c[i+4>>2]=j|1;if((i|0)!=(c[8562]|0))return;c[8562]=0;c[8559]=0;return}if((c[8562]|0)==(j|0)){j=(c[8559]|0)+b|0;c[8559]=j;c[8562]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[8557]=c[8557]&~(1<<d);break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){d=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0;d=a}else{d=c[j+8>>2]|0;c[d+12>>2]=a;c[a+8>>2]=d;d=a}while(0);if(g|0){a=c[j+28>>2]|0;b=34532+(a<<2)|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=d;if(!d){c[8558]=c[8558]&~(1<<a);break}}else{e=g+16|0;c[((c[e>>2]|0)==(j|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;a=j+16|0;b=c[a>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}a=c[a+4>>2]|0;if(a|0){c[d+20>>2]=a;c[a+24>>2]=d}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[8562]|0)){c[8559]=f;return}}else{c[a>>2]=e&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}a=f>>>3;if(f>>>0<256){d=34268+(a<<1<<2)|0;b=c[8557]|0;a=1<<a;if(!(b&a)){c[8557]=b|a;a=d;b=d+8|0}else{b=d+8|0;a=c[b>>2]|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)e=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;e=(j+245760|0)>>>16&2;e=14-(g|h|e)+(j<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;a=34532+(e<<2)|0;c[i+28>>2]=e;c[i+20>>2]=0;c[i+16>>2]=0;b=c[8558]|0;d=1<<e;a:do if(!(b&d)){c[8558]=b|d;c[a>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i}else{a=c[a>>2]|0;b:do if((c[a+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=a+16+(e>>>31<<2)|0;b=c[d>>2]|0;if(!b)break;if((c[b+4>>2]&-8|0)==(f|0)){a=b;break b}else{e=e<<1;a=b}}c[d>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i;break a}while(0);h=a+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=a;c[i+24>>2]=0}while(0);j=(c[8565]|0)+-1|0;c[8565]=j;if(j|0)return;a=34684;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[8565]=-1;return}function Ng(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=Lg(b)|0;return b|0}if(b>>>0>4294967231){c[(Ug()|0)>>2]=12;b=0;return b|0}d=Og(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=Lg(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;Ei(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Mg(a);b=d;return b|0}function Og(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=a+4|0;m=c[l>>2]|0;d=m&-8;i=a+d|0;if(!(m&3)){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[8677]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;k=a+b|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|3;m=i+4|0;c[m>>2]=c[m>>2]|1;Pg(k,d);return a|0}if((c[8563]|0)==(i|0)){k=(c[8560]|0)+d|0;d=k-b|0;e=a+b|0;if(k>>>0<=b>>>0){a=0;return a|0}c[l>>2]=m&1|b|2;c[e+4>>2]=d|1;c[8563]=e;c[8560]=d;return a|0}if((c[8562]|0)==(i|0)){e=(c[8559]|0)+d|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){k=a+b|0;e=a+e|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|1;c[e>>2]=d;e=e+4|0;c[e>>2]=c[e>>2]&-2;e=k}else{c[l>>2]=m&1|e|2;e=a+e+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[8559]=d;c[8562]=e;return a|0}e=c[i+4>>2]|0;if(e&2|0){a=0;return a|0}j=(e&-8)+d|0;if(j>>>0<b>>>0){a=0;return a|0}k=j-b|0;f=e>>>3;do if(e>>>0<256){e=c[i+8>>2]|0;d=c[i+12>>2]|0;if((d|0)==(e|0)){c[8557]=c[8557]&~(1<<f);break}else{c[e+12>>2]=d;c[d+8>>2]=e;break}}else{h=c[i+24>>2]|0;d=c[i+12>>2]|0;do if((d|0)==(i|0)){e=i+16|0;f=e+4|0;d=c[f>>2]|0;if(!d){d=c[e>>2]|0;if(!d){f=0;break}}else e=f;while(1){g=d+20|0;f=c[g>>2]|0;if(!f){g=d+16|0;f=c[g>>2]|0;if(!f)break;else{d=f;e=g}}else{d=f;e=g}}c[e>>2]=0;f=d}else{f=c[i+8>>2]|0;c[f+12>>2]=d;c[d+8>>2]=f;f=d}while(0);if(h|0){d=c[i+28>>2]|0;e=34532+(d<<2)|0;if((c[e>>2]|0)==(i|0)){c[e>>2]=f;if(!f){c[8558]=c[8558]&~(1<<d);break}}else{g=h+16|0;c[((c[g>>2]|0)==(i|0)?g:h+20|0)>>2]=f;if(!f)break}c[f+24>>2]=h;d=i+16|0;e=c[d>>2]|0;if(e|0){c[f+16>>2]=e;c[e+24>>2]=f}d=c[d+4>>2]|0;if(d|0){c[f+20>>2]=d;c[d+24>>2]=f}}}while(0);if(k>>>0<16){c[l>>2]=m&1|j|2;m=a+j+4|0;c[m>>2]=c[m>>2]|1;return a|0}else{i=a+b|0;c[l>>2]=m&1|b|2;c[i+4>>2]=k|3;m=a+j+4|0;c[m>>2]=c[m>>2]|1;Pg(i,k);return a|0}return 0}function Pg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){f=c[a>>2]|0;if(!(d&3))return;h=a+(0-f)|0;b=f+b|0;if((c[8562]|0)==(h|0)){a=i+4|0;d=c[a>>2]|0;if((d&3|0)!=3)break;c[8559]=b;c[a>>2]=d&-2;c[h+4>>2]=b|1;c[i>>2]=b;return}e=f>>>3;if(f>>>0<256){a=c[h+8>>2]|0;d=c[h+12>>2]|0;if((d|0)==(a|0)){c[8557]=c[8557]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}g=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){d=h+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{f=c[h+8>>2]|0;c[f+12>>2]=a;c[a+8>>2]=f}while(0);if(g){d=c[h+28>>2]|0;e=34532+(d<<2)|0;if((c[e>>2]|0)==(h|0)){c[e>>2]=a;if(!a){c[8558]=c[8558]&~(1<<d);break}}else{f=g+16|0;c[((c[f>>2]|0)==(h|0)?f:g+20|0)>>2]=a;if(!a)break}c[a+24>>2]=g;d=h+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(d){c[a+20>>2]=d;c[d+24>>2]=a}}}else h=a;while(0);a=i+4|0;e=c[a>>2]|0;if(!(e&2)){if((c[8563]|0)==(i|0)){i=(c[8560]|0)+b|0;c[8560]=i;c[8563]=h;c[h+4>>2]=i|1;if((h|0)!=(c[8562]|0))return;c[8562]=0;c[8559]=0;return}if((c[8562]|0)==(i|0)){i=(c[8559]|0)+b|0;c[8559]=i;c[8562]=h;c[h+4>>2]=i|1;c[h+i>>2]=i;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){a=c[i+8>>2]|0;b=c[i+12>>2]|0;if((b|0)==(a|0)){c[8557]=c[8557]&~(1<<d);break}else{c[a+12>>2]=b;c[b+8>>2]=a;break}}else{g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+16|0;d=a+4|0;b=c[d>>2]|0;if(!b){b=c[a>>2]|0;if(!b){d=0;break}}else a=d;while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);if(g|0){b=c[i+28>>2]|0;a=34532+(b<<2)|0;if((c[a>>2]|0)==(i|0)){c[a>>2]=d;if(!d){c[8558]=c[8558]&~(1<<b);break}}else{e=g+16|0;c[((c[e>>2]|0)==(i|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;b=i+16|0;a=c[b>>2]|0;if(a|0){c[d+16>>2]=a;c[a+24>>2]=d}b=c[b+4>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}}while(0);c[h+4>>2]=f|1;c[h+f>>2]=f;if((h|0)==(c[8562]|0)){c[8559]=f;return}}else{c[a>>2]=e&-2;c[h+4>>2]=b|1;c[h+b>>2]=b;f=b}b=f>>>3;if(f>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=h;c[b+12>>2]=h;c[h+8>>2]=b;c[h+12>>2]=d;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{g=(b+1048320|0)>>>16&8;i=b<<g;d=(i+520192|0)>>>16&4;i=i<<d;e=(i+245760|0)>>>16&2;e=14-(d|g|e)+(i<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=34532+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[h+16>>2]=0;a=c[8558]|0;d=1<<e;if(!(a&d)){c[8558]=a|d;c[b>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}b=c[b>>2]|0;a:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break a}else{e=e<<1;b=a}}c[d>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}while(0);g=b+8|0;i=c[g>>2]|0;c[i+12>>2]=h;c[g>>2]=h;c[h+8>>2]=i;c[h+12>>2]=b;c[h+24>>2]=0;return}function Qg(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Vg(c[a+60>>2]|0)|0;a=Tg(pa(6,d|0)|0)|0;l=b;return a|0}function Rg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+32|0;g=n+16|0;f=n;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=Tg(na(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=b+(o<<31>>31)|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=Tg(na(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function Sg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((Tg(ma(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function Tg(a){a=a|0;if(a>>>0>4294963200){c[(Ug()|0)>>2]=0-a;a=-1}return a|0}function Ug(){return 34788}function Vg(a){a=a|0;return a|0}function Wg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=1;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,oa(54,f|0)|0):0)a[b+75>>0]=-1;f=Rg(b,d,e)|0;l=g;return f|0}function Xg(a){a=a|0;return (a+-48|0)>>>0<10|0}function Yg(){return 13300}function Zg(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function _g(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=5;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=5;break}}}while(0);if((e|0)==5){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function $g(a,b){a=a|0;b=b|0;bh(a,b)|0;return a|0}function ah(a,b){a=a|0;b=b|0;$g(a+(_g(a)|0)|0,b)|0;return a|0}function bh(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=10}else f=10;while(0);if((f|0)==10){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function ch(b,c){b=b|0;c=c|0;b=eh(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function dh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else i=16;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)==g<<24>>24)if(!e){i=16;break}else break;f=N(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break c;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break}}else i=11;while(0);if((i|0)==11)if(!e){i=16;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;e=e+-1|0;if(!e){i=16;break}else b=b+1|0}}while(0);if((i|0)==16)b=0;return b|0}function eh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(_g(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=N(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function fh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f;c[g>>2]=e;e=gh(a,b,d,g)|0;l=f;return e|0}function gh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=13544;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(Ug()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=hh(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function hh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+208|0;p=s+160|0;q=s+80|0;r=s;f=p;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((ih(0,d,n,q,p)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)o=jh(b)|0;else o=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=ih(b,d,n,q,p)|0;if(h){Xa[c[b+36>>2]&31](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=ih(b,d,n,q,p)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(o|0)kh(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function ih(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+64|0;D=I+56|0;E=I+40|0;A=I;G=I+48|0;H=I+60|0;c[D>>2]=e;w=(d|0)!=0;x=A+40|0;z=x;A=A+39|0;B=G+4|0;j=0;e=0;m=0;a:while(1){do{do if((e|0)>-1)if((j|0)>(2147483647-e|0)){c[(Ug()|0)>>2]=75;e=-1;break}else{e=j+e|0;break}while(0);s=c[D>>2]|0;j=a[s>>0]|0;if(!(j<<24>>24)){v=94;break a}k=s;b:while(1){switch(j<<24>>24){case 37:{v=10;break b}case 0:{j=k;break b}default:{}}u=k+1|0;c[D>>2]=u;j=a[u>>0]|0;k=u}c:do if((v|0)==10){v=0;j=k;do{if((a[k+1>>0]|0)!=37)break c;j=j+1|0;k=k+2|0;c[D>>2]=k}while((a[k>>0]|0)==37)}while(0);j=j-s|0;if(w)lh(d,s,j)}while((j|0)!=0);u=(Xg(a[(c[D>>2]|0)+1>>0]|0)|0)==0;k=c[D>>2]|0;if(!u?(a[k+2>>0]|0)==36:0){q=(a[k+1>>0]|0)+-48|0;o=1;j=3}else{q=-1;o=m;j=1}j=k+j|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>31|(1<<m&75913|0)==0)n=0;else{n=0;do{n=1<<m|n;j=j+1|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0}while(!(m>>>0>31|(1<<m&75913|0)==0))}if(k<<24>>24==42){if((Xg(a[j+1>>0]|0)|0)!=0?(F=c[D>>2]|0,(a[F+2>>0]|0)==36):0){j=F+1|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;m=1;k=F+3|0}else{if(o|0){e=-1;break}if(w){u=(c[f>>2]|0)+(4-1)&~(4-1);j=c[u>>2]|0;c[f>>2]=u+4}else j=0;m=0;k=(c[D>>2]|0)+1|0}c[D>>2]=k;u=(j|0)<0;t=u?0-j|0:j;n=u?n|8192:n;u=m}else{j=mh(D)|0;if((j|0)<0){e=-1;break}t=j;u=o;k=c[D>>2]|0}do if((a[k>>0]|0)==46){j=k+1|0;if((a[j>>0]|0)!=42){c[D>>2]=j;j=mh(D)|0;k=c[D>>2]|0;break}if(Xg(a[k+2>>0]|0)|0?(C=c[D>>2]|0,(a[C+3>>0]|0)==36):0){j=C+2|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;k=C+4|0;c[D>>2]=k;break}if(u|0){e=-1;break a}if(w){r=(c[f>>2]|0)+(4-1)&~(4-1);j=c[r>>2]|0;c[f>>2]=r+4}else j=0;k=(c[D>>2]|0)+2|0;c[D>>2]=k}else j=-1;while(0);r=0;while(1){if(((a[k>>0]|0)+-65|0)>>>0>57){e=-1;break a}m=k;k=k+1|0;c[D>>2]=k;m=a[(a[m>>0]|0)+-65+(10304+(r*58|0))>>0]|0;o=m&255;if((o+-1|0)>>>0>=8)break;else r=o}if(!(m<<24>>24)){e=-1;break}p=(q|0)>-1;do if(m<<24>>24==19)if(p){e=-1;break a}else v=54;else{if(p){c[i+(q<<2)>>2]=o;p=g+(q<<3)|0;q=c[p+4>>2]|0;v=E;c[v>>2]=c[p>>2];c[v+4>>2]=q;v=54;break}if(!w){e=0;break a}nh(E,o,f);k=c[D>>2]|0;v=55}while(0);if((v|0)==54){v=0;if(w)v=55;else j=0}d:do if((v|0)==55){v=0;k=a[k+-1>>0]|0;k=(r|0)!=0&(k&15|0)==3?k&-33:k;m=n&-65537;q=(n&8192|0)==0?n:m;e:do switch(k|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[E>>2]>>2]=e;j=0;break d}case 1:{c[c[E>>2]>>2]=e;j=0;break d}case 2:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}case 3:{b[c[E>>2]>>1]=e;j=0;break d}case 4:{a[c[E>>2]>>0]=e;j=0;break d}case 6:{c[c[E>>2]>>2]=e;j=0;break d}case 7:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}default:{j=0;break d}}case 112:{k=120;j=j>>>0>8?j:8;m=q|8;v=67;break}case 88:case 120:{m=q;v=67;break}case 111:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;p=ph(k,m,x)|0;v=z-p|0;n=0;o=19018;j=(q&8|0)==0|(j|0)>(v|0)?j:v+1|0;v=73;break}case 105:case 100:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;if((m|0)<0){k=qi(0,0,k|0,m|0)|0;m=y;n=E;c[n>>2]=k;c[n+4>>2]=m;n=1;o=19018;v=72;break e}else{n=(q&2049|0)!=0&1;o=(q&2048|0)==0?((q&1|0)==0?19018:19020):19019;v=72;break e}}case 117:{m=E;n=0;o=19018;k=c[m>>2]|0;m=c[m+4>>2]|0;v=72;break}case 99:{a[A>>0]=c[E>>2];r=A;n=0;o=19018;p=1;j=z;break}case 109:{k=rh(c[(Ug()|0)>>2]|0)|0;v=77;break}case 115:{k=c[E>>2]|0;k=(k|0)==0?19028:k;v=77;break}case 67:{c[G>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=G;o=-1;v=81;break}case 83:{if(!j){sh(d,32,t,0,q);j=0;v=91}else{o=j;v=81}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{j=uh(d,+h[E>>3],t,j,q,k)|0;break d}default:{r=s;n=0;o=19018;p=j;m=q;j=z}}while(0);f:do if((v|0)==67){s=E;r=c[s>>2]|0;s=c[s+4>>2]|0;p=oh(r,s,x,k&32)|0;o=(m&8|0)==0|(r|0)==0&(s|0)==0;n=o?0:2;o=o?19018:19018+(k>>>4)|0;q=m;k=r;m=s;v=73}else if((v|0)==72){p=qh(k,m,x)|0;v=73}else if((v|0)==77){v=0;s=dh(k,0,j)|0;q=(s|0)==0;r=k;n=0;o=19018;p=q?j:s-k|0;j=q?k+j|0:s}else if((v|0)==81){v=0;n=c[E>>2]|0;j=0;while(1){k=c[n>>2]|0;if(!k)break;k=th(H,k)|0;m=(k|0)<0;if(m|k>>>0>(o-j|0)>>>0){v=85;break}j=k+j|0;if(o>>>0>j>>>0)n=n+4|0;else break}if((v|0)==85){v=0;if(m){e=-1;break a}}sh(d,32,t,j,q);if(!j){j=0;v=91}else{m=c[E>>2]|0;n=0;while(1){k=c[m>>2]|0;if(!k){v=91;break f}k=th(H,k)|0;n=k+n|0;if((n|0)>(j|0)){v=91;break f}lh(d,H,k);if(n>>>0>=j>>>0){v=91;break}else m=m+4|0}}}while(0);if((v|0)==73){v=0;m=(k|0)!=0|(m|0)!=0;s=(j|0)!=0|m;m=z-p+((m^1)&1)|0;r=s?p:x;p=s?((j|0)>(m|0)?j:m):0;m=(j|0)>-1?q&-65537:q;j=z}else if((v|0)==91){v=0;sh(d,32,t,j,q^8192);j=(t|0)>(j|0)?t:j;break}q=j-r|0;p=(p|0)<(q|0)?q:p;s=p+n|0;j=(t|0)<(s|0)?s:t;sh(d,32,j,s,m);lh(d,o,n);sh(d,48,j,s,m^65536);sh(d,48,p,q,0);lh(d,r,q);sh(d,32,j,s,m^8192)}while(0);m=u}g:do if((v|0)==94)if(!d)if(!m)e=0;else{e=1;while(1){j=c[i+(e<<2)>>2]|0;if(!j)break;nh(g+(e<<3)|0,j,f);e=e+1|0;if(e>>>0>=10){e=1;break g}}while(1){if(c[i+(e<<2)>>2]|0){e=-1;break g}e=e+1|0;if(e>>>0>=10){e=1;break}}}while(0);l=I;return e|0}function jh(a){a=a|0;return 0}function kh(a){a=a|0;return}function lh(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))Gh(b,d,a)|0;return}function mh(b){b=b|0;var d=0,e=0;if(!(Xg(a[c[b>>2]>>0]|0)|0))d=0;else{d=0;do{e=c[b>>2]|0;d=(d*10|0)+-48+(a[e>>0]|0)|0;e=e+1|0;c[b>>2]=e}while((Xg(a[e>>0]|0)|0)!=0)}return d|0}function nh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function oh(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[10768+(b&15)>>0]|0|f;b=Ai(b|0,c|0,4)|0;c=y}while(!((b|0)==0&(c|0)==0));return e|0}function ph(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Ai(b|0,c|0,3)|0;c=y}while(!((b|0)==0&(c|0)==0));return d|0}function qh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){do{e=b;b=xi(b|0,c|0,10,0)|0;f=c;c=y;g=vi(b|0,c|0,10,0)|0;g=qi(e|0,f|0,g|0,y|0)|0;d=d+-1|0;a[d>>0]=g&255|48}while(f>>>0>9|(f|0)==9&e>>>0>4294967295);c=b}else c=b;if(c)do{g=c;c=(c>>>0)/10|0;d=d+-1|0;a[d>>0]=g-(c*10|0)|48}while(g>>>0>=10);return d|0}function rh(a){a=a|0;return Bh(a,c[(Ah()|0)+188>>2]|0)|0}function sh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Fi(f|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{lh(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}lh(a,f,e)}l=g;return}function th(a,b){a=a|0;b=b|0;if(!a)a=0;else a=yh(a,b,0)|0;return a|0}function uh(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+32|0;v=H+536|0;G=H;F=G;n=H+540|0;c[v>>2]=0;E=n+12|0;vh(e)|0;j=y;if((j|0)<0){e=-e;vh(e)|0;D=1;C=19035;j=y}else{D=(h&2049|0)!=0&1;C=(h&2048|0)==0?((h&1|0)==0?19036:19041):19038}do if(0==0&(j&2146435072|0)==2146435072){G=(i&32|0)!=0;j=D+3|0;sh(b,32,f,j,h&-65537);lh(b,C,D);lh(b,e!=e|0.0!=0.0?(G?19062:19066):G?19054:19058,3);sh(b,32,f,j,h^8192)}else{r=+wh(e,v)*2.0;j=r!=0.0;if(j)c[v>>2]=(c[v>>2]|0)+-1;u=i|32;if((u|0)==97){p=i&32;s=(p|0)==0?C:C+9|0;q=D|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[s>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[v>>2]|0;j=(k|0)<0?0-k|0:k;j=qh(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;k=(g|0)<1;m=(h&8|0)==0;n=G;do{D=~~e;j=n+1|0;a[n>>0]=p|d[10768+D>>0];e=(e-+(D|0))*16.0;if((j-F|0)==1?!(m&(k&e==0.0)):0){a[j>>0]=46;n=n+2|0}else n=j}while(e!=0.0);if((g|0)!=0?(-2-F+n|0)<(g|0):0){k=E;m=o;j=g+2+k-m|0}else{k=E;m=o;j=k-F-m+n|0}E=j+q|0;sh(b,32,f,E,h);lh(b,s,q);sh(b,48,f,E,h^65536);F=n-F|0;lh(b,G,F);G=k-m|0;sh(b,48,j-(F+G)|0,0,0);lh(b,o,G);sh(b,32,f,E,h^8192);j=E;break}k=(g|0)<0?6:g;if(j){j=(c[v>>2]|0)+-28|0;c[v>>2]=j;e=r*268435456.0}else{e=r;j=c[v>>2]|0}B=(j|0)<0?m:m+288|0;m=B;do{z=~~e>>>0;c[m>>2]=z;m=m+4|0;e=(e-+(z>>>0))*1.0e9}while(e!=0.0);z=B;if((j|0)>0){p=B;while(1){o=(j|0)<29?j:29;j=m+-4|0;if(j>>>0>=p>>>0){n=0;do{t=Bi(c[j>>2]|0,0,o|0)|0;t=pi(t|0,y|0,n|0,0)|0;w=y;n=xi(t|0,w|0,1e9,0)|0;x=vi(n|0,y|0,1e9,0)|0;x=qi(t|0,w|0,x|0,y|0)|0;c[j>>2]=x;j=j+-4|0}while(j>>>0>=p>>>0);if(n){x=p+-4|0;c[x>>2]=n;n=x}else n=p}else n=p;a:do if(m>>>0>n>>>0){j=m;while(1){m=j+-4|0;if(c[m>>2]|0){m=j;break a}if(m>>>0>n>>>0)j=m;else break}}while(0);j=(c[v>>2]|0)-o|0;c[v>>2]=j;if((j|0)>0)p=n;else break}}else n=B;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(u|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0<m>>>0){o=(1<<s)+-1|0;p=1e9>>>s;q=0;j=n;do{x=c[j>>2]|0;c[j>>2]=(x>>>s)+q;q=N(x&o,p)|0;j=j+4|0}while(j>>>0<m>>>0);n=(c[n>>2]|0)==0?n+4|0:n;if(q){c[m>>2]=q;m=m+4|0}}else n=(c[n>>2]|0)==0?n+4|0:n;j=t?B:n;m=(m-j>>2|0)>(g|0)?j+(g<<2)|0:m;j=(c[v>>2]|0)+s|0;c[v>>2]=j}while((j|0)<0);t=n}else t=n;if(t>>>0<m>>>0){j=(z-t>>2)*9|0;o=c[t>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;j=j+1|0}while(o>>>0>=n>>>0)}}else j=0;w=(u|0)==103;x=(k|0)!=0;n=k-((u|0)==102?0:j)+((x&w)<<31>>31)|0;if((n|0)<(((m-z>>2)*9|0)+-9|0)){v=n+9216|0;n=(v|0)/9|0;g=B+4+(n+-1024<<2)|0;n=v-(n*9|0)|0;if((n|0)<8){o=10;while(1){o=o*10|0;if((n|0)<7)n=n+1|0;else break}}else o=10;q=c[g>>2]|0;n=(q>>>0)/(o>>>0)|0;s=q-(N(n,o)|0)|0;p=(g+4|0)==(m|0);if(!(p&(s|0)==0)){r=(n&1|0)==0?9007199254740992.0:9007199254740994.0;v=o>>>1;e=s>>>0<v>>>0?.5:p&(s|0)==(v|0)?1.0:1.5;if(D){v=(a[C>>0]|0)==45;e=v?-e:e;r=v?-r:r}n=q-s|0;c[g>>2]=n;if(r+e!=r){v=n+o|0;c[g>>2]=v;if(v>>>0>999999999){o=g;j=t;while(1){n=o+-4|0;c[o>>2]=0;if(n>>>0<j>>>0){j=j+-4|0;c[j>>2]=0}v=(c[n>>2]|0)+1|0;c[n>>2]=v;if(v>>>0>999999999)o=n;else{o=j;break}}}else{n=g;o=t}j=(z-o>>2)*9|0;q=c[o>>2]|0;if(q>>>0>=10){p=10;do{p=p*10|0;j=j+1|0}while(q>>>0>=p>>>0)}}else{n=g;o=t}}else{n=g;o=t}v=n+4|0;m=m>>>0>v>>>0?v:m}else o=t;g=0-j|0;b:do if(m>>>0>o>>>0)while(1){n=m+-4|0;if(c[n>>2]|0){v=m;u=1;break b}if(n>>>0>o>>>0)m=n;else{v=n;u=0;break}}else{v=m;u=0}while(0);do if(w){k=k+((x^1)&1)|0;if((k|0)>(j|0)&(j|0)>-5){p=i+-1|0;k=k+-1-j|0}else{p=i+-2|0;k=k+-1|0}if(!(h&8)){if(u?(A=c[v+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){n=0;m=10;do{m=m*10|0;n=n+1|0}while(!((A>>>0)%(m>>>0)|0|0))}else n=0;else n=9;m=((v-z>>2)*9|0)+-9|0;if((p|32|0)==102){i=m-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}else{i=m+j-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}}}else p=i;while(0);t=(k|0)!=0;q=t?1:h>>>3&1;s=(p|32|0)==102;if(s){w=0;j=(j|0)>0?j:0}else{m=(j|0)<0?g:j;m=qh(m,((m|0)<0)<<31>>31,E)|0;n=E;if((n-m|0)<2)do{m=m+-1|0;a[m>>0]=48}while((n-m|0)<2);a[m+-1>>0]=(j>>31&2)+43;j=m+-2|0;a[j>>0]=p;w=j;j=n-j|0}j=D+1+k+q+j|0;sh(b,32,f,j,h);lh(b,C,D);sh(b,48,f,j,h^65536);if(s){q=o>>>0>B>>>0?B:o;s=G+9|0;o=s;p=G+8|0;n=q;do{m=qh(c[n>>2]|0,0,s)|0;if((n|0)==(q|0)){if((m|0)==(s|0)){a[p>>0]=48;m=p}}else if(m>>>0>G>>>0){Fi(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}lh(b,m,o-m|0);n=n+4|0}while(n>>>0<=B>>>0);if(!((h&8|0)==0&(t^1)))lh(b,19070,1);if(n>>>0<v>>>0&(k|0)>0)while(1){m=qh(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){Fi(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}lh(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0<v>>>0&(k|0)>9)){k=m;break}else k=m}sh(b,48,k+9|0,9,0)}else{v=u?v:o+4|0;if(o>>>0<v>>>0&(k|0)>-1){g=G+9|0;t=(h&8|0)==0;u=g;q=0-F|0;s=G+8|0;p=o;do{m=qh(c[p>>2]|0,0,g)|0;if((m|0)==(g|0)){a[s>>0]=48;m=s}do if((p|0)==(o|0)){n=m+1|0;lh(b,m,1);if(t&(k|0)<1){m=n;break}lh(b,19070,1);m=n}else{if(m>>>0<=G>>>0)break;Fi(G|0,48,m+q|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=u-m|0;lh(b,m,(k|0)>(F|0)?F:k);k=k-F|0;p=p+4|0}while(p>>>0<v>>>0&(k|0)>-1)}sh(b,48,k+18|0,18,0);lh(b,w,E-w|0)}sh(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function vh(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;y=c[j+4>>2]|0;return b|0}function wh(a,b){a=+a;b=b|0;return +(+xh(a,b))}function xh(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Ai(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+xh(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function yh(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(zh()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(Ug()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(Ug()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function zh(){return Yg()|0}function Ah(){return Yg()|0}function Bh(b,e){b=b|0;e=e|0;var f=0,g=0;f=0;while(1){if((d[10784+f>>0]|0)==(b|0)){g=4;break}f=f+1|0;if((f|0)==87){b=87;g=5;break}}if((g|0)==4)if(!f)f=10880;else{b=f;g=5}if((g|0)==5){f=10880;do{do{g=f;f=f+1|0}while((a[g>>0]|0)!=0);b=b+-1|0}while((b|0)!=0)}return Ch(f,c[e+20>>2]|0)|0}function Ch(a,b){a=a|0;b=b|0;return Dh(a,b)|0}function Dh(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Eh(c[b>>2]|0,c[b+4>>2]|0,a)|0;return ((b|0)==0?a:b)|0}function Eh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=Fh(c[b+8>>2]|0,o)|0;f=Fh(c[b+12>>2]|0,o)|0;g=Fh(c[b+16>>2]|0,o)|0;a:do if((h>>>0<d>>>2>>>0?(n=d-(h<<2)|0,f>>>0<n>>>0&g>>>0<n>>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=Fh(c[b+(g<<2)>>2]|0,o)|0;g=Fh(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0<d>>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=Zg(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}l=f?l:k;h=f?j:h-j|0}f=i+m|0;g=Fh(c[b+(f<<2)>>2]|0,o)|0;f=Fh(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0<d>>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Fh(a,b){a=a|0;b=b|0;var c=0;c=Ci(a|0)|0;return ((b|0)==0?a:c)|0}function Gh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Hh(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0<d>>>0){f=Xa[c[e+36>>2]&31](e,b,d)|0;break}b:do if((a[e+75>>0]|0)<0|(d|0)==0){h=0;g=b}else{i=d;while(1){g=i+-1|0;if((a[b+g>>0]|0)==10)break;if(!g){h=0;g=b;break b}else i=g}f=Xa[c[e+36>>2]&31](e,b,i)|0;if(f>>>0<i>>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}while(0);Ei(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0}function Hh(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function Ih(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;Ei(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Jh(a,b){a=a|0;b=b|0;return Kh(a,b,(_g(a)|0)+1|0)|0}function Kh(b,c,d){b=b|0;c=c|0;d=d|0;a:do if(!d)d=0;else{c=c&255;while(1){d=d+-1|0;if((a[b+d>>0]|0)==c<<24>>24)break;if(!d){d=0;break a}}d=b+d|0}while(0);return d|0}function Lh(a){a=a|0;var b=0,c=0;b=(_g(a)|0)+1|0;c=Lg(b)|0;if(!c)a=0;else a=Ei(c|0,a|0,b|0)|0;return a|0}function Mh(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=ch(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=Nh(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=Oh(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=Ph(b,c)|0;break}else{b=Qh(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function Nh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c>>0]|0)<<8|(d[c+1>>0]|0);c=b+1|0;e=a[c>>0]|0;a:do if(!(e<<24>>24))c=0;else{e=(d[b>>0]|0)<<8|e&255;while(1){b=e&65535;if((b|0)==(f|0))break;c=c+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){c=0;break a}else e=b<<8|e&255}c=c+-1|0}while(0);return c|0}function Oh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=(b|c&255)<<8;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-2|0)|0}function Ph(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);e=b+3|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|c&255;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=b<<8|c&255;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-3|0)|0}
+function Uf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+32|0;s=x+8|0;t=x;u=x+16|0;if(!f){l=x;return}v=21712;v=pi(c[v>>2]|0,c[v+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;w=y;c[5427]=f;h=c[5449]&c[5450];if(h){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f){g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1}else i=12}else i=12;a:do if((i|0)==12){c[5431]=-1;c[5356]=0;c[5357]=0;r=21160;h=c[r+4>>2]|0;f=21432;c[f>>2]=c[r>>2];c[f+4>>2]=h;f=0;h=0;b:while(1){if(f>>>0<(c[5357]|0)>>>0)f=e[f+2>>1]<<16|e[f>>1];else{j=21432;j=pi(c[j>>2]|0,c[j+4>>2]|0,h|0,0)|0;k=y;r=21160;c[r>>2]=j;c[r+4>>2]=k;if((c[5427]|0)<1){i=40;break}h=c[5449]&c[5450];if(h|0){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f|0){i=21;break}}f=Ai(j|0,k|0,12)|0;f=f&255;r=30080+(f<<4)|0;if((c[r>>2]|0)==(j&-4096|0)?(c[r+4>>2]|0)==(k|0):0){h=(c[30080+(f<<4)+8>>2]|0)+j|0;i=h;c[u>>2]=i;f=j}else{if(Xf(u,j,k)|0){i=39;break}h=c[u>>2]|0;i=h;f=j}c[5356]=h;r=4094-(f&4095)|0;c[5357]=i+r;q=qi(j|0,k|0,h|0,0)|0;f=21432;c[f>>2]=q;c[f+4>>2]=y;f=e[h>>1]|0;if((r|0)<=0){if((f&3|0)==3){h=pi(j|0,k|0,2,0)|0;i=y;j=Ai(h|0,i|0,12)|0;j=j&255;r=30080+(j<<4)|0;if((c[r>>2]|0)==(h&-4096|0)?(c[r+4>>2]|0)==(i|0):0){h=(c[30080+(j<<4)+8>>2]|0)+h|0;c[s>>2]=h}else{if(Xf(s,h,i)|0){i=35;break}h=c[s>>2]|0}f=e[h>>1]<<16|f}}else f=e[i+2>>1]<<16|f}h=(c[5427]|0)+-1|0;c[5427]=h;j=f>>>7;r=j&31;p=f>>>15&31;o=f>>>20;q=o&31;c:do switch(f&127){case 124:case 120:case 116:case 112:case 108:case 104:case 100:case 96:case 92:case 88:case 84:case 80:case 76:case 72:case 68:case 64:case 60:case 56:case 52:case 48:case 44:case 40:case 36:case 32:case 28:case 24:case 20:case 16:case 12:case 8:case 4:case 0:{h=f>>>2;m=h&7|8;d:do switch(f>>>13&7){case 0:{h=j&48|f>>>1&960|f>>>4&4|h&8;if(!h){i=504;break b}q=h+(c[5296]|0)|0;r=21168+(m<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break}case 1:{if(!(a[21703]|0)){i=504;break b}f=(j&56|f<<1&192)+(c[21168+((j&7|8)<<3)>>2]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4089|0)?(c[r+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,s,f,h,3)|0){i=52;break b}h=s;f=c[h>>2]|0;h=c[h+4>>2]|0}r=21440+(m<<3)|0;c[r>>2]=f;c[r+4>>2]=h;a[21703]=3;break}case 2:{f=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4093|0)?(c[r+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=58;break b}f=c[s>>2]|0}r=21168+(m<<3)|0;c[r>>2]=f;c[r+4>>2]=((f|0)<0)<<31>>31;break}case 3:{if(!(a[21703]|0)){i=504;break b}f=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4093|0)?(c[r+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=65;break b}f=c[s>>2]|0}r=21440+(m<<3)|0;c[r>>2]=f;c[r+4>>2]=-1;a[21703]=3;break}case 5:{if(!(a[21703]|0)){i=504;break b}j=(j&56|f<<1&192)+(c[21168+((j&7|8)<<3)>>2]|0)|0;k=((j|0)<0)<<31>>31;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;r=25984+(i<<4)|0;if(!((c[r>>2]|0)==(j&-4089|0)?(c[r+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break d;else{i=506;break b}else{r=(c[25984+(i<<4)+8>>2]|0)+j|0;c[r>>2]=f;c[r+4>>2]=h;break d}}case 6:{i=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;j=((i|0)<0)<<31>>31;f=c[21168+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break d;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break d}}case 7:{if(!(a[21703]|0)){i=504;break b}i=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;j=((i|0)<0)<<31>>31;f=c[21440+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break d;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break d}}default:{i=504;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 125:case 121:case 117:case 113:case 109:case 105:case 101:case 97:case 93:case 89:case 85:case 81:case 77:case 73:case 69:case 65:case 61:case 57:case 53:case 49:case 45:case 41:case 37:case 33:case 29:case 25:case 21:case 17:case 13:case 9:case 5:case 1:{e:do switch(f>>>13&7){case 0:{if(r|0){r=21168+(r<<3)|0;q=((j&32|f>>>2&31)<<26>>26)+(c[r>>2]|0)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}break}case 1:{h=f>>>1;q=c[5356]|0;o=21432;r=c[o>>2]|0;o=c[o+4>>2]|0;p=21176;c[p>>2]=pi(pi(q|0,0,2,0)|0,y|0,r|0,o|0)|0;c[p+4>>2]=y;r=q+((h&2048|j&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)+r|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}case 2:{if(r|0){q=(j&32|f>>>2&31)<<26>>26;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}break}case 3:{switch(j&31){case 0:break e;case 2:break;default:{q=(f<<19&-2147483648|f<<24&2080374784)>>14;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break e}}h=f>>>3&512|f>>>2&16|f<<1&64|f<<4&384|f<<3&32;if(!h){i=504;break b}q=(h<<22>>22)+(c[5296]|0)|0;r=21184;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break}case 4:{i=f>>>10;k=j&7|8;switch(i&3){case 1:case 0:{r=j&32;j=r|f>>>2&31;if(r|0){i=504;break b}h=21168+(k<<3)|0;i=c[h>>2]|0;if(!(f&3072)){q=i>>>j;r=h;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break e}else{q=i>>j;r=h;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break e}}case 2:{p=(j&32|f>>>2&31)<<26>>26;r=21168+(k<<3)|0;o=r;q=c[o+4>>2]&((p|0)<0)<<31>>31;c[r>>2]=c[o>>2]&p;c[r+4>>2]=q;break e}case 3:{h=f>>>2&7|8;switch((f>>>5&3|i&4)&7){case 0:{r=21168+(k<<3)|0;p=r;q=21168+(h<<3)|0;c[r>>2]=zi(0,qi(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0)|0,32)|0;c[r+4>>2]=y;break e}case 1:{r=21168+(k<<3)|0;p=r;o=21168+(h<<3)|0;q=c[o+4>>2]^c[p+4>>2];c[r>>2]=c[o>>2]^c[p>>2];c[r+4>>2]=q;break e}case 2:{r=21168+(k<<3)|0;p=r;o=21168+(h<<3)|0;q=c[o+4>>2]|c[p+4>>2];c[r>>2]=c[o>>2]|c[p>>2];c[r+4>>2]=q;break e}case 3:{r=21168+(k<<3)|0;p=r;o=21168+(h<<3)|0;q=c[o+4>>2]&c[p+4>>2];c[r>>2]=c[o>>2]&c[p>>2];c[r+4>>2]=q;break e}default:{i=504;break b}}}default:{i=105;break b}}}case 5:{r=f>>>1;r=(c[5356]|0)+((r&2048|j&16|r&768|f<<2&1024|r&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}case 6:{r=21168+((j&7|8)<<3)|0;if((c[r>>2]|0)==0&(c[r+4>>2]|0)==0){r=(c[5356]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}break}case 7:{r=21168+((j&7|8)<<3)|0;if(!((c[r>>2]|0)==0&(c[r+4>>2]|0)==0)){r=(c[5356]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}break}default:{i=500;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 126:case 122:case 118:case 114:case 110:case 106:case 102:case 98:case 94:case 90:case 86:case 82:case 78:case 74:case 70:case 66:case 62:case 58:case 54:case 50:case 46:case 42:case 38:case 34:case 30:case 26:case 22:case 18:case 14:case 10:case 6:case 2:{h=f>>>2;m=h&31;f:do switch(f>>>13&7){case 0:{h=j&32;if(h|0){i=504;break b}if(r|0){r=21168+(r<<3)|0;q=r;q=Bi(c[q>>2]|0,c[q+4>>2]|0,h|m|0)|0;q=zi(0,q|0,32)|0;c[r>>2]=q;c[r+4>>2]=y}break}case 1:{if(!(a[21703]|0)){i=504;break b}f=(j&32|h&24|f<<4&448)+(c[5296]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;q=21888+(i<<4)|0;if((c[q>>2]|0)==(f&-4089|0)?(c[q+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,s,f,h,3)|0){i=117;break b}h=s;f=c[h>>2]|0;h=c[h+4>>2]|0}r=21440+(r<<3)|0;c[r>>2]=f;c[r+4>>2]=h;a[21703]=3;break}case 2:{f=(j&32|h&28|f<<4&192)+(c[5296]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;q=21888+(i<<4)|0;if((c[q>>2]|0)==(f&-4093|0)?(c[q+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=124;break b}f=c[s>>2]|0}if(r|0){r=21168+(r<<3)|0;c[r>>2]=f;c[r+4>>2]=((f|0)<0)<<31>>31}break}case 3:{if(!(a[21703]|0)){i=504;break b}f=(j&32|h&28|f<<4&192)+(c[5296]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;q=21888+(i<<4)|0;if((c[q>>2]|0)==(f&-4093|0)?(c[q+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=131;break b}f=c[s>>2]|0}r=21440+(r<<3)|0;c[r>>2]=f;c[r+4>>2]=-1;a[21703]=3;break}case 4:{h=(m|0)==0;i=(r|0)==0;if(!(f&4096))if(h){if(i){i=504;break b}r=21168+(r<<3)|0;f=c[r+4>>2]|0;r=c[r>>2]&-2;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}else{if(i)break f;p=21168+(m<<3)|0;q=c[p+4>>2]|0;r=21168+(r<<3)|0;c[r>>2]=c[p>>2];c[r+4>>2]=q;break f}else if(h){if(i){i=140;break b}q=21432;f=c[q>>2]|0;q=c[q+4>>2]|0;h=pi(c[5356]|0,0,2,0)|0;q=pi(h|0,y|0,f|0,q|0)|0;r=21168+(r<<3)|0;f=c[r+4>>2]|0;r=c[r>>2]&-2;h=21160;c[h>>2]=r;c[h+4>>2]=f;h=21176;c[h>>2]=q;c[h+4>>2]=y;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}else{if(i)break f;r=21168+(r<<3)|0;q=r;p=21168+(m<<3)|0;q=pi(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0)|0;q=zi(0,q|0,32)|0;c[r>>2]=q;c[r+4>>2]=y;break f}}case 5:{if(!(a[21703]|0)){i=504;break b}j=(j&56|f>>>1&448)+(c[5296]|0)|0;k=((j|0)<0)<<31>>31;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;r=25984+(i<<4)|0;if(!((c[r>>2]|0)==(j&-4089|0)?(c[r+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break f;else{i=506;break b}else{r=(c[25984+(i<<4)+8>>2]|0)+j|0;c[r>>2]=f;c[r+4>>2]=h;break f}}case 6:{i=(j&60|f>>>1&192)+(c[5296]|0)|0;j=((i|0)<0)<<31>>31;f=c[21168+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break f;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break f}}case 7:{if(!(a[21703]|0)){i=504;break b}i=(j&60|f>>>1&192)+(c[5296]|0)|0;j=((i|0)<0)<<31>>31;f=c[21440+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break f;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break f}}default:{i=501;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 55:{if(r|0){q=f&-4096;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 23:{if(r|0){q=(c[5356]|0)+(f&-4096)+(c[5358]|0)|0;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 111:{if(r|0){q=21432;p=c[q>>2]|0;q=c[q+4>>2]|0;n=pi(c[5356]|0,0,4,0)|0;q=pi(n|0,y|0,p|0,q|0)|0;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=y}r=(c[5356]|0)+((o&2046|f&1044480|f>>>11&1048576|f>>>9&2048)<<11>>11)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break}case 103:{i=c[5356]|0;k=21432;j=c[k>>2]|0;k=c[k+4>>2]|0;f=(f>>20)+(c[21168+(p<<3)>>2]|0)&-2;h=((f|0)<0)<<31>>31;q=21160;c[q>>2]=f;c[q+4>>2]=h;if(r|0){q=pi(i|0,0,4,0)|0;q=pi(q|0,y|0,j|0,k|0)|0;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=y}c[5356]=0;c[5357]=0;r=21432;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break}case 99:{switch(f>>>13&3){case 0:{r=21168+(p<<3)|0;h=21168+(q<<3)|0;h=(c[r>>2]|0)==(c[h>>2]|0)?(c[r+4>>2]|0)==(c[h+4>>2]|0):0;break}case 2:{r=21168+(p<<3)|0;p=c[r+4>>2]|0;h=21168+(q<<3)|0;q=c[h+4>>2]|0;h=(p|0)<(q|0)|((p|0)==(q|0)?(c[r>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}case 3:{r=21168+(p<<3)|0;p=c[r+4>>2]|0;h=21168+(q<<3)|0;q=c[h+4>>2]|0;h=p>>>0<q>>>0|((p|0)==(q|0)?(c[r>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}default:{i=504;break b}}if((f&4096|0)!=0^h){r=(c[5356]|0)+((f>>>19&4096|o&2016|j&30|f<<4&2048)<<19>>19)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}else{f=(c[5356]|0)+4|0;c[5356]=f;h=f;break c}}case 3:{h=f>>20;i=21168+(p<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;switch(f>>>12&7){case 0:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4096|0)?(c[q+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,s,h,i,0)|0){i=181;break b}f=c[s>>2]&255}f=f<<24>>24;h=f;f=((f|0)<0)<<31>>31;break}case 1:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4095|0)?(c[q+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,s,h,i,1)|0){i=187;break b}f=c[s>>2]&65535}f=f<<16>>16;h=f;f=((f|0)<0)<<31>>31;break}case 2:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4093|0)?(c[q+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,s,h,i,2)|0){i=193;break b}f=c[s>>2]|0}h=f;f=((f|0)<0)<<31>>31;break}case 4:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4096|0)?(c[q+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,s,h,i,0)|0){i=199;break b}f=c[s>>2]&255}h=f&255;f=0;break}case 5:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4095|0)?(c[q+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,s,h,i,1)|0){i=205;break b}f=c[s>>2]&65535}h=f&65535;f=0;break}default:{i=504;break b}}if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 35:{i=(r|o&4064)<<20>>20;j=21168+(p<<3)|0;i=pi(c[j>>2]|0,c[j+4>>2]|0,i|0,((i|0)<0)<<31>>31|0)|0;j=y;h=c[21168+(q<<3)>>2]|0;g:do switch(f>>>12&7){case 0:{f=(Ai(i|0,j|0,12)|0)&255;r=25984+(f<<4)|0;if(!((c[r>>2]|0)==(i&-4096|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,h&255,0,0)|0))break g;else{i=506;break b}else{a[(c[25984+(f<<4)+8>>2]|0)+i>>0]=h;break g}}case 1:{f=(Ai(i|0,j|0,12)|0)&255;r=25984+(f<<4)|0;if(!((c[r>>2]|0)==(i&-4095|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,h&65535,0,1)|0))break g;else{i=506;break b}else{b[(c[25984+(f<<4)+8>>2]|0)+i>>1]=h;break g}}case 2:{f=(Ai(i|0,j|0,12)|0)&255;r=25984+(f<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,h,0,2)|0))break g;else{i=506;break b}else{c[(c[25984+(f<<4)+8>>2]|0)+i>>2]=h;break g}}default:{i=504;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 19:{j=f>>20;h:do switch(f>>>12&7){case 0:{f=j+(c[21168+(p<<3)>>2]|0)|0;h=f;f=((f|0)<0)<<31>>31;break}case 1:{if(j>>>0>31){i=504;break b}h=21168+(p<<3)|0;h=zi(0,Bi(c[h>>2]|0,c[h+4>>2]|0,j&31|0)|0,32)|0;f=y;break}case 2:{h=21168+(p<<3)|0;q=c[h+4>>2]|0;f=((j|0)<0)<<31>>31;h=((q|0)<(f|0)|((q|0)==(f|0)?(c[h>>2]|0)>>>0<j>>>0:0))&1;f=0;break}case 3:{h=21168+(p<<3)|0;q=c[h+4>>2]|0;f=((j|0)<0)<<31>>31;h=(q>>>0<f>>>0|((q|0)==(f|0)?(c[h>>2]|0)>>>0<j>>>0:0))&1;f=0;break}case 4:{f=21168+(p<<3)|0;h=c[f>>2]^j;f=c[f+4>>2]^((j|0)<0)<<31>>31;break}case 5:{if(j&-1056|0){i=504;break b}i=c[21168+(p<<3)>>2]|0;h=j&31;if(!(f&1073741824)){f=i>>>h;h=f;f=((f|0)<0)<<31>>31;break h}else{f=i>>h;h=f;f=((f|0)<0)<<31>>31;break h}}case 6:{f=21168+(p<<3)|0;h=c[f>>2]|j;f=c[f+4>>2]|((j|0)<0)<<31>>31;break}default:{f=21168+(p<<3)|0;h=c[f>>2]&j;f=c[f+4>>2]&((j|0)<0)<<31>>31}}while(0);if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 51:{k=21168+(p<<3)|0;i=c[k>>2]|0;k=c[k+4>>2]|0;j=21168+(q<<3)|0;h=c[j>>2]|0;j=c[j+4>>2]|0;q=t;c[q>>2]=h;c[q+4>>2]=j;i:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{f=N(h,i)|0;h=f;f=((f|0)<0)<<31>>31;break i}case 1:{q=zi(0,i|0,32)|0;f=y;h=zi(vi(zi(0,h|0,32)|0,y|0,q|0,f|0)|0,y|0,32)|0;f=y;break i}case 2:{h=zi(vi(h|0,0,zi(0,i|0,32)|0,y|0)|0,y|0,32)|0;f=y;break i}case 3:{vi(h|0,0,i|0,0)|0;h=y;f=0;break i}case 4:{if(h)if((i|0)==-2147483648&(h|0)==-1)f=-2147483648;else f=(i|0)/(h|0)|0;else f=-1;h=f;f=((f|0)<0)<<31>>31;break i}case 5:{if(!h)f=-1;else f=(i>>>0)/(h>>>0)|0;h=f;f=((f|0)<0)<<31>>31;break i}case 6:{if(h)if((i|0)==-2147483648&(h|0)==-1)f=0;else f=(i|0)%(h|0)|0;else f=i;h=f;f=((f|0)<0)<<31>>31;break i}case 7:{if(!h)f=i;else f=(i>>>0)%(h>>>0)|0;h=f;f=((f|0)<0)<<31>>31;break i}default:{i=502;break b}}else{if(f&-1107296256|0){i=504;break b}do switch((f>>>12&7|f>>>27&8)&15){case 0:{h=zi(0,pi(h|0,j|0,i|0,k|0)|0,32)|0;f=y;break i}case 8:{h=zi(0,qi(i|0,k|0,h|0,j|0)|0,32)|0;f=y;break i}case 1:{h=zi(0,Bi(i|0,k|0,h&31|0)|0,32)|0;f=y;break i}case 2:{h=((k|0)<(j|0)|(k|0)==(j|0)&i>>>0<h>>>0)&1;f=0;break i}case 3:{h=(k>>>0<j>>>0|(k|0)==(j|0)&i>>>0<h>>>0)&1;f=0;break i}case 4:{h=h^i;f=j^k;break i}case 5:{f=i>>>(h&31);h=f;f=((f|0)<0)<<31>>31;break i}case 13:{f=i>>(h&31);h=f;f=((f|0)<0)<<31>>31;break i}case 6:{h=h|i;f=j|k;break i}case 7:{h=h&i;f=j&k;break i}default:{i=504;break b}}while(0)}while(0);if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 115:{if(!(f&16384)){n=21168+(p<<3)|0;m=c[n>>2]|0;n=c[n+4>>2]|0}else{m=p;n=0}i=f&12288;j:do switch(f>>>12&3){case 1:{q=21712;c[q>>2]=qi(v|0,w|0,h|0,((h|0)<0)<<31>>31|0)|0;c[q+4>>2]=y;if(_f(t,o,1)|0){i=504;break b}h=zi(0,c[t>>2]|0,32)|0;j=y;i=t;c[i>>2]=h;c[i+4>>2]=j;i=$f(o,m,n)|0;if((i|0)<0){i=504;break b}if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=j}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;r=pi(c[5356]|0,0,4,0)|0;f=pi(r|0,y|0,h|0,f|0)|0;h=y;r=21160;c[r>>2]=f;c[r+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;r=21432;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break c}break}case 3:case 2:{q=21712;c[q>>2]=qi(v|0,w|0,h|0,((h|0)<0)<<31>>31|0)|0;c[q+4>>2]=y;h=(p|0)!=0;if(_f(t,o,h&1)|0){i=504;break b}j=zi(0,c[t>>2]|0,32)|0;k=y;q=t;c[q>>2]=j;c[q+4>>2]=k;if(h){h=(i|0)==8192;h=$f(o,h?j|m:j&~m,h?k|n:k&~n)|0;if((h|0)<0){i=504;break b}else i=h}else i=0;if(r|0){r=21168+(r<<3)|0;c[r>>2]=j;c[r+4>>2]=k}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;r=pi(c[5356]|0,0,4,0)|0;f=pi(r|0,y|0,h|0,f|0)|0;h=y;r=21160;c[r>>2]=f;c[r+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;r=21432;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break c}break}case 0:{switch(o&4095){case 0:{i=291;break b}case 1:{i=293;break b}case 258:{i=295;break b}case 770:{i=301;break b}case 261:{if((f&32640|0)!=0|(a[21702]|0)==0){i=504;break b}if(!(c[5449]&c[5450])){i=313;break b}else break j}default:{}}if((f&-33521792|0)!=301989888|(a[21702]|0)==0){i=504;break b}if(!p){f=0;do{r=21888+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=25984+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=30080+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;f=f+1|0}while((f|0)!=256)}else{f=0;do{r=21888+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=25984+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=30080+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;f=f+1|0}while((f|0)!=256)}r=21432;f=c[r>>2]|0;r=c[r+4>>2]|0;h=pi(c[5356]|0,0,4,0)|0;r=pi(h|0,y|0,f|0,r|0)|0;f=y;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}default:{i=503;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 15:{switch(f>>>12&7){case 0:{if(f&-267387008|0){i=504;break b}break}case 1:{if((f|0)!=4111){i=504;break b}break}default:{i=504;break b}}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 47:{if((f&28672|0)!=8192){i=504;break b}p=21168+(p<<3)|0;o=c[p>>2]|0;p=c[p+4>>2]|0;j=f>>>27&255;k:do switch(j&31){case 2:{if(q|0){i=504;break b}f=(Ai(o|0,p|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(o&-4093|0)?(c[q+4>>2]|0)==(p|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,s,o,p,2)|0){i=333;break b}f=c[s>>2]|0}h=21872;c[h>>2]=o;c[h+4>>2]=p;h=f;f=((f|0)<0)<<31>>31;break}case 3:{n=21872;if((c[n>>2]|0)==(o|0)?(c[n+4>>2]|0)==(p|0):0){f=c[21168+(q<<3)>>2]|0;h=Ai(o|0,p|0,12)|0;h=h&255;q=25984+(h<<4)|0;if(!((c[q>>2]|0)==(o&-4093|0)?(c[q+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){h=0;f=0;break k}else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+o>>2]=f;h=0;f=0;break k}}else{h=1;f=0}break}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{k=(Ai(o|0,p|0,12)|0)&255;n=21888+(k<<4)|0;m=o&-4093;if((c[n>>2]|0)==(m|0)?(c[n+4>>2]|0)==(p|0):0)h=c[(c[21888+(k<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,s,o,p,2)|0){i=343;break b}h=c[s>>2]|0}n=((h|0)<0)<<31>>31;z=21168+(q<<3)|0;i=c[z>>2]|0;z=c[z+4>>2]|0;q=t;c[q>>2]=i;c[q+4>>2]=z;switch(j&31){case 1:{f=i;break}case 0:{f=h+i|0;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 4:{f=h^i;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 12:{f=h&i;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 8:{f=h|i;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 16:{if((h|0)<(i|0)){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 20:{if((h|0)>(i|0)){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 24:{if(h>>>0<i>>>0){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 28:{if(h>>>0>i>>>0){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}default:{i=504;break b}}z=25984+(k<<4)|0;if(!((c[z>>2]|0)==(m|0)?(c[z+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){f=n;break k}else{i=506;break b}else{c[(c[25984+(k<<4)+8>>2]|0)+o>>2]=f;f=n;break k}}default:{i=504;break b}}while(0);if(r|0){z=21168+(r<<3)|0;c[z>>2]=h;c[z+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 7:{if(!(a[21703]|0)){i=504;break b}h=f>>20;i=21168+(p<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;l:do switch(f>>>12&7){case 2:{f=(Ai(h|0,i|0,12)|0)&255;z=21888+(f<<4)|0;if((c[z>>2]|0)==(h&-4093|0)?(c[z+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,s,h,i,2)|0){i=370;break b}f=c[s>>2]|0}h=-1;break}case 3:{f=(Ai(h|0,i|0,12)|0)&255;z=21888+(f<<4)|0;if((c[z>>2]|0)==(h&-4089|0)?(c[z+4>>2]|0)==(i|0):0){h=(c[21888+(f<<4)+8>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break l}if(Yf(21152,s,h,i,3)|0){i=375;break b}h=s;f=c[h>>2]|0;h=c[h+4>>2]|0;break}default:{i=504;break b}}while(0);z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 39:{if(!(a[21703]|0)){i=504;break b}j=(r|o&4064)<<20>>20;k=21168+(p<<3)|0;j=pi(c[k>>2]|0,c[k+4>>2]|0,j|0,((j|0)<0)<<31>>31|0)|0;k=y;m:do switch(f>>>12&7){case 2:{f=c[21440+(q<<3)>>2]|0;h=(Ai(j|0,k|0,12)|0)&255;z=25984+(h<<4)|0;if(!((c[z>>2]|0)==(j&-4093|0)?(c[z+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,0,2)|0))break m;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+j>>2]=f;break m}}case 3:{h=21440+(q<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;z=25984+(i<<4)|0;if(!((c[z>>2]|0)==(j&-4089|0)?(c[z+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break m;else{i=506;break b}else{z=(c[25984+(i<<4)+8>>2]|0)+j|0;c[z>>2]=f;c[z+4>>2]=h;break m}}default:{i=504;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 67:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]|0,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 71:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]|0,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 75:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]^-2147483648,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]^-2147483648,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 79:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]^-2147483648,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]^-2147483648,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 83:{if(!(a[21703]|0)){i=504;break b}h=f>>>12;i=h&7;do switch(f>>>25&127){case 0:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Cb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 4:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Eb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 8:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Fb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 12:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Hb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 44:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((q|0)!=0|(h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Ib(c[21440+(p<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 16:{switch(h&7){case 0:{h=21440+(q<<3)|0;f=c[h>>2]&-2147483648|c[21440+(p<<3)>>2]&2147483647;h=c[h+4>>2]|0;break}case 1:{h=21440+(q<<3)|0;f=(c[h>>2]&-2147483648|c[21440+(p<<3)>>2]&2147483647)^-2147483648;h=~c[h+4>>2];break}case 2:{h=21440+(p<<3)|0;z=21440+(q<<3)|0;f=c[z>>2]&-2147483648^c[h>>2];h=c[z+4>>2]^c[h+4>>2];break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;break}case 20:{switch(h&7){case 0:{f=Jb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696,2)|0;break}case 1:{f=Kb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696,2)|0;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=-1;a[21703]=3;break}case 96:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=Pb(c[21440+(p<<3)>>2]|0,h,21696)|0;break}case 1:{f=Rb(c[21440+(p<<3)>>2]|0,h,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 80:{switch(h&7){case 0:{f=Mb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696)|0;break}case 1:{f=Nb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696)|0;break}case 2:{f=Lb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 104:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=Sb(c[21168+(p<<3)>>2]|0,h,21696)|0;break}case 1:{f=Tb(c[21168+(p<<3)>>2]|0,h,21696)|0;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=-1;a[21703]=3;break}case 32:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if(!((q|0)==1&(h|0)>-1)){i=504;break b}q=21440+(p<<3)|0;z=21440+(r<<3)|0;c[z>>2]=lc(c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 112:{if(q|0){i=504;break b}switch(h&7){case 0:{f=zi(0,c[21440+(p<<3)>>2]|0,32)|0;h=y;break}case 1:{f=Ob(c[21440+(p<<3)>>2]|0)|0;h=0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h}break}case 120:{if(q|i|0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=zi(0,c[21168+(p<<3)>>2]|0,32)|0;c[z+4>>2]=y;a[21703]=3;break}case 1:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=Zb(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 5:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=$b(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 9:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=ac(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 13:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=cc(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 45:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((q|0)!=0|(h|0)<0){i=504;break b}q=21440+(p<<3)|0;z=21440+(r<<3)|0;c[z>>2]=dc(c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 17:{switch(h&7){case 0:{f=21440+(p<<3)|0;h=c[f>>2]|0;f=c[21440+(q<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647;break}case 1:{f=21440+(p<<3)|0;h=c[f>>2]|0;f=(c[21440+(q<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647)^-2147483648;break}case 2:{f=21440+(p<<3)|0;h=c[f>>2]|0;f=c[21440+(q<<3)+4>>2]&-2147483648^c[f+4>>2];break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=h;c[z+4>>2]=f;a[21703]=3;break}case 21:{switch(h&7){case 0:{h=21440+(p<<3)|0;f=21440+(q<<3)|0;f=ec(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}case 1:{h=21440+(p<<3)|0;f=21440+(q<<3)|0;f=fc(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;break}case 97:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=21440+(p<<3)|0;f=mc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}case 1:{f=21440+(p<<3)|0;f=oc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 81:{switch(h&7){case 0:{z=21440+(p<<3)|0;f=21440+(q<<3)|0;f=hc(c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 1:{z=21440+(p<<3)|0;f=21440+(q<<3)|0;f=ic(c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 2:{z=21440+(p<<3)|0;f=21440+(q<<3)|0;f=gc(c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 105:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=pc(c[21168+(p<<3)>>2]|0,h,21696)|0;h=y;break}case 1:{f=qc(c[21168+(p<<3)>>2]|0,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;break}case 33:{if(!((q|0)==0&((i|0)==7|i>>>0<5))){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=kc(c[21440+(p<<3)>>2]|0,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 113:{if(!((q|0)==0&(i|0)==1)){i=504;break b}f=21440+(p<<3)|0;f=jc(c[f>>2]|0,c[f+4>>2]|0)|0;if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=0}break}default:{i=504;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}default:{i=504;break b}}while(0)}switch(i|0){case 21:{g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1;i=40;break}case 35:{i=39;break}case 52:{i=506;break}case 58:{i=506;break}case 65:{i=506;break}case 105:break;case 117:{i=506;break}case 124:{i=506;break}case 131:{i=506;break}case 140:{c[5431]=3;g=3;i=505;break}case 181:{i=506;break}case 187:{i=506;break}case 193:{i=506;break}case 199:{i=506;break}case 205:{i=506;break}case 291:{if(!(f&1048448)){g=(d[21702]|0)+8|0;c[5431]=g;i=505}else i=504;break}case 293:{if(!(f&1048448)){c[5431]=3;g=3;i=505}else i=504;break}case 295:{g=a[21702]|0;if((f&1048448|0)!=0|g<<24>>24==0)i=504;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,8)|0;i=i&1;t=Ai(f|0,h|0,5)|0;u=1<<i^-289;z=21736;c[z>>2]=f&u|((t&1)<<i&-289|32);c[z+4>>2]=h&((u|0)<0)<<31>>31;if((i|0)!=(g&255|0)){g=0;do{z=21888+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=25984+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=30080+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;g=g+1|0}while((g|0)!=256);z=Ai(f|0,h|0,i<<1|32|0)|0;a[21701]=16<<(z&3);a[21702]=i}t=21832;u=c[t+4>>2]|0;z=21160;c[z>>2]=c[t>>2];c[z+4>>2]=u;break a}break}case 301:{g=a[21702]|0;if((f&1048448|0)!=0|(g&255)<3)i=504;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,11)|0;j=i&3;t=Ai(f|0,h|0,7)|0;u=1<<j^-6273;z=21736;c[z>>2]=f&u|((t&1)<<j&-6273|128);c[z+4>>2]=h&((u|0)<0)<<31>>31;if((j|0)!=(g&255|0)){g=0;do{z=21888+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=25984+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=30080+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;g=g+1|0}while((g|0)!=256);switch(i&3){case 1:{g=(Ai(f|0,h|0,34)|0)&3;break}case 0:{g=h&3;break}default:g=d[21704]|0}a[21701]=16<<g;a[21702]=j}t=21760;u=c[t+4>>2]|0;z=21160;c[z>>2]=c[t>>2];c[z+4>>2]=u;break a}break}case 313:{c[5430]=1;u=21432;z=c[u>>2]|0;u=c[u+4>>2]|0;t=pi(c[5356]|0,0,4,0)|0;u=pi(t|0,y|0,z|0,u|0)|0;z=21160;c[z>>2]=u;c[z+4>>2]=y;break a}case 333:{i=506;break}case 343:{i=506;break}case 370:{i=506;break}case 375:{i=506;break}case 500:break;case 501:break;case 502:break;case 503:break}if((i|0)==39)i=506;else if((i|0)==40)break;else if((i|0)==504){c[5431]=2;g=21728;c[g>>2]=f;c[g+4>>2]=0;g=2;i=505}if((i|0)==505){u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;z=21160;c[z>>2]=u;c[z+4>>2]=y}else if((i|0)==506){g=c[5431]|0;u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;z=21160;c[z>>2]=u;c[z+4>>2]=y;if((g|0)<=-1)break}c[5427]=(c[5427]|0)+-1;z=21728;Wf(g,c[z>>2]|0,c[z+4>>2]|0)}while(0);z=c[5427]|0;w=qi(v|0,w|0,z|0,((z|0)<0)<<31>>31|0)|0;z=21712;c[z>>2]=w;c[z+4>>2]=y;l=x;return}function Vf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;z=l;l=l+32|0;t=z+8|0;u=z;v=z+16|0;if(!f){l=z;return}w=21712;w=pi(c[w>>2]|0,c[w+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;x=y;c[5427]=f;h=c[5449]&c[5450];if(h){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f){g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1}else i=12}else i=12;a:do if((i|0)==12){c[5431]=-1;c[5356]=0;c[5357]=0;s=21160;h=c[s+4>>2]|0;f=21432;c[f>>2]=c[s>>2];c[f+4>>2]=h;f=0;h=0;b:while(1){if(f>>>0<(c[5357]|0)>>>0)f=e[f+2>>1]<<16|e[f>>1];else{j=21432;j=pi(c[j>>2]|0,c[j+4>>2]|0,h|0,0)|0;k=y;s=21160;c[s>>2]=j;c[s+4>>2]=k;if((c[5427]|0)<1){i=40;break}h=c[5449]&c[5450];if(h|0){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f|0){i=21;break}}f=Ai(j|0,k|0,12)|0;f=f&255;s=30080+(f<<4)|0;if((c[s>>2]|0)==(j&-4096|0)?(c[s+4>>2]|0)==(k|0):0){h=(c[30080+(f<<4)+8>>2]|0)+j|0;i=h;c[v>>2]=i;f=j}else{if(Xf(v,j,k)|0){i=39;break}h=c[v>>2]|0;i=h;f=j}c[5356]=h;s=4094-(f&4095)|0;c[5357]=i+s;r=qi(j|0,k|0,h|0,0)|0;f=21432;c[f>>2]=r;c[f+4>>2]=y;f=e[h>>1]|0;if((s|0)<=0){if((f&3|0)==3){h=pi(j|0,k|0,2,0)|0;i=y;j=Ai(h|0,i|0,12)|0;j=j&255;s=30080+(j<<4)|0;if((c[s>>2]|0)==(h&-4096|0)?(c[s+4>>2]|0)==(i|0):0){h=(c[30080+(j<<4)+8>>2]|0)+h|0;c[t>>2]=h}else{if(Xf(t,h,i)|0){i=35;break}h=c[t>>2]|0}f=e[h>>1]<<16|f}}else f=e[i+2>>1]<<16|f}h=(c[5427]|0)+-1|0;c[5427]=h;k=f>>>7;s=k&31;m=f>>>15&31;o=f>>>20;r=o&31;c:do switch(f&127){case 124:case 120:case 116:case 112:case 108:case 104:case 100:case 96:case 92:case 88:case 84:case 80:case 76:case 72:case 68:case 64:case 60:case 56:case 52:case 48:case 44:case 40:case 36:case 32:case 28:case 24:case 20:case 16:case 12:case 8:case 4:case 0:{h=f>>>2;m=h&7|8;d:do switch(f>>>13&7){case 0:{h=k&48|f>>>1&960|f>>>4&4|h&8;if(!h){i=592;break b}r=21184;s=21168+(m<<3)|0;c[s>>2]=pi(c[r>>2]|0,c[r+4>>2]|0,h|0,0)|0;c[s+4>>2]=y;break}case 1:{if(!(a[21703]|0)){i=592;break b}h=21168+((k&7|8)<<3)|0;f=pi(c[h>>2]|0,c[h+4>>2]|0,k&56|f<<1&192|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;s=21888+(i<<4)|0;if((c[s>>2]|0)==(f&-4089|0)?(c[s+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=52;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}s=21440+(m<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 2:{h=21168+((k&7|8)<<3)|0;f=pi(c[h>>2]|0,c[h+4>>2]|0,k&56|f>>>4&4|f<<1&64|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;s=21888+(i<<4)|0;if((c[s>>2]|0)==(f&-4093|0)?(c[s+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,t,f,h,2)|0){i=58;break b}f=c[t>>2]|0}s=21168+(m<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31;break}case 3:{h=21168+((k&7|8)<<3)|0;f=pi(c[h>>2]|0,c[h+4>>2]|0,k&56|f<<1&192|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;s=21888+(i<<4)|0;if((c[s>>2]|0)==(f&-4089|0)?(c[s+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=64;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}s=21168+(m<<3)|0;c[s>>2]=f;c[s+4>>2]=h;break}case 5:{if(!(a[21703]|0)){i=592;break b}j=21168+((k&7|8)<<3)|0;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f<<1&192|0,0)|0;k=y;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break d;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break d}}case 6:{i=21168+((k&7|8)<<3)|0;i=pi(c[i>>2]|0,c[i+4>>2]|0,k&56|f>>>4&4|f<<1&64|0,0)|0;j=y;f=c[21168+(m<<3)>>2]|0;h=(Ai(i|0,j|0,12)|0)&255;s=25984+(h<<4)|0;if(!((c[s>>2]|0)==(i&-4093|0)?(c[s+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break d;else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break d}}case 7:{j=21168+((k&7|8)<<3)|0;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f<<1&192|0,0)|0;k=y;h=21168+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break d;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break d}}default:{i=592;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 125:case 121:case 117:case 113:case 109:case 105:case 101:case 97:case 93:case 89:case 85:case 81:case 77:case 73:case 69:case 65:case 61:case 57:case 53:case 49:case 45:case 41:case 37:case 33:case 29:case 25:case 21:case 17:case 13:case 9:case 5:case 1:{e:do switch(f>>>13&7){case 0:{if(s|0){r=(k&32|f>>>2&31)<<26>>26;s=21168+(s<<3)|0;q=s;r=pi(c[q>>2]|0,c[q+4>>2]|0,r|0,((r|0)<0)<<31>>31|0)|0;c[s>>2]=r;c[s+4>>2]=y}break}case 1:{if(s|0){s=21168+(s<<3)|0;r=((k&32|f>>>2&31)<<26>>26)+(c[s>>2]|0)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31}break}case 2:{if(s|0){r=(k&32|f>>>2&31)<<26>>26;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31}break}case 3:{switch(k&31){case 0:break e;case 2:break;default:{r=(f<<19&-2147483648|f<<24&2080374784)>>14;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31;break e}}h=f>>>3&512|f>>>2&16|f<<1&64|f<<4&384|f<<3&32;if(!h){i=592;break b}r=h<<22>>22;q=21184;s=21184;c[s>>2]=pi(c[q>>2]|0,c[q+4>>2]|0,r|0,((r|0)<0)<<31>>31|0)|0;c[s+4>>2]=y;break}case 4:{i=f>>>10;j=k&7|8;switch(i&3){case 1:case 0:{k=k&32|f>>>2&31;h=21168+(j<<3)|0;j=h;i=c[j>>2]|0;j=c[j+4>>2]|0;if(!(f&3072)){r=Ai(i|0,j|0,k|0)|0;s=h;c[s>>2]=r;c[s+4>>2]=y;break e}else{r=zi(i|0,j|0,k|0)|0;s=h;c[s>>2]=r;c[s+4>>2]=y;break e}}case 2:{q=(k&32|f>>>2&31)<<26>>26;s=21168+(j<<3)|0;p=s;r=c[p+4>>2]&((q|0)<0)<<31>>31;c[s>>2]=c[p>>2]&q;c[s+4>>2]=r;break e}case 3:{h=f>>>2&7|8;switch((f>>>5&3|i&4)&7){case 0:{s=21168+(j<<3)|0;q=s;r=21168+(h<<3)|0;c[s>>2]=qi(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0;c[s+4>>2]=y;break e}case 1:{s=21168+(j<<3)|0;q=s;p=21168+(h<<3)|0;r=c[p+4>>2]^c[q+4>>2];c[s>>2]=c[p>>2]^c[q>>2];c[s+4>>2]=r;break e}case 2:{s=21168+(j<<3)|0;q=s;p=21168+(h<<3)|0;r=c[p+4>>2]|c[q+4>>2];c[s>>2]=c[p>>2]|c[q>>2];c[s+4>>2]=r;break e}case 3:{s=21168+(j<<3)|0;q=s;p=21168+(h<<3)|0;r=c[p+4>>2]&c[q+4>>2];c[s>>2]=c[p>>2]&c[q>>2];c[s+4>>2]=r;break e}case 4:{s=21168+(j<<3)|0;q=s;r=21168+(h<<3)|0;c[s>>2]=zi(0,qi(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0,32)|0;c[s+4>>2]=y;break e}case 5:{s=21168+(j<<3)|0;r=s;q=21168+(h<<3)|0;c[s>>2]=zi(0,pi(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0,32)|0;c[s+4>>2]=y;break e}default:{i=592;break b}}}default:{i=105;break b}}}case 5:{h=f>>>1;h=(h&2048|k&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;s=pi(pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}case 6:{s=21168+((k&7|8)<<3)|0;if((c[s>>2]|0)==0&(c[s+4>>2]|0)==0){h=(f>>>4&256|k&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}break}case 7:{s=21168+((k&7|8)<<3)|0;if(!((c[s>>2]|0)==0&(c[s+4>>2]|0)==0)){h=(f>>>4&256|k&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}break}default:{i=588;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 126:case 122:case 118:case 114:case 110:case 106:case 102:case 98:case 94:case 90:case 86:case 82:case 78:case 74:case 70:case 66:case 62:case 58:case 54:case 50:case 46:case 42:case 38:case 34:case 30:case 26:case 22:case 18:case 14:case 10:case 6:case 2:{h=f>>>2;m=h&31;f:do switch(f>>>13&7){case 0:{f=21168+(s<<3)|0;if(s|0){r=f;r=Bi(c[r>>2]|0,c[r+4>>2]|0,k&32|m|0)|0;s=f;c[s>>2]=r;c[s+4>>2]=y}break}case 1:{if(!(a[21703]|0)){i=592;break b}i=21184;f=pi(c[i>>2]|0,c[i+4>>2]|0,k&32|h&24|f<<4&448|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4089|0)?(c[r+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=116;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 2:{i=21184;f=pi(c[i>>2]|0,c[i+4>>2]|0,k&32|h&28|f<<4&192|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4093|0)?(c[r+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,t,f,h,2)|0){i=123;break b}f=c[t>>2]|0}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}break}case 3:{i=21184;f=pi(c[i>>2]|0,c[i+4>>2]|0,k&32|h&24|f<<4&448|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4089|0)?(c[r+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=130;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 4:{h=(m|0)==0;i=(s|0)==0;if(!(f&4096))if(h){if(i){i=592;break b}s=21168+(s<<3)|0;f=c[s+4>>2]|0;s=c[s>>2]&-2;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}else{if(i)break f;q=21168+(m<<3)|0;r=c[q+4>>2]|0;s=21168+(s<<3)|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;break f}else if(h){if(i){i=139;break b}r=21432;f=c[r>>2]|0;r=c[r+4>>2]|0;h=pi(c[5356]|0,0,2,0)|0;r=pi(h|0,y|0,f|0,r|0)|0;s=21168+(s<<3)|0;f=c[s+4>>2]|0;s=c[s>>2]&-2;h=21160;c[h>>2]=s;c[h+4>>2]=f;h=21176;c[h>>2]=r;c[h+4>>2]=y;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}else{f=21168+(s<<3)|0;if(i)break f;r=f;s=21168+(m<<3)|0;r=pi(c[s>>2]|0,c[s+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0;s=f;c[s>>2]=r;c[s+4>>2]=y;break f}}case 5:{if(!(a[21703]|0)){i=592;break b}j=21184;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f>>>1&448|0,0)|0;k=y;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break f;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break f}}case 6:{i=21184;i=pi(c[i>>2]|0,c[i+4>>2]|0,k&60|f>>>1&192|0,0)|0;j=y;f=c[21168+(m<<3)>>2]|0;h=(Ai(i|0,j|0,12)|0)&255;s=25984+(h<<4)|0;if(!((c[s>>2]|0)==(i&-4093|0)?(c[s+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break f;else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break f}}case 7:{j=21184;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f>>>1&448|0,0)|0;k=y;h=21168+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break f;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break f}}default:{i=589;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 55:{if(s|0){r=f&-4096;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 23:{if(s|0){r=21432;q=c[r>>2]|0;r=c[r+4>>2]|0;p=f&-4096;p=pi(c[5356]|0,0,p|0,((p|0)<0)<<31>>31|0)|0;r=pi(p|0,y|0,q|0,r|0)|0;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=y}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 111:{f=(o&2046|f&1044480|f>>>11&1048576|f>>>9&2048)<<11>>11;if(s|0){r=21432;q=c[r>>2]|0;r=c[r+4>>2]|0;p=pi(c[5356]|0,0,4,0)|0;r=pi(p|0,y|0,q|0,r|0)|0;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=y}s=21432;h=c[s>>2]|0;s=c[s+4>>2]|0;s=pi(pi(c[5356]|0,0,f|0,((f|0)<0)<<31>>31|0)|0,y|0,h|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break}case 103:{h=f>>20;i=c[5356]|0;k=21432;j=c[k>>2]|0;k=c[k+4>>2]|0;f=21168+(m<<3)|0;h=pi(c[f>>2]|0,c[f+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;f=y;h=h&-2;r=21160;c[r>>2]=h;c[r+4>>2]=f;if(s|0){r=pi(i|0,0,4,0)|0;r=pi(r|0,y|0,j|0,k|0)|0;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=y}c[5356]=0;c[5357]=0;s=21432;c[s>>2]=h;c[s+4>>2]=f;h=0;f=0;break}case 99:{switch(f>>>13&3){case 0:{s=21168+(m<<3)|0;h=21168+(r<<3)|0;h=(c[s>>2]|0)==(c[h>>2]|0)?(c[s+4>>2]|0)==(c[h+4>>2]|0):0;break}case 2:{s=21168+(m<<3)|0;q=c[s+4>>2]|0;h=21168+(r<<3)|0;r=c[h+4>>2]|0;h=(q|0)<(r|0)|((q|0)==(r|0)?(c[s>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}case 3:{s=21168+(m<<3)|0;q=c[s+4>>2]|0;h=21168+(r<<3)|0;r=c[h+4>>2]|0;h=q>>>0<r>>>0|((q|0)==(r|0)?(c[s>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}default:{i=592;break b}}if((f&4096|0)!=0^h){h=(f>>>19&4096|o&2016|k&30|f<<4&2048)<<19>>19;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}else{f=(c[5356]|0)+4|0;c[5356]=f;h=f;break c}}case 3:{h=f>>20;i=21168+(m<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;g:do switch(f>>>12&7){case 0:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4096|0)?(c[r+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,t,h,i,0)|0){i=179;break b}f=c[t>>2]&255}h=f<<24>>24;f=h;h=((h|0)<0)<<31>>31;break}case 1:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4095|0)?(c[r+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,t,h,i,1)|0){i=185;break b}f=c[t>>2]&65535}h=f<<16>>16;f=h;h=((h|0)<0)<<31>>31;break}case 2:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4093|0)?(c[r+4>>2]|0)==(i|0):0)h=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,t,h,i,2)|0){i=191;break b}h=c[t>>2]|0}f=h;h=((h|0)<0)<<31>>31;break}case 4:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4096|0)?(c[r+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,t,h,i,0)|0){i=197;break b}f=c[t>>2]&255}f=f&255;h=0;break}case 5:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4095|0)?(c[r+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,t,h,i,1)|0){i=203;break b}f=c[t>>2]&65535}f=f&65535;h=0;break}case 3:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4089|0)?(c[r+4>>2]|0)==(i|0):0){h=(c[21888+(f<<4)+8>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break g}if(Yf(21152,t,h,i,3)|0){i=208;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0;break}case 6:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4093|0)?(c[r+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,t,h,i,2)|0){i=214;break b}f=c[t>>2]|0}h=0;break}default:{i=592;break b}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 35:{j=(s|o&4064)<<20>>20;k=21168+(m<<3)|0;j=pi(c[k>>2]|0,c[k+4>>2]|0,j|0,((j|0)<0)<<31>>31|0)|0;k=y;h=21168+(r<<3)|0;i=c[h>>2]|0;h=c[h+4>>2]|0;h:do switch(f>>>12&7){case 0:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4096|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i&255,0,0)|0))break h;else{i=594;break b}else{a[(c[25984+(f<<4)+8>>2]|0)+j>>0]=i;break h}}case 1:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4095|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i&65535,0,1)|0))break h;else{i=594;break b}else{b[(c[25984+(f<<4)+8>>2]|0)+j>>1]=i;break h}}case 2:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4093|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i,0,2)|0))break h;else{i=594;break b}else{c[(c[25984+(f<<4)+8>>2]|0)+j>>2]=i;break h}}case 3:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i,h,3)|0))break h;else{i=594;break b}else{s=(c[25984+(f<<4)+8>>2]|0)+j|0;c[s>>2]=i;c[s+4>>2]=h;break h}}default:{i=592;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 19:{k=f>>20;i:do switch(f>>>12&7){case 0:{h=21168+(m<<3)|0;h=pi(c[h>>2]|0,c[h+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;f=y;break}case 1:{if(k>>>0>63){i=592;break b}h=21168+(m<<3)|0;h=Bi(c[h>>2]|0,c[h+4>>2]|0,k&63|0)|0;f=y;break}case 2:{h=21168+(m<<3)|0;r=c[h+4>>2]|0;f=((k|0)<0)<<31>>31;h=((r|0)<(f|0)|((r|0)==(f|0)?(c[h>>2]|0)>>>0<k>>>0:0))&1;f=0;break}case 3:{h=21168+(m<<3)|0;r=c[h+4>>2]|0;f=((k|0)<0)<<31>>31;h=(r>>>0<f>>>0|((r|0)==(f|0)?(c[h>>2]|0)>>>0<k>>>0:0))&1;f=0;break}case 4:{f=21168+(m<<3)|0;h=c[f>>2]^k;f=c[f+4>>2]^((k|0)<0)<<31>>31;break}case 5:{if(k&-1088|0){i=592;break b}j=21168+(m<<3)|0;i=c[j>>2]|0;j=c[j+4>>2]|0;h=k&63;if(!(f&1073741824)){h=Ai(i|0,j|0,h|0)|0;f=y;break i}else{h=zi(i|0,j|0,h|0)|0;f=y;break i}}case 6:{f=21168+(m<<3)|0;h=c[f>>2]|k;f=c[f+4>>2]|((k|0)<0)<<31>>31;break}default:{f=21168+(m<<3)|0;h=c[f>>2]&k;f=c[f+4>>2]&((k|0)<0)<<31>>31}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 27:{i=f>>20;h=21168+(m<<3)|0;j=c[h>>2]|0;j:do switch(f>>>12&7){case 0:{f=i+j|0;break}case 1:{if(i>>>0>31){i=592;break b}f=Bi(j|0,c[h+4>>2]|0,i&31|0)|0;break}case 5:{if(i&-1056|0){i=592;break b}h=i&31;if(!(f&1073741824)){f=j>>>h;break j}else{f=j>>h;break j}}default:{i=592;break b}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 51:{k=21168+(m<<3)|0;h=c[k>>2]|0;k=c[k+4>>2]|0;j=21168+(r<<3)|0;i=c[j>>2]|0;j=c[j+4>>2]|0;r=u;c[r>>2]=i;c[r+4>>2]=j;k:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{h=vi(i|0,j|0,h|0,k|0)|0;f=y;break k}case 1:{vi(i|0,0,h|0,0)|0;m=y;n=vi(j|0,0,h|0,0)|0;r=y;p=vi(i|0,0,k|0,0)|0;o=y;f=vi(j|0,0,k|0,0)|0;q=y;pi(pi(m|0,0,n|0,0)|0,y|0,p|0,0)|0;p=y;p=pi(pi(pi(o|0,0,r|0,0)|0,y|0,f|0,0)|0,y|0,p|0,0)|0;pi(0,y&7|0,f|0,q|0)|0;q=y;f=(k|0)<0;r=(j|0)<0;h=qi(p|0,q|0,pi((r?i:0)|0,(r?j:0)|0,(f?h:0)|0,(f?k:0)|0)|0,y|0)|0;f=y;break k}case 2:{vi(i|0,0,h|0,0)|0;m=y;n=vi(j|0,0,h|0,0)|0;p=y;r=vi(i|0,0,k|0,0)|0;o=y;q=vi(j|0,0,k|0,0)|0;f=y;pi(pi(m|0,0,n|0,0)|0,y|0,r|0,0)|0;r=y;r=pi(pi(pi(o|0,0,p|0,0)|0,y|0,q|0,0)|0,y|0,r|0,0)|0;pi(0,y&7|0,q|0,f|0)|0;f=(k|0)<0;h=qi(r|0,y|0,(f?h:0)|0,(f?k:0)|0)|0;f=y;break k}case 3:{vi(i|0,0,h|0,0)|0;n=y;o=vi(j|0,0,h|0,0)|0;q=y;h=vi(i|0,0,k|0,0)|0;p=y;r=vi(j|0,0,k|0,0)|0;f=y;pi(pi(n|0,0,o|0,0)|0,y|0,h|0,0)|0;h=y;h=pi(pi(pi(p|0,0,q|0,0)|0,y|0,r|0,0)|0,y|0,h|0,0)|0;pi(0,y&7|0,r|0,f|0)|0;f=y;break k}case 4:{if((i|0)==0&(j|0)==0){h=-1;f=-1;break k}if((h|0)==0&(k|0)==-2147483648&((i|0)==-1&(j|0)==-1)){h=0;f=-2147483648;break k}h=ti(h|0,k|0,i|0,j|0)|0;f=y;break k}case 5:{if((i|0)==0&(j|0)==0){h=-1;f=-1;break k}h=xi(h|0,k|0,i|0,j|0)|0;f=y;break k}case 6:{if((i|0)==0&(j|0)==0){f=k;break k}if((h|0)==0&(k|0)==-2147483648&((i|0)==-1&(j|0)==-1)){h=0;f=0;break k}h=wi(h|0,k|0,i|0,j|0)|0;f=y;break k}case 7:{if((i|0)==0&(j|0)==0){f=k;break k}h=yi(h|0,k|0,i|0,j|0)|0;f=y;break k}default:{i=590;break b}}else{if(f&-1107296256|0){i=592;break b}do switch((f>>>12&7|f>>>27&8)&15){case 0:{h=pi(i|0,j|0,h|0,k|0)|0;f=y;break k}case 8:{h=qi(h|0,k|0,i|0,j|0)|0;f=y;break k}case 1:{h=Bi(h|0,k|0,i&63|0)|0;f=y;break k}case 2:{h=((k|0)<(j|0)|(k|0)==(j|0)&h>>>0<i>>>0)&1;f=0;break k}case 3:{h=(k>>>0<j>>>0|(k|0)==(j|0)&h>>>0<i>>>0)&1;f=0;break k}case 4:{h=i^h;f=j^k;break k}case 5:{h=Ai(h|0,k|0,i&63|0)|0;f=y;break k}case 13:{h=zi(h|0,k|0,i&63|0)|0;f=y;break k}case 6:{h=i|h;f=j|k;break k}case 7:{h=i&h;f=j&k;break k}default:{i=592;break b}}while(0)}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 59:{k=21168+(m<<3)|0;j=c[k>>2]|0;k=c[k+4>>2]|0;i=21168+(r<<3)|0;h=c[i>>2]|0;i=c[i+4>>2]|0;r=u;c[r>>2]=h;c[r+4>>2]=i;l:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{f=N(h,j)|0;break l}case 4:{if(!h){f=-1;break l}if((j|0)==-2147483648&(h|0)==-1){f=-2147483648;break l}f=(j|0)/(h|0)|0;break l}case 5:{if(!h){f=-1;break l}f=(j>>>0)/(h>>>0)|0;break l}case 6:{if(!h){f=j;break l}if((j|0)==-2147483648&(h|0)==-1){f=0;break l}f=(j|0)%(h|0)|0;break l}case 7:{if(!h){f=j;break l}f=(j>>>0)%(h>>>0)|0;break l}default:{i=592;break b}}else{if(f&-1107296256|0){i=592;break b}switch((f>>>12&7|f>>>27&8)&15){case 0:{f=pi(h|0,i|0,j|0,k|0)|0;break l}case 8:{f=qi(j|0,k|0,h|0,i|0)|0;break l}case 1:{f=j<<(h&31);break l}case 5:{f=j>>>(h&31);break l}case 13:{f=j>>(h&31);break l}default:{i=592;break b}}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 115:{if(!(f&16384)){k=21168+(m<<3)|0;j=c[k>>2]|0;k=c[k+4>>2]|0}else{j=m;k=0}i=f&12288;m:do switch(f>>>12&3){case 1:{r=21712;c[r>>2]=qi(w|0,x|0,h|0,((h|0)<0)<<31>>31|0)|0;c[r+4>>2]=y;if(_f(u,o,1)|0){i=592;break b}i=$f(o,j,k)|0;if((i|0)<0){i=592;break b}if(s|0){q=u;r=c[q+4>>2]|0;s=21168+(s<<3)|0;c[s>>2]=c[q>>2];c[s+4>>2]=r}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;s=pi(c[5356]|0,0,4,0)|0;f=pi(s|0,y|0,h|0,f|0)|0;h=y;s=21160;c[s>>2]=f;c[s+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;s=21432;c[s>>2]=f;c[s+4>>2]=h;h=0;f=0;break c}break}case 3:case 2:{r=21712;c[r>>2]=qi(w|0,x|0,h|0,((h|0)<0)<<31>>31|0)|0;c[r+4>>2]=y;h=(m|0)!=0;if(_f(u,o,h&1)|0){i=592;break b}n=u;m=c[n>>2]|0;n=c[n+4>>2]|0;if(h){h=(i|0)==8192;h=$f(o,h?m|j:m&~j,h?n|k:n&~k)|0;if((h|0)<0){i=592;break b}else i=h}else i=0;if(s|0){s=21168+(s<<3)|0;c[s>>2]=m;c[s+4>>2]=n}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;s=pi(c[5356]|0,0,4,0)|0;f=pi(s|0,y|0,h|0,f|0)|0;h=y;s=21160;c[s>>2]=f;c[s+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;s=21432;c[s>>2]=f;c[s+4>>2]=h;h=0;f=0;break c}break}case 0:{switch(o&4095){case 0:{i=333;break b}case 1:{i=335;break b}case 258:{i=337;break b}case 770:{i=343;break b}case 261:{if((f&32640|0)!=0|(a[21702]|0)==0){i=592;break b}if(!(c[5449]&c[5450])){i=355;break b}else break m}default:{}}if((f&-33521792|0)!=301989888|(a[21702]|0)==0){i=592;break b}if(!m){f=0;do{s=21888+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=25984+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=30080+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;f=f+1|0}while((f|0)!=256)}else{f=0;do{s=21888+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=25984+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=30080+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;f=f+1|0}while((f|0)!=256)}s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,4,0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}default:{i=591;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 15:{switch(f>>>12&7){case 0:{if(f&-267387008|0){i=592;break b}break}case 1:{if((f|0)!=4111){i=592;break b}break}default:{i=592;break b}}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 47:{n:do switch(f>>>12&7){case 2:{p=21168+(m<<3)|0;o=c[p>>2]|0;p=c[p+4>>2]|0;j=f>>>27&255;switch(j&31){case 2:{if(r|0){i=592;break b}f=(Ai(o|0,p|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(o&-4093|0)?(c[r+4>>2]|0)==(p|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,t,o,p,2)|0){i=375;break b}f=c[t>>2]|0}h=21872;c[h>>2]=o;c[h+4>>2]=p;h=f;f=((f|0)<0)<<31>>31;break n}case 3:{q=21872;if(!((c[q>>2]|0)==(o|0)?(c[q+4>>2]|0)==(p|0):0)){h=1;f=0;break n}f=c[21168+(r<<3)>>2]|0;h=(Ai(o|0,p|0,12)|0)&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(o&-4093|0)?(c[r+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){h=0;f=0;break n}else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+o>>2]=f;h=0;f=0;break n}}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{k=(Ai(o|0,p|0,12)|0)&255;q=21888+(k<<4)|0;m=o&-4093;if((c[q>>2]|0)==(m|0)?(c[q+4>>2]|0)==(p|0):0)h=c[(c[21888+(k<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,t,o,p,2)|0){i=385;break b}h=c[t>>2]|0}n=((h|0)<0)<<31>>31;q=21168+(r<<3)|0;i=c[q>>2]|0;q=c[q+4>>2]|0;r=u;c[r>>2]=i;c[r+4>>2]=q;switch(j&31){case 1:{f=i;break}case 0:{f=h+i|0;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 4:{f=h^i;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 12:{f=h&i;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 8:{f=h|i;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 16:{if((h|0)<(i|0)){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 20:{if((h|0)>(i|0)){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 24:{if(h>>>0<i>>>0){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 28:{if(h>>>0>i>>>0){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}default:{i=592;break b}}r=25984+(k<<4)|0;if(!((c[r>>2]|0)==(m|0)?(c[r+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){f=n;break n}else{i=594;break b}else{c[(c[25984+(k<<4)+8>>2]|0)+o>>2]=f;f=n;break n}}default:{i=592;break b}}}case 3:{q=21168+(m<<3)|0;p=c[q>>2]|0;q=c[q+4>>2]|0;k=f>>>27&255;switch(k&31){case 2:{if(r|0){i=592;break b}f=(Ai(p|0,q|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(p&-4089|0)?(c[r+4>>2]|0)==(q|0):0){f=(c[21888+(f<<4)+8>>2]|0)+p|0;h=c[f>>2]|0;f=c[f+4>>2]|0}else{if(Yf(21152,t,p,q,3)|0){i=408;break b}f=t;h=c[f>>2]|0;f=c[f+4>>2]|0}r=21872;c[r>>2]=p;c[r+4>>2]=q;break n}case 3:{o=21872;if(!((c[o>>2]|0)==(p|0)?(c[o+4>>2]|0)==(q|0):0)){h=1;f=0;break n}h=21168+(r<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(p|0,q|0,12)|0)&255;r=25984+(i<<4)|0;if(!((c[r>>2]|0)==(p&-4089|0)?(c[r+4>>2]|0)==(q|0):0))if(!(Zf(21152,p,q,f,h,3)|0)){h=0;f=0;break n}else{i=594;break b}else{r=(c[25984+(i<<4)+8>>2]|0)+p|0;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break n}}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{m=(Ai(p|0,q|0,12)|0)&255;o=21888+(m<<4)|0;n=p&-4089;if((c[o>>2]|0)==(n|0)?(c[o+4>>2]|0)==(q|0):0){o=(c[21888+(m<<4)+8>>2]|0)+p|0;h=c[o>>2]|0;o=c[o+4>>2]|0}else{if(Yf(21152,t,p,q,3)|0){i=418;break b}o=t;h=c[o>>2]|0;o=c[o+4>>2]|0}j=21168+(r<<3)|0;i=c[j>>2]|0;j=c[j+4>>2]|0;r=u;c[r>>2]=i;c[r+4>>2]=j;switch(k&31){case 1:{f=j;break}case 0:{i=pi(i|0,j|0,h|0,o|0)|0;f=y;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 4:{i=i^h;f=j^o;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 12:{i=i&h;f=j&o;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 8:{i=i|h;f=j|o;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 16:{if((o|0)<(j|0)|(o|0)==(j|0)&h>>>0<i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}case 20:{if((o|0)>(j|0)|(o|0)==(j|0)&h>>>0>i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}case 24:{if(o>>>0<j>>>0|(o|0)==(j|0)&h>>>0<i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}case 28:{if(o>>>0>j>>>0|(o|0)==(j|0)&h>>>0>i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}default:{i=592;break b}}r=25984+(m<<4)|0;if(!((c[r>>2]|0)==(n|0)?(c[r+4>>2]|0)==(q|0):0))if(!(Zf(21152,p,q,i,f,3)|0)){f=o;break n}else{i=594;break b}else{r=(c[25984+(m<<4)+8>>2]|0)+p|0;c[r>>2]=i;c[r+4>>2]=f;f=o;break n}}default:{i=592;break b}}}default:{i=592;break b}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 7:{if(!(a[21703]|0)){i=592;break b}h=f>>20;i=21168+(m<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;o:do switch(f>>>12&7){case 2:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4093|0)?(c[r+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,t,h,i,2)|0){i=445;break b}f=c[t>>2]|0}h=-1;break}case 3:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4089|0)?(c[r+4>>2]|0)==(i|0):0){h=(c[21888+(f<<4)+8>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break o}if(Yf(21152,t,h,i,3)|0){i=450;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0;break}default:{i=592;break b}}while(0);s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 39:{if(!(a[21703]|0)){i=592;break b}j=(s|o&4064)<<20>>20;k=21168+(m<<3)|0;j=pi(c[k>>2]|0,c[k+4>>2]|0,j|0,((j|0)<0)<<31>>31|0)|0;k=y;p:do switch(f>>>12&7){case 2:{f=c[21440+(r<<3)>>2]|0;h=(Ai(j|0,k|0,12)|0)&255;s=25984+(h<<4)|0;if(!((c[s>>2]|0)==(j&-4093|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,0,2)|0))break p;else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+j>>2]=f;break p}}case 3:{h=21440+(r<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break p;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break p}}default:{i=592;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 67:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 71:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 75:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]^-2147483648,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]^-2147483648,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 79:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]^-2147483648,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]^-2147483648,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 83:{if(!(a[21703]|0)){i=592;break b}h=f>>>12;i=h&7;do switch(f>>>25&127){case 0:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Cb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 4:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Eb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 8:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Fb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 12:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Hb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 44:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((r|0)!=0|(h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Ib(c[21440+(m<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 16:{switch(h&7){case 0:{h=21440+(r<<3)|0;f=c[h>>2]&-2147483648|c[21440+(m<<3)>>2]&2147483647;h=c[h+4>>2]|0;break}case 1:{h=21440+(r<<3)|0;f=(c[h>>2]&-2147483648|c[21440+(m<<3)>>2]&2147483647)^-2147483648;h=~c[h+4>>2];break}case 2:{h=21440+(m<<3)|0;r=21440+(r<<3)|0;f=c[r>>2]&-2147483648^c[h>>2];h=c[r+4>>2]^c[h+4>>2];break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 20:{switch(h&7){case 0:{f=Jb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696,2)|0;break}case 1:{f=Kb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696,2)|0;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=-1;a[21703]=3;break}case 96:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{h=Pb(c[21440+(m<<3)>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 1:{h=Rb(c[21440+(m<<3)>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 2:{f=Ub(c[21440+(m<<3)>>2]|0,h,21696)|0;h=y;break}case 3:{f=Wb(c[21440+(m<<3)>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 80:{switch(h&7){case 0:{f=Mb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696)|0;break}case 1:{f=Nb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696)|0;break}case 2:{f=Lb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696)|0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}break}case 104:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{f=Sb(c[21168+(m<<3)>>2]|0,h,21696)|0;break}case 1:{f=Tb(c[21168+(m<<3)>>2]|0,h,21696)|0;break}case 2:{f=21168+(m<<3)|0;f=Xb(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}case 3:{f=21168+(m<<3)|0;f=Yb(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=-1;a[21703]=3;break}case 32:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if(!((r|0)==1&(h|0)>-1)){i=592;break b}r=21440+(m<<3)|0;s=21440+(s<<3)|0;c[s>>2]=lc(c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 112:{if(r|0){i=592;break b}switch(h&7){case 0:{f=zi(0,c[21440+(m<<3)>>2]|0,32)|0;h=y;break}case 1:{f=Ob(c[21440+(m<<3)>>2]|0)|0;h=0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 120:{if(r|i|0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=zi(0,c[21168+(m<<3)>>2]|0,32)|0;c[s+4>>2]=y;a[21703]=3;break}case 1:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=Zb(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 5:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=$b(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 9:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=ac(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 13:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=cc(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 45:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((r|0)!=0|(h|0)<0){i=592;break b}r=21440+(m<<3)|0;s=21440+(s<<3)|0;c[s>>2]=dc(c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 17:{switch(h&7){case 0:{f=21440+(m<<3)|0;h=c[f>>2]|0;f=c[21440+(r<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647;break}case 1:{f=21440+(m<<3)|0;h=c[f>>2]|0;f=(c[21440+(r<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647)^-2147483648;break}case 2:{f=21440+(m<<3)|0;h=c[f>>2]|0;f=c[21440+(r<<3)+4>>2]&-2147483648^c[f+4>>2];break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f;a[21703]=3;break}case 21:{switch(h&7){case 0:{h=21440+(m<<3)|0;f=21440+(r<<3)|0;f=ec(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}case 1:{h=21440+(m<<3)|0;f=21440+(r<<3)|0;f=fc(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 97:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{f=21440+(m<<3)|0;h=mc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 1:{f=21440+(m<<3)|0;h=oc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 2:{f=21440+(m<<3)|0;f=rc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}case 3:{f=21440+(m<<3)|0;f=tc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 81:{switch(h&7){case 0:{q=21440+(m<<3)|0;f=21440+(r<<3)|0;f=hc(c[q>>2]|0,c[q+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 1:{q=21440+(m<<3)|0;f=21440+(r<<3)|0;f=ic(c[q>>2]|0,c[q+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 2:{q=21440+(m<<3)|0;f=21440+(r<<3)|0;f=gc(c[q>>2]|0,c[q+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}break}case 105:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{f=pc(c[21168+(m<<3)>>2]|0,h,21696)|0;h=y;break}case 1:{f=qc(c[21168+(m<<3)>>2]|0,h,21696)|0;h=y;break}case 2:{f=21168+(m<<3)|0;f=uc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}case 3:{f=21168+(m<<3)|0;f=vc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 33:{if(!((r|0)==0&((i|0)==7|i>>>0<5))){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=kc(c[21440+(m<<3)>>2]|0,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 113:{if(r|0){i=592;break b}switch(h&7){case 0:{h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break}case 1:{f=21440+(m<<3)|0;f=jc(c[f>>2]|0,c[f+4>>2]|0)|0;h=0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 121:{if(r|i|0){i=592;break b}q=21168+(m<<3)|0;r=c[q+4>>2]|0;s=21440+(s<<3)|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;a[21703]=3;break}default:{i=592;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}default:{i=592;break b}}while(0)}switch(i|0){case 21:{g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1;i=40;break}case 35:{i=39;break}case 52:{i=594;break}case 58:{i=594;break}case 64:{i=594;break}case 105:break;case 116:{i=594;break}case 123:{i=594;break}case 130:{i=594;break}case 139:{c[5431]=3;g=3;i=593;break}case 179:{i=594;break}case 185:{i=594;break}case 191:{i=594;break}case 197:{i=594;break}case 203:{i=594;break}case 208:{i=594;break}case 214:{i=594;break}case 333:{if(!(f&1048448)){g=(d[21702]|0)+8|0;c[5431]=g;i=593}else i=592;break}case 335:{if(!(f&1048448)){c[5431]=3;g=3;i=593}else i=592;break}case 337:{g=a[21702]|0;if((f&1048448|0)!=0|g<<24>>24==0)i=592;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,8)|0;i=i&1;t=Ai(f|0,h|0,5)|0;u=1<<i^-289;v=21736;c[v>>2]=f&u|((t&1)<<i&-289|32);c[v+4>>2]=h&((u|0)<0)<<31>>31;if((i|0)!=(g&255|0)){g=0;do{v=21888+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=25984+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=30080+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;g=g+1|0}while((g|0)!=256);v=Ai(f|0,h|0,i<<1|32|0)|0;a[21701]=16<<(v&3);a[21702]=i}t=21832;u=c[t+4>>2]|0;v=21160;c[v>>2]=c[t>>2];c[v+4>>2]=u;break a}break}case 343:{g=a[21702]|0;if((f&1048448|0)!=0|(g&255)<3)i=592;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,11)|0;j=i&3;t=Ai(f|0,h|0,7)|0;u=1<<j^-6273;v=21736;c[v>>2]=f&u|((t&1)<<j&-6273|128);c[v+4>>2]=h&((u|0)<0)<<31>>31;if((j|0)!=(g&255|0)){g=0;do{v=21888+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=25984+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=30080+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;g=g+1|0}while((g|0)!=256);switch(i&3){case 1:{g=(Ai(f|0,h|0,34)|0)&3;break}case 0:{g=h&3;break}default:g=d[21704]|0}a[21701]=16<<g;a[21702]=j}t=21760;u=c[t+4>>2]|0;v=21160;c[v>>2]=c[t>>2];c[v+4>>2]=u;break a}break}case 355:{c[5430]=1;u=21432;v=c[u>>2]|0;u=c[u+4>>2]|0;t=pi(c[5356]|0,0,4,0)|0;u=pi(t|0,y|0,v|0,u|0)|0;v=21160;c[v>>2]=u;c[v+4>>2]=y;break a}case 375:{i=594;break}case 385:{i=594;break}case 408:{i=594;break}case 418:{i=594;break}case 445:{i=594;break}case 450:{i=594;break}case 588:break;case 589:break;case 590:break;case 591:break}if((i|0)==39)i=594;else if((i|0)==40)break;else if((i|0)==592){c[5431]=2;g=21728;c[g>>2]=f;c[g+4>>2]=0;g=2;i=593}if((i|0)==593){u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;v=21160;c[v>>2]=u;c[v+4>>2]=y}else if((i|0)==594){g=c[5431]|0;u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;v=21160;c[v>>2]=u;c[v+4>>2]=y;if((g|0)<=-1)break}c[5427]=(c[5427]|0)+-1;v=21728;Wf(g,c[v>>2]|0,c[v+4>>2]|0)}while(0);v=c[5427]|0;w=qi(w|0,x|0,v|0,((v|0)<0)<<31>>31|0)|0;x=21712;c[x>>2]=w;c[x+4>>2]=y;l=z;return}function Wf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=a[21702]|0;do if((k&255)<2)if((b|0)<0){h=(c[5452]|0)>>>(b&63)&1;g=b&2147483647;i=0;j=6;break}else{h=(c[5451]|0)>>>b&1;b=b&2147483647;g=0;j=7;break}else{g=b&2147483647;if((b|0)<0){h=0;i=0;j=6}else{b=g;g=0}}while(0);if((j|0)==6){b=Bi(1,0,(d[21701]|0)+-1|0)|0;b=b|g;g=y|i;j=7}if((j|0)==7)if(h){j=21840;c[j>>2]=b;c[j+4>>2]=g;j=21160;b=c[j+4>>2]|0;h=21832;c[h>>2]=c[j>>2];c[h+4>>2]=b;h=21848;c[h>>2]=e;c[h+4>>2]=f;h=21736;b=c[h>>2]|0;h=c[h+4>>2]|0;f=Ai(b|0,h|0,k&255|0)|0;f=Bi(f|0,y|0,5)|0;j=21736;c[j>>2]=b&-291|(k&255)<<8|f&32;c[j+4>>2]=h;if(k<<24>>24==1){j=21816;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}g=0;do{k=21888+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;g=g+1|0}while((g|0)!=256);j=Ai(b|0,h|0,34)|0;a[21701]=16<<(j&3);a[21702]=1;j=21816;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}h=21768;c[h>>2]=b;c[h+4>>2]=g;h=21160;j=c[h+4>>2]|0;i=21760;c[i>>2]=c[h>>2];c[i+4>>2]=j;i=21776;c[i>>2]=e;c[i+4>>2]=f;f=21736;i=c[f>>2]|0;f=c[f+4>>2]|0;e=Ai(i|0,f|0,k&255|0)|0;e=Bi(e|0,y|0,7)|0;j=21736;c[j>>2]=i&-6281|(k&255)<<11|e&128;c[j+4>>2]=f;if(k<<24>>24==3){j=21744;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}g=0;do{k=21888+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;g=g+1|0}while((g|0)!=256);a[21701]=16<<(d[21704]|0);a[21702]=3;j=21744;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}function Xf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l+16|0;e=h;if(ag(21152,e,b,d,2)|0){a=21728;c[a>>2]=b;c[a+4>>2]=d;c[5431]=12;d=-1;l=h;return d|0}f=e;e=c[f>>2]|0;f=c[f+4>>2]|0;g=qf(c[5470]|0,e,f)|0;if(g|0?c[g+32>>2]|0:0){i=Ai(b|0,d|0,12)|0;i=i&255;j=c[g+40>>2]|0;g=g+8|0;g=qi(e|0,f|0,c[g>>2]|0,c[g+4>>2]|0)|0;g=j+g|0;f=30080+(i<<4)|0;c[f>>2]=b&-4096;c[f+4>>2]=d;c[30080+(i<<4)+8>>2]=g-b;c[a>>2]=g;d=0;l=h;return d|0}j=21728;c[j>>2]=b;c[j+4>>2]=d;c[5431]=1;j=-1;l=h;return j|0}function Yf(b,f,g,h,i){b=b|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;r=s+8|0;j=s;o=1<<i;q=o+-1&g;a:do if(!q){if(ag(b,j,g,h,0)|0){f=b+576|0;c[f>>2]=g;c[f+4>>2]=h;c[b+572>>2]=13;f=-1;l=s;return f|0}k=j;j=c[k>>2]|0;k=c[k+4>>2]|0;m=qf(c[b+728>>2]|0,j,k)|0;if(!m){f=0;l=s;return f|0}if(!(c[m+32>>2]|0)){b=m+8|0;k=qi(j|0,k|0,c[b>>2]|0,c[b+4>>2]|0)|0;j=c[m+76>>2]|0;if(j&o|0){p=Xa[c[m+68>>2]&31](c[m+64>>2]|0,k,i)|0;n=0;break}if(!((i|0)==3&(j&4|0)!=0)){p=0;n=0;break}b=m+68|0;n=m+64|0;p=Xa[c[b>>2]&31](c[n>>2]|0,k,2)|0;n=Xa[c[b>>2]&31](c[n>>2]|0,k+4|0,2)|0;break}r=Ai(g|0,h|0,12)|0;r=r&255;q=c[m+40>>2]|0;o=m+8|0;j=qi(j|0,k|0,c[o>>2]|0,c[o+4>>2]|0)|0;j=q+j|0;q=b+736+(r<<4)|0;c[q>>2]=g&-4096;c[q+4>>2]=h;c[b+736+(r<<4)+8>>2]=j-g;switch(i|0){case 0:{p=d[j>>0]|0;n=0;break a}case 1:{p=e[j>>1]|0;n=0;break a}case 2:{p=c[j>>2]|0;n=0;break a}case 3:{n=j;p=c[n>>2]|0;n=c[n+4>>2]|0;break a}default:ra()}}else switch(i|0){case 1:{j=(Ai(g|0,h|0,12)|0)&255;q=b+736+(j<<4)|0;do if((c[q>>2]|0)==(g&-4096|0)?(c[q+4>>2]|0)==(h|0):0)n=a[(c[b+736+(j<<4)+8>>2]|0)+g>>0]|0;else{j=Yf(b,r,g,h,0)|0;if(!j){n=c[r>>2]&255;break}f=j;l=s;return f|0}while(0);j=pi(g|0,h|0,1,0)|0;k=y;m=(Ai(j|0,k|0,12)|0)&255;q=b+736+(m<<4)|0;do if((c[q>>2]|0)==(j&-4096|0)?(c[q+4>>2]|0)==(k|0):0)j=a[(c[b+736+(m<<4)+8>>2]|0)+j>>0]|0;else{j=Yf(b,r,j,k,0)|0;if(!j){j=c[r>>2]&255;break}f=j;l=s;return f|0}while(0);p=(j&255)<<8|n&255;n=0;break a}case 2:{k=qi(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;m=y;j=(Ai(k|0,m|0,12)|0)&255;h=b+736+(j<<4)|0;do if((c[h>>2]|0)==(k&-4093|0)?(c[h+4>>2]|0)==(m|0):0)n=c[(c[b+736+(j<<4)+8>>2]|0)+k>>2]|0;else{j=Yf(b,r,k,m,2)|0;if(!j){n=c[r>>2]|0;break}f=j;l=s;return f|0}while(0);j=pi(k|0,m|0,4,0)|0;k=y;m=(Ai(j|0,k|0,12)|0)&255;h=b+736+(m<<4)|0;do if(!((c[h>>2]|0)==(j&-4093|0)?(c[h+4>>2]|0)==(k|0):0)){j=Yf(b,r,j,k,2)|0;if(!j){m=c[r>>2]|0;j=0;break}else{m=0;break}}else{m=c[(c[b+736+(m<<4)+8>>2]|0)+j>>2]|0;j=0}while(0);k=q<<3;if(!j){p=m<<32-k|n>>>k;n=0;break a}l=s;return j|0}case 3:{k=qi(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;m=y;j=(Ai(k|0,m|0,12)|0)&255;h=b+736+(j<<4)|0;do if((c[h>>2]|0)==(k&-4089|0)?(c[h+4>>2]|0)==(m|0):0){p=(c[b+736+(j<<4)+8>>2]|0)+k|0;n=c[p>>2]|0;p=c[p+4>>2]|0}else{j=Yf(b,r,k,m,3)|0;if(!j){p=r;n=c[p>>2]|0;p=c[p+4>>2]|0;break}f=j;l=s;return f|0}while(0);j=pi(k|0,m|0,8,0)|0;k=y;m=(Ai(j|0,k|0,12)|0)&255;h=b+736+(m<<4)|0;do if(!((c[h>>2]|0)==(j&-4089|0)?(c[h+4>>2]|0)==(k|0):0)){j=Yf(b,r,j,k,3)|0;if(!j){o=r;j=0;k=c[o>>2]|0;o=c[o+4>>2]|0;break}else{k=0;o=0;break}}else{o=(c[b+736+(m<<4)+8>>2]|0)+j|0;j=0;k=c[o>>2]|0;o=c[o+4>>2]|0}while(0);b=q<<3;m=Ai(n|0,p|0,b|0)|0;n=y;k=Bi(k|0,o|0,64-b|0)|0;if(!j){p=k|m;n=y|n;break a}l=s;return j|0}default:ra()}while(0);c[f>>2]=p;c[f+4>>2]=n;f=0;l=s;return f|0}function Zf(d,e,f,g,h,i){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;j=r;q=1<<i;p=q+-1|0;if(!((p&e|0)==0&(((p|0)<0)<<31>>31&f|0)==0)){if((i|0)==31){h=0;l=r;return h|0}o=0;while(1){j=pi(o|0,0,e|0,f|0)|0;k=y;m=Ai(g|0,h|0,o<<3|0)|0;n=Ai(j|0,k|0,12)|0;n=n&255;i=d+4832+(n<<4)|0;if(!((c[i>>2]|0)==(j&-4096|0)?(c[i+4>>2]|0)==(k|0):0)){j=Zf(d,j,k,m&255,0,0)|0;if(j|0){k=24;break}}else a[(c[d+4832+(n<<4)+8>>2]|0)+j>>0]=m;o=o+1|0;if((o|0)>=(q|0)){j=0;k=24;break}}if((k|0)==24){l=r;return j|0}}if(ag(d,j,e,f,1)|0){h=d+576|0;c[h>>2]=e;c[h+4>>2]=f;c[d+572>>2]=15;h=-1;l=r;return h|0}m=j;k=c[m>>2]|0;m=c[m+4>>2]|0;p=qf(c[d+728>>2]|0,k,m)|0;if(!p){h=0;l=r;return h|0}j=(c[p+32>>2]|0)==0;n=p+8|0;o=n;o=qi(k|0,m|0,c[o>>2]|0,c[o+4>>2]|0)|0;if(j){j=c[p+76>>2]|0;if(j&q|0){fb[c[p+72>>2]&31](c[p+64>>2]|0,o,g,i);h=0;l=r;return h|0}if(!((i|0)==3&(j&4|0)!=0)){h=0;l=r;return h|0}e=p+72|0;f=p+64|0;fb[c[e>>2]&31](c[f>>2]|0,o,g,2);fb[c[e>>2]&31](c[f>>2]|0,o+4|0,h,2);h=0;l=r;return h|0}q=c[p+48>>2]|0;j=q+(o>>>17<<2)|0;if(!q)j=o;else{c[j>>2]=c[j>>2]|1<<(o>>>12&31);j=n;j=qi(k|0,m|0,c[j>>2]|0,c[j+4>>2]|0)|0}q=Ai(e|0,f|0,12)|0;q=q&255;j=(c[p+40>>2]|0)+j|0;p=d+4832+(q<<4)|0;c[p>>2]=e&-4096;c[p+4>>2]=f;c[d+4832+(q<<4)+8>>2]=j-e;switch(i|0){case 0:{a[j>>0]=g;h=0;l=r;return h|0}case 1:{b[j>>1]=g;h=0;l=r;return h|0}case 2:{c[j>>2]=g;h=0;l=r;return h|0}case 3:{f=j;c[f>>2]=g;c[f+4>>2]=h;h=0;l=r;return h|0}default:ra()}return 0}function _f(b,e,f){b=b|0;e=e|0;f=f|0;var g=0;if((e&3072|0)==3072&(f|0)!=0){b=-1;return b|0}f=a[21702]|0;if((e>>>8&3)>>>0>(f&255)>>>0){b=-1;return b|0}a:do switch(e|0){case 1:if(!(a[21703]|0)){b=-1;return b|0}else{f=c[5424]|0;e=0;g=46;break a}case 2:if(!(a[21703]|0)){b=-1;return b|0}else{f=d[21700]|0;e=0;g=46;break a}case 3:if(!(a[21703]|0)){b=-1;return b|0}else{f=d[21700]<<5|c[5424];e=0;g=46;break a}case 3074:case 3072:{if((f&255)<3?((f<<24>>24==0?c[5466]|0:c[5453]|0)&1<<(e&31)|0)==0:0){g=45;break a}e=21712;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 3202:case 3200:{if((a[21701]|0)==32){if((f&255)<3?((f<<24>>24==0?c[5466]|0:c[5453]|0)&1<<(e&31)|0)==0:0){g=45;break a}f=c[5429]|0;e=0;g=46}else g=45;break}case 256:{e=21736;g=c[e>>2]|d[21703]<<13;f=g&909619;e=c[e+4>>2]&3;if((g&24576|0)==24576&0==0|(g&98304|0)==98304&0==0){g=Bi(1,0,(d[21701]|0)+-1|0)|0;f=g|f;e=y|e;g=46}else g=46;break}case 260:{f=c[5452]&c[5449];e=0;g=46;break}case 261:{e=21816;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 262:{f=c[5466]|0;e=0;g=46;break}case 320:{e=21824;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 321:{e=21832;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 322:{e=21840;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 323:{e=21848;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 324:{f=c[5452]&c[5450];e=0;g=46;break}case 384:{e=21856;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 768:{f=21736;e=c[f+4>>2]|0;f=c[f>>2]|d[21703]<<13;if((f&24576|0)==24576&0==0|(f&98304|0)==98304&0==0){g=Bi(1,0,(d[21701]|0)+-1|0)|0;f=g|f;e=y|e;g=46}else g=46;break}case 769:{f=c[5448]|(Bi(d[21704]|0,0,(d[21701]|0)+-2|0)|0);e=y;g=46;break}case 770:{f=c[5451]|0;e=0;g=46;break}case 771:{f=c[5452]|0;e=0;g=46;break}case 772:{f=c[5449]|0;e=0;g=46;break}case 773:{e=21744;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 774:{f=c[5453]|0;e=0;g=46;break}case 832:{e=21752;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 833:{e=21760;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 834:{e=21768;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 835:{e=21776;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 836:{f=c[5450]|0;e=0;g=46;break}case 2818:case 2816:{e=21712;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 2946:case 2944:{if((a[21701]|0)==32){f=c[5429]|0;e=0;g=46}else g=45;break}case 3860:{e=21784;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}default:g=45}while(0);if((g|0)==45){c[b>>2]=0;c[b+4>>2]=0;b=-1;return b|0}else if((g|0)==46){c[b>>2]=f;c[b+4>>2]=e;b=0;return b|0}return 0}function $f(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;do switch(b|0){case 1:{c[5424]=e&31;a[21703]=3;f=0;return f|0}case 2:{f=e&7;a[21700]=f>>>0>4?0:f&255;a[21703]=3;f=0;return f|0}case 3:{f=(Ai(e|0,f|0,5)|0)&7;a[21700]=f>>>0>4?0:f&255;c[5424]=e&31;a[21703]=3;f=0;return f|0}case 256:{h=21736;g=c[h>>2]|0;h=c[h+4>>2]|0;i=g&-909620|e&909619;j=h&-4|f&3;b=i^g;if(!((b&917504|0)==0&0==0?(g&131072|0)==0&0==0|(b&6144|0)==0&0==0:0)){b=0;do{k=21888+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;b=b+1|0}while((b|0)!=256)}e=Ai(e|0,f|0,13)|0;a[21703]=e&3;f=f&3;f=(f|0)==0|(f|0)==3;e=f?924091:924091;f=f?0:15;k=21736;c[k>>2]=i&e|g&~e;c[k+4>>2]=j&f|h&~f;k=0;return k|0}case 260:{k=c[5452]|0;c[5449]=~k&c[5449]|k&e;k=0;return k|0}case 261:{k=21816;c[k>>2]=e&-4;c[k+4>>2]=f;k=0;return k|0}case 262:{c[5466]=e&5;k=0;return k|0}case 320:{k=21824;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 321:{k=21832;c[k>>2]=e&-2;c[k+4>>2]=f;k=0;return k|0}case 322:{k=21840;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 323:{k=21848;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 324:{k=c[5452]|0;c[5450]=~k&c[5450]|k&e;k=0;return k|0}case 384:{b=Ai(e|0,f|0,60)|0;if((b|0)!=0?(g=21856,g=Ai(c[g>>2]|0,c[g+4>>2]|0,60)|0,(b&14|0)!=8):0)b=g;k=Bi(b|0,0,60)|0;b=21856;c[b>>2]=k|e;c[b+4>>2]=y|f&4095;b=0;do{k=21888+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;b=b+1|0}while((b|0)!=256);b=2;return b|0}case 768:{h=21736;g=c[h>>2]|0;h=c[h+4>>2]|0;k=g^e;if(!((k&917504|0)==0&0==0?(g&131072|0)==0&0==0|(k&6144|0)==0&0==0:0)){b=0;do{k=21888+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;b=b+1|0}while((b|0)!=256)}j=Ai(e|0,f|0,13)|0;a[21703]=j&3;j=f&3;j=(j|0)==0|(j|0)==3;i=j?924091:924091;j=j?0:15;k=21736;c[k>>2]=g&~i|i&e;c[k+4>>2]=h&~j|j&f;k=0;return k|0}case 769:{k=Ai(e|0,f|0,(d[21701]|0)+-2|0)|0;b=k&3;switch(k&3){case 3:case 0:{k=0;return k|0}default:{}}if((b|0)==(d[21704]|0|0)){k=0;return k|0}a[21704]=b;a[21701]=1<<(b|4);k=1;return k|0}case 770:{c[5451]=c[5451]&-65536|e&65535;k=0;return k|0}case 771:{c[5452]=c[5452]&-547|e&546;k=0;return k|0}case 772:{c[5449]=c[5449]&-683|e&682;k=0;return k|0}case 773:{k=21744;c[k>>2]=e&-4;c[k+4>>2]=f;k=0;return k|0}case 774:{c[5453]=e&5;k=0;return k|0}case 832:{k=21752;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 833:{k=21760;c[k>>2]=e&-2;c[k+4>>2]=f;k=0;return k|0}case 834:{k=21768;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 835:{k=21776;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 836:{c[5450]=c[5450]&-35|e&34;k=0;return k|0}default:{k=-1;return k|0}}while(0);return 0}
+function Yd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;h=k;i=k+12|0;if((f|0)<0){c[h>>2]=0-e;Xd(15755,h)}f=Lg(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);Xa[c[b+76>>2]&31](b,c[g+16>>2]|0,15637)|0;if((Ee(f)|0)==1?(e=Ae(f)|0,c[i>>2]=e,e|0):0)if(!(Zd(b,i,c[b+144>>2]|0,34812)|0)){c[g+24>>2]=0;_d(b,0,0,g);l=k;return}else Xd(15796,j);Xd(15796,j)}function Zd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;K=l;l=l+2080|0;D=K+2056|0;E=K+1024|0;F=K;J=K+2076|0;G=K+2072|0;H=K+2068|0;o=K+2064|0;p=K+2048|0;c[J>>2]=c[d>>2];q=b+128|0;r=b+88|0;s=b+92|0;t=b+96|0;u=D+4|0;v=b+140|0;w=b+136|0;x=b+112|0;z=e+16|0;A=e+24|0;B=e+56|0;C=e+64|0;a:while(1){g=c[J>>2]|0;b:do switch(a[g>>0]|0){case 0:{h=44;break a}case 46:{h=5;break a}case 35:{re(J);break}default:{if((te(G,J,8)|0)<0){h=7;break a}m=c[G>>2]|0;n=m>>>12;c[G>>2]=m&4095;if((ve(H,J)|0)<0){h=9;break a}if((ve(o,J)|0)<0){h=11;break a}h=c[G>>2]|0;k=c[H>>2]|0;m=c[o>>2]|0;i=vf(104)|0;g=i+16|0;c[g>>2]=1;c[i+20>>2]=0;M=q;j=c[M+4>>2]|0;L=i+8|0;c[L>>2]=c[M>>2];c[L+4>>2]=j;L=q;j=q;c[j>>2]=pi(c[L>>2]|0,c[L+4>>2]|0,1,0)|0;c[j+4>>2]=y;j=i+24|0;c[j>>2]=n;c[i+28>>2]=h&4095;c[i+32>>2]=k;c[i+36>>2]=m;switch(n&1048575|0){case 8:{Ga(i+64|0);break}case 4:{M=i+56|0;c[M>>2]=M;c[i+60>>2]=M;break}default:{}}k=c[s>>2]|0;c[s>>2]=i;c[i>>2]=r;c[i+4>>2]=k;c[k>>2]=i;k=t;L=t;c[L>>2]=pi(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[L+4>>2]=y;Oa(D|0,0)|0;L=c[D>>2]|0;k=i+40|0;c[k>>2]=L;M=(c[u>>2]|0)*1e3|0;m=i+48|0;c[m>>2]=M;c[i+44>>2]=L;c[i+52>>2]=M;M=p;c[M>>2]=0;c[M+4>>2]=0;switch(n&1048575|0){case 6:case 2:{if((ve(i+56|0,J)|0)<0){h=17;break a}if((ve(i+60|0,J)|0)<0){h=19;break a}break}case 8:{if((ue(p,J)|0)<0){h=21;break a}break}case 4:{c[g>>2]=(c[g>>2]|0)+1;if((c[j>>2]|0)!=4){h=23;break a}M=vf(18)|0;c[M+8>>2]=i;g=M+13|0;a[g>>0]=46;a[g+1>>0]=0;g=i+56|0;h=i+64|0;R=c[h>>2]|0;L=R+18|0;S=pi(c[v>>2]|0,0,-1,-1)|0;N=y;P=pi(S|0,N|0,L|0,((L|0)<0)<<31>>31|0)|0;Q=c[w>>2]|0;P=Ai(P|0,y|0,Q|0)|0;O=y;Q=Ai(pi(S|0,N|0,R|0,((R|0)<0)<<31>>31|0)|0,y|0,Q|0)|0;R=x;N=x;c[N>>2]=pi(qi(c[R>>2]|0,c[R+4>>2]|0,Q|0,y|0)|0,y|0,P|0,O|0)|0;c[N+4>>2]=y;c[h>>2]=L;L=c[g>>2]|0;c[L+4>>2]=M;c[M>>2]=L;c[M+4>>2]=g;c[g>>2]=M;c[z>>2]=(c[z>>2]|0)+1;if((c[j>>2]|0)!=4){h=25;break a}S=vf(19)|0;c[S+8>>2]=e;M=S+13|0;a[M>>0]=a[14342]|0;a[M+1>>0]=a[14343]|0;a[M+2>>0]=a[14344]|0;M=c[h>>2]|0;R=M+19|0;L=pi(c[v>>2]|0,0,-1,-1)|0;Q=y;O=pi(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Ai(O|0,y|0,N|0)|0;P=y;N=Ai(pi(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=pi(qi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[h>>2]=R;R=c[g>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=g;c[g>>2]=S;break}default:{}}if((we(k,m,J)|0)<0){h=28;break a}if((se(E,1024,J)|0)<0){h=30;break a}if((c[A>>2]|0)!=4){h=32;break a}M=_g(E)|0;R=M+17|0;S=vf(R)|0;c[S+8>>2]=i;Ei(S+13|0,E|0,M+1|0)|0;M=c[C>>2]|0;R=M+R|0;L=pi(c[v>>2]|0,0,-1,-1)|0;Q=y;O=pi(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Ai(O|0,y|0,N|0)|0;P=y;N=Ai(pi(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=pi(qi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[C>>2]=R;R=c[B>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=B;c[B>>2]=S;do if((n|0)!=10){S=p;if(!((n|0)==8&((c[S>>2]|0)!=0|(c[S+4>>2]|0)!=0))){re(J);if((n|0)!=4)break b;S=pe(f,E)|0;g=Zd(b,J,i,S)|0;Mg(S);if(!g)break b;else{h=46;break a}}else{if((xe(D,J)|0)<0){h=40;break a}R=D;S=p;Pd(b,i,15635,c[R>>2]|0,c[R+4>>2]|0,c[S>>2]|0,c[S+4>>2]|0)|0;break}}else{if((se(F,1024,J)|0)<0){h=35;break a}c[i+56>>2]=Lh(F)|0}while(0);re(J)}}while(0)}switch(h|0){case 5:{c[J>>2]=g+1;re(J);I=c[J>>2]|0;break}case 7:{di(15963,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 9:{di(15977,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 11:{di(15990,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 17:{di(16003,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 19:{di(16018,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 21:{di(15932,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 23:{ja(14301,14319,456,14328);break}case 25:{ja(14301,14319,456,14328);break}case 28:{di(16033,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 30:{di(15857,17,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 32:{ja(14301,14319,456,14328);break}case 35:{di(16048,21,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 40:{di(15946,16,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 44:{I=g;break}case 46:{l=K;return g|0}}c[d>>2]=I;S=0;l=K;return S|0}function _d(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;f=h;g=e+20|0;b=c[g>>2]|0;if(b|0){db[c[a+4>>2]&15](a,b);c[g>>2]=0}b=e+24|0;d=c[b>>2]|0;if((d|0)<=1){i=c[e+16>>2]|0;c[b>>2]=d+1;b=ld(a,i,c[12960+(d<<2)>>2]|0)|0;c[g>>2]=b;if(b|0?(_a[c[a+24>>2]&15](a,f,b,0,6,e)|0)>=1:0){l=h;return}_d(a,0,0,e);l=h;return}if(($d(a,15826,1)|0)<0)$d(a,15848,0)|0;db[c[a+4>>2]&15](a,c[e+16>>2]|0);b=c[e+8>>2]|0;if(b|0)cb[b&15](c[e+12>>2]|0);Mg(e);l=h;return}function $d(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=l;l=l+1072|0;h=t+1056|0;o=t+1048|0;n=t+1040|0;q=t+1060|0;r=t;k=t+1032|0;m=t+1024|0;d=Od(b,d)|0;if(!d){s=-1;l=t;return s|0}if((c[d+24>>2]|0)!=8){s=-1;l=t;return s|0}if((c[d+56>>2]|0)!=3){s=-1;l=t;return s|0}j=c[d+60>>2]|0;p=Lg(j+1|0)|0;Ha(d+64|0,0,p|0,j|0);a[p+j>>0]=0;if(!e){c[q>>2]=p;f=c[3261]|0;g=b+176|0;d=p;a:while(1)b:do switch(a[d>>0]|0){case 0:break a;case 9:case 32:{d=d+1|0;c[q>>2]=d;break}case 10:{d=d+1|0;c[q>>2]=d;break}default:{if((se(r,1024,q)|0)<0){s=49;break a}d=Od(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0){o=vf(24)|0;m=d+80|0;n=c[m+4>>2]|0;e=o+8|0;c[e>>2]=c[m>>2];c[e+4>>2]=n;e=o+16|0;c[e>>2]=e;c[o+20>>2]=e;n=c[g>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=g;c[g>>2]=o;while(1){d=c[q>>2]|0;c:while(1){switch(a[d>>0]|0){case 10:case 0:break b;case 9:case 32:break;default:break c}o=d+1|0;c[q>>2]=o;d=o}if((se(r,1024,q)|0)<0){s=61;break a}o=vf(16)|0;c[o+12>>2]=Lh(r)|0;n=c[e>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=e;c[e>>2]=o}}c[h>>2]=r;fi(f,15875,h)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:break b;default:{}}o=d+1|0;c[q>>2]=o;d=o}}}while(0);if((s|0)==49)di(15857,17,1,f)|0;else if((s|0)==61)di(15857,17,1,f)|0}else{c[q>>2]=p;h=c[3261]|0;i=b+176|0;j=b+184|0;e=0;g=0;d=p;d:while(1){f=e;e:while(1){f:while(1){e=a[d>>0]|0;g:while(1)switch(e<<24>>24){case 0:break d;case 64:{s=12;break e}case 10:break f;case 35:break;case 9:case 32:break g;default:{e=0;break e}}e=d+1|0;c[q>>2]=e;d=e}d=d+1|0;c[q>>2]=d;f=0}if((s|0)==12){c[q>>2]=d+1;e=1}if((se(r,1024,q)|0)<0){s=14;break}d=c[q>>2]|0;h:while(1){switch(a[d>>0]|0){case 58:{s=18;break h}case 9:case 32:break;default:{s=27;break h}}s=d+1|0;c[q>>2]=s;d=s}i:do if((s|0)==18){s=0;c[q>>2]=d+1;d=Od(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0)if(!e){f=vf(24)|0;d=d+80|0;e=c[d+4>>2]|0;g=f+8|0;c[g>>2]=c[d>>2];c[g+4>>2]=e;g=f+16|0;c[g>>2]=g;c[f+20>>2]=g;g=c[i>>2]|0;c[g+4>>2]=f;c[f>>2]=g;c[f+4>>2]=i;c[i>>2]=f;g=0;break}else{g=vf(20)|0;c[g+8>>2]=Lh(r)|0;f=g+12|0;c[f>>2]=f;c[g+16>>2]=f;f=c[j>>2]|0;c[f+4>>2]=g;c[g>>2]=f;c[g+4>>2]=j;c[j>>2]=g;f=0;break}c[n>>2]=r;fi(h,15875,n)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:{f=0;g=0;break i}default:{}}g=d+1|0;c[q>>2]=g;d=g}}else if((s|0)==27){s=0;d=(g|0)!=0;if(!(d|(f|0)!=0)){s=28;break d}if(!d){d=vf(16)|0;c[d+12>>2]=Lh(r)|0;c[d+8>>2]=e;g=f+16|0;e=c[g>>2]|0;c[e+4>>2]=d;c[d>>2]=e;c[d+4>>2]=g;c[g>>2]=d;g=0;break}if((ue(m,q)|0)<0){s=31;break d}if((xe(k,q)|0)<0){s=33;break d}d=vf(32)|0;c[d+24>>2]=Lh(r)|0;e=k;u=c[e+4>>2]|0;v=d+8|0;c[v>>2]=c[e>>2];c[v+4>>2]=u;v=m;u=c[v+4>>2]|0;e=d+16|0;c[e>>2]=c[v>>2];c[e+4>>2]=u;e=g+12|0;u=c[e>>2]|0;c[u+4>>2]=d;c[d>>2]=u;c[d+4>>2]=e;c[e>>2]=d}while(0);d=c[q>>2]|0;v=a[d>>0]|0;e=v<<24>>24==10;if(e^v<<24>>24!=0)do{d=d+1|0;c[q>>2]=d;v=a[d>>0]|0;e=v<<24>>24==10}while(e^v<<24>>24!=0);if(e){d=d+1|0;c[q>>2]=d}e=f}if((s|0)==14)di(15857,17,1,h)|0;else if((s|0)==28){c[o>>2]=r;fi(h,15903,o)|0}else if((s|0)==31)di(15932,13,1,h)|0;else if((s|0)==33)di(15946,16,1,h)|0}Mg(p);v=0;l=t;return v|0}function ae(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=l;l=l+32|0;d=f+16|0;e=f;if((c[a>>2]|0)!=9)ja(16078,14319,2865,16092);if(_a[c[a+12>>2]&15](a,d,e,0,34812,34812)|0)ja(15194,14319,2867,16092);if(!($a[c[a+28>>2]&3](a,e,c[d>>2]|0,16107,514,384,0)|0)){h=c[a+52>>2]|0;g=c[d>>2]|0;e=_g(b)|0;_a[h&15](a,g,0,0,b,e)|0;db[c[a+4>>2]&15](a,c[d>>2]|0);l=f;return}else ja(16118,14319,2869,16092)}function be(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;f=i+16|0;g=i;h=c[8555]|0;if(!h){Mg(b);l=i;return}if(_a[c[h+12>>2]&15](h,f,g,1e3,34812,34812)|0)ja(16199,14319,2892,16248);e=ld(h,c[f>>2]|0,c[h+200>>2]|0)|0;if(e|0){Gd(h,c[f>>2]|0,a)|0;if(($a[c[h+28>>2]&3](h,g,e,a,514,384,0)|0)>=0)_a[c[h+52>>2]&15](h,e,0,0,b,d)|0;db[c[h+4>>2]&15](h,e)}a=c[f>>2]|0;if(a|0)db[c[h+4>>2]&15](h,a);Mg(b);l=i;return}function ce(){return}function de(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[8556]|0;c[8556]=f+-1;a=(f|0)>1;if((f|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,0,d,e);return}function ee(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[8556]|0;c[8556]=e+-1;a=(e|0)>1;if((e|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,(d|0)<1?-404:0-d|0,0,0);return}function fe(a){a=a|0;c[a+4>>2]=0;c[a>>2]=0;return}function ge(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;g=vf(8)|0;c[g>>2]=e;c[g+4>>2]=f;f=c[8556]|0;c[8556]=f+1;if(!f)Na(1);wa(a|0,16268,b|0,d|0,0,0,g|0,1,7,8,0)|0;return g|0}function he(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=vf(4132)|0;c[e>>2]=b;c[e+4>>2]=d;c[e+16>>2]=a;return e|0}function ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!e){q=0;return q|0}l=b+8|0;m=b+12|0;n=b+36|0;o=b+16|0;p=b+20|0;q=b+4|0;k=b+40|0;j=d;a:while(1){switch(c[l>>2]|0){case 0:{i=c[m>>2]|0;d=20-i|0;d=(e|0)<(d|0)?e:d;Ei(b+36+i|0,j|0,d|0)|0;i=d+(c[m>>2]|0)|0;c[m>>2]=i;if((i|0)>19){if(Rh(n,16326,4)|0){d=-1;e=12;break a}f=p;g=k;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[l>>2]=1;c[m>>2]=0}break}case 1:{d=c[m>>2]|0;i=4096-d|0;i=(e|0)<(i|0)?e:i;Ei(b+36+d|0,j|0,i|0)|0;d=i+(c[m>>2]|0)|0;c[m>>2]=d;if((d|0)>4095){d=d+-16|0;Ef(n,n,d,c[o>>2]|0,p,0);d=Xa[c[b>>2]&31](c[q>>2]|0,n,d)|0;if((d|0)<0){e=12;break a}f=n;g=(c[m>>2]|0)+(b+36)+-16|0;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[m>>2]=16;d=i}else d=i;break}default:{e=10;break a}}e=e-d|0;if(!e){d=0;e=12;break}else j=j+d|0}if((e|0)==10)ra();else if((e|0)==12)return d|0;return 0}function je(b){b=b|0;var d=0,e=0,f=0,g=0;if((c[b+8>>2]|0)!=1){g=-1;return g|0}d=b+12|0;e=c[d>>2]|0;if(!((e|0)!=0&(e&15|0)==0)){g=-1;return g|0}g=b+36|0;Ef(g,g,e,c[b+16>>2]|0,b+20|0,0);d=a[(c[d>>2]|0)+-1+(b+36)>>0]|0;if((d+-1&255)>15){g=-1;return g|0}d=e-(d&255)|0;if(d|0?(f=Xa[c[b>>2]&31](c[b+4>>2]|0,g,d)|0,(f|0)<0):0){g=f;return g|0}g=0;return g|0}function ke(a){a=a|0;Mg(a);return}function le(a,b,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=vf(48)|0;c[m>>2]=a;c[m+4>>2]=b;b=m+8|0;c[b>>2]=0;c[b+4>>2]=0;c[m+16>>2]=j;c[m+20>>2]=k;b=m+24|0;c[b>>2]=g;k=m+32|0;g=k;c[g>>2]=0;c[g+4>>2]=0;if(l|0){g=vf(4132)|0;c[g>>2]=15;c[g+4>>2]=m;c[g+16>>2]=l;c[m+40>>2]=g}l=vf(8)|0;c[l>>2]=m;c[l+4>>2]=9;g=(h|0)!=0|(i|0)!=0;if(g){a=Lg(h)|0;j=c[m>>2]|0;b=c[b>>2]|0;if((b|0)!=0?(n=k,n=_a[c[j+48>>2]&15](j,b,c[n>>2]|0,c[n+4>>2]|0,a,h)|0,(n|0)>=0):0){b=k;n=pi(c[b>>2]|0,c[b+4>>2]|0,n|0,((n|0)<0)<<31>>31|0)|0;b=k;c[b>>2]=n;c[b+4>>2]=y;b=16263}else b=16263}else{a=0;b=16268}n=c[8556]|0;c[8556]=n+1;if(!n)Na(1);wa(d|0,b|0,e|0,f|0,a|0,h|0,l|0,1,7,8,0)|0;if(!g)return;Mg(a);return}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=c[a>>2]|0;e=a+8|0;f=e;a=_a[c[g+52>>2]&15](g,c[a+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,b,d)|0;if((a|0)<0)return a|0;f=e;f=pi(c[f>>2]|0,c[f+4>>2]|0,a|0,((a|0)<0)<<31>>31|0)|0;g=e;c[g>>2]=f;c[g+4>>2]=y;return a|0}function ne(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[b>>2]|0;do if((d|0)<0){h=b+40|0;i=d;g=((d|0)<0)<<31>>31}else{h=b+40|0;g=c[h>>2]|0;do if(!g){i=b+8|0;g=i;g=_a[c[o+52>>2]&15](o,c[b+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0,e,f)|0;if((g|0)<0)n=13;else{m=i;m=pi(c[m>>2]|0,c[m+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;n=i;c[n>>2]=m;c[n+4>>2]=y;n=14}}else{g=ie(g,e,f)|0;if(!((d|0)==0&(g|0)>-1))if((g|0)<0){n=13;break}else{n=14;break}g=c[h>>2]|0;if((((c[g+8>>2]|0)==1?(i=g+12|0,j=c[i>>2]|0,(j|0)!=0&(j&15|0)==0):0)?(k=g+36|0,Ef(k,k,j,c[g+16>>2]|0,g+20|0,0),l=a[(c[i>>2]|0)+-1+(g+36)>>0]|0,(l+-1&255)<=15):0)?(m=j-(l&255)|0,m|0):0)Xa[c[g>>2]&31](c[g+4>>2]|0,k,m)|0}while(0);if((n|0)==13){i=g;g=((g|0)<0)<<31>>31;break}if((n|0)==14?d|0:0)return;g=b+8|0;i=c[g>>2]|0;g=c[g+4>>2]|0}while(0);gb[c[b+16>>2]&7](o,c[b+4>>2]|0,i,g,c[b+20>>2]|0);g=c[h>>2]|0;if(g|0)Mg(g);Mg(b);return}function oe(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=l;l=l+288|0;x=A+48|0;y=A;z=A+80|0;if((f|0)>=33)ja(16272,16297,589,16307);if((h|0)<=0){l=A;return}o=y+f|0;p=y+(f+1)|0;q=y+(f+2)|0;r=y+(f+3)|0;s=f+4|0;t=(g|0)>0;u=(d|0)>64;v=z+112|0;w=z+176|0;n=1;while(1){c[x>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;Ei(y|0,e|0,f|0)|0;a[o>>0]=n>>>24;a[p>>0]=n>>>16;a[q>>0]=n>>>8;a[r>>0]=n;if(t){k=s;m=0;while(1){if(u){Jf(b,d,v);j=32}else{Ei(v|0,b|0,d|0)|0;j=d}Fi(z+112+j|0,0,64-j|0)|0;j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^54;j=j+1|0}while((j|0)!=64);Ff(z);Gf(z,v,64);Gf(z,y,k);If(w,z);j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^106;j=j+1|0}while((j|0)!=64);Jf(v,96,y);j=0;do{B=x+j|0;a[B>>0]=a[B>>0]^a[y+j>>0];j=j+1|0}while((j|0)!=32);m=m+1|0;if((m|0)==(g|0))break;else k=32}}j=(h|0)<32?h:32;Ei(i|0,x|0,j|0)|0;h=h-j|0;if((h|0)<=0)break;else{i=i+j|0;n=n+1|0}}l=A;return}function pe(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(!(a[b>>0]|0)){f=Lh(c)|0;return f|0}g=_g(b)|0;e=_g(c)|0;f=Lg(g+2+e|0)|0;Ei(f|0,b|0,g|0)|0;d=f+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ei(d|0,c|0,e+1|0)|0;g=f;return g|0}function qe(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(ch(c,58)|0){f=Lh(c)|0;return f|0}if(!(a[b>>0]|0)){f=Lh(c)|0;return f|0}g=_g(b)|0;f=_g(c)|0;e=Lg(g+2+f|0)|0;Ei(e|0,b|0,g|0)|0;d=e+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ei(d|0,c|0,f+1|0)|0;g=e;return g|0}function re(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]|0;while(1){g=a[d>>0]|0;e=g<<24>>24==10;f=d+1|0;if(e^g<<24>>24!=0)d=f;else break}c[b>>2]=e?f:d;return}function se(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[e>>2]|0;a:while(1){f=a[h>>0]|0;switch(f<<24>>24){case 34:{j=4;break a}case 0:{i=-1;j=26;break a}case 9:case 32:break;default:{j=21;break a}}h=h+1|0}b:do if((j|0)==4){k=b+d+-1|0;f=h+1|0;c:while(1){d=f+1|0;j=a[f>>0]|0;h=j<<24>>24;d:do switch(j<<24>>24){case 34:{g=b;l=d;break b}case 0:case 10:{i=-1;j=26;break c}case 92:{i=f+2|0;h=a[d>>0]|0;switch(h|0){case 92:case 34:case 39:{f=i;break d}case 110:{h=10;f=i;break d}case 114:{h=13;f=i;break d}case 116:{h=9;f=i;break d}case 120:{i=a[i>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{j=d+-87|0;break}else{j=d+-55|0;break}else j=h;while(0);i=a[f+3>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{h=d+-87|0;break}else{h=d+-55|0;break}while(0);h=h|j<<4;f=f+4|0;break d}default:{i=-1;j=26;break c}}}default:f=d}while(0);if(b>>>0>=k>>>0){i=-1;j=26;break}a[b>>0]=h;b=b+1|0}if((j|0)==26)return i|0}else if((j|0)==21){i=b+d+-1|0;g=b;while(1){switch(f<<24>>24){case 10:case 0:case 9:case 32:{l=h;break b}default:{}}if(g>>>0>=i>>>0){i=-1;break}l=h+1|0;a[g>>0]=f;g=g+1|0;h=l;f=a[l>>0]|0}return i|0}else if((j|0)==26)return i|0;while(0);a[g>>0]=0;c[e>>2]=l;e=0;return e|0}function te(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=c[d>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Sh(g,f,e)|0;b=c[f>>2]|0;if((b|0)==(g|0)){d=-1;l=h;return d|0}c[d>>2]=b;d=0;l=h;return d|0}function ue(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=ai(f,e,0)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function ve(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}c[b>>2]=Sh(f,e,0)|0;b=c[e>>2]|0;if((b|0)==(f|0)){d=-1;l=g;return d|0}c[d>>2]=b;d=0;l=g;return d|0}function we(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;g=c[e>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Sh(g,f,0)|0;b=c[f>>2]|0;if((b|0)==(g|0)){e=-1;l=i;return e|0}if((a[b>>0]|0)==46){b=b+1|0;f=a[b>>0]|0;if((f+-48&255)<10){g=0;h=1e9;do{h=(h>>>0)/10|0;g=(N((f<<24>>24)+-48|0,h)|0)+g|0;b=b+1|0;f=a[b>>0]|0}while((f+-48&255)<10);f=g}else f=0}else f=0;c[d>>2]=f;c[e>>2]=b;e=0;l=i;return e|0}function xe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=ai(f,e,16)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function ye(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=f;c[g>>2]=b;c[g+4>>2]=d;Th(a,16330,f)|0;l=e;return a|0}function ze(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if((d|0)<=0){d=0;return d|0}j=0;a:while(1){h=j<<1;f=a[c+h>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{i=g+-87|0;break}else{i=g+-55|0;break}else i=e;while(0);f=a[c+(h|1)>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{e=g+-87|0;break}else{e=g+-55|0;break}while(0);a[b+j>>0]=e|i<<4;j=j+1|0;if((j|0)>=(d|0)){e=0;f=12;break}}if((f|0)==12)return e|0;return 0}function Ae(a){a=a|0;a=Mh(a,16338)|0;return ((a|0)==0?0:a+2|0)|0}function Be(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+128|0;i=k;j=i;a:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 10:case 0:{d=-1;f=18;break a}default:{}}f=i;b:while(1){switch(g<<24>>24){case 0:case 10:case 58:break b;default:{}}if((f-j|0)>>>0<127){a[f>>0]=g;f=f+1|0}g=d+1|0;d=g;g=a[g>>0]|0}a[f>>0]=0;if((a[d>>0]|0)!=58){d=-1;f=18;break}c:while(1){d=d+1|0;switch(a[d>>0]|0){case 9:case 32:break;default:break c}}f=ch(d,10)|0;g=(f|0)!=0;if(g)h=f-d|0;else h=_g(d)|0;if(!(Zg(i,e)|0)){f=16;break}if(g)d=f+1|0;else{d=-1;f=18;break}}if((f|0)==16){c=(h|0)<(c|0)?h:c+-1|0;Ei(b|0,d|0,c|0)|0;a[b+c>>0]=0;c=0;l=k;return c|0}else if((f|0)==18){l=k;return d|0}return 0}function Ce(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Be(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=ai(f,g,0)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function De(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Be(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=ai(f,g,16)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function Ee(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+80|0;e=f+64|0;d=f;if(Be(d,64,b,16341)|0){l=f;return -1}a:while(1){switch(a[d>>0]|0){case 9:case 32:break;default:break a}d=d+1|0}b=ai(d,e,0)|0;l=f;return ((c[e>>2]|0)==(d|0)?-1:b)|0}function Fe(a){a=a|0;if(wf(a,16349,0)|0){a=1;return a|0}if(wf(a,16355,0)|0){a=1;return a|0}a=(wf(a,16362,0)|0)!=0&1;return a|0}function Ge(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[e>>2]|0;o=Wa[c[o+2576>>2]&3](o,e)|0;if((f|0)<=0)return;m=a+8|0;n=a+4|0;l=0;h=0;e=0;while(1){g=c[o+(l>>>5<<2)>>2]|0;if(!g)g=h;else{i=0;k=e;while(1){j=i;while(1){e=1<<j;if(!(e&g))j=j+1|0;else break}g=g&~e;e=j+l<<12;p=c[m>>2]|0;i=(e|0)/(p|0)|0;p=((e|4095|0)/(p|0)|0)+1|0;e=c[n>>2]|0;e=(p|0)<(e|0)?p:e;if((k|0)!=(h|0)){if((i|0)>(k+3|0)){hb[b&1](a,d,0,h,c[a>>2]|0,k-h|0);h=i}}else h=i;if(!g){g=h;break}else{i=j;k=e}}}l=l+32|0;if((l|0)>=(f|0))break;else h=g}if((e|0)==(g|0))return;hb[b&1](a,d,0,g,c[a>>2]|0,e-g|0);return}function He(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=vf(12)|0;c[h>>2]=e;c[e>>2]=f;c[e+4>>2]=g;f=f<<2;c[e+8>>2]=f;f=(N(f,g)|0)+65535&-65536;g=e+16|0;c[g>>2]=f;c[h+4>>2]=f>>12;g=c[g>>2]|0;g=_a[c[a+2568>>2]&15](a,b,d,g,((g|0)<0)<<31>>31,2)|0;c[h+8>>2]=g;c[e+12>>2]=c[g+40>>2];c[e+20>>2]=h;c[e+24>>2]=6;return h|0}function Ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+20>>2]|0;Ge(a,b,d,c[e+8>>2]|0,c[e+4>>2]|0);return}function Je(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;a:do if((e|0)>=0){j=b+4+(e<<2)|0;if(c[j>>2]|0){i=0;return i|0}}else{e=0;while(1){j=b+4+(e<<2)|0;if(!(c[j>>2]|0))break a;e=e+8|0;if(e>>>0>=256){e=0;break}}return e|0}while(0);k=vf(432)|0;c[k>>2]=b;c[k+316>>2]=Lh(d)|0;a[k+4>>0]=e;a[k+56>>0]=f;a[k+57>>0]=(f&65535)>>>8;a[k+58>>0]=g;a[k+59>>0]=(g&65535)>>>8;a[k+64>>0]=h;a[k+66>>0]=i;a[k+67>>0]=(i&65535)>>>8;a[k+70>>0]=0;a[k+312>>0]=64;uf(k+8|0,7,k,0);uf(k+20|0,7,k,1);uf(k+32|0,7,k,2);uf(k+44|0,7,k,3);c[j>>2]=k;i=k;return i|0}function Ke(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a>>2]|0;f=d[a+4>>0]|0;a=b+3+(f>>>3)&3;b=1<<(f&31);if(!e){e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]&~b}else{e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]|b}eb[c[g+1164+(a*12|0)>>2]&15](c[g+1164+(a*12|0)+4>>2]|0,c[g+1164+(a*12|0)+8>>2]|0,(c[g+1036+(a<<5)+28>>2]|(c[g+1036+(a<<5)+24>>2]|(c[g+1036+(a<<5)+20>>2]|(c[g+1036+(a<<5)+16>>2]|(c[g+1036+(a<<5)+12>>2]|(c[g+1036+(a<<5)+8>>2]|(c[g+1036+(a<<5)+4>>2]|c[g+1036+(a<<5)>>2]))))))|0)!=0&1);return}function Le(a,b){a=a|0;b=b|0;if(b>>>0<4)return a+8+(b*12|0)|0;else ja(16368,16380,140,16386);return 0}function Me(a){a=a|0;return c[(c[a>>2]|0)+1028>>2]|0}function Ne(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;if(d>>>0>=7)ja(16405,16380,190,16431);if(e+-1&e|0)ja(16448,16380,191,16431);if(e>>>0<=3)ja(16473,16380,192,16431);i=b+320+(d<<4)|0;if(!(c[i>>2]|0)){c[i>>2]=e;f=f&255;a[b+320+(d<<4)+4>>0]=f;a[b+320+(d<<4)+5>>0]=0;c[b+320+(d<<4)+8>>2]=g;c[b+320+(d<<4)+12>>2]=h;g=(d|0)==6;h=(g?48:(d<<2)+16|0)+(b+56)|0;a[h>>0]=g?0:f;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;return}else ja(16483,16380,194,16431)}function Oe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return tf(c[(c[a>>2]|0)+1028>>2]|0,b,d,e)|0}function Pe(b,c,d){b=b|0;c=c|0;d=d|0;a[(c&255)+(b+56)>>0]=d;return}function Qe(b,c,d){b=b|0;c=c|0;d=d|0;c=(c&255)+(b+56)|0;a[c>>0]=d;a[c+1>>0]=(d&65535)>>>8;return}function Re(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+312|0;f=a[e>>0]|0;g=f&255;h=g+d|0;if((h|0)>256){h=-1;return h|0}a[e>>0]=h;h=b+62|0;a[h>>0]=a[h>>0]|16;Ei(b+56+g|0,c|0,d|0)|0;h=b+108|0;a[g+1+(b+56)>>0]=a[h>>0]|0;a[h>>0]=f;h=g;return h|0}function Se(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((c[b>>2]|0)!=2){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;f=c[b>>2]|0;a:do if((f|0)>0){e=c[b+8>>2]|0;b=0;while(1){if(!(Zg((c[e+(b<<4)+4>>2]|0)+4|0,d)|0))break;b=b+1|0;if((b|0)>=(f|0))break a}if(e+(b<<4)|0){e=e+(b<<4)+8|0;f=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=f;return}}while(0);c[a>>2]=6;c[a+4>>2]=0;return}function Te(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;if((c[a>>2]|0)!=2){d=-1;l=j;return d|0}i=c[a+4>>2]|0;a=c[i>>2]|0;a:do if((a|0)>0){f=c[i+8>>2]|0;e=0;while(1){if(!(Zg((c[f+(e<<4)+4>>2]|0)+4|0,b)|0))break;e=e+1|0;if((e|0)>=(a|0)){h=8;break a}}if(f+(e<<4)|0){a=f+(e<<4)+8|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];Ue(g)}else h=8}else h=8;while(0);if((h|0)==8){e=i+4|0;f=c[e>>2]|0;if((a|0)<(f|0))e=c[i+8>>2]|0;else{g=a+1|0;a=(f*3|0)/2|0;a=(g|0)>(a|0)?g:a;g=i+8|0;h=Ng(c[g>>2]|0,a<<4)|0;c[g>>2]=h;c[e>>2]=a;a=c[i>>2]|0;e=h}c[i>>2]=a+1;h=_g(b)|0;i=Lg(h+5|0)|0;c[i>>2]=h;Ei(i+4|0,b|0,h+1|0)|0;c[e+(a<<4)>>2]=0;c[e+(a<<4)+4>>2]=i;a=e+(a<<4)+8|0}i=d;b=c[i+4>>2]|0;d=a;c[d>>2]=c[i>>2];c[d+4>>2]=b;d=0;l=j;return d|0}function Ue(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=l;l=l+16|0;e=f;switch(c[a>>2]|0){case 7:case 0:{Mg(c[a+4>>2]|0);l=f;return}case 3:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=(c[d>>2]|0)+(a<<3)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ue(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Mg(b);l=f;return}case 2:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=c[d>>2]|0;h=g+(a<<4)|0;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];Ue(e);g=g+(a<<4)+8|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ue(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Mg(b);l=f;return}case 6:case 5:case 4:case 1:{l=f;return}default:ra()}}function Ve(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[b>>2]|0)!=3){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;if((c[b>>2]|0)>>>0>d>>>0){e=(c[b+8>>2]|0)+(d<<3)|0;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}else{c[a>>2]=6;c[a+4>>2]=0;return}}function We(a){a=a|0;return ((c[a>>2]|0)==7?(c[a+4>>2]|0)+4|0:0)|0}function Xe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+272|0;g=e+256|0;f=e;c[g>>2]=d;gh(f,256,b,g)|0;b=_g(f)|0;d=Lg(b+5|0)|0;c[d>>2]=b;Ei(d+4|0,f|0,b+1|0)|0;c[a>>2]=7;c[a+4>>2]=d;l=e;return}function Ye(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+240|0;u=y+224|0;m=y+216|0;i=y+208|0;j=y+200|0;s=y+192|0;p=y+184|0;o=y+176|0;n=y+168|0;h=y+160|0;q=y;w=y+212|0;x=y+152|0;v=y+136|0;k=y+144|0;r=y+128|0;e=c[d>>2]|0;c[w>>2]=e;a:while(1){f=a[e>>0]|0;b:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break a;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break b;default:{}}e=e+1|0}}case 42:break;default:break a}e=e+2|0;c:while(1)switch(a[e>>0]|0){case 0:break b;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break c;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;if(!(f<<24>>24)){Xe(b,16496,h);l=y;return}d:do if((g+-48|0)>>>0<10){u=bi(e,w,0)|0;v=x;c[v>>2]=1;c[v+4>>2]=u}else switch(f<<24>>24){case 34:{Ze(x,w);break d}case 123:{e=e+1|0;c[w>>2]=e;i=vf(12)|0;c[x>>2]=2;c[x+4>>2]=i;i=k+4|0;h=q+1|0;j=q;e:while(1){f=a[e>>0]|0;f:do if(!(Zh(f<<24>>24)|0)){g:do if(f<<24>>24==47){switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break f;default:{}}e=e+1|0}}case 42:break;default:break g}e=e+2|0;h:while(1)switch(a[e>>0]|0){case 0:break f;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break h;else e=f;break}default:e=e+1|0}e=e+2|0;break f}while(0);c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;switch(f<<24>>24){case 125:{t=38;break e}case 34:{Ze(k,w);e=c[i>>2]|0;if((c[k>>2]|0)==7){t=40;break e}break}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){t=48;break e}a[q>>0]=f;e=e+1|0;g=a[e>>0]|0;t=g<<24>>24;if((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26)))){f=e;e=h;do{if((e-j|0)>126){t=48;break e}a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;t=g<<24>>24}while((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26))))}else{f=e;e=h}c[w>>2]=f;a[e>>0]=0;t=_g(q)|0;e=Lg(t+5|0)|0;c[e>>2]=t;Ei(e+4|0,q|0,t+1|0)|0}}if(!(c[e>>2]|0)){t=48;break e}f=c[w>>2]|0;i:while(1){g=a[f>>0]|0;j:do if(!(Zh(g<<24>>24)|0)){if(g<<24>>24!=47)break i;switch(a[f+1>>0]|0){case 47:{f=f+2|0;while(1){switch(a[f>>0]|0){case 10:case 0:break j;default:{}}f=f+1|0}}case 42:break;default:break i}f=f+2|0;k:while(1)switch(a[f>>0]|0){case 0:break j;case 42:{g=f+1|0;if((a[g>>0]|0)==47)break k;else f=g;break}default:f=f+1|0}f=f+2|0}else f=f+1|0;while(0)}c[w>>2]=f;if((a[f>>0]|0)!=58){t=65;break e}c[w>>2]=f+1;Ye(v,w);c[m>>2]=c[x>>2];c[m+4>>2]=c[x+4>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];Te(m,e+4|0,u)|0;e=c[w>>2]|0;l:while(1){f=a[e>>0]|0;m:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break l;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break m;default:{}}e=e+1|0}}case 42:break;default:break l}e=e+2|0;n:while(1)switch(a[e>>0]|0){case 0:break m;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break n;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 125:break f;case 44:break;default:{t=83;break e}}e=e+1|0;c[w>>2]=e}else e=e+1|0;while(0)}if((t|0)==38){c[w>>2]=e+1;break d}else if((t|0)==40){c[b>>2]=7;c[b+4>>2]=e;l=y;return}else if((t|0)==48){Xe(b,16519,n);l=y;return}else if((t|0)==65){Xe(b,16541,o);l=y;return}else if((t|0)==83){Xe(b,16554,p);l=y;return}break}case 91:{e=e+1|0;c[w>>2]=e;n=vf(12)|0;c[x>>2]=3;c[x+4>>2]=n;o=n+8|0;p=n+4|0;m=n+8|0;q=n+8|0;j=0;o:while(1){p:while(1){f=a[e>>0]|0;q:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break p;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break q;default:{}}e=e+1|0}}case 42:break;default:break p}e=e+2|0;r:while(1)switch(a[e>>0]|0){case 0:break q;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break r;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;if((a[e>>0]|0)==93){t=101;break}Ye(r,w);i=r;h=c[i>>2]|0;i=c[i+4>>2]|0;k=v;c[k>>2]=h;c[k+4>>2]=i;k=j+1|0;e=c[n>>2]|0;if(e>>>0<=j>>>0){if((e|0)==(j|0)){e=c[p>>2]|0;if((e|0)>(j|0)){f=k;g=c[m>>2]|0;e=j}else{e=(e*3|0)/2|0;e=(k|0)>(e|0)?k:e;g=Ng(c[q>>2]|0,e<<3)|0;c[q>>2]=g;c[p>>2]=e;e=c[n>>2]|0;f=e+1|0}c[n>>2]=f;e=g+(e<<3)|0;t=109}}else{e=(c[o>>2]|0)+(j<<3)|0;c[u>>2]=c[e>>2];c[u+4>>2]=c[e+4>>2];Ue(u);e=(c[o>>2]|0)+(j<<3)|0;t=109}if((t|0)==109){t=0;j=e;c[j>>2]=h;c[j+4>>2]=i}e=c[w>>2]|0;s:while(1){f=a[e>>0]|0;t:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break s;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break t;default:{}}e=e+1|0}}case 42:break;default:break s}e=e+2|0;u:while(1)switch(a[e>>0]|0){case 0:break t;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break u;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 44:{e=e+1|0;c[w>>2]=e;break}case 93:break;default:break o}j=k}if((t|0)==101){c[w>>2]=e+1;break d}Xe(b,16575,s);l=y;return}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){Xe(b,16637,i);l=y;return}a[q>>0]=f;f=e+1|0;e=q+1|0;g=a[f>>0]|0;v=g<<24>>24;v:do if((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26)))){h=q;while(1){if((e-h|0)>126)break v;a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;v=g<<24>>24;if(!((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26))))){t=134;break}}}else t=134;while(0);if((t|0)==134){c[w>>2]=f;a[e>>0]=0;if(!(Zg(q,16596)|0)){v=x;c[v>>2]=5;c[v+4>>2]=0;break d}if(!(Zg(q,16601)|0)){v=x;c[v>>2]=4;c[v+4>>2]=1;break d}if(!(Zg(q,16606)|0)){v=x;c[v>>2]=4;c[v+4>>2]=0;break d}}c[j>>2]=q;Xe(b,16612,j);l=y;return}}while(0);c[d>>2]=c[w>>2];d=x;w=c[d+4>>2]|0;x=b;c[x>>2]=c[d>>2];c[x+4>>2]=w;l=y;return}function Ze(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+4144|0;r=s+4128|0;q=s+4120|0;p=s+4112|0;o=s+4104|0;n=s+4096|0;m=s;j=m+4095|0;e=(c[d>>2]|0)+1|0;k=m;a:while(1){h=e+1|0;i=a[e>>0]|0;f=i<<24>>24;b:do switch(i<<24>>24){case 0:case 10:{e=3;break a}case 34:{e=23;break a}case 92:{g=e+2|0;f=a[h>>0]|0;switch(f|0){case 92:case 34:case 39:{e=g;break b}case 110:{f=10;e=g;break b}case 114:{f=13;e=g;break b}case 116:{f=9;e=g;break b}case 120:{g=a[g>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=12;break a}else{i=h+-87|0;break}else{i=h+-55|0;break}else i=f;while(0);g=a[e+3>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=17;break a}else{f=h+-87|0;break}else{f=h+-55|0;break}while(0);f=f|i<<4;e=e+4|0;break b}default:{e=19;break a}}}default:e=h}while(0);if(k>>>0>=j>>>0){e=21;break}a[k>>0]=f;k=k+1|0}if((e|0)==3){Xe(b,16658,n);l=s;return}else if((e|0)==12){Xe(b,16678,o);l=s;return}else if((e|0)==17){Xe(b,16678,p);l=s;return}else if((e|0)==19){Xe(b,16696,q);l=s;return}else if((e|0)==21){Xe(b,16716,r);l=s;return}else if((e|0)==23){a[k>>0]=0;c[d>>2]=h;q=_g(m)|0;r=Lg(q+5|0)|0;c[r>>2]=q;Ei(r+4|0,m|0,q+1|0)|0;c[b>>2]=0;c[b+4>>2]=r;l=s;return}}function _e(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;k=n+24|0;m=n+16|0;i=n+20|0;j=n+8|0;g=n;c[i>>2]=d;Ye(g,i);h=c[g>>2]|0;g=c[g+4>>2]|0;f=j;c[f>>2]=h;c[f+4>>2]=g;if((h|0)==7){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return}d=c[i>>2]|0;a:while(1){e=a[d>>0]|0;b:do if(!(Zh(e<<24>>24)|0)){if(e<<24>>24!=47){f=19;break a}switch(a[d+1>>0]|0){case 47:{d=d+2|0;while(1){switch(a[d>>0]|0){case 10:case 0:break b;default:{}}d=d+1|0}}case 42:break;default:{f=8;break a}}d=d+2|0;c:while(1)switch(a[d>>0]|0){case 0:break b;case 42:{e=d+1|0;if((a[e>>0]|0)==47)break c;else d=e;break}default:d=d+1|0}d=d+2|0}else d=d+1|0;while(0)}if((f|0)==8)c[i>>2]=d;else if((f|0)==19?(c[i>>2]=d,e<<24>>24==0):0){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return};c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];Ue(k);Xe(b,16732,m);l=n;return}function $e(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+16|0;g=f;h=Lg(e+1|0)|0;Ei(h|0,d|0,e|0)|0;a[h+e>>0]=0;_e(g,h);d=g;g=c[d>>2]|0;d=c[d+4>>2]|0;Mg(h);e=b;c[e>>2]=g;c[e+4>>2]=d;l=f;return}function af(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=vf(16)|0;h=vf(1168)|0;j=h+8|0;$g(j,b)|0;i=Jh(j,47)|0;a[((i|0)==0?j:i+1|0)>>0]=0;i=h+1064|0;c[i>>2]=i;c[h+1068>>2]=i;c[h+4>>2]=d;c[h+1036>>2]=e;c[h+1040>>2]=f;c[h>>2]=g;c[g+12>>2]=h;c[g>>2]=10;c[g+4>>2]=2;c[g+8>>2]=3;ge(b,0,0,g,10,1)|0;return g|0}function bf(a){a=a|0;a=(c[a+12>>2]|0)+1048|0;y=c[a+4>>2]|0;return c[a>>2]|0}function cf(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=0;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1096|0;g=h;g=pi(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return jf(a,1)|0}function df(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=1;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1112|0;g=h;g=pi(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return jf(a,1)|0}function ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=l;l=l+1280|0;B=G+128|0;E=G+1248|0;D=G+1240|0;C=G+1232|0;o=G+1224|0;n=G+1216|0;k=G+1200|0;i=G+1184|0;h=G+1176|0;g=G+1168|0;j=G+1256|0;x=G+1160|0;z=G+1152|0;f=G+1208|0;m=G+1192|0;A=G;v=G+1264|0;u=a+12|0;w=c[u>>2]|0;if((b|0)<0){t=c[3261]|0;c[g>>2]=0-b;fi(t,16765,g)|0;Da(1)}$e(f,d,e);r=f;t=c[r>>2]|0;r=c[r+4>>2]|0;s=x;c[s>>2]=t;c[s+4>>2]=r;if((t|0)==7){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[h>>2]=We(B)|0;yg(18452,h);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((zg(B,16808,j)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}s=c[j>>2]|0;t=s<<1;b=w+1056|0;c[b>>2]=t;if((s|0)>=1?(t+-1&t|0)==0:0){a=w+1060|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((zg(B,16839,a)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}a=c[a>>2]|0;if((a|0)<1){yg(16847,k);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}s=c[b>>2]|0;s=vi(s|0,((s|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;t=y;r=w+1048|0;c[r>>2]=s;c[r+4>>2]=t;c[w+1072>>2]=0;r=(c[w+4>>2]|0)/(c[j>>2]|0)|0;c[w+1076>>2]=(r|0)>1?r:1;c[w+1136>>2]=-1;c[w+1080>>2]=8;t=pi(s|0,t|0,7,0)|0;t=ti(t|0,y|0,8,0)|0;c[w+1088>>2]=t;c[w+1084>>2]=vf(t<<2)|0;t=w+1160|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((Ag(B,16864,t,1)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}if((c[t>>2]|0)>32){yg(16883,n);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Se(m,B,16915);b=m;a=c[b>>2]|0;b=c[b+4>>2]|0;s=z;c[s>>2]=a;c[s+4>>2]=b;if((a|0)!=6){if((a|0)!=3){yg(16924,o);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}q=c[b>>2]|0;a:do if((q|0)>0){p=v+4|0;r=w+1064|0;s=w+1068|0;o=0;b:while(1){b=q-o|0;n=c[t>>2]|0;n=(b|0)<(n|0)?b:n;b=(n|0)>0;c:do if(b){a=0;do{c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];Ve(v,B,a+o|0);if((c[v>>2]|0)!=1)break b;c[A+(a<<2)>>2]=c[p>>2];a=a+1|0}while((a|0)<(n|0));if((n|0)==1){d=c[A>>2]|0;b=c[s>>2]|0;d:do if((b|0)!=(r|0)){a=b;while(1){if((c[a+12>>2]|0)==(d|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break d}if((b|0)==(a|0))if(!b)break;else break c;else{j=c[a>>2]|0;k=a+4|0;m=c[k>>2]|0;c[j+4>>2]=m;c[m>>2]=j;c[a>>2]=0;c[k>>2]=0;m=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[k>>2]=m;c[m>>2]=a;break c}}while(0);k=c[u>>2]|0;m=ff(k,d)|0;j=k+1104|0;i=j;i=pi(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[j>>2]=i;c[j+4>>2]=y;c[D>>2]=k+8;c[D+4>>2]=d;fh(B,1024,16966,D)|0;ge(B,0,0,m,11,1)|0}else F=35}else F=35;while(0);if((F|0)==35){F=0;j=(o|0)/(c[t>>2]|0)|0;k=c[u>>2]|0;m=Lg(140)|0;c[m>>2]=k;c[m+4>>2]=j;c[m+8>>2]=n;do if(b){g=k+1064|0;h=k+1068|0;i=m+12|0;a=0;f=0;do{e=c[A+(f<<2)>>2]|0;d=c[h>>2]|0;e:do if((d|0)!=(g|0)){b=d;while(1){if((c[b+12>>2]|0)==(e|0))break;b=c[b+4>>2]|0;if((b|0)==(g|0)){F=44;break e}}if((d|0)==(b|0))if(!d){F=44;break}else{b=0;break}else{H=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;c[H+4>>2]=e;c[e>>2]=H;c[b>>2]=0;c[d>>2]=0;e=c[h>>2]|0;c[h>>2]=b;c[b>>2]=g;c[d>>2]=e;c[e>>2]=b;b=0;break}}else F=44;while(0);if((F|0)==44){F=0;b=ff(k,e)|0;a=1}c[i+(f<<2)>>2]=b;f=f+1|0}while((f|0)!=(n|0));if(!a){F=48;break}c[E>>2]=k+8;c[E+4>>2]=j;fh(B,1024,16980,E)|0;ge(B,0,0,m,12,1)|0}else F=48;while(0);if((F|0)==48){F=0;Mg(m)}}o=n+o|0;if((q|0)<=(o|0))break a}yg(16944,C);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}while(0)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);a=c[w+1036>>2]|0;if(!a){l=G;return}cb[a&15](c[w+1040>>2]|0);l=G;return}yg(16819,i);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}function ff(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=a+1072|0;d=c[h>>2]|0;i=a+1076|0;g=a+1064|0;a:do if((d|0)>=(c[i>>2]|0)?(e=c[g>>2]|0,(e|0)!=(g|0)):0)do{f=e;e=c[e>>2]|0;if((c[f+16>>2]|0)==1){c[h>>2]=d+-1;Ia(f+20|0);j=c[f>>2]|0;d=c[f+4>>2]|0;c[j+4>>2]=d;c[d>>2]=j;Mg(f);d=c[h>>2]|0;if((d|0)<(c[i>>2]|0))break a}}while((e|0)!=(g|0));while(0);j=vf(28)|0;c[j+8>>2]=a;c[j+12>>2]=b;c[j+16>>2]=0;b=j+20|0;Ga(b|0);Ja(b|0,c[a+1056>>2]<<9|0)|0;b=a+1068|0;i=c[b>>2]|0;c[b>>2]=j;c[j>>2]=g;c[j+4>>2]=i;c[i>>2]=j;c[h>>2]=(c[h>>2]|0)+1;return j|0}function gf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((b|0)<0){g=c[3261]|0;c[f>>2]=c[a+12>>2];fi(g,17138,f)|0;Da(1)}g=c[a+8>>2]|0;if((c[g+1056>>2]<<9|0)!=(e|0))ja(17163,17058,366,17192);b=c[g>>2]|0;f=a+16|0;if(c[f>>2]|0)ja(17095,17058,346,17122);La(a+20|0,0,d|0,e|0);c[f>>2]=1;if((c[a+12>>2]|0)!=(c[g+1136>>2]|0)){l=h;return}jf(b,0)|0;l=h;return}function hf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;if((b|0)<0){k=c[3261]|0;c[f>>2]=c[a+4>>2];fi(k,16994,f)|0;Da(1)}j=c[(c[a>>2]|0)+1056>>2]<<9;k=a+8|0;b=c[k>>2]|0;if((N(j,b)|0)!=(e|0))ja(17019,17058,252,17070);if((b|0)<=0){Mg(a);l=m;return}f=a+12|0;b=0;while(1){e=c[f+(b<<2)>>2]|0;if(e|0){g=c[e+8>>2]|0;h=c[g>>2]|0;i=e+16|0;if(c[i>>2]|0){b=9;break}n=d+(N(b,j)|0)|0;La(e+20|0,0,n|0,c[g+1056>>2]<<9|0);c[i>>2]=1;if((c[e+12>>2]|0)==(c[g+1136>>2]|0))jf(h,0)|0}b=b+1|0;if((b|0)>=(c[k>>2]|0)){b=13;break}}if((b|0)==9)ja(17095,17058,346,17122);else if((b|0)==13){Mg(a);l=m;return}}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+1040|0;C=E+1024|0;B=E;w=a+12|0;x=c[w>>2]|0;z=x+1144|0;A=x+1140|0;a=c[A>>2]|0;d=(c[z>>2]|0)-a|0;a:do if(d|0){m=x+1128|0;n=x+1080|0;o=x+1084|0;p=x+1056|0;q=x+1136|0;r=x+1064|0;s=x+1068|0;t=x+1120|0;u=x+1156|0;v=x+1092|0;b:while(1){i=m;h=c[i>>2]|0;i=c[i+4>>2]|0;e=c[n>>2]|0;f=((e|0)<0)<<31>>31;k=xi(h|0,i|0,e|0,f|0)|0;g=y;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;do if(!j){e=c[p>>2]|0;f=((e|0)<0)<<31>>31;g=xi(h|0,i|0,e|0,f|0)|0;f=vi(g|0,y|0,e|0,f|0)|0;f=qi(h|0,i|0,f|0,y|0)|0;e=e-f|0;d=(d|0)<(e|0)?d:e;c[q>>2]=g;e=c[s>>2]|0;if((e|0)==(r|0))break b;a=e;while(1){if((c[a+12>>2]|0)==(g|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break b}if((e|0)==(a|0)){if(!e)break b}else{h=c[a>>2]|0;i=a+4|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[a>>2]=0;c[i>>2]=0;j=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[i>>2]=j;c[j>>2]=a}if(!(c[a+16>>2]|0)){a=1;D=23;break b}if(!(c[t>>2]|0)){Ha(a+20|0,f<<9|0,(c[u>>2]|0)+(c[A>>2]<<9)|0,d<<9|0);a=(c[A>>2]|0)+d|0;c[A>>2]=a;j=m;j=pi(c[j>>2]|0,c[j+4>>2]|0,d|0,((d|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y;c[q>>2]=-1;break}else{h=vf(8)|0;i=c[n>>2]<<9;j=Lg(i)|0;Ga(h|0);Ja(h|0,i|0)|0;c[(c[o>>2]|0)+(k<<2)>>2]=h;k=N(c[n>>2]|0,k)|0;Ha(a+20|0,((c[p>>2]|0)+-1&k)<<9|0,j|0,i|0);La(h|0,0,j|0,i|0);Mg(j);c[v>>2]=(c[v>>2]|0)+1;a=c[A>>2]|0;break}}else{f=vi(k|0,g|0,e|0,f|0)|0;f=qi(h|0,i|0,f|0,y|0)|0;e=e-f|0;e=(d|0)<(e|0)?d:e;f=f<<9;a=(c[u>>2]|0)+(a<<9)|0;d=e<<9;if(!(c[t>>2]|0))Ha(j|0,f|0,a|0,d|0);else La(j|0,f|0,a|0,d|0);a=(c[A>>2]|0)+e|0;c[A>>2]=a;j=m;j=pi(c[j>>2]|0,c[j+4>>2]|0,e|0,((e|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y}while(0);d=(c[z>>2]|0)-a|0;if(!d)break a}if((D|0)==23){l=E;return a|0}b=c[w>>2]|0;D=ff(b,g)|0;A=b+1104|0;z=A;z=pi(c[z>>2]|0,c[z+4>>2]|0,1,0)|0;c[A>>2]=z;c[A+4>>2]=y;c[C>>2]=b+8;c[C+4>>2]=g;fh(B,1024,16966,C)|0;ge(B,0,0,D,11,1)|0;D=1;l=E;return D|0}while(0);if(b|0){D=0;l=E;return D|0}db[c[x+1148>>2]&15](c[x+1152>>2]|0,0);D=0;l=E;return D|0}function kf(){var a=0;a=vf(2592)|0;c[a+2568>>2]=9;c[a+2572>>2]=10;c[a+2576>>2]=2;c[a+2580>>2]=5;return a|0}function lf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;i=c[a>>2]|0;if((i|0)>=32)ja(17207,17248,85,17256);if(!(((e|0)!=0|(f|0)!=0)&((e&4095|0)==0&0==0)))ja(17275,17248,86,17256);c[a>>2]=i+1;h=a+8+(i*80|0)|0;c[h>>2]=a;c[a+8+(i*80|0)+32>>2]=1;c[a+8+(i*80|0)+36>>2]=g&-5;j=a+8+(i*80|0)+8|0;c[j>>2]=b;c[j+4>>2]=d;b=a+8+(i*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(g&4|0)==0;j=a+8+(i*80|0)+24|0;c[j>>2]=b?e:0;c[j+4>>2]=b?f:0;j=a+8+(i*80|0)+40|0;c[j>>2]=0;b=a+8+(i*80|0)+48|0;c[b>>2]=0;d=vf(e)|0;c[j>>2]=d;if(!d){di(17325,29,1,c[3261]|0)|0;Da(1)}if(!(g&2))return h|0;f=Ai(e|0,f|0,12)|0;f=(f+31|0)>>>5<<2;g=a+8+(i*80|0)+44|0;c[g>>2]=f;j=a+8+(i*80|0)+60|0;c[j>>2]=0;c[a+8+(i*80|0)+52>>2]=vf(f)|0;c[a+8+(i*80|0)+56>>2]=vf(c[g>>2]|0)|0;c[b>>2]=c[a+8+(i*80|0)+52+(c[j>>2]<<2)>>2];return h|0}function mf(a,b){a=a|0;b=b|0;Mg(c[b+40>>2]|0);return}function nf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=b+48|0;i=c[h>>2]|0;f=b+44|0;d=c[f>>2]|0;g=d>>>2;a:do if(g){e=0;while(1){if(c[i+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>=g>>>0)break a}g=b+24|0;if(!((c[g>>2]|0)==0&(c[g+4>>2]|0)==0)){eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);d=c[f>>2]|0}}while(0);f=b+60|0;g=c[f>>2]^1;c[f>>2]=g;b=c[b+52+(g<<2)>>2]|0;c[h>>2]=b;Fi(b|0,0,d|0)|0;return i|0}function of(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=b+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!f){if(g)return;if(c[b+32>>2]|0)eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);e=b+8|0;c[e>>2]=0;c[e+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;return}if(!g?(f=b+8|0,(c[f>>2]|0)==(d|0)?(c[f+4>>2]|0)==(e|0):0):0)return;if(!(c[b+32>>2]|0))a=b+16|0;else{f=b+16|0;eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[f>>2]|0);a=f}b=b+8|0;c[b>>2]=d;c[b+4>>2]=e;d=a;e=c[d+4>>2]|0;c[h>>2]=c[d>>2];c[h+4>>2]=e;return}function pf(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)<=0){Mg(a);return}e=a+2572|0;d=0;do{if(c[a+8+(d*80|0)+32>>2]|0){db[c[e>>2]&15](a,a+8+(d*80|0)|0);b=c[a>>2]|0}d=d+1|0}while((d|0)<(b|0));Mg(a);return}function qf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=c[a>>2]|0;if((h|0)<=0){i=0;return i|0}e=0;while(1){f=a+8+(e*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(j=a+8+(e*80|0)+24|0,g=pi(c[j>>2]|0,c[j+4>>2]|0,g|0,f|0)|0,f=y,f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0):0)break;e=e+1|0;if((e|0)>=(h|0)){e=0;i=7;break}}if((i|0)==7)return e|0;j=a+8+(e*80|0)|0;return j|0}function rf(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;k=c[a>>2]|0;if((k|0)>=32)ja(17207,17248,197,17355);if(f>>>0<1|(f|0)==1&e>>>0<0){c[a>>2]=k+1;l=a+8+(k*80|0)|0;c[l>>2]=a;m=a+8+(k*80|0)+8|0;c[m>>2]=b;c[m+4>>2]=d;b=a+8+(k*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(j&16|0)==0;d=a+8+(k*80|0)+24|0;c[d>>2]=b?e:0;c[d+4>>2]=b?f:0;c[a+8+(k*80|0)+32>>2]=0;c[a+8+(k*80|0)+64>>2]=g;c[a+8+(k*80|0)+68>>2]=h;c[a+8+(k*80|0)+72>>2]=i;c[a+8+(k*80|0)+76>>2]=j;return l|0}else ja(17375,17248,198,17355);return 0}function sf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[a>>2]|0;if(c[a+32>>2]|0){gb[c[f+2580>>2]&7](f,a,b,d,e);return}h=a+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!e){if(g)return;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;d=h;c[d>>2]=0;c[d+4>>2]=0;return}f=a+8|0;if(!g?(e=f,(c[e>>2]|0)==(b|0)?(c[e+4>>2]|0)==(d|0):0):0)return;e=f;c[e>>2]=b;c[e+4>>2]=d;a=a+16|0;b=c[a+4>>2]|0;d=h;c[d>>2]=c[a>>2];c[d+4>>2]=b;return}function tf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;i=c[a>>2]|0;if((i|0)<=0){k=0;return k|0}h=0;while(1){f=a+8+(h*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(l=a+8+(h*80|0)+24|0,l=pi(c[l>>2]|0,c[l+4>>2]|0,g|0,f|0)|0,m=y,m>>>0>d>>>0|(m|0)==(d|0)&l>>>0>b>>>0):0)break;f=h+1|0;if((f|0)<(i|0))h=f;else{f=0;k=11;break}}if((k|0)==11)return f|0;if(!(c[a+8+(h*80|0)+32>>2]|0)){m=0;return m|0}f=qi(b|0,d|0,g|0,f|0)|0;if(e|0?(m=c[a+8+(h*80|0)+48>>2]|0,j=m+(f>>>17<<2)|0,m|0):0)c[j>>2]=c[j>>2]|1<<(f>>>12&31);m=(c[a+8+(h*80|0)+40>>2]|0)+f|0;return m|0}function uf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;return}function vf(a){a=a|0;var b=0;b=Lg(a)|0;if(!b){b=0;return b|0}Fi(b|0,0,a|0)|0;return b|0}function wf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=a[d>>0]|0;a:do if(f<<24>>24){while(1){if((a[b>>0]|0)!=f<<24>>24){b=0;break}b=b+1|0;d=d+1|0;f=a[d>>0]|0;if(!(f<<24>>24))break a}return b|0}while(0);if(!e){e=1;return e|0}c[e>>2]=b;e=1;return e|0}function xf(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function yf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+4|0;i=c[h>>2]|0;j=i+1|0;g=b+8|0;k=c[g>>2]|0;f=(k*3|0)>>>1;f=(j|0)>(f|0)?j:f;e=c[b>>2]|0;if(j>>>0>k>>>0){e=Ng(e,f)|0;c[b>>2]=e;c[g>>2]=f}a[e+i>>0]=d;if(j>>>0<=(c[h>>2]|0)>>>0)return;c[h>>2]=j;return}function zf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+4|0;h=c[g>>2]|0;i=_g(b)|0;j=i+h|0;f=a+8|0;k=c[f>>2]|0;e=(k*3|0)>>>1;e=(j|0)>(e|0)?j:e;d=c[a>>2]|0;if(j>>>0>k>>>0){d=Ng(d,e)|0;c[a>>2]=d;c[f>>2]=e}Ei(d+h|0,b|0,i|0)|0;if(j>>>0<=(c[g>>2]|0)>>>0)return;c[g>>2]=j;return}function Af(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;if(!((a|0)!=0&(e|0)!=0)){h=-1;return h|0}switch(b|0){case 128:case 192:case 256:break;default:{h=-2;return h|0}}g=(b|0)==128;do if(!g){f=e+240|0;if((b|0)==192){c[f>>2]=12;break}else{c[f>>2]=14;break}}else c[e+240>>2]=10;while(0);f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);c[e>>2]=f;c[e+4>>2]=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);c[e+8>>2]=(d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0);c[e+12>>2]=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(g){a=0;do{g=c[e+12>>2]|0;f=c[16+((g>>>16&255)<<2)>>2]&-16777216^f^c[16+((g>>>8&255)<<2)>>2]&16711680^c[16+((g&255)<<2)>>2]&65280^c[16+(g>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];h=e;e=e+16|0;c[e>>2]=f;b=c[h+4>>2]^f;c[h+20>>2]=b;b=c[h+8>>2]^b;c[h+24>>2]=b;c[h+28>>2]=b^g;a=a+1|0}while((a|0)!=10);f=0;return f|0}c[e+16>>2]=(d[a+17>>0]|0)<<16|(d[a+16>>0]|0)<<24|(d[a+18>>0]|0)<<8|(d[a+19>>0]|0);c[e+20>>2]=(d[a+21>>0]|0)<<16|(d[a+20>>0]|0)<<24|(d[a+22>>0]|0)<<8|(d[a+23>>0]|0);if((b|0)==192){a=0;while(1){h=c[e+20>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+24|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+28>>2]=g;g=c[e+8>>2]^g;c[e+32>>2]=g;g=c[e+12>>2]^g;c[e+36>>2]=g;a=a+1|0;if((a|0)==8){f=0;break}g=c[e+16>>2]^g;c[e+40>>2]=g;c[e+44>>2]=g^h;e=b}return f|0}c[e+24>>2]=(d[a+25>>0]|0)<<16|(d[a+24>>0]|0)<<24|(d[a+26>>0]|0)<<8|(d[a+27>>0]|0);c[e+28>>2]=(d[a+29>>0]|0)<<16|(d[a+28>>0]|0)<<24|(d[a+30>>0]|0)<<8|(d[a+31>>0]|0);if((b|0)!=256){h=0;return h|0}a=0;while(1){h=c[e+28>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+32|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+36>>2]=g;g=c[e+8>>2]^g;c[e+40>>2]=g;g=c[e+12>>2]^g;c[e+44>>2]=g;a=a+1|0;if((a|0)==7){f=0;break}g=c[16+(g>>>24<<2)>>2]&-16777216^c[e+16>>2]^c[16+((g>>>16&255)<<2)>>2]&16711680^c[16+((g>>>8&255)<<2)>>2]&65280^c[16+((g&255)<<2)>>2]&255;c[e+48>>2]=g;g=c[e+20>>2]^g;c[e+52>>2]=g;g=c[e+24>>2]^g;c[e+56>>2]=g;c[e+60>>2]=g^h;e=b}return f|0}function Bf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=Af(a,b,d)|0;if((a|0)<0){d=a;return d|0}e=d+240|0;a=c[e>>2]|0;if((a|0)<=0){d=0;return d|0}a=a<<2;b=0;do{f=d+(b<<2)|0;g=c[f>>2]|0;h=d+(a<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|1)<<2)|0;g=c[h>>2]|0;f=d+((a|1)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;f=d+((b|2)<<2)|0;g=c[f>>2]|0;h=d+((a|2)<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|3)<<2)|0;g=c[h>>2]|0;f=d+((a|3)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;b=b+4|0;a=a+-4|0}while((b|0)<(a|0));if((c[e>>2]|0)<=1){h=0;return h|0}a=d;b=1;do{h=a;a=a+16|0;g=c[a>>2]|0;c[a>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];g=h+20|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];g=h+24|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];h=h+28|0;g=c[h>>2]|0;c[h>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];b=b+1|0}while((b|0)<(c[e>>2]|0));a=0;return a|0}function Cf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[6208+((h>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((i>>>8&255)<<2)>>2]^c[8256+((b&255)<<2)>>2]^c[n+16>>2];l=c[6208+((i>>>16&255)<<2)>>2]^c[5184+(h>>>24<<2)>>2]^c[7232+((b>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[n+20>>2];m=c[6208+((b>>>16&255)<<2)>>2]^c[5184+(i>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((h&255)<<2)>>2]^c[n+24>>2];g=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(b>>>24<<2)>>2]^c[7232+((h>>>8&255)<<2)>>2]^c[8256+((i&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[6208+((m>>>16&255)<<2)>>2]^c[5184+(l>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((k&255)<<2)>>2]^c[n+36>>2];q=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(m>>>24<<2)>>2]^c[7232+((k>>>8&255)<<2)>>2]^c[8256+((l&255)<<2)>>2]^c[n+40>>2];k=c[6208+((k>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((l>>>8&255)<<2)>>2]^c[8256+((m&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[6208+((l>>>16&255)<<2)>>2]^c[5184+(i<<2)>>2]^c[7232+((m>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[16+((l>>>16&255)<<2)>>2]&16711680|c[16+(i<<2)>>2]&-16777216|c[16+((m>>>8&255)<<2)>>2]&65280|c[16+((g&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[16+((m>>>16&255)<<2)>>2]&16711680|c[16+(l>>>24<<2)>>2]&-16777216|c[16+((g>>>8&255)<<2)>>2]&65280|c[16+((k&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[16+((g>>>16&255)<<2)>>2]&16711680|c[16+(m>>>24<<2)>>2]&-16777216|c[16+((k>>>8&255)<<2)>>2]&65280|c[16+((l&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[16+((k>>>16&255)<<2)>>2]&16711680|c[16+(g>>>24<<2)>>2]&-16777216|c[16+((l>>>8&255)<<2)>>2]&65280|c[16+((m&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Df(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[2112+((b>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((i>>>8&255)<<2)>>2]^c[4160+((h&255)<<2)>>2]^c[n+16>>2];l=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(h>>>24<<2)>>2]^c[3136+((b>>>8&255)<<2)>>2]^c[4160+((i&255)<<2)>>2]^c[n+20>>2];m=c[2112+((h>>>16&255)<<2)>>2]^c[1088+(i>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((b&255)<<2)>>2]^c[n+24>>2];g=c[2112+((i>>>16&255)<<2)>>2]^c[1088+(b>>>24<<2)>>2]^c[3136+((h>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[2112+((k>>>16&255)<<2)>>2]^c[1088+(l>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((m&255)<<2)>>2]^c[n+36>>2];q=c[2112+((l>>>16&255)<<2)>>2]^c[1088+(m>>>24<<2)>>2]^c[3136+((k>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+40>>2];k=c[2112+((m>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((l>>>8&255)<<2)>>2]^c[4160+((k&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(i<<2)>>2]^c[3136+((m>>>8&255)<<2)>>2]^c[4160+((l&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[9280+((g>>>16&255)<<2)>>2]&16711680|c[9280+(i<<2)>>2]&-16777216|c[9280+((m>>>8&255)<<2)>>2]&65280|c[9280+((l&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[9280+((k>>>16&255)<<2)>>2]&16711680|c[9280+(l>>>24<<2)>>2]&-16777216|c[9280+((g>>>8&255)<<2)>>2]&65280|c[9280+((m&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[9280+((l>>>16&255)<<2)>>2]&16711680|c[9280+(m>>>24<<2)>>2]&-16777216|c[9280+((k>>>8&255)<<2)>>2]&65280|c[9280+((g&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[9280+((m>>>16&255)<<2)>>2]&16711680|c[9280+(g>>>24<<2)>>2]&-16777216|c[9280+((l>>>8&255)<<2)>>2]&65280|c[9280+((k&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Ef(b,c,d,e,f,g){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=l;l=l+16|0;T=U;h=d>>>0>15;if(!g){if(h){i=d+-16|0;j=i&-16;A=j+16|0;g=b+A|0;k=f+1|0;m=f+2|0;n=f+3|0;o=f+4|0;p=f+5|0;q=f+6|0;r=f+7|0;s=f+8|0;t=f+9|0;u=f+10|0;v=f+11|0;w=f+12|0;x=f+13|0;y=f+14|0;z=f+15|0;h=b;b=c;while(1){S=T;Q=h;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Df(h,b,e);a[b>>0]=a[b>>0]^a[f>>0];S=b+1|0;a[S>>0]=a[S>>0]^a[k>>0];S=b+2|0;a[S>>0]=a[S>>0]^a[m>>0];S=b+3|0;a[S>>0]=a[S>>0]^a[n>>0];S=b+4|0;a[S>>0]=a[S>>0]^a[o>>0];S=b+5|0;a[S>>0]=a[S>>0]^a[p>>0];S=b+6|0;a[S>>0]=a[S>>0]^a[q>>0];S=b+7|0;a[S>>0]=a[S>>0]^a[r>>0];S=b+8|0;a[S>>0]=a[S>>0]^a[s>>0];S=b+9|0;a[S>>0]=a[S>>0]^a[t>>0];S=b+10|0;a[S>>0]=a[S>>0]^a[u>>0];S=b+11|0;a[S>>0]=a[S>>0]^a[v>>0];S=b+12|0;a[S>>0]=a[S>>0]^a[w>>0];S=b+13|0;a[S>>0]=a[S>>0]^a[x>>0];S=b+14|0;a[S>>0]=a[S>>0]^a[y>>0];S=b+15|0;a[S>>0]=a[S>>0]^a[z>>0];S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{h=h+16|0;b=b+16|0}}d=i-j|0;h=c+A|0}else{g=b;h=c}if(!d){l=U;return}S=T;Q=g;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Df(T,T,e);c=0;do{a[h+c>>0]=a[f+c>>0]^a[T+c>>0];c=c+1|0}while((c|0)!=(d|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}if(h){O=d+-16|0;i=O&-16;P=i+16|0;h=b+P|0;j=f+1|0;k=T+1|0;m=f+2|0;n=T+2|0;o=f+3|0;p=T+3|0;q=f+4|0;r=T+4|0;s=f+5|0;t=T+5|0;u=f+6|0;v=T+6|0;w=f+7|0;x=T+7|0;y=f+8|0;z=T+8|0;A=f+9|0;B=T+9|0;C=f+10|0;D=T+10|0;E=f+11|0;F=T+11|0;G=f+12|0;H=T+12|0;I=f+13|0;J=T+13|0;K=f+14|0;L=T+14|0;M=f+15|0;N=T+15|0;g=b;b=c;while(1){a[T>>0]=a[f>>0]^a[g>>0];a[k>>0]=a[j>>0]^a[g+1>>0];a[n>>0]=a[m>>0]^a[g+2>>0];a[p>>0]=a[o>>0]^a[g+3>>0];a[r>>0]=a[q>>0]^a[g+4>>0];a[t>>0]=a[s>>0]^a[g+5>>0];a[v>>0]=a[u>>0]^a[g+6>>0];a[x>>0]=a[w>>0]^a[g+7>>0];a[z>>0]=a[y>>0]^a[g+8>>0];a[B>>0]=a[A>>0]^a[g+9>>0];a[D>>0]=a[C>>0]^a[g+10>>0];a[F>>0]=a[E>>0]^a[g+11>>0];a[H>>0]=a[G>>0]^a[g+12>>0];a[J>>0]=a[I>>0]^a[g+13>>0];a[L>>0]=a[K>>0]^a[g+14>>0];a[N>>0]=a[M>>0]^a[g+15>>0];Cf(T,b,e);S=f;Q=b;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{g=g+16|0;b=b+16|0}}d=O-i|0;c=c+P|0}else h=b;if(!d){l=U;return}g=0;do{a[T+g>>0]=a[f+g>>0]^a[h+g>>0];g=g+1|0}while((g|0)!=(d|0));if(d>>>0<16)Ei(T+d|0,f+d|0,16-d|0)|0;Cf(T,T,e);S=c;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}function Ff(a){a=a|0;var b=0;c[a+40>>2]=0;b=a;c[b>>2]=0;c[b+4>>2]=0;c[a+8>>2]=1779033703;c[a+12>>2]=-1150833019;c[a+16>>2]=1013904242;c[a+20>>2]=-1521486534;c[a+24>>2]=1359893119;c[a+28>>2]=-1694144372;c[a+32>>2]=528734635;c[a+36>>2]=1541459225;return}function Gf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=a+40|0;e=c[g>>2]|0;if(e>>>0>64)ra();i=a;f=c[i>>2]|0;i=c[i+4>>2]|0;h=pi(f|0,i|0,d|0,0)|0;j=y;if(j>>>0<i>>>0|(j|0)==(i|0)&h>>>0<f>>>0)ra();if(!d)return;f=a+44|0;while(1){if(!(d>>>0>63&(e|0)==0)){i=64-e|0;i=(d|0)<(i|0)?d:i;Ei(a+44+e|0,b|0,i|0)|0;j=(c[g>>2]|0)+i|0;c[g>>2]=j;e=b+i|0;d=d-i|0;if((j|0)==64){Hf(a,f);i=a;i=pi(c[i>>2]|0,c[i+4>>2]|0,512,0)|0;j=a;c[j>>2]=i;c[j+4>>2]=y;c[g>>2]=0}}else{Hf(a,b);j=a;j=pi(c[j>>2]|0,c[j+4>>2]|0,512,0)|0;e=a;c[e>>2]=j;c[e+4>>2]=y;e=b+64|0;d=d+-64|0}if(!d)break;b=e;e=c[g>>2]|0}return}function Hf(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+288|0;f=i+256|0;g=i;h=a+8|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];c[f+24>>2]=c[h+24>>2];c[f+28>>2]=c[h+28>>2];e=0;do{j=b+(e<<2)|0;c[g+(e<<2)>>2]=(d[j+1>>0]|0)<<16|(d[j>>0]|0)<<24|(d[j+2>>0]|0)<<8|(d[j+3>>0]|0);e=e+1|0}while((e|0)!=16);e=16;b=c[g>>2]|0;do{j=c[g+(e+-2<<2)>>2]|0;k=b;b=c[g+(e+-15<<2)>>2]|0;c[g+(e<<2)>>2]=k+(c[g+(e+-7<<2)>>2]|0)+((j>>>19|j<<13)^j>>>10^(j>>>17|j<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);j=f+28|0;q=f+16|0;r=c[q>>2]|0;b=f+24|0;s=c[b>>2]|0;v=f+20|0;e=c[v>>2]|0;k=(c[j>>2]|0)+1116352408+(c[g>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((e^s)&r^s)|0;t=c[f>>2]|0;u=f+4|0;o=c[u>>2]|0;w=f+8|0;n=c[w>>2]|0;m=f+12|0;p=k+(c[m>>2]|0)|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((o|t)&n|o&t)+k|0;c[j>>2]=k;s=s+1899447441+(c[g+4>>2]|0)+(p&(e^r)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=e+-1245643825+(c[g+8>>2]|0)+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=r+-373957723+(c[g+12>>2]|0)+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=p+961987163+(c[g+16>>2]|0)+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=n+1508970993+(c[g+20>>2]|0)+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+24>>2]|0)+-1841331548+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+28>>2]|0)+-1424204075+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+32>>2]|0)+-670586216+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+36>>2]|0)+310598401+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+40>>2]|0)+607225278+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+44>>2]|0)+1426881987+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+48>>2]|0)+1925078388+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+52>>2]|0)+-2132889090+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+56>>2]|0)+-1680079193+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+60>>2]|0)+-1046744716+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+64>>2]|0)+-459576895+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+68>>2]|0)+-272742522+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+72>>2]|0)+264347078+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+76>>2]|0)+604807628+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+80>>2]|0)+770255983+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+84>>2]|0)+1249150122+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+88>>2]|0)+1555081692+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+92>>2]|0)+1996064986+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+96>>2]|0)+-1740746414+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+100>>2]|0)+-1473132947+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+104>>2]|0)+-1341970488+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+108>>2]|0)+-1084653625+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+112>>2]|0)+-958395405+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+116>>2]|0)+-710438585+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+120>>2]|0)+113926993+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+124>>2]|0)+338241895+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+128>>2]|0)+666307205+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+132>>2]|0)+773529912+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+136>>2]|0)+1294757372+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+140>>2]|0)+1396182291+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+144>>2]|0)+1695183700+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+148>>2]|0)+1986661051+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+152>>2]|0)+-2117940946+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+156>>2]|0)+-1838011259+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+160>>2]|0)+-1564481375+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+164>>2]|0)+-1474664885+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+168>>2]|0)+-1035236496+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+172>>2]|0)+-949202525+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+176>>2]|0)+-778901479+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+180>>2]|0)+-694614492+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+184>>2]|0)+-200395387+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+188>>2]|0)+275423344+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+192>>2]|0)+430227734+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+196>>2]|0)+506948616+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+200>>2]|0)+659060556+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+204>>2]|0)+883997877+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+208>>2]|0)+958139571+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+212>>2]|0)+1322822218+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+216>>2]|0)+1537002063+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+220>>2]|0)+1747873779+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+224>>2]|0)+1955562222+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+228>>2]|0)+2024104815+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+232>>2]|0)+-2067236844+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+236>>2]|0)+-1933114872+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+240>>2]|0)+-1866530822+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+244>>2]|0)+-1538233109+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+248>>2]|0)+-1090935817+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;k=(c[g+252>>2]|0)+-965641998+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;g=k+r|0;c[q>>2]=g;k=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+k|0;c[f>>2]=k;c[h>>2]=k+(c[h>>2]|0);k=a+12|0;c[k>>2]=o+(c[k>>2]|0);k=a+16|0;c[k>>2]=n+(c[k>>2]|0);k=a+20|0;c[k>>2]=(c[m>>2]|0)+(c[k>>2]|0);k=a+24|0;c[k>>2]=g+(c[k>>2]|0);k=a+28|0;c[k>>2]=e+(c[k>>2]|0);k=a+32|0;c[k>>2]=(c[b>>2]|0)+(c[k>>2]|0);k=a+36|0;c[k>>2]=(c[j>>2]|0)+(c[k>>2]|0);l=i;return}function If(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=d+40|0;e=c[h>>2]|0;if(e>>>0>63)ra();i=d;i=pi(c[i>>2]|0,c[i+4>>2]|0,e<<3|0,0)|0;g=d;c[g>>2]=i;c[g+4>>2]=y;g=d+44|0;c[h>>2]=e+1;a[d+44+e>>0]=-128;e=c[h>>2]|0;if(e>>>0<=56){if((e|0)!=56)f=9}else{if(e>>>0<64)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<64);Hf(d,g);c[h>>2]=0;e=0;f=9}if((f|0)==9)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<56);h=d;i=c[h>>2]|0;h=c[h+4>>2]|0;f=Ai(i|0,h|0,56)|0;a[d+100>>0]=f;f=Ai(i|0,h|0,48)|0;a[d+101>>0]=f;f=Ai(i|0,h|0,40)|0;a[d+102>>0]=f;a[d+103>>0]=h;a[d+104>>0]=i>>>24;a[d+105>>0]=i>>>16;a[d+106>>0]=i>>>8;a[d+107>>0]=i;Hf(d,g);i=c[d+8>>2]|0;a[b>>0]=i>>>24;a[b+1>>0]=i>>>16;a[b+2>>0]=i>>>8;a[b+3>>0]=i;i=c[d+12>>2]|0;a[b+4>>0]=i>>>24;a[b+5>>0]=i>>>16;a[b+6>>0]=i>>>8;a[b+7>>0]=i;i=c[d+16>>2]|0;a[b+8>>0]=i>>>24;a[b+9>>0]=i>>>16;a[b+10>>0]=i>>>8;a[b+11>>0]=i;i=c[d+20>>2]|0;a[b+12>>0]=i>>>24;a[b+13>>0]=i>>>16;a[b+14>>0]=i>>>8;a[b+15>>0]=i;i=c[d+24>>2]|0;a[b+16>>0]=i>>>24;a[b+17>>0]=i>>>16;a[b+18>>0]=i>>>8;a[b+19>>0]=i;i=c[d+28>>2]|0;a[b+20>>0]=i>>>24;a[b+21>>0]=i>>>16;a[b+22>>0]=i>>>8;a[b+23>>0]=i;i=c[d+32>>2]|0;a[b+24>>0]=i>>>24;a[b+25>>0]=i>>>16;a[b+26>>0]=i>>>8;a[b+27>>0]=i;i=c[d+36>>2]|0;a[b+28>>0]=i>>>24;a[b+29>>0]=i>>>16;a[b+30>>0]=i>>>8;a[b+31>>0]=i;return}function Jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+112|0;f=e;c[f+40>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[f+8>>2]=1779033703;c[f+12>>2]=-1150833019;c[f+16>>2]=1013904242;c[f+20>>2]=-1521486534;c[f+24>>2]=1359893119;c[f+28>>2]=-1694144372;c[f+32>>2]=528734635;c[f+36>>2]=1541459225;Gf(f,a,b);If(d,f);l=e;return}function Kf(b){b=b|0;var d=0;c[5288]=12968;c[5470]=b;b=21160;c[b>>2]=4096;c[b+4>>2]=0;a[21702]=3;a[21701]=64;a[21704]=2;b=21736;c[b>>2]=0;c[b+4>>2]=10;c[5448]=c[5448]|1315117;b=0;do{d=21888+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=25984+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=30080+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;b=b+1|0}while((b|0)!=256);return 21152}function Lf(a){a=a|0;Mg(a);return}function Mf(b,d){b=b|0;d=d|0;var e=0,f=0;e=21712;e=pi(c[e>>2]|0,c[e+4>>2]|0,d|0,0)|0;f=y;if(!((c[5430]|0)==0&(d|0)>0))return;b=d;a:while(1){switch(a[21701]|0){case 32:{Uf(b);break}case 64:{Vf(b);break}default:{b=6;break a}}if(c[5430]|0){b=9;break}b=21712;b=qi(e|0,f|0,c[b>>2]|0,c[b+4>>2]|0)|0;if((b|0)<=0){b=9;break}}if((b|0)==6)ra();else if((b|0)==9)return}function Nf(a){a=a|0;a=a+560|0;y=c[a+4>>2]|0;return c[a>>2]|0}function Of(a,b){a=a|0;b=b|0;var d=0;d=a+648|0;b=c[d>>2]|b;c[d>>2]=b;d=a+568|0;if(!(c[d>>2]|0))return;if(!(c[a+644>>2]&b))return;c[d>>2]=0;return}function Pf(a,b){a=a|0;b=b|0;a=a+648|0;c[a>>2]=c[a>>2]&~b;return}function Qf(a){a=a|0;return c[a+648>>2]|0}function Rf(a){a=a|0;return c[a+568>>2]|0}function Sf(a){a=a|0;return c[a+640>>2]|0}function Tf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+d|0;d=0;do{f=a+4832+(d<<4)|0;h=f;g=c[h>>2]|0;if(!((g|0)==-1?(c[h+4>>2]|0)==-1:0)?(h=(c[a+4832+(d<<4)+8>>2]|0)+g|0,h>>>0>=b>>>0&e>>>0>h>>>0):0){h=f;c[h>>2]=-1;c[h+4>>2]=-1}d=d+1|0}while((d|0)!=256);return}
+function Qh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+1056|0;v=x+1024|0;w=x;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;c[v+24>>2]=0;c[v+28>>2]=0;f=a[e>>0]|0;a:do if(f<<24>>24){q=0;do{if(!(a[b+q>>0]|0)){f=0;break a}u=f&255;t=v+(u>>>5<<2)|0;c[t>>2]=c[t>>2]|1<<(u&31);q=q+1|0;c[w+(u<<2)>>2]=q;f=a[e+q>>0]|0}while(f<<24>>24!=0);n=q>>>0>1;if(n){k=1;j=1;m=0;i=-1;o=1;while(1){f=a[e+(j+i)>>0]|0;g=a[e+o>>0]|0;do if(f<<24>>24==g<<24>>24)if((j|0)==(k|0)){h=k;f=1;g=k+m|0;break}else{h=k;f=j+1|0;g=m;break}else if((f&255)>(g&255)){h=o-i|0;f=1;g=o;break}else{h=1;f=1;g=m+1|0;i=m;break}while(0);o=f+g|0;if(o>>>0>=q>>>0)break;else{k=h;j=f;m=g}}if(n){n=1;m=1;o=0;g=-1;p=1;while(1){f=a[e+(m+g)>>0]|0;j=a[e+p>>0]|0;do if(f<<24>>24==j<<24>>24)if((m|0)==(n|0)){f=n;j=1;k=n+o|0;break}else{f=n;j=m+1|0;k=o;break}else if((f&255)<(j&255)){f=p-g|0;j=1;k=p;break}else{f=1;j=1;k=o+1|0;g=o;break}while(0);p=j+k|0;if(p>>>0>=q>>>0){u=q;j=25;break}else{n=f;m=j;o=k}}}else{u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=0;f=1;g=-1;j=25}while(0);b:do if((j|0)==25){s=(g+1|0)>>>0>(i+1|0)>>>0;f=s?f:h;s=s?g:i;t=s+1|0;if(!(Rh(e,e+f|0,t)|0)){n=u-f|0;r=n;m=f}else{n=u-s+-1|0;n=(s>>>0>n>>>0?s:n)+1|0;r=0;m=n;n=u-n|0}o=u|63;p=u+-1|0;q=(r|0)!=0;f=b;k=0;g=b;while(1){h=f;do if((g-h|0)>>>0<u>>>0){i=dh(g,0,o)|0;if(i)if((i-h|0)>>>0<u>>>0){f=0;break b}else break;else{i=g+o|0;break}}else i=g;while(0);g=d[f+p>>0]|0;c:do if(!(1<<(g&31)&c[v+(g>>>5<<2)>>2])){h=0;g=u}else{g=u-(c[w+(g<<2)>>2]|0)|0;if(g|0){h=0;g=q&(k|0)!=0&g>>>0<m>>>0?n:g;break}j=t>>>0>k>>>0;g=j?t:k;h=a[e+g>>0]|0;d:do if(h<<24>>24){while(1){if(h<<24>>24!=(a[f+g>>0]|0))break;g=g+1|0;h=a[e+g>>0]|0;if(!(h<<24>>24))break d}h=0;g=g-s|0;break c}while(0);if(!j)break b;g=t;while(1){g=g+-1|0;if((a[e+g>>0]|0)!=(a[f+g>>0]|0)){h=r;g=m;break c}if(g>>>0<=k>>>0)break b}}while(0);f=f+g|0;k=h;g=i}}while(0);l=x;return f|0}function Rh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function Sh(a,b,c){a=a|0;b=b|0;c=c|0;c=Vh(a,b,c,-1,0)|0;return c|0}function Th(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=Uh(a,b,f)|0;l=e;return d|0}function Uh(a,b,c){a=a|0;b=b|0;c=c|0;return gh(a,2147483647,b,c)|0}function Vh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;Wh(h,0);d=Xh(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function Wh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=e+b;else c[a+100>>2]=d;return}function Xh(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(Ug()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0}while((Zh(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=Yh(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0;if((i|32|0)!=120)if(j){o=8;n=47;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0;if((d[12689+i>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){Wh(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{o=16;n=47}}else{e=j?10:e;if(e>>>0>(d[12689+i>>0]|0)>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;Wh(b,0);c[(Ug()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;do{i=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;e=j+-48|0}while(e>>>0<10&i>>>0<429496729);if(e>>>0<10){m=0;do{f=vi(i|0,m|0,10,0)|0;k=y;l=((e|0)<0)<<31>>31;o=~l;if(k>>>0>o>>>0|(k|0)==(o|0)&f>>>0>~e>>>0){f=10;e=m;n=76;break c}i=pi(f|0,k|0,e|0,l|0)|0;m=y;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;e=j+-48|0}while(e>>>0<10&(m>>>0<429496729|(m|0)==429496729&i>>>0<2576980378));if(e>>>0>9){j=p;e=m}else{f=10;e=m;n=76}}else{j=p;e=0}}else{j=p;e=0;i=0}}else{o=e;n=47}while(0);d:do if((n|0)==47){if(!(o+-1&o)){n=a[19072+((o*23|0)>>>5&7)>>0]|0;f=a[12689+i>>0]|0;e=f&255;if(o>>>0>e>>>0){i=0;do{i=e|i<<n;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;f=a[12689+j>>0]|0;e=f&255}while(i>>>0<134217728&o>>>0>e>>>0);k=e;e=0}else{j=i;k=e;e=0;i=0}l=Ai(-1,-1,n|0)|0;m=y;if(o>>>0<=k>>>0|(m>>>0<e>>>0|(m|0)==(e|0)&l>>>0<i>>>0)){f=o;n=76;break}while(1){i=Bi(i|0,e|0,n|0)|0;e=y;i=i|f&255;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Yh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0|(e>>>0>m>>>0|(e|0)==(m|0)&i>>>0>l>>>0)){f=o;n=76;break d}}}e=a[12689+i>>0]|0;f=e&255;if(o>>>0>f>>>0){i=0;do{i=f+(N(i,o)|0)|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;e=a[12689+j>>0]|0;f=e&255}while(i>>>0<119304647&o>>>0>f>>>0);k=e;e=0}else{j=i;k=e;i=0;e=0}if(o>>>0>f>>>0){m=xi(-1,-1,o|0,0)|0;n=y;f=k;while(1){if(e>>>0>n>>>0|(e|0)==(n|0)&i>>>0>m>>>0){f=o;n=76;break d}k=vi(i|0,e|0,o|0,0)|0;l=y;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=o;n=76;break d}i=pi(k|0,l|0,f|0,0)|0;e=y;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Yh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0){f=o;n=76;break}}}else{f=o;n=76}}while(0);if((n|0)==76)if(f>>>0>(d[12689+j>>0]|0)>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0}while(f>>>0>(d[12689+i>>0]|0)>>>0);c[(Ug()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else j=p;if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0<h>>>0|(e|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(Ug()|0)>>2]=34;g=pi(g|0,h|0,-1,-1)|0;h=y;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(Ug()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=qi(i^j|0,e^g|0,j|0,g|0)|0;h=y}while(0);y=h;return g|0}function Yh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=_h(b)|0;if((e|0)>=0){f=c[f>>2]|0;i=c[b+8>>2]|0;if(f){h=c[b+4>>2]|0;f=f-(c[b+108>>2]|0)|0;g=i;if((i-h|0)<(f|0))j=9;else c[b+100>>2]=h+(f+-1)}else{g=i;j=9}if((j|0)==9)c[b+100>>2]=i;f=b+4|0;if(!g)f=c[f>>2]|0;else{f=c[f>>2]|0;b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((e|0)!=(d[f>>0]|0|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function Zh(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function _h(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if(($h(a)|0)==0?(Xa[c[a+32>>2]&31](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function $h(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Xa[c[b+36>>2]&31](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function ai(a,b,c){a=a|0;b=b|0;c=c|0;c=Vh(a,b,c,-1,-1)|0;return c|0}function bi(a,b,c){a=a|0;b=b|0;c=c|0;c=Vh(a,b,c,-2147483648,0)|0;return c|0}function ci(a,b){a=a|0;b=b|0;var c=0;c=_g(a)|0;return ((di(a,1,c,b)|0)!=(c|0))<<31>>31|0}function di(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=N(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(jh(e)|0)==0;a=Gh(a,f,e)|0;if(!g)kh(e)}else a=Gh(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function ei(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(Hh(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0<h>>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((Xa[c[b+36>>2]&31](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function fi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=hh(a,b,f)|0;l=e;return d|0}function gi(a,b){a=a|0;b=b|0;return hh(c[3293]|0,a,b)|0}function hi(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=hh(c[3293]|0,a,e)|0;l=d;return b|0}function ii(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((c[d+76>>2]|0)>=0?(jh(d)|0)!=0:0){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(i=d+20|0,j=c[i>>2]|0,j>>>0<(c[d+16>>2]|0)>>>0):0){c[i>>2]=j+1;a[j>>0]=f}else e=ei(d,b)|0;kh(d)}else k=3;do if((k|0)==3){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=f;break}e=ei(d,b)|0}while(0);return e|0}function ji(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[3293]|0;if((c[f+76>>2]|0)>-1)g=jh(f)|0;else g=0;do if((ci(b,f)|0)<0)b=-1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(ei(f,10)|0)>>31}while(0);if(g|0)kh(f);return b|0}function ki(){ka(34808);return}function li(){return 34792}function mi(){return 34800}function ni(){return 34804}function oi(){}function pi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function qi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (y=d,a-c>>>0|0)|0}function ri(a){a=a|0;return (a?31-(Q(a^a-1)|0)|0:32)|0}function si(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (y=n,f)|0}else{if(!g){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (y=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (y=n,f)|0}g=h-1|0;if(g&h|0){i=(Q(h|0)|0)+33-(Q(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (y=o,p)|0}else{p=ri(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (y=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (y=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (y=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((ri(i|0)|0)>>>0);return (y=o,p)|0}g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (y=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (y=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=pi(m|0,l|0,-1,-1)|0;d=y;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;qi(k|0,d|0,e|0,n|0)|0;p=y;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=qi(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=y;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (y=o,p)|0}function ti(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=qi(j^a|0,i^b|0,j|0,i|0)|0;g=y;a=f^j;b=e^i;return qi((si(h,g,qi(f^c|0,e^d|0,f|0,e|0)|0,y,0)|0)^a|0,y^b|0,a|0,b|0)|0}function ui(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function vi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=ui(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function wi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;i=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;j=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=qi(h^a|0,g^b|0,h|0,g|0)|0;b=y;si(a,b,qi(k^d|0,j^e|0,k|0,j|0)|0,y,i)|0;e=qi(c[i>>2]^h|0,c[i+4>>2]^g|0,h|0,g|0)|0;d=y;l=f;return (y=d,e)|0}function xi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return si(a,b,c,d,0)|0}function yi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g|0;si(a,b,d,e,f)|0;l=g;return (y=c[f+4>>2]|0,c[f>>2]|0)|0}function zi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=(b|0)<0?-1:0;return b>>c-32|0}function Ai(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function Bi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}y=a<<c-32;return 0}function Ci(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Di(a,b,c){a=a|0;b=b|0;c=c|0;b=Q(b)|0;if((b|0)==32)b=b+(Q(a)|0)|0;y=0;return b|0}function Ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return za(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function Fi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function Gi(a){a=a|0;var b=0,d=0;d=c[i>>2]|0;b=d+a|0;if((a|0)>0&(b|0)<(d|0)|(b|0)<0){V()|0;la(12);return -1}c[i>>2]=b;if((b|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=d;la(12);return -1}return d|0}function Hi(a,b){a=a|0;b=b|0;return Va[a&15](b|0)|0}function Ii(a,b,c){a=a|0;b=b|0;c=c|0;return Wa[a&3](b|0,c|0)|0}function Ji(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Xa[a&31](b|0,c|0,d|0)|0}function Ki(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Ya[a&3](b|0,c|0,d|0,e|0)|0}function Li(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Za[a&7](b|0,c|0,d|0,e|0,f|0)|0}function Mi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return _a[a&15](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Ni(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return $a[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)|0}function Oi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return ab[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Pi(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;return bb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0,n|0,o|0,p|0,q|0)|0}function Qi(a,b){a=a|0;b=b|0;cb[a&15](b|0)}function Ri(a,b,c){a=a|0;b=b|0;c=c|0;db[a&15](b|0,c|0)}function Si(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;eb[a&15](b|0,c|0,d|0)}function Ti(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fb[a&31](b|0,c|0,d|0,e|0)}function Ui(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;gb[a&7](b|0,c|0,d|0,e|0,f|0)}function Vi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;hb[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function Wi(a){a=a|0;R(0);return 0}function Xi(a,b){a=a|0;b=b|0;R(1);return 0}function Yi(a,b,c){a=a|0;b=b|0;c=c|0;R(2);return 0}function Zi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(3);return 0}function _i(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(4);return 0}function $i(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(5);return 0}function aj(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;R(6);return 0}function bj(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;R(7);return 0}function cj(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;R(8);return 0}function dj(a){a=a|0;R(9)}function ej(a,b){a=a|0;b=b|0;R(10)}function fj(a,b,c){a=a|0;b=b|0;c=c|0;R(11)}function gj(a,b,c){a=a|0;b=b|0;c=c|0;ua(a|0,b|0,c|0)}function hj(a,b,c){a=a|0;b=b|0;c=c|0;Qa(a|0,b|0,c|0)}function ij(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(12)}function jj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(13)}function kj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(14)}
+
+// EMSCRIPTEN_END_FUNCS
+var Va=[Wi,Kf,Nf,Qf,Rf,Sf,dg,hg,Qg,Qc,bf,Wi,Wi,Wi,Wi,Wi];var Wa=[Xi,fg,nf,Xi];var Xa=[Yi,Rg,Sg,Wg,Ih,Bb,zc,Ac,Dc,Fc,vd,Gd,Hd,Id,Sd,me,lg,ng,qg,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi];var Ya=[Zi,Bd,Ed,Zi];var Za=[_i,xc,Pc,Yc,bd,ed,Fd,_i];var _a=[$i,qd,rd,sd,td,yd,zd,Ad,Cd,lf,$i,$i,$i,$i,$i,$i];var $a=[aj,ud,cf,df];var ab=[bj,Dd];var bb=[cj,wd];var cb=[dj,Lf,cg,eg,wb,zb,Ab,xb,cd,nd,dj,dj,dj,dj,dj,dj];var db=[ej,Mf,Of,Pf,gg,Lc,Sc,od,pd,xd,mf,ej,ej,ej,ej,ej];var eb=[fj,Tf,jg,gj,hj,Rc,Ie,Ke,kg,pg,Dg,Gg,fj,fj,fj,fj];var fb=[ij,Bc,Cc,Ec,hd,Td,_d,de,ee,ne,ef,gf,hf,mg,og,rg,Eg,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij];var gb=[jj,ig,Md,Wd,Yd,of,jj,jj];var hb=[kj,yb];return{___divdi3:ti,___emscripten_environ_constructor:ki,___muldi3:vi,___remdi3:wi,___udivdi3:xi,___uremdi3:yi,__get_daylight:mi,__get_timezone:ni,__get_tzname:li,_bitshift64Ashr:zi,_bitshift64Lshr:Ai,_bitshift64Shl:Bi,_console_queue_char:pb,_display_key_event:qb,_display_mouse_event:rb,_display_wheel_event:sb,_free:Mg,_fs_import_file:be,_i64Add:pi,_i64Subtract:qi,_llvm_bswap_i32:Ci,_llvm_ctlz_i64:Di,_malloc:Lg,_memcpy:Ei,_memset:Fi,_net_set_carrier:ub,_net_write_packet:tb,_sbrk:Gi,_vm_start:vb,dynCall_ii:Hi,dynCall_iii:Ii,dynCall_iiii:Ji,dynCall_iiiii:Ki,dynCall_iiiiii:Li,dynCall_iiiiiii:Mi,dynCall_iiiiiiii:Ni,dynCall_iiiiiiiii:Oi,dynCall_iiiiiiiiiiiiiiiii:Pi,dynCall_vi:Qi,dynCall_vii:Ri,dynCall_viii:Si,dynCall_viiii:Ti,dynCall_viiiii:Ui,dynCall_viiiiii:Vi,establishStackSpace:lb,getTempRet0:ob,runPostSets:oi,setTempRet0:nb,setThrew:mb,stackAlloc:ib,stackRestore:kb,stackSave:jb}})
+
+
+// EMSCRIPTEN_END_ASM
+(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=asm["___emscripten_environ_constructor"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___remdi3=Module["___remdi3"]=asm["___remdi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var __get_daylight=Module["__get_daylight"]=asm["__get_daylight"];var __get_timezone=Module["__get_timezone"]=asm["__get_timezone"];var __get_tzname=Module["__get_tzname"]=asm["__get_tzname"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _console_queue_char=Module["_console_queue_char"]=asm["_console_queue_char"];var _display_key_event=Module["_display_key_event"]=asm["_display_key_event"];var _display_mouse_event=Module["_display_mouse_event"]=asm["_display_mouse_event"];var _display_wheel_event=Module["_display_wheel_event"]=asm["_display_wheel_event"];var _free=Module["_free"]=asm["_free"];var _fs_import_file=Module["_fs_import_file"]=asm["_fs_import_file"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _llvm_ctlz_i64=Module["_llvm_ctlz_i64"]=asm["_llvm_ctlz_i64"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memset=Module["_memset"]=asm["_memset"];var _net_set_carrier=Module["_net_set_carrier"]=asm["_net_set_carrier"];var _net_write_packet=Module["_net_write_packet"]=asm["_net_write_packet"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _vm_start=Module["_vm_start"]=asm["_vm_start"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=asm["dynCall_iiiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=asm["dynCall_iiiiiiiiiiiiiiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;if(memoryInitializer){if(!isDataURI(memoryInitializer)){memoryInitializer=locateFile(memoryInitializer)}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run()
+
+
+
+
diff --git a/jslinux-2019-12-21/root-riscv64.bin b/jslinux-2019-12-21/root-riscv64.bin
new file mode 100644
index 0000000..4942c6d
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64.cfg b/jslinux-2019-12-21/root-riscv64.cfg
new file mode 100644
index 0000000..e1349e2
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64.cfg
@@ -0,0 +1,11 @@
+/* VM configuration file */
+{
+ version: 1,
+ machine: "riscv64",
+ memory_size: 128,
+ bios: "bbl64.bin",
+ kernel: "kernel-riscv64.bin",
+ cmdline: "console=hvc0 root=/dev/vda rw",
+ drive0: { file: "root-riscv64/blk.txt" },
+ eth0: { driver: "user" },
+}
diff --git a/jslinux-2019-12-21/root-riscv64/blk.txt b/jslinux-2019-12-21/root-riscv64/blk.txt
new file mode 100644
index 0000000..a2a6be7
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk.txt
@@ -0,0 +1,4 @@
+{
+ block_size: 256,
+ n_block: 16,
+}
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000000.bin b/jslinux-2019-12-21/root-riscv64/blk000000000.bin
new file mode 100644
index 0000000..f88afd7
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000000.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000001.bin b/jslinux-2019-12-21/root-riscv64/blk000000001.bin
new file mode 100644
index 0000000..d3e69e5
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000001.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000002.bin b/jslinux-2019-12-21/root-riscv64/blk000000002.bin
new file mode 100644
index 0000000..0dd2407
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000002.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000003.bin b/jslinux-2019-12-21/root-riscv64/blk000000003.bin
new file mode 100644
index 0000000..c15dbab
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000003.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000004.bin b/jslinux-2019-12-21/root-riscv64/blk000000004.bin
new file mode 100644
index 0000000..fff7fb1
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000004.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000005.bin b/jslinux-2019-12-21/root-riscv64/blk000000005.bin
new file mode 100644
index 0000000..7dbe2c9
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000005.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000006.bin b/jslinux-2019-12-21/root-riscv64/blk000000006.bin
new file mode 100644
index 0000000..3db4829
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000006.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000007.bin b/jslinux-2019-12-21/root-riscv64/blk000000007.bin
new file mode 100644
index 0000000..5fbf56f
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000007.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000008.bin b/jslinux-2019-12-21/root-riscv64/blk000000008.bin
new file mode 100644
index 0000000..c5f642b
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000008.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000009.bin b/jslinux-2019-12-21/root-riscv64/blk000000009.bin
new file mode 100644
index 0000000..36a07d8
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000009.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000010.bin b/jslinux-2019-12-21/root-riscv64/blk000000010.bin
new file mode 100644
index 0000000..d865802
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000010.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000011.bin b/jslinux-2019-12-21/root-riscv64/blk000000011.bin
new file mode 100644
index 0000000..af39dc1
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000011.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000012.bin b/jslinux-2019-12-21/root-riscv64/blk000000012.bin
new file mode 100644
index 0000000..b53ced0
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000012.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000013.bin b/jslinux-2019-12-21/root-riscv64/blk000000013.bin
new file mode 100644
index 0000000..4c1632c
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000013.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000014.bin b/jslinux-2019-12-21/root-riscv64/blk000000014.bin
new file mode 100644
index 0000000..89f5642
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000014.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-riscv64/blk000000015.bin b/jslinux-2019-12-21/root-riscv64/blk000000015.bin
new file mode 100644
index 0000000..2e67caf
--- /dev/null
+++ b/jslinux-2019-12-21/root-riscv64/blk000000015.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86.bin b/jslinux-2019-12-21/root-x86.bin
new file mode 100644
index 0000000..a483489
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86.bin.orig b/jslinux-2019-12-21/root-x86.bin.orig
new file mode 100644
index 0000000..8782717
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86.bin.orig
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86.cfg b/jslinux-2019-12-21/root-x86.cfg
new file mode 100644
index 0000000..7b391ba
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86.cfg
@@ -0,0 +1,10 @@
+/* VM configuration file */
+{
+ version: 1,
+ machine: "pc",
+ memory_size: 128,
+ kernel: "kernel-x86.bin",
+ cmdline: "loglevel=3 console=hvc0 root=/dev/vda init=/bin/ash rw",
+ drive0: { file: "root-x86/blk.txt" },
+ eth0: { driver: "user" },
+}
diff --git a/jslinux-2019-12-21/root-x86/blk.txt b/jslinux-2019-12-21/root-x86/blk.txt
new file mode 100644
index 0000000..65791bb
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk.txt
@@ -0,0 +1,4 @@
+{
+ block_size: 2048,
+ n_block: 25,
+}
diff --git a/jslinux-2019-12-21/root-x86/blk000000000.bin b/jslinux-2019-12-21/root-x86/blk000000000.bin
new file mode 100644
index 0000000..c71e322
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000000.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000001.bin b/jslinux-2019-12-21/root-x86/blk000000001.bin
new file mode 100644
index 0000000..ac5b9eb
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000001.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000002.bin b/jslinux-2019-12-21/root-x86/blk000000002.bin
new file mode 100644
index 0000000..32d1f73
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000002.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000003.bin b/jslinux-2019-12-21/root-x86/blk000000003.bin
new file mode 100644
index 0000000..3301331
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000003.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000004.bin b/jslinux-2019-12-21/root-x86/blk000000004.bin
new file mode 100644
index 0000000..9b94ccb
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000004.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000005.bin b/jslinux-2019-12-21/root-x86/blk000000005.bin
new file mode 100644
index 0000000..178a4a3
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000005.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000006.bin b/jslinux-2019-12-21/root-x86/blk000000006.bin
new file mode 100644
index 0000000..8464bbd
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000006.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000007.bin b/jslinux-2019-12-21/root-x86/blk000000007.bin
new file mode 100644
index 0000000..3301331
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000007.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000008.bin b/jslinux-2019-12-21/root-x86/blk000000008.bin
new file mode 100644
index 0000000..60fda4f
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000008.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000009.bin b/jslinux-2019-12-21/root-x86/blk000000009.bin
new file mode 100644
index 0000000..d785f99
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000009.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000010.bin b/jslinux-2019-12-21/root-x86/blk000000010.bin
new file mode 100644
index 0000000..338f6e1
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000010.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000011.bin b/jslinux-2019-12-21/root-x86/blk000000011.bin
new file mode 100644
index 0000000..3301331
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000011.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000012.bin b/jslinux-2019-12-21/root-x86/blk000000012.bin
new file mode 100644
index 0000000..6a3a70c
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000012.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000013.bin b/jslinux-2019-12-21/root-x86/blk000000013.bin
new file mode 100644
index 0000000..3301331
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000013.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000014.bin b/jslinux-2019-12-21/root-x86/blk000000014.bin
new file mode 100644
index 0000000..9baa771
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000014.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000015.bin b/jslinux-2019-12-21/root-x86/blk000000015.bin
new file mode 100644
index 0000000..05f9258
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000015.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000016.bin b/jslinux-2019-12-21/root-x86/blk000000016.bin
new file mode 100644
index 0000000..e5e0c64
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000016.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000017.bin b/jslinux-2019-12-21/root-x86/blk000000017.bin
new file mode 100644
index 0000000..6001d11
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000017.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000018.bin b/jslinux-2019-12-21/root-x86/blk000000018.bin
new file mode 100644
index 0000000..3301331
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000018.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000019.bin b/jslinux-2019-12-21/root-x86/blk000000019.bin
new file mode 100644
index 0000000..d740e1e
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000019.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000020.bin b/jslinux-2019-12-21/root-x86/blk000000020.bin
new file mode 100644
index 0000000..9eef5bc
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000020.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000021.bin b/jslinux-2019-12-21/root-x86/blk000000021.bin
new file mode 100644
index 0000000..08d5daf
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000021.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000022.bin b/jslinux-2019-12-21/root-x86/blk000000022.bin
new file mode 100644
index 0000000..6f362b7
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000022.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000023.bin b/jslinux-2019-12-21/root-x86/blk000000023.bin
new file mode 100644
index 0000000..3301331
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000023.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000024.bin b/jslinux-2019-12-21/root-x86/blk000000024.bin
new file mode 100644
index 0000000..ada4ca1
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000024.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000025.bin b/jslinux-2019-12-21/root-x86/blk000000025.bin
new file mode 100644
index 0000000..fbc2212
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000025.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000026.bin b/jslinux-2019-12-21/root-x86/blk000000026.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000026.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000027.bin b/jslinux-2019-12-21/root-x86/blk000000027.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000027.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000028.bin b/jslinux-2019-12-21/root-x86/blk000000028.bin
new file mode 100644
index 0000000..44f596e
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000028.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000029.bin b/jslinux-2019-12-21/root-x86/blk000000029.bin
new file mode 100644
index 0000000..550b8ed
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000029.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000030.bin b/jslinux-2019-12-21/root-x86/blk000000030.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000030.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000031.bin b/jslinux-2019-12-21/root-x86/blk000000031.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000031.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000032.bin b/jslinux-2019-12-21/root-x86/blk000000032.bin
new file mode 100644
index 0000000..c4112d8
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000032.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000033.bin b/jslinux-2019-12-21/root-x86/blk000000033.bin
new file mode 100644
index 0000000..0d990c3
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000033.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000034.bin b/jslinux-2019-12-21/root-x86/blk000000034.bin
new file mode 100644
index 0000000..d387f2d
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000034.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000035.bin b/jslinux-2019-12-21/root-x86/blk000000035.bin
new file mode 100644
index 0000000..deef736
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000035.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000036.bin b/jslinux-2019-12-21/root-x86/blk000000036.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000036.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000037.bin b/jslinux-2019-12-21/root-x86/blk000000037.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000037.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000038.bin b/jslinux-2019-12-21/root-x86/blk000000038.bin
new file mode 100644
index 0000000..ea2d51a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000038.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000039.bin b/jslinux-2019-12-21/root-x86/blk000000039.bin
new file mode 100644
index 0000000..7de6988
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000039.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000040.bin b/jslinux-2019-12-21/root-x86/blk000000040.bin
new file mode 100644
index 0000000..894ba25
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000040.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000041.bin b/jslinux-2019-12-21/root-x86/blk000000041.bin
new file mode 100644
index 0000000..0f41954
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000041.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000042.bin b/jslinux-2019-12-21/root-x86/blk000000042.bin
new file mode 100644
index 0000000..440277b
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000042.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000043.bin b/jslinux-2019-12-21/root-x86/blk000000043.bin
new file mode 100644
index 0000000..da772d8
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000043.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000044.bin b/jslinux-2019-12-21/root-x86/blk000000044.bin
new file mode 100644
index 0000000..ca05e30
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000044.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000045.bin b/jslinux-2019-12-21/root-x86/blk000000045.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000045.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000046.bin b/jslinux-2019-12-21/root-x86/blk000000046.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000046.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000047.bin b/jslinux-2019-12-21/root-x86/blk000000047.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000047.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000048.bin b/jslinux-2019-12-21/root-x86/blk000000048.bin
new file mode 100644
index 0000000..2eee8a3
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000048.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000049.bin b/jslinux-2019-12-21/root-x86/blk000000049.bin
new file mode 100644
index 0000000..9e0f96a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000049.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000050.bin b/jslinux-2019-12-21/root-x86/blk000000050.bin
new file mode 100644
index 0000000..5c2339d
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000050.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000051.bin b/jslinux-2019-12-21/root-x86/blk000000051.bin
new file mode 100644
index 0000000..d6a37c8
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000051.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000052.bin b/jslinux-2019-12-21/root-x86/blk000000052.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000052.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000053.bin b/jslinux-2019-12-21/root-x86/blk000000053.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000053.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000054.bin b/jslinux-2019-12-21/root-x86/blk000000054.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000054.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000055.bin b/jslinux-2019-12-21/root-x86/blk000000055.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000055.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000056.bin b/jslinux-2019-12-21/root-x86/blk000000056.bin
new file mode 100644
index 0000000..d9233d8
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000056.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000057.bin b/jslinux-2019-12-21/root-x86/blk000000057.bin
new file mode 100644
index 0000000..d0c7f05
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000057.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000058.bin b/jslinux-2019-12-21/root-x86/blk000000058.bin
new file mode 100644
index 0000000..db4367a
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000058.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000059.bin b/jslinux-2019-12-21/root-x86/blk000000059.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000059.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000060.bin b/jslinux-2019-12-21/root-x86/blk000000060.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000060.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000061.bin b/jslinux-2019-12-21/root-x86/blk000000061.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000061.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000062.bin b/jslinux-2019-12-21/root-x86/blk000000062.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000062.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000063.bin b/jslinux-2019-12-21/root-x86/blk000000063.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000063.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000064.bin b/jslinux-2019-12-21/root-x86/blk000000064.bin
new file mode 100644
index 0000000..f3577c9
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000064.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000065.bin b/jslinux-2019-12-21/root-x86/blk000000065.bin
new file mode 100644
index 0000000..50d2b31
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000065.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000066.bin b/jslinux-2019-12-21/root-x86/blk000000066.bin
new file mode 100644
index 0000000..188d2e6
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000066.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000067.bin b/jslinux-2019-12-21/root-x86/blk000000067.bin
new file mode 100644
index 0000000..ae605d8
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000067.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000068.bin b/jslinux-2019-12-21/root-x86/blk000000068.bin
new file mode 100644
index 0000000..39785a2
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000068.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000069.bin b/jslinux-2019-12-21/root-x86/blk000000069.bin
new file mode 100644
index 0000000..c31853c
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000069.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000070.bin b/jslinux-2019-12-21/root-x86/blk000000070.bin
new file mode 100644
index 0000000..f01bfbf
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000070.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000071.bin b/jslinux-2019-12-21/root-x86/blk000000071.bin
new file mode 100644
index 0000000..e6e9cba
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000071.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000072.bin b/jslinux-2019-12-21/root-x86/blk000000072.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000072.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000073.bin b/jslinux-2019-12-21/root-x86/blk000000073.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000073.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000074.bin b/jslinux-2019-12-21/root-x86/blk000000074.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000074.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000075.bin b/jslinux-2019-12-21/root-x86/blk000000075.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000075.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000076.bin b/jslinux-2019-12-21/root-x86/blk000000076.bin
new file mode 100644
index 0000000..3f4e16c
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000076.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000077.bin b/jslinux-2019-12-21/root-x86/blk000000077.bin
new file mode 100644
index 0000000..3449fb9
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000077.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000078.bin b/jslinux-2019-12-21/root-x86/blk000000078.bin
new file mode 100644
index 0000000..66a4f35
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000078.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000079.bin b/jslinux-2019-12-21/root-x86/blk000000079.bin
new file mode 100644
index 0000000..2822aec
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000079.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000080.bin b/jslinux-2019-12-21/root-x86/blk000000080.bin
new file mode 100644
index 0000000..5381d8f
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000080.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000081.bin b/jslinux-2019-12-21/root-x86/blk000000081.bin
new file mode 100644
index 0000000..61e96a3
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000081.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000082.bin b/jslinux-2019-12-21/root-x86/blk000000082.bin
new file mode 100644
index 0000000..855a4cb
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000082.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000083.bin b/jslinux-2019-12-21/root-x86/blk000000083.bin
new file mode 100644
index 0000000..58e79c3
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000083.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000084.bin b/jslinux-2019-12-21/root-x86/blk000000084.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000084.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000085.bin b/jslinux-2019-12-21/root-x86/blk000000085.bin
new file mode 100644
index 0000000..41ce963
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000085.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000086.bin b/jslinux-2019-12-21/root-x86/blk000000086.bin
new file mode 100644
index 0000000..8536003
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000086.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000087.bin b/jslinux-2019-12-21/root-x86/blk000000087.bin
new file mode 100644
index 0000000..5e753bc
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000087.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000088.bin b/jslinux-2019-12-21/root-x86/blk000000088.bin
new file mode 100644
index 0000000..f0a23d9
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000088.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000089.bin b/jslinux-2019-12-21/root-x86/blk000000089.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000089.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000090.bin b/jslinux-2019-12-21/root-x86/blk000000090.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000090.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000091.bin b/jslinux-2019-12-21/root-x86/blk000000091.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000091.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000092.bin b/jslinux-2019-12-21/root-x86/blk000000092.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000092.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000093.bin b/jslinux-2019-12-21/root-x86/blk000000093.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000093.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000094.bin b/jslinux-2019-12-21/root-x86/blk000000094.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000094.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000095.bin b/jslinux-2019-12-21/root-x86/blk000000095.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000095.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000096.bin b/jslinux-2019-12-21/root-x86/blk000000096.bin
new file mode 100644
index 0000000..39d064f
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000096.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000097.bin b/jslinux-2019-12-21/root-x86/blk000000097.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000097.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000098.bin b/jslinux-2019-12-21/root-x86/blk000000098.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000098.bin
Binary files differ
diff --git a/jslinux-2019-12-21/root-x86/blk000000099.bin b/jslinux-2019-12-21/root-x86/blk000000099.bin
new file mode 100644
index 0000000..8dd9b32
--- /dev/null
+++ b/jslinux-2019-12-21/root-x86/blk000000099.bin
Binary files differ
diff --git a/jslinux-2019-12-21/splitimg b/jslinux-2019-12-21/splitimg
new file mode 100755
index 0000000..8c2f617
--- /dev/null
+++ b/jslinux-2019-12-21/splitimg
Binary files differ
diff --git a/jslinux-2019-12-21/style.css b/jslinux-2019-12-21/style.css
new file mode 100644
index 0000000..9d39504
--- /dev/null
+++ b/jslinux-2019-12-21/style.css
@@ -0,0 +1,41 @@
+.term {
+ font-family: courier,fixed,swiss,monospace,sans-serif;
+ font-size: 15px;
+ color: #f0f0f0;
+ background: #000000;
+}
+
+.term_content a {
+ color: #ffff00;
+}
+
+.term_cursor {
+ color: #000000;
+ background: #00ff00;
+}
+
+.term_scrollbar { background: transparent url(images/bg-scrollbar-track-y.png) no-repeat 0 0; position: relative; background-position: 0 0; float: right; width: 15px; height: 100%; }
+.term_track { background: transparent url(images/bg-scrollbar-trackend-y.png) no-repeat 0 100%; height: 100%; width:13px; position: relative; padding: 0 1px; }
+.term_thumb { background: transparent url(images/bg-scrollbar-thumb-y.png) no-repeat 50% 100%; height: 20px; width: 25px; cursor: pointer; overflow: hidden; position: absolute; top: 0; left: -5px; }
+.term_thumb .term_end { background: transparent url(images/bg-scrollbar-thumb-y.png) no-repeat 50% 0; overflow: hidden; height: 5px; width: 25px; }
+.noSelect { user-select: none; -o-user-select: none; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; }
+#term_paste {
+ border: 1px solid;
+ height: 19px;
+}
+
+/* file import */
+#files {
+ visibility: hidden;
+ width:1px;
+ height:1px;
+ padding: 0px;
+ margin: 0px;
+ bordex: 0px;
+}
+
+label {
+ cursor: pointer;
+ margin-left: 5px;
+ margin-right: 5px;
+}
diff --git a/jslinux-2019-12-21/term.js b/jslinux-2019-12-21/term.js
new file mode 100644
index 0000000..1a9ca6c
--- /dev/null
+++ b/jslinux-2019-12-21/term.js
@@ -0,0 +1,1251 @@
+/*
+ * Javascript terminal
+ *
+ * Copyright (c) 2011-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+"use strict";
+
+function Term(width, height, handler, tot_height)
+{
+ this.w = width;
+ this.h = height;
+
+ this.cur_h = height; /* current height of the scroll back buffer */
+ if (!tot_height || tot_height < height)
+ tot_height = height;
+ this.tot_h = tot_height; /* maximum height of the scroll back buffer */
+ this.y_base = 0; /* position of the current top screen line in the
+ * scroll back buffer */
+ this.y_disp = 0; /* position of the top displayed line in the
+ * scroll back buffer */
+ /* cursor position */
+ this.x = 0;
+ this.y = 0;
+ this.scroll_top = 0;
+ this.scroll_bottom = this.h;
+ this.cursorstate = 0;
+ this.handler = handler;
+ this.state = 0;
+ this.output_queue = "";
+ this.colors = [
+ /* normal */
+ "#000000",
+ "#aa0000",
+ "#00aa00",
+ "#aa5500",
+ "#0000aa",
+ "#aa00aa",
+ "#00aaaa",
+ "#aaaaaa",
+ /* bright */
+ "#555555",
+ "#ff5555",
+ "#55ff55",
+ "#ffff55",
+ "#5555ff",
+ "#ff55ff",
+ "#55ffff",
+ "#ffffff"
+ ];
+ /* attributes bits:
+ 0-3: bg
+ 4-7: fg
+ 8: bold
+ 9: inverse
+ */
+ this.def_attr = (7 << 4) | 0;
+ this.cur_attr = this.def_attr;
+ this.is_mac = (navigator.userAgent.indexOf("Mac") >=0 ) ? true : false;
+ this.key_rep_state = 0;
+ this.key_rep_str = "";
+
+ this.utf8 = true;
+ this.utf8_state = 0;
+ this.utf8_val = 0;
+
+ this.application_cursor = false;
+ this.application_keypad = false;
+ /* if true, emulate some behaviors of the Linux console */
+ this.linux_console = true;
+}
+
+Term.prototype.open = function(parent_el, textarea_el)
+{
+ var y, line, i, term, c, row_el;
+
+ /* set initial content */
+ this.lines = new Array();
+ c = 32 | (this.def_attr << 16);
+ for(y = 0; y < this.cur_h;y++) {
+ line = new Array();
+ for(i=0;i<this.w;i++)
+ line[i] = c;
+ this.lines[y] = line;
+ }
+
+ /* create the terminal window */
+ this.term_el = document.createElement("div");
+ this.term_el.className = "term";
+ this.term_el.style.lineHeight = "1.2em";
+ /* XXX: could compute the font metrics */
+ this.term_el.style.width = "calc(" + this.w + "ch + 16px)";
+ this.term_el.style.height = (this.h * 1.2) + "em";
+
+ /* scroll bar */
+ this.scrollbar_el = document.createElement("div");
+ this.scrollbar_el.className = "term_scrollbar";
+ this.term_el.appendChild(this.scrollbar_el);
+
+ this.track_el = document.createElement("div");
+ this.track_el.className = "term_track";
+ this.track_el.onmousedown = this.mouseMoveHandler.bind(this);
+ this.scrollbar_el.appendChild(this.track_el);
+
+ this.thumb_el = document.createElement("div");
+ this.thumb_el.className = "term_thumb";
+ this.thumb_el.onmousedown = this.mouseDownHandler.bind(this);
+ this.track_el.appendChild(this.thumb_el);
+
+ this.end_el = document.createElement("div");
+ this.end_el.className = "term_end";
+ this.thumb_el.appendChild(this.end_el);
+
+ /* current scrollbar position */
+ this.thumb_size = -1;
+ this.thumb_pos = -1;
+
+ /* terminal content */
+ this.content_el = document.createElement("div");
+ this.content_el.className = "term_content";
+ this.content_el.style.width = (this.w) + "ch";
+ this.term_el.appendChild(this.content_el);
+
+ this.rows_el = [];
+ for(y=0;y<this.h;y++) {
+ row_el = document.createElement("div");
+ this.rows_el.push(row_el);
+ this.content_el.appendChild(row_el);
+ }
+
+ this.parent_el = parent_el;
+ parent_el.appendChild(this.term_el);
+
+ /* dummy text area for copy paste & mobile devices */
+ this.textarea_el = textarea_el;
+
+ this.refresh(0, this.h - 1);
+
+ // key handler
+ document.addEventListener("keydown",
+ this.keyDownHandler.bind(this), true);
+ document.addEventListener("keyup",
+ this.keyUpHandler.bind(this), true);
+ document.addEventListener("blur",
+ this.blurHandler.bind(this), true);
+ document.addEventListener("keypress",
+ this.keyPressHandler.bind(this), true);
+ // wheel
+ this.term_el.addEventListener("wheel",
+ this.wheelHandler.bind(this), false);
+ // paste
+ document.defaultView.addEventListener("paste",
+ this.pasteHandler.bind(this), false);
+
+ // cursor blinking
+ term = this;
+ setInterval(function() { term.cursor_timer_cb(); }, 1000);
+};
+
+Term.prototype.refresh_scrollbar = function ()
+{
+ var total_size, thumb_pos, thumb_size, y, y0;
+ total_size = this.term_el.clientHeight;
+ thumb_size = Math.ceil(this.h * total_size / this.cur_h);
+ /* position of the first line of the scroll back buffer */
+ y0 = (this.y_base + this.h) % this.cur_h;
+ y = this.y_disp - y0;
+ if (y < 0)
+ y += this.cur_h;
+ thumb_pos = Math.floor(y * total_size / this.cur_h);
+ thumb_size = Math.max(thumb_size, 30);
+ thumb_size = Math.min(thumb_size, total_size);
+ thumb_pos = Math.min(thumb_pos, total_size - thumb_size);
+// console.log("pos=" + thumb_pos + " size=" + thumb_size);
+ if (thumb_pos != this.thumb_pos || thumb_size != this.thumb_size) {
+ this.thumb_pos = thumb_pos;
+ this.thumb_size = thumb_size;
+ this.thumb_el.style.top = thumb_pos + "px";
+ this.thumb_el.style.height = thumb_size + "px";
+ }
+}
+
+Term.prototype.refresh = function(ymin, ymax)
+{
+ var el, y, line, outline, c, w, i, j, cx, attr, last_attr, fg, bg, y1;
+ var http_link_len, http_link_str, bold, tmp, inverse;
+
+ function is_http_link_char(c)
+ {
+ var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=`.";
+ return str.indexOf(String.fromCharCode(c)) >= 0;
+ }
+
+ function right_trim(str, a)
+ {
+ var i, n;
+ n = a.length;
+ i = str.length;
+ while (i >= n && str.substr(i - n, n) == a)
+ i -= n;
+ return str.substr(0, i);
+ }
+
+ for(y = ymin; y <= ymax; y++) {
+ /* convert to HTML string */
+ y1 = y + this.y_disp;
+ if (y1 >= this.cur_h)
+ y1 -= this.cur_h;
+ line = this.lines[y1];
+ outline = "";
+ w = this.w;
+ if (y == this.y && this.cursor_state &&
+ this.y_disp == this.y_base) {
+ cx = this.x;
+ } else {
+ cx = -1;
+ }
+ last_attr = this.def_attr;
+ http_link_len = 0;
+ for(i = 0; i < w; i++) {
+ c = line[i];
+ attr = c >> 16;
+ c &= 0xffff;
+ /* test for http link */
+ if (c == 0x68 && (w - i) >= 8 && http_link_len == 0) {
+ /* test http:// or https:// */
+ if ((line[i + 1] & 0xffff) == 0x74 &&
+ (line[i + 2] & 0xffff) == 0x74 &&
+ (line[i + 3] & 0xffff) == 0x70 &&
+ (((line[i + 4] & 0xffff) == 0x3a &&
+ (line[i + 5] & 0xffff) == 0x2f &&
+ (line[i + 6] & 0xffff) == 0x2f) ||
+ ((line[i + 4] & 0xffff) == 0x73 &&
+ (line[i + 5] & 0xffff) == 0x3a &&
+ (line[i + 6] & 0xffff) == 0x2f &&
+ (line[i + 7] & 0xffff) == 0x2f))) {
+ http_link_str = "";
+ j = 0;
+ while ((i + j) < w &&
+ is_http_link_char(line[i + j] & 0xffff)) {
+ http_link_str += String.fromCharCode(line[i + j] & 0xffff);
+ j++;
+ }
+ http_link_len = j;
+ if (last_attr != this.def_attr) {
+ outline += '</span>';
+ last_attr = this.def_attr;
+ }
+ outline += "<a href='" + http_link_str + "'>";
+ }
+ }
+ if (i == cx) {
+ attr = -1; /* cursor */
+ }
+ if (attr != last_attr) {
+ if (last_attr != this.def_attr)
+ outline += '</span>';
+ if (attr != this.def_attr) {
+ if (attr == -1) {
+ /* cursor */
+ outline += '<span class="term_cursor">';
+ } else {
+ outline += '<span style="';
+ fg = (attr >> 4) & 0xf;
+ bg = attr & 0xf;
+ bold = (attr >> 8) & 1;
+ inverse = (attr >> 9) & 1;
+ if (inverse) {
+ tmp = fg;
+ fg = bg;
+ bg = tmp;
+ }
+ if (bold) {
+ /* metrics are not OK for all fonts, so disabled */
+ /* outline += 'font-weight:bold;'; */
+ /* use the bright color */
+ if (fg < 8)
+ fg += 8;
+ }
+ if (fg != 7) {
+ outline += 'color:' + this.colors[fg] + ';';
+ }
+ if (bg != 0) {
+ outline += 'background-color:' +
+ this.colors[bg] + ';';
+ }
+ outline += '">';
+ }
+ }
+ }
+ switch(c) {
+ case 32:
+ outline += "&nbsp;";
+ break;
+ case 38: // '&'
+ outline += "&amp;";
+ break;
+ case 60: // '<'
+ outline += "&lt;";
+ break;
+ case 62: // '>'
+ outline += "&gt;";
+ break;
+ default:
+ if (c < 32) {
+ outline += "&nbsp;";
+ } else {
+ outline += String.fromCharCode(c);
+ }
+ break;
+ }
+ last_attr = attr;
+ if (http_link_len != 0) {
+ http_link_len--;
+ if (http_link_len == 0) {
+ if (last_attr != this.def_attr) {
+ outline += '</span>';
+ last_attr = this.def_attr;
+ }
+ outline += "</a>";
+ }
+ }
+ }
+ if (last_attr != this.def_attr) {
+ outline += '</span>';
+ }
+
+ /* trim trailing spaces for copy/paste */
+ outline = right_trim(outline, "&nbsp;");
+ if (outline == "")
+ outline = "&nbsp;";
+
+ this.rows_el[y].innerHTML = outline;
+ }
+
+ this.refresh_scrollbar();
+};
+
+Term.prototype.cursor_timer_cb = function()
+{
+ this.cursor_state ^= 1;
+ this.refresh(this.y, this.y);
+};
+
+Term.prototype.show_cursor = function()
+{
+ if (!this.cursor_state) {
+ this.cursor_state = 1;
+ this.refresh(this.y, this.y);
+ }
+};
+
+/* scroll down or up in the scroll back buffer by n lines */
+Term.prototype.scroll_disp = function(n)
+{
+ var i, y1;
+ /* slow but it does not really matters */
+ if (n >= 0) {
+ for(i = 0; i < n; i++) {
+ if (this.y_disp == this.y_base)
+ break;
+ if (++this.y_disp == this.cur_h)
+ this.y_disp = 0;
+ }
+ } else {
+ n = -n;
+ y1 = this.y_base + this.h;
+ if (y1 >= this.cur_h)
+ y1 -= this.cur_h;
+ for(i = 0; i < n; i++) {
+ if (this.y_disp == y1)
+ break;
+ if (--this.y_disp < 0)
+ this.y_disp = this.cur_h - 1;
+ }
+ }
+ this.refresh(0, this.h - 1);
+};
+
+Term.prototype.write = function(str)
+{
+ var s, ymin, ymax;
+
+ function update(y)
+ {
+ ymin = Math.min(ymin, y);
+ ymax = Math.max(ymax, y);
+ }
+
+ function get_erase_char()
+ {
+ var bg_mask, attr;
+ bg_mask = 0xf;
+ attr = (s.def_attr & ~bg_mask) | (s.cur_attr & bg_mask);
+ return 32 | (attr << 16);
+ }
+
+ function erase_chars(x1, x2, y) {
+ var l, i, c, y1;
+ y1 = s.y_base + y;
+ if (y1 >= s.cur_h)
+ y1 -= s.cur_h;
+ l = s.lines[y1];
+ c = get_erase_char();
+ for(i = x1; i < x2; i++)
+ l[i] = c;
+ update(y);
+ }
+
+ function erase_to_eol(x, y) {
+ erase_chars(x, s.w, y);
+ }
+
+ function erase_in_line(n) {
+ switch(n) {
+ case 0:
+ erase_to_eol(s.x, s.y);
+ break;
+ case 1:
+ erase_chars(0, s.x + 1, s.y);
+ break;
+ case 2:
+ erase_chars(0, s.w, s.y);
+ break;
+ }
+ }
+
+ function erase_in_display(n) {
+ var y;
+ switch(n) {
+ case 0:
+ erase_to_eol(s.x, s.y);
+ for(y = s.y + 1; y < s.h; y++)
+ erase_to_eol(0, y);
+ break;
+ case 1:
+ erase_chars(0, s.x + 1, s.y);
+ for(y = 0; y < s.y; y++) {
+ erase_to_eol(0, y);
+ }
+ break;
+ case 2:
+ for(y = 0; y < s.h; y++) {
+ erase_to_eol(0, y);
+ }
+ break;
+ }
+ }
+
+
+ function delete_chars(n)
+ {
+ var l, i, c, y1, j;
+ y1 = s.y + s.y_base;
+ if (y1 >= s.cur_h)
+ y1 -= s.cur_h;
+ l = s.lines[y1];
+ if (n < 1)
+ n = 1;
+ c = get_erase_char();
+ j = s.x + n;
+ for(i = s.x; i < s.w; i++) {
+ if (j < s.w)
+ l[i] = l[j];
+ else
+ l[i] = c;
+ j++;
+ }
+ update(s.y);
+ }
+
+ function insert_chars(n)
+ {
+ var l, i, c, y1, x1;
+ if (n < 1)
+ n = 1;
+ if (n > s.w - s.x)
+ n = s.w - s.x;
+ y1 = s.y + s.y_base;
+ if (y1 >= s.cur_h)
+ y1 -= s.cur_h;
+ l = s.lines[y1];
+ x1 = s.x + n;
+ for(i = s.w - 1; i >= x1; i--)
+ l[i] = l[i - n];
+ c = get_erase_char();
+ for(i = s.x; i < x1; i++)
+ l[i] = c;
+ update(s.y);
+ }
+
+ function csi_colors(esc_params)
+ {
+ var j, n, fg, bg, mask;
+
+ if (esc_params.length == 0) {
+ s.cur_attr= s.def_attr;
+ } else {
+ for(j = 0; j < esc_params.length; j++) {
+ n = esc_params[j];
+ if (n >= 30 && n <= 37) {
+ /* foreground */
+ fg = n - 30;
+ s.cur_attr = (s.cur_attr & ~(0xf << 4)) | (fg << 4);
+ } else if (n >= 40 && n <= 47) {
+ /* background */
+ bg = n - 40;
+ s.cur_attr = (s.cur_attr & ~0xf) | bg;
+ } else if (n >= 90 && n <= 97) {
+ /* bright foreground */
+ fg = n - 90 + 8;
+ s.cur_attr = (s.cur_attr & ~(0xf << 4)) | (fg << 4);
+ } else if (n >= 100 && n <= 107) {
+ /* bright background */
+ bg = n - 100 + 8;
+ s.cur_attr = (s.cur_attr & ~0xf) | bg;
+ } else if (n == 1) {
+ /* bold + bright */
+ s.cur_attr |= (1 << 8);
+ } else if (n == 0) {
+ /* default attr */
+ s.cur_attr = s.def_attr;
+ } else if (n == 7) {
+ /* inverse */
+ s.cur_attr |= (1 << 9);
+ } else if (n == 27) {
+ /* not inverse */
+ s.cur_attr &= ~(1 << 9);
+ } else if (n == 39) {
+ /* reset fg */
+ mask = 0x0f << 4;
+ s.cur_attr = (s.cur_attr & ~mask) | (s.def_attr & mask);
+ } else if (n == 49) {
+ /* reset bg */
+ mask = 0x0f;
+ s.cur_attr = (s.cur_attr & ~mask) | (s.def_attr & mask);
+ }
+ }
+ }
+ }
+
+ function empty_line(y, use_erase_char) {
+ var line, c, y1, x;
+ if (use_erase_char)
+ c = get_erase_char();
+ else
+ c = 32 | (s.def_attr << 16);
+ line = new Array();
+ for(x=0;x<s.w;x++)
+ line[x] = c;
+ y1 = s.y_base + y;
+ if (y1 >= s.cur_h)
+ y1 -= s.cur_h;
+ s.lines[y1] = line;
+ }
+
+ function scroll_down(top, bottom, use_erase_char)
+ {
+ var y, line, y1, y2;
+
+ if (top == 0 && bottom == s.h) {
+ /* increase height of buffer if possible */
+ if (s.cur_h < s.tot_h) {
+ s.cur_h++;
+ }
+ /* move down one line */
+ if (++s.y_base == s.cur_h)
+ s.y_base = 0;
+ s.y_disp = s.y_base;
+ } else {
+ /* partial scroll */
+ for(y = top; y < bottom - 1; y++) {
+ y1 = s.y_base + y;
+ if (y1 >= s.cur_h)
+ y1 -= s.cur_h;
+ y2 = y1 + 1;
+ if (y2 >= s.cur_h)
+ y2 -= s.cur_h;
+ s.lines[y1] = s.lines[y2];
+ }
+ }
+ empty_line(bottom - 1, use_erase_char);
+ update(top);
+ update(bottom - 1);
+ }
+
+ function scroll_up(top, bottom, use_erase_char) {
+ var y, y1, y2;
+ /* XXX: could scroll in the history */
+ for(y = bottom - 1; y > top; y--) {
+ y1 = s.y_base + y;
+ if (y1 >= s.cur_h)
+ y1 -= s.cur_h;
+ y2 = y1 - 1;
+ if (y2 >= s.cur_h)
+ y2 -= s.cur_h;
+ s.lines[y1] = s.lines[y2];
+ }
+ empty_line(top, use_erase_char);
+ update(top);
+ update(bottom - 1);
+ }
+
+ function down_with_scroll() {
+ s.y++;
+ if (s.y == s.scroll_bottom) {
+ s.y--;
+ scroll_down(s.scroll_top, s.scroll_bottom, false);
+ } else if (s.y >= s.h) {
+ s.y--;
+ scroll_down(0, s.h, false);
+ }
+ }
+
+ function up_with_scroll() {
+ if (s.y == s.scroll_top) {
+ scroll_up(s.scroll_top, s.scroll_bottom, true);
+ } else if (s.y == 0) {
+ scroll_up(0, s.h, true);
+ } else {
+ s.y--;
+ }
+ }
+
+ function insert_lines(n) {
+ var y2;
+ if (n < 1)
+ n = 1;
+ if (s.y < s.scroll_bottom)
+ y2 = s.scroll_bottom;
+ else
+ y2 = s.h;
+ while (n != 0) {
+ scroll_up(s.y, y2, true);
+ n--;
+ }
+ }
+
+ function delete_lines(n) {
+ var y2;
+ if (n < 1)
+ n = 1;
+ if (s.y < s.scroll_bottom)
+ y2 = s.scroll_bottom;
+ else
+ y2 = s.h;
+ while (n != 0) {
+ scroll_down(s.y, y2, true);
+ n--;
+ }
+ }
+
+ var TTY_STATE_NORM = 0;
+ var TTY_STATE_ESC = 1;
+ var TTY_STATE_CSI = 2;
+ var TTY_STATE_CHARSET = 3;
+
+ function handle_char(c) {
+ var i, l, n, j, y1, y2, x1;
+
+ switch(s.state) {
+ case TTY_STATE_NORM:
+ switch(c) {
+ case 10:
+ down_with_scroll();
+ break;
+ case 13:
+ s.x = 0;
+ break;
+ case 8:
+ if (s.x > 0) {
+ s.x--;
+ }
+ break;
+ case 9: /* tab */
+ n = (s.x + 8) & ~7;
+ if (n <= s.w) {
+ s.x = n;
+ }
+ break;
+ case 27:
+ s.state = TTY_STATE_ESC;
+ break;
+ default:
+ if (c >= 32) {
+ if (s.x >= s.w) {
+ s.x = 0;
+ down_with_scroll();
+ }
+ y1 = s.y + s.y_base;
+ if (y1 >= s.cur_h)
+ y1 -= s.cur_h;
+ s.lines[y1][s.x] = (c & 0xffff) |
+ (s.cur_attr << 16);
+ s.x++;
+ update(s.y);
+ }
+ break;
+ }
+ break;
+ case TTY_STATE_ESC:
+ switch(c) {
+ case 91: // '['
+ s.esc_params = new Array();
+ s.cur_param = 0;
+ s.esc_prefix = 0;
+ s.state = TTY_STATE_CSI;
+ break;
+ case 40: // '('
+ case 41: // ')'
+ s.state = TTY_STATE_CHARSET;
+ break;
+ case 61: // '='
+ s.application_keypad = true;
+ s.state = TTY_STATE_NORM;
+ break;
+ case 62: // '>'
+ s.application_keypad = false;
+ s.state = TTY_STATE_NORM;
+ break;
+ case 77: // 'M'
+ up_with_scroll();
+ s.state = TTY_STATE_NORM;
+ break;
+ default:
+ s.state = TTY_STATE_NORM;
+ break;
+ }
+ break;
+ case TTY_STATE_CSI:
+ if (c >= 48 && c <= 57) { // '0' '9'
+ /* numeric */
+ s.cur_param = s.cur_param * 10 + c - 48;
+ } else {
+ if (c == 63) { // '?'
+ s.esc_prefix = c;
+ break;
+ }
+ /* add parsed parameter */
+ s.esc_params[s.esc_params.length] = s.cur_param;
+ s.cur_param = 0;
+ if (c == 59) // ;
+ break;
+ s.state = TTY_STATE_NORM;
+
+ // console.log("term: csi=" + s.esc_params + " cmd="+c);
+ switch(c) {
+ case 64: // '@' insert chars
+ insert_chars(s.esc_params[0]);
+ break;
+ case 65: // 'A' up
+ n = s.esc_params[0];
+ if (n < 1)
+ n = 1;
+ s.y -= n;
+ if (s.y < 0)
+ s.y = 0;
+ break;
+ case 66: // 'B' down
+ n = s.esc_params[0];
+ if (n < 1)
+ n = 1;
+ s.y += n;
+ if (s.y >= s.h)
+ s.y = s.h - 1;
+ break;
+ case 67: // 'C' right
+ n = s.esc_params[0];
+ if (n < 1)
+ n = 1;
+ s.x += n;
+ if (s.x >= s.w - 1)
+ s.x = s.w - 1;
+ break;
+ case 68: // 'D' left
+ n = s.esc_params[0];
+ if (n < 1)
+ n = 1;
+ s.x -= n;
+ if (s.x < 0)
+ s.x = 0;
+ break;
+ case 71: /* 'G' cursor character absolute */
+ x1 = s.esc_params[0] - 1;
+ if (x1 < 0)
+ x1 = 0;
+ else if (x1 >= s.w)
+ x1 = s.w - 1;
+ s.x = x1;
+ break;
+ case 72: // 'H' goto xy
+ y1 = s.esc_params[0] - 1;
+ if (s.esc_params.length >= 2)
+ x1 = s.esc_params[1] - 1;
+ else
+ x1 = 0;
+ if (y1 < 0)
+ y1 = 0;
+ else if (y1 >= s.h)
+ y1 = s.h - 1;
+ if (x1 < 0)
+ x1 = 0;
+ else if (x1 >= s.w)
+ x1 = s.w - 1;
+ s.x = x1;
+ s.y = y1;
+ break;
+ case 74: // 'J' erase in display
+ erase_in_display(s.esc_params[0]);
+ break;
+ case 75: // 'K' erase in line
+ erase_in_line(s.esc_params[0]);
+ break;
+ case 76: // 'L' insert lines
+ insert_lines(s.esc_params[0]);
+ break;
+ case 77: // 'M' insert lines
+ delete_lines(s.esc_params[0]);
+ break;
+ case 80: // 'P'
+ delete_chars(s.esc_params[0]);
+ break;
+ case 100: // 'd' line position absolute
+ {
+ y1 = s.esc_params[0] - 1;
+ if (y1 < 0)
+ y1 = 0;
+ else if (y1 >= s.h)
+ y1 = s.h - 1;
+ s.y = y1;
+ }
+ break;
+ case 104: // 'h': set mode
+ if (s.esc_prefix == 63 && s.esc_params[0] == 1) {
+ s.application_cursor = true;
+ }
+ break;
+ case 108: // 'l': reset mode
+ if (s.esc_prefix == 63 && s.esc_params[0] == 1) {
+ s.application_cursor = false;
+ }
+ break;
+ case 109: // 'm': set color
+ csi_colors(s.esc_params);
+ break;
+ case 110: // 'n' return the cursor position
+ s.queue_chars("\x1b[" + (s.y + 1) + ";" + (s.x + 1) + "R");
+ break;
+ case 114: // 'r' set scroll region
+ y1 = s.esc_params[0] - 1;
+ if (y1 < 0)
+ y1 = 0;
+ else if (y1 >= s.h)
+ y1 = s.h - 1;
+ if (s.esc_params.length >= 2)
+ y2 = s.esc_params[1];
+ else
+ y2 = s.h;
+ if (y2 >= s.h || y2 <= y1)
+ y2 = s.h;
+ s.scroll_top = y1;
+ s.scroll_bottom = y2;
+ s.x = 0;
+ s.y = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case TTY_STATE_CHARSET:
+ /* just ignore */
+ s.state = TTY_STATE_NORM;
+ break;
+ }
+ }
+
+ function handle_utf8(c) {
+ if (s.utf8_state !== 0 && (c >= 0x80 && c < 0xc0)) {
+ s.utf8_val = (s.utf8_val << 6) | (c & 0x3F);
+ s.utf8_state--;
+ if (s.utf8_state === 0) {
+ handle_char(s.utf8_val);
+ }
+ } else if (c >= 0xc0 && c < 0xf8) {
+ s.utf8_state = 1 + (c >= 0xe0) + (c >= 0xf0);
+ s.utf8_val = c & ((1 << (6 - s.utf8_state)) - 1);
+ } else {
+ s.utf8_state = 0;
+ handle_char(c);
+ }
+ }
+
+ var i, c, utf8;
+
+ /* update region is in ymin ymax */
+ s = this;
+ ymin = s.h;
+ ymax = -1;
+ update(s.y); // remove the cursor
+ /* reset top of displayed screen to top of real screen */
+ if (s.y_base != s.y_disp) {
+ s.y_disp = s.y_base;
+ /* force redraw */
+ ymin = 0;
+ ymax = s.h - 1;
+ }
+ utf8 = s.utf8;
+ for(i = 0; i < str.length; i++) {
+ c = str.charCodeAt(i);
+ if (utf8)
+ handle_utf8(c);
+ else
+ handle_char(c);
+ }
+ update(s.y); // show the cursor
+
+ if (ymax >= ymin)
+ s.refresh(ymin, ymax);
+};
+
+Term.prototype.writeln = function (str)
+{
+ this.write(str + '\r\n');
+};
+
+Term.prototype.interceptBrowserExit = function (ev)
+{
+ /* At least avoid exiting the navigator if Ctrl-Q or Ctrl-W are
+ * pressed */
+ if (ev.ctrlKey) {
+ window.onbeforeunload = function() {
+ window.onbeforeunload = null;
+ return "CTRL-W or Ctrl-Q cannot be sent to the emulator.";
+ };
+ } else {
+ window.onbeforeunload = null;
+ }
+}
+
+Term.prototype.keyDownHandler = function (ev)
+{
+ var str;
+
+ this.interceptBrowserExit(ev);
+
+ str="";
+ switch(ev.keyCode) {
+ case 8: /* backspace */
+ str = "\x7f";
+ break;
+ case 9: /* tab */
+ str = "\x09";
+ break;
+ case 13: /* enter */
+ str = "\x0d";
+ break;
+ case 27: /* escape */
+ str = "\x1b";
+ break;
+ case 37: /* left */
+ if (ev.ctrlKey) {
+ str = "\x1b[1;5D";
+ } else if (this.application_cursor) {
+ str = "\x1bOD";
+ } else {
+ str = "\x1b[D";
+ }
+ break;
+ case 39: /* right */
+ if (ev.ctrlKey) {
+ str = "\x1b[1;5C";
+ } else if (this.application_cursor) {
+ str = "\x1bOC";
+ } else {
+ str = "\x1b[C";
+ }
+ break;
+ case 38: /* up */
+ if (ev.ctrlKey) {
+ this.scroll_disp(-1);
+ } else if (this.application_cursor) {
+ str = "\x1bOA";
+ } else {
+ str = "\x1b[A";
+ }
+ break;
+ case 40: /* down */
+ if (ev.ctrlKey) {
+ this.scroll_disp(1);
+ } else if (this.application_cursor) {
+ str = "\x1bOB";
+ } else {
+ str = "\x1b[B";
+ }
+ break;
+ case 46: /* delete */
+ str = "\x1b[3~";
+ break;
+ case 45: /* insert */
+ str = "\x1b[2~";
+ break;
+ case 36: /* home */
+ if (this.linux_console)
+ str = "\x1b[1~";
+ else if (this.application_keypad)
+ str = "\x1bOH";
+ else
+ str = "\x1b[H";
+ break;
+ case 35: /* end */
+ if (this.linux_console)
+ str = "\x1b[4~";
+ else if (this.application_keypad)
+ str = "\x1bOF";
+ else
+ str = "\x1b[F";
+ break;
+ case 33: /* page up */
+ if (ev.ctrlKey) {
+ this.scroll_disp(-(this.h - 1));
+ } else {
+ str = "\x1b[5~";
+ }
+ break;
+ case 34: /* page down */
+ if (ev.ctrlKey) {
+ this.scroll_disp(this.h - 1);
+ } else {
+ str = "\x1b[6~";
+ }
+ break;
+ default:
+ if (ev.ctrlKey) {
+ /* ctrl + key */
+ if (ev.keyCode >= 65 && ev.keyCode <= 90) {
+ str = String.fromCharCode(ev.keyCode - 64);
+ } else if (ev.keyCode == 32) {
+ str = String.fromCharCode(0);
+ }
+ } else if ((!this.is_mac && ev.altKey) ||
+ (this.is_mac && ev.metaKey)) {
+ /* meta + key (Note: we only send lower case) */
+ if (ev.keyCode >= 65 && ev.keyCode <= 90) {
+ str = "\x1b" + String.fromCharCode(ev.keyCode + 32);
+ }
+ }
+ break;
+ }
+ // console.log("keydown: keycode=" + ev.keyCode + " charcode=" + ev.charCode + " str=" + str + " ctrl=" + ev.ctrlKey + " alt=" + ev.altKey + " meta=" + ev.metaKey);
+ if (str) {
+ if (ev.stopPropagation)
+ ev.stopPropagation();
+ if (ev.preventDefault)
+ ev.preventDefault();
+
+ this.show_cursor();
+ this.key_rep_state = 1;
+ this.key_rep_str = str;
+ this.handler(str);
+ return false;
+ } else {
+ this.key_rep_state = 0;
+ return true;
+ }
+};
+
+Term.prototype.keyUpHandler = function (ev)
+{
+ this.interceptBrowserExit(ev);
+};
+
+Term.prototype.to_utf8 = function(s)
+{
+ var i, n = s.length, r, c;
+ r = "";
+ for(i = 0; i < n; i++) {
+ c = s.charCodeAt(i);
+ if (c < 0x80) {
+ r += String.fromCharCode(c);
+ } else if (c < 0x800) {
+ r += String.fromCharCode((c >> 6) | 0xc0, (c & 0x3f) | 0x80);
+ } else if (c < 0x10000) {
+ r += String.fromCharCode((c >> 12) | 0xe0,
+ ((c >> 6) & 0x3f) | 0x80,
+ (c & 0x3f) | 0x80);
+ } else {
+ r += String.fromCharCode((c >> 18) | 0xf0,
+ ((c >> 12) & 0x3f) | 0x80,
+ ((c >> 6) & 0x3f) | 0x80,
+ (c & 0x3f) | 0x80);
+ }
+ }
+ return r;
+}
+
+Term.prototype.keyPressHandler = function (ev)
+{
+ var str, char_code;
+
+ if (ev.stopPropagation)
+ ev.stopPropagation();
+ if (ev.preventDefault)
+ ev.preventDefault();
+
+ str="";
+ if (!("charCode" in ev)) {
+ /* on Opera charCode is not defined and keypress is sent for
+ system keys. Moreover, only keupress is repeated which is a
+ problem for system keys. */
+ char_code = ev.keyCode;
+ if (this.key_rep_state == 1) {
+ this.key_rep_state = 2;
+ return false;
+ } else if (this.key_rep_state == 2) {
+ /* repetition */
+ this.show_cursor();
+ this.handler(this.key_rep_str);
+ return false;
+ }
+ } else {
+ char_code = ev.charCode;
+ }
+ if (char_code != 0) {
+ if (!ev.ctrlKey &&
+ ((!this.is_mac && !ev.altKey) ||
+ (this.is_mac && !ev.metaKey))) {
+ str = String.fromCharCode(char_code);
+ }
+ }
+ // console.log("keypress: keycode=" + ev.keyCode + " charcode=" + ev.charCode + " str=" + str + " ctrl=" + ev.ctrlKey + " alt=" + ev.altKey + " meta=" + ev.metaKey);
+ if (str) {
+ this.show_cursor();
+ if (this.utf8)
+ str = this.to_utf8(str);
+ this.handler(str);
+ return false;
+ } else {
+ return true;
+ }
+};
+
+Term.prototype.blurHandler = function (ev)
+{
+ /* allow unloading the page */
+ window.onbeforeunload = null;
+};
+
+Term.prototype.wheelHandler = function (ev)
+{
+ if (ev.deltaY < 0)
+ this.scroll_disp(-3);
+ else if (ev.deltaY > 0)
+ this.scroll_disp(3);
+ ev.stopPropagation();
+}
+
+Term.prototype.mouseDownHandler = function (ev)
+{
+ this.thumb_el.onmouseup = this.mouseUpHandler.bind(this);
+ document.onmousemove = this.mouseMoveHandler.bind(this);
+ document.onmouseup = this.mouseUpHandler.bind(this);
+
+ /* disable potential selection */
+ document.body.className += " noSelect";
+
+ this.mouseMoveHandler(ev);
+}
+
+Term.prototype.mouseMoveHandler = function (ev)
+{
+ var total_size, pos, new_y_disp, y, y0;
+ total_size = this.term_el.clientHeight;
+ y = ev.clientY - this.track_el.getBoundingClientRect().top;
+ pos = Math.floor((y - (this.thumb_size / 2)) * this.cur_h / total_size);
+ new_y_disp = Math.min(Math.max(pos, 0), this.cur_h - this.h);
+ /* position of the first line of the scroll back buffer */
+ y0 = (this.y_base + this.h) % this.cur_h;
+ new_y_disp += y0;
+ if (new_y_disp >= this.cur_h)
+ new_y_disp -= this.cur_h;
+ if (new_y_disp != this.y_disp) {
+ this.y_disp = new_y_disp;
+ this.refresh(0, this.h - 1);
+ }
+}
+
+Term.prototype.mouseUpHandler = function (ev)
+{
+ this.thumb_el.onmouseup = null;
+ document.onmouseup = null;
+ document.onmousemove = null;
+ document.body.className = document.body.className.replace(" noSelect", "");
+}
+
+Term.prototype.pasteHandler = function (ev)
+{
+ var c = ev.clipboardData, str;
+ if (c) {
+ str = c.getData("text/plain");
+ if (this.utf8)
+ str = this.to_utf8(str);
+ this.queue_chars(str);
+ setTimeout(this.textAreaReset.bind(this), 10);
+ return false;
+ }
+}
+
+Term.prototype.textAreaReset = function(ev)
+{
+ /* reset text */
+ this.textarea_el.value = "Paste Here";
+}
+
+/* output queue to send back asynchronous responses */
+Term.prototype.queue_chars = function (str)
+{
+ this.output_queue += str;
+ if (this.output_queue)
+ setTimeout(this.outputHandler.bind(this), 0);
+};
+
+Term.prototype.outputHandler = function ()
+{
+ if (this.output_queue) {
+ this.handler(this.output_queue);
+ this.output_queue = "";
+ }
+};
+
+Term.prototype.getSize = function ()
+{
+ return [this.w, this.h];
+};
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/Changelog b/jslinux-2019-12-21/tinyemu-2019-12-21/Changelog
new file mode 100644
index 0000000..540a05f
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/Changelog
@@ -0,0 +1,45 @@
+2019-12-21:
+
+- added complete JSLinux demo
+- RISC-V: added initrd support
+- RISC-V: fixed FMIN/FMAX instructions
+
+2018-09-23:
+
+- added support for separate RISC-V BIOS and kernel
+
+2018-09-15:
+
+- renamed to TinyEMU (temu)
+- single executable for all emulated machines
+
+2018-08-29:
+
+- compilation fixes
+
+2017-08-06:
+
+- added JSON configuration file
+- added graphical display with SDL
+- added VirtIO input support
+- added PCI bus and VirtIO PCI support
+- x86: added IDE, PS/2, vmmouse and VGA devices
+- added user mode network interface
+
+2017-06-10:
+
+- RISCV: avoid unnecessary kernel patches
+- x86: accept standard kernel images
+
+2017-05-25:
+
+- RISCV: faster emulation (1.4x)
+- Support of user level ISA version 2.2 and priviledged architecture
+ version 1.10
+- added small x86 emulator (x86emu) based on KVM
+- modified the fs_net network protocol to match the vfsync protocol
+- handle console resize
+- JS emulator:
+ - added scrollbar in terminal
+ - added file import and export
+ - added copy/paste support
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/MIT-LICENSE.txt b/jslinux-2019-12-21/tinyemu-2019-12-21/MIT-LICENSE.txt
new file mode 100644
index 0000000..3f38cbe
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/MIT-LICENSE.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2016-2017 Fabrice Bellard
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile
new file mode 100644
index 0000000..390ae37
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile
@@ -0,0 +1,135 @@
+#
+# TinyEMU
+#
+# Copyright (c) 2016-2018 Fabrice Bellard
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+# if set, network filesystem is enabled. libcurl and libcrypto
+# (openssl) must be installed.
+CONFIG_FS_NET=y
+# SDL support (optional)
+CONFIG_SDL=y
+# if set, compile the 128 bit emulator. Note: the 128 bit target does
+# not compile if gcc does not support the int128 type (32 bit hosts).
+CONFIG_INT128=y
+# build x86 emulator
+CONFIG_X86EMU=y
+# win32 build (not usable yet)
+#CONFIG_WIN32=y
+# user space network redirector
+CONFIG_SLIRP=y
+
+ifdef CONFIG_WIN32
+CROSS_PREFIX=i686-w64-mingw32-
+EXE=.exe
+else
+CROSS_PREFIX=
+EXE=
+endif
+CC=$(CROSS_PREFIX)gcc
+STRIP=$(CROSS_PREFIX)strip
+CFLAGS=-O2 -Wall -g -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD
+CFLAGS+=-D_GNU_SOURCE -DCONFIG_VERSION=\"$(shell cat VERSION)\"
+LDFLAGS=
+
+bindir=/usr/local/bin
+INSTALL=install
+
+PROGS+= temu$(EXE)
+ifndef CONFIG_WIN32
+ifdef CONFIG_FS_NET
+PROGS+=build_filelist splitimg
+endif
+endif
+
+all: $(PROGS)
+
+EMU_OBJS:=virtio.o pci.o fs.o cutils.o iomem.o simplefb.o \
+ json.o machine.o temu.o
+
+ifdef CONFIG_SLIRP
+CFLAGS+=-DCONFIG_SLIRP
+EMU_OBJS+=$(addprefix slirp/, bootp.o ip_icmp.o mbuf.o slirp.o tcp_output.o cksum.o ip_input.o misc.o socket.o tcp_subr.o udp.o if.o ip_output.o sbuf.o tcp_input.o tcp_timer.o)
+endif
+
+ifndef CONFIG_WIN32
+EMU_OBJS+=fs_disk.o
+EMU_LIBS=-lrt
+endif
+ifdef CONFIG_FS_NET
+CFLAGS+=-DCONFIG_FS_NET
+EMU_OBJS+=fs_net.o fs_wget.o fs_utils.o block_net.o
+EMU_LIBS+=-lcurl -lcrypto
+ifdef CONFIG_WIN32
+EMU_LIBS+=-lwsock32
+endif # CONFIG_WIN32
+endif # CONFIG_FS_NET
+ifdef CONFIG_SDL
+EMU_LIBS+=-lSDL
+EMU_OBJS+=sdl.o
+CFLAGS+=-DCONFIG_SDL
+ifdef CONFIG_WIN32
+LDFLAGS+=-mwindows
+endif
+endif
+
+EMU_OBJS+=riscv_machine.o softfp.o riscv_cpu32.o riscv_cpu64.o
+ifdef CONFIG_INT128
+CFLAGS+=-DCONFIG_RISCV_MAX_XLEN=128
+EMU_OBJS+=riscv_cpu128.o
+else
+CFLAGS+=-DCONFIG_RISCV_MAX_XLEN=64
+endif
+ifdef CONFIG_X86EMU
+CFLAGS+=-DCONFIG_X86EMU
+EMU_OBJS+=x86_cpu.o x86_machine.o ide.o ps2.o vmmouse.o pckbd.o vga.o
+endif
+
+temu$(EXE): $(EMU_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $^ $(EMU_LIBS)
+
+riscv_cpu32.o: riscv_cpu.c
+ $(CC) $(CFLAGS) -DMAX_XLEN=32 -c -o $@ $<
+
+riscv_cpu64.o: riscv_cpu.c
+ $(CC) $(CFLAGS) -DMAX_XLEN=64 -c -o $@ $<
+
+riscv_cpu128.o: riscv_cpu.c
+ $(CC) $(CFLAGS) -DMAX_XLEN=128 -c -o $@ $<
+
+build_filelist: build_filelist.o fs_utils.o cutils.o
+ $(CC) $(LDFLAGS) -o $@ $^ -lm
+
+splitimg: splitimg.o
+ $(CC) $(LDFLAGS) -o $@ $^
+
+install: $(PROGS)
+ $(STRIP) $(PROGS)
+ $(INSTALL) -m755 $(PROGS) "$(DESTDIR)$(bindir)"
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+clean:
+ rm -f *.o *.d *~ $(PROGS) slirp/*.o slirp/*.d slirp/*~
+
+-include $(wildcard *.d)
+-include $(wildcard slirp/*.d)
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile.js b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile.js
new file mode 100644
index 0000000..3d76f77
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile.js
@@ -0,0 +1,65 @@
+#
+# TinyEMU emulator
+#
+# Copyright (c) 2016-2018 Fabrice Bellard
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+# Build the Javascript version of TinyEMU
+EMCC=emcc
+EMCFLAGS=-O2 --llvm-opts 2 -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -fno-strict-aliasing -DCONFIG_FS_NET
+#EMCFLAGS+=-Werror
+EMLDFLAGS=-O3 --memory-init-file 0 --closure 0 -s NO_EXIT_RUNTIME=1 -s NO_FILESYSTEM=1 -s "EXPORTED_FUNCTIONS=['_console_queue_char','_vm_start','_fs_import_file','_display_key_event','_display_mouse_event','_display_wheel_event','_net_write_packet','_net_set_carrier']" -s 'EXTRA_EXPORTED_RUNTIME_METHODS=["ccall", "cwrap"]' -s BINARYEN_TRAP_MODE=clamp --js-library js/lib.js
+EMLDFLAGS_ASMJS:=$(EMLDFLAGS) -s WASM=0
+EMLDFLAGS_WASM:=$(EMLDFLAGS) -s WASM=1 -s TOTAL_MEMORY=67108864 -s ALLOW_MEMORY_GROWTH=1
+
+PROGS=js/riscvemu32.js js/riscvemu32-wasm.js js/riscvemu64.js js/riscvemu64-wasm.js
+
+all: $(PROGS)
+
+JS_OBJS=jsemu.js.o softfp.js.o virtio.js.o fs.js.o fs_net.js.o fs_wget.js.o fs_utils.js.o simplefb.js.o pci.js.o json.js.o block_net.js.o
+JS_OBJS+=iomem.js.o cutils.js.o aes.js.o sha256.js.o
+
+RISCVEMU64_OBJS=$(JS_OBJS) riscv_cpu64.js.o riscv_machine.js.o machine.js.o
+RISCVEMU32_OBJS=$(JS_OBJS) riscv_cpu32.js.o riscv_machine.js.o machine.js.o
+
+js/riscvemu64.js: $(RISCVEMU64_OBJS) js/lib.js
+ $(EMCC) $(EMLDFLAGS_ASMJS) -o $@ $(RISCVEMU64_OBJS)
+
+js/riscvemu32.js: $(RISCVEMU32_OBJS) js/lib.js
+ $(EMCC) $(EMLDFLAGS_ASMJS) -o $@ $(RISCVEMU32_OBJS)
+
+js/riscvemu64-wasm.js: $(RISCVEMU64_OBJS) js/lib.js
+ $(EMCC) $(EMLDFLAGS_WASM) -o $@ $(RISCVEMU64_OBJS)
+
+js/riscvemu32-wasm.js: $(RISCVEMU32_OBJS) js/lib.js
+ $(EMCC) $(EMLDFLAGS_WASM) -o $@ $(RISCVEMU32_OBJS)
+
+riscv_cpu32.js.o: riscv_cpu.c
+ $(EMCC) $(EMCFLAGS) -DMAX_XLEN=32 -DCONFIG_RISCV_MAX_XLEN=32 -c -o $@ $<
+
+riscv_cpu64.js.o: riscv_cpu.c
+ $(EMCC) $(EMCFLAGS) -DMAX_XLEN=64 -DCONFIG_RISCV_MAX_XLEN=64 -c -o $@ $<
+
+
+%.js.o: %.c
+ $(EMCC) $(EMCFLAGS) -c -o $@ $<
+
+-include $(wildcard *.d)
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/VERSION b/jslinux-2019-12-21/tinyemu-2019-12-21/VERSION
new file mode 100644
index 0000000..bd16728
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/VERSION
@@ -0,0 +1 @@
+2019-12-21
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/aes.c b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.c
new file mode 100644
index 0000000..ac8af6d
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.c
@@ -0,0 +1,1321 @@
+/**
+ *
+ * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project.
+ */
+/*
+ * rijndael-alg-fst.c
+ *
+ * @version 3.0 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <string.h>
+#include <inttypes.h>
+#include "aes.h"
+
+#ifndef NDEBUG
+#define NDEBUG
+#endif
+
+#include <assert.h>
+
+typedef uint32_t u32;
+typedef uint16_t u16;
+typedef uint8_t u8;
+
+#define MAXKC (256/32)
+#define MAXKB (256/8)
+#define MAXNR 14
+
+/* This controls loop-unrolling in aes_core.c */
+#undef FULL_UNROLL
+# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3]))
+# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); }
+
+/*
+Te0[x] = S [x].[02, 01, 01, 03];
+Te1[x] = S [x].[03, 02, 01, 01];
+Te2[x] = S [x].[01, 03, 02, 01];
+Te3[x] = S [x].[01, 01, 03, 02];
+Te4[x] = S [x].[01, 01, 01, 01];
+
+Td0[x] = Si[x].[0e, 09, 0d, 0b];
+Td1[x] = Si[x].[0b, 0e, 09, 0d];
+Td2[x] = Si[x].[0d, 0b, 0e, 09];
+Td3[x] = Si[x].[09, 0d, 0b, 0e];
+Td4[x] = Si[x].[01, 01, 01, 01];
+*/
+
+static const u32 Te0[256] = {
+ 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
+ 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
+ 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
+ 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
+ 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
+ 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
+ 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
+ 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
+ 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
+ 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
+ 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
+ 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
+ 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
+ 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
+ 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
+ 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
+ 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
+ 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
+ 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
+ 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
+ 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
+ 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
+ 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
+ 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
+ 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
+ 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
+ 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
+ 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
+ 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
+ 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
+ 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
+ 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
+ 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
+ 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
+ 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
+ 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
+ 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
+ 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
+ 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
+ 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
+ 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
+ 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
+ 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
+ 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
+ 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
+ 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
+ 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
+ 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
+ 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
+ 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
+ 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
+ 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
+ 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
+ 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
+ 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
+ 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
+ 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
+ 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
+ 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
+ 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
+ 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
+ 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
+ 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
+ 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
+};
+static const u32 Te1[256] = {
+ 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
+ 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
+ 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
+ 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
+ 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
+ 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
+ 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
+ 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
+ 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
+ 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
+ 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
+ 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
+ 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
+ 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
+ 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
+ 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
+ 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
+ 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
+ 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
+ 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
+ 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
+ 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
+ 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
+ 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
+ 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
+ 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
+ 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
+ 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
+ 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
+ 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
+ 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
+ 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
+ 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
+ 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
+ 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
+ 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
+ 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
+ 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
+ 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
+ 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
+ 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
+ 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
+ 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
+ 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
+ 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
+ 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
+ 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
+ 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
+ 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
+ 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
+ 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
+ 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
+ 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
+ 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
+ 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
+ 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
+ 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
+ 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
+ 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
+ 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
+ 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
+ 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
+ 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
+ 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
+};
+static const u32 Te2[256] = {
+ 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
+ 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
+ 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
+ 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
+ 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
+ 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
+ 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
+ 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
+ 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
+ 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
+ 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
+ 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
+ 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
+ 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
+ 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
+ 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
+ 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
+ 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
+ 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
+ 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
+ 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
+ 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
+ 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
+ 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
+ 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
+ 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
+ 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
+ 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
+ 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
+ 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
+ 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
+ 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
+ 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
+ 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
+ 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
+ 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
+ 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
+ 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
+ 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
+ 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
+ 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
+ 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
+ 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
+ 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
+ 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
+ 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
+ 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
+ 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
+ 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
+ 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
+ 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
+ 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
+ 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
+ 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
+ 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
+ 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
+ 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
+ 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
+ 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
+ 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
+ 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
+ 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
+ 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
+ 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
+};
+static const u32 Te3[256] = {
+
+ 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
+ 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
+ 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
+ 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
+ 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
+ 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
+ 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
+ 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
+ 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
+ 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
+ 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
+ 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
+ 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
+ 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
+ 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
+ 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
+ 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
+ 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
+ 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
+ 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
+ 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
+ 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
+ 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
+ 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
+ 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
+ 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
+ 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
+ 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
+ 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
+ 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
+ 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
+ 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
+ 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
+ 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
+ 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
+ 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
+ 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
+ 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
+ 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
+ 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
+ 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
+ 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
+ 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
+ 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
+ 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
+ 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
+ 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
+ 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
+ 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
+ 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
+ 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
+ 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
+ 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
+ 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
+ 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
+ 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
+ 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
+ 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
+ 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
+ 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
+ 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
+ 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
+ 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
+ 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
+};
+static const u32 Te4[256] = {
+ 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
+ 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
+ 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
+ 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
+ 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
+ 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
+ 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
+ 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
+ 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
+ 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
+ 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
+ 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
+ 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
+ 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
+ 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
+ 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
+ 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
+ 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
+ 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
+ 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
+ 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
+ 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
+ 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
+ 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
+ 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
+ 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
+ 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
+ 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
+ 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
+ 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
+ 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
+ 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
+ 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
+ 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
+ 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
+ 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
+ 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
+ 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
+ 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
+ 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
+ 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
+ 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
+ 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
+ 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
+ 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
+ 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
+ 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
+ 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
+ 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
+ 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
+ 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
+ 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
+ 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
+ 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
+ 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
+ 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
+ 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
+ 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
+ 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
+ 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
+ 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
+ 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
+ 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
+ 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
+};
+static const u32 Td0[256] = {
+ 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
+ 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
+ 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
+ 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
+ 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
+ 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
+ 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
+ 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
+ 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
+ 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
+ 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
+ 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
+ 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
+ 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
+ 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
+ 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
+ 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
+ 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
+ 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
+ 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
+ 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
+ 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
+ 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
+ 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
+ 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
+ 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
+ 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
+ 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
+ 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
+ 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
+ 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
+ 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
+ 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
+ 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
+ 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
+ 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
+ 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
+ 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
+ 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
+ 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
+ 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
+ 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
+ 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
+ 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
+ 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
+ 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
+ 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
+ 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
+ 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
+ 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
+ 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
+ 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
+ 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
+ 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
+ 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
+ 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
+ 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
+ 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
+ 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
+ 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
+ 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
+ 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
+ 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
+ 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
+};
+static const u32 Td1[256] = {
+ 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
+ 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
+ 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
+ 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
+ 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
+ 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
+ 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
+ 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
+ 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
+ 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
+ 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
+ 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
+ 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
+ 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
+ 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
+ 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
+ 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
+ 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
+ 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
+ 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
+ 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
+ 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
+ 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
+ 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
+ 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
+ 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
+ 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
+ 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
+ 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
+ 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
+ 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
+ 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
+ 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
+ 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
+ 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
+ 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
+ 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
+ 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
+ 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
+ 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
+ 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
+ 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
+ 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
+ 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
+ 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
+ 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
+ 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
+ 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
+ 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
+ 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
+ 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
+ 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
+ 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
+ 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
+ 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
+ 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
+ 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
+ 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
+ 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
+ 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
+ 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
+ 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
+ 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
+ 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
+};
+static const u32 Td2[256] = {
+ 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
+ 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
+ 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
+ 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
+ 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
+ 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
+ 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
+ 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
+ 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
+ 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
+ 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
+ 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
+ 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
+ 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
+ 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
+ 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
+ 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
+ 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
+ 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
+ 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
+
+ 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
+ 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
+ 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
+ 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
+ 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
+ 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
+ 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
+ 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
+ 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
+ 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
+ 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
+ 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
+ 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
+ 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
+ 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
+ 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
+ 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
+ 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
+ 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
+ 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
+ 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
+ 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
+ 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
+ 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
+ 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
+ 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
+ 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
+ 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
+ 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
+ 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
+ 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
+ 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
+ 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
+ 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
+ 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
+ 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
+ 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
+ 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
+ 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
+ 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
+ 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
+ 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
+ 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
+ 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
+};
+static const u32 Td3[256] = {
+ 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
+ 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
+ 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
+ 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
+ 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
+ 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
+ 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
+ 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
+ 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
+ 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
+ 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
+ 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
+ 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
+ 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
+ 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
+ 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
+ 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
+ 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
+ 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
+ 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
+ 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
+ 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
+ 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
+ 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
+ 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
+ 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
+ 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
+ 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
+ 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
+ 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
+ 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
+ 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
+ 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
+ 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
+ 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
+ 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
+ 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
+ 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
+ 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
+ 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
+ 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
+ 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
+ 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
+ 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
+ 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
+ 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
+ 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
+ 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
+ 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
+ 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
+ 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
+ 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
+ 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
+ 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
+ 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
+ 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
+ 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
+ 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
+ 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
+ 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
+ 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
+ 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
+ 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
+ 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
+};
+static const u32 Td4[256] = {
+ 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
+ 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
+ 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
+ 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
+ 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
+ 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
+ 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
+ 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
+ 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
+ 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
+ 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
+ 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
+ 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
+ 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
+ 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
+ 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
+ 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
+ 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
+ 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
+ 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
+ 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
+ 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
+ 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
+ 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
+ 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
+ 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
+ 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
+ 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
+ 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
+ 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
+ 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
+ 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
+ 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
+ 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
+ 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
+ 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
+ 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
+ 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
+ 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
+ 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
+ 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
+ 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
+ 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
+ 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
+ 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
+ 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
+ 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
+ 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
+ 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
+ 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
+ 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
+ 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
+ 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
+ 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
+ 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
+ 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
+ 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
+ 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
+ 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
+ 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
+ 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
+ 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
+ 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
+ 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
+};
+static const u32 rcon[] = {
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
+};
+
+/**
+ * Expand the cipher key into the encryption key schedule.
+ */
+int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key) {
+
+ u32 *rk;
+ int i = 0;
+ u32 temp;
+
+ if (!userKey || !key)
+ return -1;
+ if (bits != 128 && bits != 192 && bits != 256)
+ return -2;
+
+ rk = key->rd_key;
+
+ if (bits==128)
+ key->rounds = 10;
+ else if (bits==192)
+ key->rounds = 12;
+ else
+ key->rounds = 14;
+
+ rk[0] = GETU32(userKey );
+ rk[1] = GETU32(userKey + 4);
+ rk[2] = GETU32(userKey + 8);
+ rk[3] = GETU32(userKey + 12);
+ if (bits == 128) {
+ while (1) {
+ temp = rk[3];
+ rk[4] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp ) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24) ] & 0x000000ff) ^
+ rcon[i];
+ rk[5] = rk[1] ^ rk[4];
+ rk[6] = rk[2] ^ rk[5];
+ rk[7] = rk[3] ^ rk[6];
+ if (++i == 10) {
+ return 0;
+ }
+ rk += 4;
+ }
+ }
+ rk[4] = GETU32(userKey + 16);
+ rk[5] = GETU32(userKey + 20);
+ if (bits == 192) {
+ while (1) {
+ temp = rk[ 5];
+ rk[ 6] = rk[ 0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp ) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24) ] & 0x000000ff) ^
+ rcon[i];
+ rk[ 7] = rk[ 1] ^ rk[ 6];
+ rk[ 8] = rk[ 2] ^ rk[ 7];
+ rk[ 9] = rk[ 3] ^ rk[ 8];
+ if (++i == 8) {
+ return 0;
+ }
+ rk[10] = rk[ 4] ^ rk[ 9];
+ rk[11] = rk[ 5] ^ rk[10];
+ rk += 6;
+ }
+ }
+ rk[6] = GETU32(userKey + 24);
+ rk[7] = GETU32(userKey + 28);
+ if (bits == 256) {
+ while (1) {
+ temp = rk[ 7];
+ rk[ 8] = rk[ 0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp ) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24) ] & 0x000000ff) ^
+ rcon[i];
+ rk[ 9] = rk[ 1] ^ rk[ 8];
+ rk[10] = rk[ 2] ^ rk[ 9];
+ rk[11] = rk[ 3] ^ rk[10];
+ if (++i == 7) {
+ return 0;
+ }
+ temp = rk[11];
+ rk[12] = rk[ 4] ^
+ (Te4[(temp >> 24) ] & 0xff000000) ^
+ (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp ) & 0xff] & 0x000000ff);
+ rk[13] = rk[ 5] ^ rk[12];
+ rk[14] = rk[ 6] ^ rk[13];
+ rk[15] = rk[ 7] ^ rk[14];
+
+ rk += 8;
+ }
+ }
+ return 0;
+}
+
+/**
+ * Expand the cipher key into the decryption key schedule.
+ */
+int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key) {
+
+ u32 *rk;
+ int i, j, status;
+ u32 temp;
+
+ /* first, start with an encryption schedule */
+ status = AES_set_encrypt_key(userKey, bits, key);
+ if (status < 0)
+ return status;
+
+ rk = key->rd_key;
+
+ /* invert the order of the round keys: */
+ for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
+ temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp;
+ temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
+ temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
+ temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
+ }
+ /* apply the inverse MixColumn transform to all round keys but the first and the last: */
+ for (i = 1; i < (key->rounds); i++) {
+ rk += 4;
+ rk[0] =
+ Td0[Te4[(rk[0] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[0] ) & 0xff] & 0xff];
+ rk[1] =
+ Td0[Te4[(rk[1] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[1] ) & 0xff] & 0xff];
+ rk[2] =
+ Td0[Te4[(rk[2] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[2] ) & 0xff] & 0xff];
+ rk[3] =
+ Td0[Te4[(rk[3] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[3] ) & 0xff] & 0xff];
+ }
+ return 0;
+}
+
+#ifndef AES_ASM
+/*
+ * Encrypt a single block
+ * in and out can overlap
+ */
+void AES_encrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key) {
+
+ const u32 *rk;
+ u32 s0, s1, s2, s3, t0, t1, t2, t3;
+#ifndef FULL_UNROLL
+ int r;
+#endif /* ?FULL_UNROLL */
+
+ assert(in && out && key);
+ rk = key->rd_key;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32(in ) ^ rk[0];
+ s1 = GETU32(in + 4) ^ rk[1];
+ s2 = GETU32(in + 8) ^ rk[2];
+ s3 = GETU32(in + 12) ^ rk[3];
+#ifdef FULL_UNROLL
+ /* round 1: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
+ /* round 2: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
+ /* round 3: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
+ /* round 4: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
+ /* round 5: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
+ /* round 6: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
+ /* round 7: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
+ /* round 8: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
+ /* round 9: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
+ if (key->rounds > 10) {
+ /* round 10: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
+ /* round 11: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
+ if (key->rounds > 12) {
+ /* round 12: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
+ /* round 13: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
+ }
+ }
+ rk += key->rounds << 2;
+#else /* !FULL_UNROLL */
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = key->rounds >> 1;
+ for (;;) {
+ t0 =
+ Te0[(s0 >> 24) ] ^
+ Te1[(s1 >> 16) & 0xff] ^
+ Te2[(s2 >> 8) & 0xff] ^
+ Te3[(s3 ) & 0xff] ^
+ rk[4];
+ t1 =
+ Te0[(s1 >> 24) ] ^
+ Te1[(s2 >> 16) & 0xff] ^
+ Te2[(s3 >> 8) & 0xff] ^
+ Te3[(s0 ) & 0xff] ^
+ rk[5];
+ t2 =
+ Te0[(s2 >> 24) ] ^
+ Te1[(s3 >> 16) & 0xff] ^
+ Te2[(s0 >> 8) & 0xff] ^
+ Te3[(s1 ) & 0xff] ^
+ rk[6];
+ t3 =
+ Te0[(s3 >> 24) ] ^
+ Te1[(s0 >> 16) & 0xff] ^
+ Te2[(s1 >> 8) & 0xff] ^
+ Te3[(s2 ) & 0xff] ^
+ rk[7];
+
+ rk += 8;
+ if (--r == 0) {
+ break;
+ }
+
+ s0 =
+ Te0[(t0 >> 24) ] ^
+ Te1[(t1 >> 16) & 0xff] ^
+ Te2[(t2 >> 8) & 0xff] ^
+ Te3[(t3 ) & 0xff] ^
+ rk[0];
+ s1 =
+ Te0[(t1 >> 24) ] ^
+ Te1[(t2 >> 16) & 0xff] ^
+ Te2[(t3 >> 8) & 0xff] ^
+ Te3[(t0 ) & 0xff] ^
+ rk[1];
+ s2 =
+ Te0[(t2 >> 24) ] ^
+ Te1[(t3 >> 16) & 0xff] ^
+ Te2[(t0 >> 8) & 0xff] ^
+ Te3[(t1 ) & 0xff] ^
+ rk[2];
+ s3 =
+ Te0[(t3 >> 24) ] ^
+ Te1[(t0 >> 16) & 0xff] ^
+ Te2[(t1 >> 8) & 0xff] ^
+ Te3[(t2 ) & 0xff] ^
+ rk[3];
+ }
+#endif /* ?FULL_UNROLL */
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Te4[(t0 >> 24) ] & 0xff000000) ^
+ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t3 ) & 0xff] & 0x000000ff) ^
+ rk[0];
+ PUTU32(out , s0);
+ s1 =
+ (Te4[(t1 >> 24) ] & 0xff000000) ^
+ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t0 ) & 0xff] & 0x000000ff) ^
+ rk[1];
+ PUTU32(out + 4, s1);
+ s2 =
+ (Te4[(t2 >> 24) ] & 0xff000000) ^
+ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t1 ) & 0xff] & 0x000000ff) ^
+ rk[2];
+ PUTU32(out + 8, s2);
+ s3 =
+ (Te4[(t3 >> 24) ] & 0xff000000) ^
+ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t2 ) & 0xff] & 0x000000ff) ^
+ rk[3];
+ PUTU32(out + 12, s3);
+}
+
+/*
+ * Decrypt a single block
+ * in and out can overlap
+ */
+void AES_decrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key) {
+
+ const u32 *rk;
+ u32 s0, s1, s2, s3, t0, t1, t2, t3;
+#ifndef FULL_UNROLL
+ int r;
+#endif /* ?FULL_UNROLL */
+
+ assert(in && out && key);
+ rk = key->rd_key;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32(in ) ^ rk[0];
+ s1 = GETU32(in + 4) ^ rk[1];
+ s2 = GETU32(in + 8) ^ rk[2];
+ s3 = GETU32(in + 12) ^ rk[3];
+#ifdef FULL_UNROLL
+ /* round 1: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
+ /* round 2: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
+ /* round 3: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
+ /* round 4: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
+ /* round 5: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
+ /* round 6: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
+ /* round 7: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
+ /* round 8: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
+ /* round 9: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
+ if (key->rounds > 10) {
+ /* round 10: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
+ /* round 11: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
+ if (key->rounds > 12) {
+ /* round 12: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
+ /* round 13: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
+ }
+ }
+ rk += key->rounds << 2;
+#else /* !FULL_UNROLL */
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = key->rounds >> 1;
+ for (;;) {
+ t0 =
+ Td0[(s0 >> 24) ] ^
+ Td1[(s3 >> 16) & 0xff] ^
+ Td2[(s2 >> 8) & 0xff] ^
+ Td3[(s1 ) & 0xff] ^
+ rk[4];
+ t1 =
+ Td0[(s1 >> 24) ] ^
+ Td1[(s0 >> 16) & 0xff] ^
+ Td2[(s3 >> 8) & 0xff] ^
+ Td3[(s2 ) & 0xff] ^
+ rk[5];
+ t2 =
+ Td0[(s2 >> 24) ] ^
+ Td1[(s1 >> 16) & 0xff] ^
+ Td2[(s0 >> 8) & 0xff] ^
+ Td3[(s3 ) & 0xff] ^
+ rk[6];
+ t3 =
+ Td0[(s3 >> 24) ] ^
+ Td1[(s2 >> 16) & 0xff] ^
+ Td2[(s1 >> 8) & 0xff] ^
+ Td3[(s0 ) & 0xff] ^
+ rk[7];
+
+ rk += 8;
+ if (--r == 0) {
+ break;
+ }
+
+ s0 =
+ Td0[(t0 >> 24) ] ^
+ Td1[(t3 >> 16) & 0xff] ^
+ Td2[(t2 >> 8) & 0xff] ^
+ Td3[(t1 ) & 0xff] ^
+ rk[0];
+ s1 =
+ Td0[(t1 >> 24) ] ^
+ Td1[(t0 >> 16) & 0xff] ^
+ Td2[(t3 >> 8) & 0xff] ^
+ Td3[(t2 ) & 0xff] ^
+ rk[1];
+ s2 =
+ Td0[(t2 >> 24) ] ^
+ Td1[(t1 >> 16) & 0xff] ^
+ Td2[(t0 >> 8) & 0xff] ^
+ Td3[(t3 ) & 0xff] ^
+ rk[2];
+ s3 =
+ Td0[(t3 >> 24) ] ^
+ Td1[(t2 >> 16) & 0xff] ^
+ Td2[(t1 >> 8) & 0xff] ^
+ Td3[(t0 ) & 0xff] ^
+ rk[3];
+ }
+#endif /* ?FULL_UNROLL */
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Td4[(t0 >> 24) ] & 0xff000000) ^
+ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t1 ) & 0xff] & 0x000000ff) ^
+ rk[0];
+ PUTU32(out , s0);
+ s1 =
+ (Td4[(t1 >> 24) ] & 0xff000000) ^
+ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t2 ) & 0xff] & 0x000000ff) ^
+ rk[1];
+ PUTU32(out + 4, s1);
+ s2 =
+ (Td4[(t2 >> 24) ] & 0xff000000) ^
+ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t3 ) & 0xff] & 0x000000ff) ^
+ rk[2];
+ PUTU32(out + 8, s2);
+ s3 =
+ (Td4[(t3 >> 24) ] & 0xff000000) ^
+ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t0 ) & 0xff] & 0x000000ff) ^
+ rk[3];
+ PUTU32(out + 12, s3);
+}
+
+#endif /* AES_ASM */
+
+void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
+ const unsigned long length, const AES_KEY *key,
+ unsigned char *ivec, const int enc)
+{
+
+ unsigned long n;
+ unsigned long len = length;
+ unsigned char tmp[AES_BLOCK_SIZE];
+
+ assert(in && out && key && ivec);
+
+ if (enc) {
+ while (len >= AES_BLOCK_SIZE) {
+ for(n=0; n < AES_BLOCK_SIZE; ++n)
+ tmp[n] = in[n] ^ ivec[n];
+ AES_encrypt(tmp, out, key);
+ memcpy(ivec, out, AES_BLOCK_SIZE);
+ len -= AES_BLOCK_SIZE;
+ in += AES_BLOCK_SIZE;
+ out += AES_BLOCK_SIZE;
+ }
+ if (len) {
+ for(n=0; n < len; ++n)
+ tmp[n] = in[n] ^ ivec[n];
+ for(n=len; n < AES_BLOCK_SIZE; ++n)
+ tmp[n] = ivec[n];
+ AES_encrypt(tmp, tmp, key);
+ memcpy(out, tmp, AES_BLOCK_SIZE);
+ memcpy(ivec, tmp, AES_BLOCK_SIZE);
+ }
+ } else {
+ while (len >= AES_BLOCK_SIZE) {
+ memcpy(tmp, in, AES_BLOCK_SIZE);
+ AES_decrypt(in, out, key);
+ for(n=0; n < AES_BLOCK_SIZE; ++n)
+ out[n] ^= ivec[n];
+ memcpy(ivec, tmp, AES_BLOCK_SIZE);
+ len -= AES_BLOCK_SIZE;
+ in += AES_BLOCK_SIZE;
+ out += AES_BLOCK_SIZE;
+ }
+ if (len) {
+ memcpy(tmp, in, AES_BLOCK_SIZE);
+ AES_decrypt(tmp, tmp, key);
+ for(n=0; n < len; ++n)
+ out[n] = tmp[n] ^ ivec[n];
+ memcpy(ivec, tmp, AES_BLOCK_SIZE);
+ }
+ }
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/aes.h b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.h
new file mode 100644
index 0000000..c4d7a1c
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.h
@@ -0,0 +1,49 @@
+/*
+ * OpenSSL compatible AES header
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef AES_H
+#define AES_H
+
+#define AES_MAXNR 14
+#define AES_BLOCK_SIZE 16
+
+struct aes_key_st {
+ uint32_t rd_key[4 *(AES_MAXNR + 1)];
+ int rounds;
+};
+typedef struct aes_key_st AES_KEY;
+
+int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key);
+int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key);
+
+void AES_encrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key);
+void AES_decrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key);
+void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
+ const unsigned long length, const AES_KEY *key,
+ unsigned char *ivec, const int enc);
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/block_net.c b/jslinux-2019-12-21/tinyemu-2019-12-21/block_net.c
new file mode 100644
index 0000000..66794d4
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/block_net.c
@@ -0,0 +1,531 @@
+/*
+ * HTTP block device
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+
+#include "cutils.h"
+#include "virtio.h"
+#include "fs_wget.h"
+#include "list.h"
+#include "fbuf.h"
+#include "machine.h"
+
+typedef enum {
+ CBLOCK_LOADING,
+ CBLOCK_LOADED,
+} CachedBlockStateEnum;
+
+typedef struct CachedBlock {
+ struct list_head link;
+ struct BlockDeviceHTTP *bf;
+ unsigned int block_num;
+ CachedBlockStateEnum state;
+ FileBuffer fbuf;
+} CachedBlock;
+
+#define BLK_FMT "%sblk%09u.bin"
+#define GROUP_FMT "%sgrp%09u.bin"
+#define PREFETCH_GROUP_LEN_MAX 32
+
+typedef struct {
+ struct BlockDeviceHTTP *bf;
+ int group_num;
+ int n_block_num;
+ CachedBlock *tab_block[PREFETCH_GROUP_LEN_MAX];
+} PrefetchGroupRequest;
+
+/* modified data is stored per cluster (smaller than cached blocks to
+ avoid losing space) */
+typedef struct Cluster {
+ FileBuffer fbuf;
+} Cluster;
+
+typedef struct BlockDeviceHTTP {
+ BlockDevice *bs;
+ int max_cache_size_kb;
+ char url[1024];
+ int prefetch_count;
+ void (*start_cb)(void *opaque);
+ void *start_opaque;
+
+ int64_t nb_sectors;
+ int block_size; /* in sectors, power of two */
+ int nb_blocks;
+ struct list_head cached_blocks; /* list of CachedBlock */
+ int n_cached_blocks;
+ int n_cached_blocks_max;
+
+ /* write support */
+ int sectors_per_cluster; /* power of two */
+ Cluster **clusters; /* NULL if no written data */
+ int n_clusters;
+ int n_allocated_clusters;
+
+ /* statistics */
+ int64_t n_read_sectors;
+ int64_t n_read_blocks;
+ int64_t n_write_sectors;
+
+ /* current read request */
+ BOOL is_write;
+ uint64_t sector_num;
+ int cur_block_num;
+ int sector_index, sector_count;
+ BlockDeviceCompletionFunc *cb;
+ void *opaque;
+ uint8_t *io_buf;
+
+ /* prefetch */
+ int prefetch_group_len;
+} BlockDeviceHTTP;
+
+static void bf_update_block(CachedBlock *b, const uint8_t *data);
+static void bf_read_onload(void *opaque, int err, void *data, size_t size);
+static void bf_init_onload(void *opaque, int err, void *data, size_t size);
+static void bf_prefetch_group_onload(void *opaque, int err, void *data,
+ size_t size);
+
+static CachedBlock *bf_find_block(BlockDeviceHTTP *bf, unsigned int block_num)
+{
+ CachedBlock *b;
+ struct list_head *el;
+
+ list_for_each(el, &bf->cached_blocks) {
+ b = list_entry(el, CachedBlock, link);
+ if (b->block_num == block_num) {
+ /* move to front */
+ if (bf->cached_blocks.next != el) {
+ list_del(&b->link);
+ list_add(&b->link, &bf->cached_blocks);
+ }
+ return b;
+ }
+ }
+ return NULL;
+}
+
+static void bf_free_block(BlockDeviceHTTP *bf, CachedBlock *b)
+{
+ bf->n_cached_blocks--;
+ file_buffer_reset(&b->fbuf);
+ list_del(&b->link);
+ free(b);
+}
+
+static CachedBlock *bf_add_block(BlockDeviceHTTP *bf, unsigned int block_num)
+{
+ CachedBlock *b;
+ if (bf->n_cached_blocks >= bf->n_cached_blocks_max) {
+ struct list_head *el, *el1;
+ /* start by looking at the least unused blocks */
+ list_for_each_prev_safe(el, el1, &bf->cached_blocks) {
+ b = list_entry(el, CachedBlock, link);
+ if (b->state == CBLOCK_LOADED) {
+ bf_free_block(bf, b);
+ if (bf->n_cached_blocks < bf->n_cached_blocks_max)
+ break;
+ }
+ }
+ }
+ b = mallocz(sizeof(CachedBlock));
+ b->bf = bf;
+ b->block_num = block_num;
+ b->state = CBLOCK_LOADING;
+ file_buffer_init(&b->fbuf);
+ file_buffer_resize(&b->fbuf, bf->block_size * 512);
+ list_add(&b->link, &bf->cached_blocks);
+ bf->n_cached_blocks++;
+ return b;
+}
+
+static int64_t bf_get_sector_count(BlockDevice *bs)
+{
+ BlockDeviceHTTP *bf = bs->opaque;
+ return bf->nb_sectors;
+}
+
+static void bf_start_load_block(BlockDevice *bs, int block_num)
+{
+ BlockDeviceHTTP *bf = bs->opaque;
+ char filename[1024];
+ CachedBlock *b;
+ b = bf_add_block(bf, block_num);
+ bf->n_read_blocks++;
+ /* make a XHR to read the block */
+#if 0
+ printf("%u,\n", block_num);
+#endif
+#if 0
+ printf("load_blk=%d cached=%d read=%d KB (%d KB) write=%d KB (%d KB)\n",
+ block_num, bf->n_cached_blocks,
+ (int)(bf->n_read_sectors / 2),
+ (int)(bf->n_read_blocks * bf->block_size / 2),
+ (int)(bf->n_write_sectors / 2),
+ (int)(bf->n_allocated_clusters * bf->sectors_per_cluster / 2));
+#endif
+ snprintf(filename, sizeof(filename), BLK_FMT, bf->url, block_num);
+ // printf("wget %s\n", filename);
+ fs_wget(filename, NULL, NULL, b, bf_read_onload, TRUE);
+}
+
+static void bf_start_load_prefetch_group(BlockDevice *bs, int group_num,
+ const int *tab_block_num,
+ int n_block_num)
+{
+ BlockDeviceHTTP *bf = bs->opaque;
+ CachedBlock *b;
+ PrefetchGroupRequest *req;
+ char filename[1024];
+ BOOL req_flag;
+ int i;
+
+ req_flag = FALSE;
+ req = malloc(sizeof(*req));
+ req->bf = bf;
+ req->group_num = group_num;
+ req->n_block_num = n_block_num;
+ for(i = 0; i < n_block_num; i++) {
+ b = bf_find_block(bf, tab_block_num[i]);
+ if (!b) {
+ b = bf_add_block(bf, tab_block_num[i]);
+ req_flag = TRUE;
+ } else {
+ /* no need to read the block if it is already loading or
+ loaded */
+ b = NULL;
+ }
+ req->tab_block[i] = b;
+ }
+
+ if (req_flag) {
+ snprintf(filename, sizeof(filename), GROUP_FMT, bf->url, group_num);
+ // printf("wget %s\n", filename);
+ fs_wget(filename, NULL, NULL, req, bf_prefetch_group_onload, TRUE);
+ /* XXX: should add request in a list to free it for clean exit */
+ } else {
+ free(req);
+ }
+}
+
+static void bf_prefetch_group_onload(void *opaque, int err, void *data,
+ size_t size)
+{
+ PrefetchGroupRequest *req = opaque;
+ BlockDeviceHTTP *bf = req->bf;
+ CachedBlock *b;
+ int block_bytes, i;
+
+ if (err < 0) {
+ fprintf(stderr, "Could not load group %u\n", req->group_num);
+ exit(1);
+ }
+ block_bytes = bf->block_size * 512;
+ assert(size == block_bytes * req->n_block_num);
+ for(i = 0; i < req->n_block_num; i++) {
+ b = req->tab_block[i];
+ if (b) {
+ bf_update_block(b, (const uint8_t *)data + block_bytes * i);
+ }
+ }
+ free(req);
+}
+
+static int bf_rw_async1(BlockDevice *bs, BOOL is_sync)
+{
+ BlockDeviceHTTP *bf = bs->opaque;
+ int offset, block_num, n, cluster_num;
+ CachedBlock *b;
+ Cluster *c;
+
+ for(;;) {
+ n = bf->sector_count - bf->sector_index;
+ if (n == 0)
+ break;
+ cluster_num = bf->sector_num / bf->sectors_per_cluster;
+ c = bf->clusters[cluster_num];
+ if (c) {
+ offset = bf->sector_num % bf->sectors_per_cluster;
+ n = min_int(n, bf->sectors_per_cluster - offset);
+ if (bf->is_write) {
+ file_buffer_write(&c->fbuf, offset * 512,
+ bf->io_buf + bf->sector_index * 512, n * 512);
+ } else {
+ file_buffer_read(&c->fbuf, offset * 512,
+ bf->io_buf + bf->sector_index * 512, n * 512);
+ }
+ bf->sector_index += n;
+ bf->sector_num += n;
+ } else {
+ block_num = bf->sector_num / bf->block_size;
+ offset = bf->sector_num % bf->block_size;
+ n = min_int(n, bf->block_size - offset);
+ bf->cur_block_num = block_num;
+
+ b = bf_find_block(bf, block_num);
+ if (b) {
+ if (b->state == CBLOCK_LOADING) {
+ /* wait until the block is loaded */
+ return 1;
+ } else {
+ if (bf->is_write) {
+ int cluster_size, cluster_offset;
+ uint8_t *buf;
+ /* allocate a new cluster */
+ c = mallocz(sizeof(Cluster));
+ cluster_size = bf->sectors_per_cluster * 512;
+ buf = malloc(cluster_size);
+ file_buffer_init(&c->fbuf);
+ file_buffer_resize(&c->fbuf, cluster_size);
+ bf->clusters[cluster_num] = c;
+ /* copy the cached block data to the cluster */
+ cluster_offset = (cluster_num * bf->sectors_per_cluster) &
+ (bf->block_size - 1);
+ file_buffer_read(&b->fbuf, cluster_offset * 512,
+ buf, cluster_size);
+ file_buffer_write(&c->fbuf, 0, buf, cluster_size);
+ free(buf);
+ bf->n_allocated_clusters++;
+ continue; /* write to the allocated cluster */
+ } else {
+ file_buffer_read(&b->fbuf, offset * 512,
+ bf->io_buf + bf->sector_index * 512, n * 512);
+ }
+ bf->sector_index += n;
+ bf->sector_num += n;
+ }
+ } else {
+ bf_start_load_block(bs, block_num);
+ return 1;
+ }
+ bf->cur_block_num = -1;
+ }
+ }
+
+ if (!is_sync) {
+ // printf("end of request\n");
+ /* end of request */
+ bf->cb(bf->opaque, 0);
+ }
+ return 0;
+}
+
+static void bf_update_block(CachedBlock *b, const uint8_t *data)
+{
+ BlockDeviceHTTP *bf = b->bf;
+ BlockDevice *bs = bf->bs;
+
+ assert(b->state == CBLOCK_LOADING);
+ file_buffer_write(&b->fbuf, 0, data, bf->block_size * 512);
+ b->state = CBLOCK_LOADED;
+
+ /* continue I/O read/write if necessary */
+ if (b->block_num == bf->cur_block_num) {
+ bf_rw_async1(bs, FALSE);
+ }
+}
+
+static void bf_read_onload(void *opaque, int err, void *data, size_t size)
+{
+ CachedBlock *b = opaque;
+ BlockDeviceHTTP *bf = b->bf;
+
+ if (err < 0) {
+ fprintf(stderr, "Could not load block %u\n", b->block_num);
+ exit(1);
+ }
+
+ assert(size == bf->block_size * 512);
+ bf_update_block(b, data);
+}
+
+static int bf_read_async(BlockDevice *bs,
+ uint64_t sector_num, uint8_t *buf, int n,
+ BlockDeviceCompletionFunc *cb, void *opaque)
+{
+ BlockDeviceHTTP *bf = bs->opaque;
+ // printf("bf_read_async: sector_num=%" PRId64 " n=%d\n", sector_num, n);
+ bf->is_write = FALSE;
+ bf->sector_num = sector_num;
+ bf->io_buf = buf;
+ bf->sector_count = n;
+ bf->sector_index = 0;
+ bf->cb = cb;
+ bf->opaque = opaque;
+ bf->n_read_sectors += n;
+ return bf_rw_async1(bs, TRUE);
+}
+
+static int bf_write_async(BlockDevice *bs,
+ uint64_t sector_num, const uint8_t *buf, int n,
+ BlockDeviceCompletionFunc *cb, void *opaque)
+{
+ BlockDeviceHTTP *bf = bs->opaque;
+ // printf("bf_write_async: sector_num=%" PRId64 " n=%d\n", sector_num, n);
+ bf->is_write = TRUE;
+ bf->sector_num = sector_num;
+ bf->io_buf = (uint8_t *)buf;
+ bf->sector_count = n;
+ bf->sector_index = 0;
+ bf->cb = cb;
+ bf->opaque = opaque;
+ bf->n_write_sectors += n;
+ return bf_rw_async1(bs, TRUE);
+}
+
+BlockDevice *block_device_init_http(const char *url,
+ int max_cache_size_kb,
+ void (*start_cb)(void *opaque),
+ void *start_opaque)
+{
+ BlockDevice *bs;
+ BlockDeviceHTTP *bf;
+ char *p;
+
+ bs = mallocz(sizeof(*bs));
+ bf = mallocz(sizeof(*bf));
+ strcpy(bf->url, url);
+ /* get the path with the trailing '/' */
+ p = strrchr(bf->url, '/');
+ if (!p)
+ p = bf->url;
+ else
+ p++;
+ *p = '\0';
+
+ init_list_head(&bf->cached_blocks);
+ bf->max_cache_size_kb = max_cache_size_kb;
+ bf->start_cb = start_cb;
+ bf->start_opaque = start_opaque;
+ bf->bs = bs;
+
+ bs->opaque = bf;
+ bs->get_sector_count = bf_get_sector_count;
+ bs->read_async = bf_read_async;
+ bs->write_async = bf_write_async;
+
+ fs_wget(url, NULL, NULL, bs, bf_init_onload, TRUE);
+ return bs;
+}
+
+static void bf_init_onload(void *opaque, int err, void *data, size_t size)
+{
+ BlockDevice *bs = opaque;
+ BlockDeviceHTTP *bf = bs->opaque;
+ int block_size_kb, block_num;
+ JSONValue cfg, array;
+
+ if (err < 0) {
+ fprintf(stderr, "Could not load block device file (err=%d)\n", -err);
+ exit(1);
+ }
+
+ /* parse the disk image info */
+ cfg = json_parse_value_len(data, size);
+ if (json_is_error(cfg)) {
+ vm_error("error: %s\n", json_get_error(cfg));
+ config_error:
+ json_free(cfg);
+ exit(1);
+ }
+
+ if (vm_get_int(cfg, "block_size", &block_size_kb) < 0)
+ goto config_error;
+ bf->block_size = block_size_kb * 2;
+ if (bf->block_size <= 0 ||
+ (bf->block_size & (bf->block_size - 1)) != 0) {
+ vm_error("invalid block_size\n");
+ goto config_error;
+ }
+ if (vm_get_int(cfg, "n_block", &bf->nb_blocks) < 0)
+ goto config_error;
+ if (bf->nb_blocks <= 0) {
+ vm_error("invalid n_block\n");
+ goto config_error;
+ }
+
+ bf->nb_sectors = bf->block_size * (uint64_t)bf->nb_blocks;
+ bf->n_cached_blocks = 0;
+ bf->n_cached_blocks_max = max_int(1, bf->max_cache_size_kb / block_size_kb);
+ bf->cur_block_num = -1; /* no request in progress */
+
+ bf->sectors_per_cluster = 8; /* 4 KB */
+ bf->n_clusters = (bf->nb_sectors + bf->sectors_per_cluster - 1) / bf->sectors_per_cluster;
+ bf->clusters = mallocz(sizeof(bf->clusters[0]) * bf->n_clusters);
+
+ if (vm_get_int_opt(cfg, "prefetch_group_len",
+ &bf->prefetch_group_len, 1) < 0)
+ goto config_error;
+ if (bf->prefetch_group_len > PREFETCH_GROUP_LEN_MAX) {
+ vm_error("prefetch_group_len is too large");
+ goto config_error;
+ }
+
+ array = json_object_get(cfg, "prefetch");
+ if (!json_is_undefined(array)) {
+ int idx, prefetch_len, l, i;
+ JSONValue el;
+ int tab_block_num[PREFETCH_GROUP_LEN_MAX];
+
+ if (array.type != JSON_ARRAY) {
+ vm_error("expecting an array\n");
+ goto config_error;
+ }
+ prefetch_len = array.u.array->len;
+ idx = 0;
+ while (idx < prefetch_len) {
+ l = min_int(prefetch_len - idx, bf->prefetch_group_len);
+ for(i = 0; i < l; i++) {
+ el = json_array_get(array, idx + i);
+ if (el.type != JSON_INT) {
+ vm_error("expecting an integer\n");
+ goto config_error;
+ }
+ tab_block_num[i] = el.u.int32;
+ }
+ if (l == 1) {
+ block_num = tab_block_num[0];
+ if (!bf_find_block(bf, block_num)) {
+ bf_start_load_block(bs, block_num);
+ }
+ } else {
+ bf_start_load_prefetch_group(bs, idx / bf->prefetch_group_len,
+ tab_block_num, l);
+ }
+ idx += l;
+ }
+ }
+ json_free(cfg);
+
+ if (bf->start_cb) {
+ bf->start_cb(bf->start_opaque);
+ }
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/build_filelist.c b/jslinux-2019-12-21/tinyemu-2019-12-21/build_filelist.c
new file mode 100644
index 0000000..db3c150
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/build_filelist.c
@@ -0,0 +1,311 @@
+/*
+ * File list builder for RISCVEMU network filesystem
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <sys/statfs.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <errno.h>
+#include <sys/sysmacros.h>
+
+#include "cutils.h"
+#include "fs_utils.h"
+
+void print_str(FILE *f, const char *str)
+{
+ const char *s;
+ int c;
+ s = str;
+ while (*s != '\0') {
+ if (*s <= ' ' || *s > '~')
+ goto use_quote;
+ s++;
+ }
+ fputs(str, f);
+ return;
+ use_quote:
+ s = str;
+ fputc('"', f);
+ while (*s != '\0') {
+ c = *(uint8_t *)s;
+ if (c < ' ' || c == 127) {
+ fprintf(f, "\\x%02x", c);
+ } else if (c == '\\' || c == '\"') {
+ fprintf(f, "\\%c", c);
+ } else {
+ fputc(c, f);
+ }
+ s++;
+ }
+ fputc('"', f);
+}
+
+#define COPY_BUF_LEN (1024 * 1024)
+
+static void copy_file(const char *src_filename, const char *dst_filename)
+{
+ uint8_t *buf;
+ FILE *fi, *fo;
+ int len;
+
+ buf = malloc(COPY_BUF_LEN);
+ fi = fopen(src_filename, "rb");
+ if (!fi) {
+ perror(src_filename);
+ exit(1);
+ }
+ fo = fopen(dst_filename, "wb");
+ if (!fo) {
+ perror(dst_filename);
+ exit(1);
+ }
+ for(;;) {
+ len = fread(buf, 1, COPY_BUF_LEN, fi);
+ if (len == 0)
+ break;
+ fwrite(buf, 1, len, fo);
+ }
+ fclose(fo);
+ fclose(fi);
+}
+
+typedef struct {
+ char *files_path;
+ uint64_t next_inode_num;
+ uint64_t fs_size;
+ uint64_t fs_max_size;
+ FILE *f;
+} ScanState;
+
+static void add_file_size(ScanState *s, uint64_t size)
+{
+ s->fs_size += block_align(size, FS_BLOCK_SIZE);
+ if (s->fs_size > s->fs_max_size) {
+ fprintf(stderr, "Filesystem Quota exceeded (%" PRId64 " bytes)\n", s->fs_max_size);
+ exit(1);
+ }
+}
+
+void scan_dir(ScanState *s, const char *path)
+{
+ FILE *f = s->f;
+ DIR *dirp;
+ struct dirent *de;
+ const char *name;
+ struct stat st;
+ char *path1;
+ uint32_t mode, v;
+
+ dirp = opendir(path);
+ if (!dirp) {
+ perror(path);
+ exit(1);
+ }
+ for(;;) {
+ de = readdir(dirp);
+ if (!de)
+ break;
+ name = de->d_name;
+ if (!strcmp(name, ".") || !strcmp(name, ".."))
+ continue;
+ path1 = compose_path(path, name);
+ if (lstat(path1, &st) < 0) {
+ perror(path1);
+ exit(1);
+ }
+
+ mode = st.st_mode & 0xffff;
+ fprintf(f, "%06o %u %u",
+ mode,
+ (int)st.st_uid,
+ (int)st.st_gid);
+ if (S_ISCHR(mode) || S_ISBLK(mode)) {
+ fprintf(f, " %u %u",
+ (int)major(st.st_rdev),
+ (int)minor(st.st_rdev));
+ }
+ if (S_ISREG(mode)) {
+ fprintf(f, " %" PRIu64, st.st_size);
+ }
+ /* modification time (at most ms resolution) */
+ fprintf(f, " %u", (int)st.st_mtim.tv_sec);
+ v = st.st_mtim.tv_nsec;
+ if (v != 0) {
+ fprintf(f, ".");
+ while (v != 0) {
+ fprintf(f, "%u", v / 100000000);
+ v = (v % 100000000) * 10;
+ }
+ }
+
+ fprintf(f, " ");
+ print_str(f, name);
+ if (S_ISLNK(mode)) {
+ char buf[1024];
+ int len;
+ len = readlink(path1, buf, sizeof(buf) - 1);
+ if (len < 0) {
+ perror("readlink");
+ exit(1);
+ }
+ buf[len] = '\0';
+ fprintf(f, " ");
+ print_str(f, buf);
+ } else if (S_ISREG(mode) && st.st_size > 0) {
+ char buf1[FILEID_SIZE_MAX], *fname;
+ FSFileID file_id;
+ file_id = s->next_inode_num++;
+ fprintf(f, " %" PRIx64, file_id);
+ file_id_to_filename(buf1, file_id);
+ fname = compose_path(s->files_path, buf1);
+ copy_file(path1, fname);
+ add_file_size(s, st.st_size);
+ }
+
+ fprintf(f, "\n");
+ if (S_ISDIR(mode)) {
+ scan_dir(s, path1);
+ }
+ free(path1);
+ }
+
+ closedir(dirp);
+ fprintf(f, ".\n"); /* end of directory */
+}
+
+void help(void)
+{
+ printf("usage: build_filelist [options] source_path dest_path\n"
+ "\n"
+ "Options:\n"
+ "-m size_mb set the max filesystem size in MiB\n");
+ exit(1);
+}
+
+#define LOCK_FILENAME "lock"
+
+int main(int argc, char **argv)
+{
+ const char *dst_path, *src_path;
+ ScanState s_s, *s = &s_s;
+ FILE *f;
+ char *filename;
+ FSFileID root_id;
+ char fname[FILEID_SIZE_MAX];
+ struct stat st;
+ uint64_t first_inode, fs_max_size;
+ int c;
+
+ first_inode = 1;
+ fs_max_size = (uint64_t)1 << 30;
+ for(;;) {
+ c = getopt(argc, argv, "hi:m:");
+ if (c == -1)
+ break;
+ switch(c) {
+ case 'h':
+ help();
+ case 'i':
+ first_inode = strtoul(optarg, NULL, 0);
+ break;
+ case 'm':
+ fs_max_size = (uint64_t)strtoul(optarg, NULL, 0) << 20;
+ break;
+ default:
+ exit(1);
+ }
+ }
+
+ if (optind + 1 >= argc)
+ help();
+ src_path = argv[optind];
+ dst_path = argv[optind + 1];
+
+ mkdir(dst_path, 0755);
+
+ s->files_path = compose_path(dst_path, ROOT_FILENAME);
+ s->next_inode_num = first_inode;
+ s->fs_size = 0;
+ s->fs_max_size = fs_max_size;
+
+ mkdir(s->files_path, 0755);
+
+ root_id = s->next_inode_num++;
+ file_id_to_filename(fname, root_id);
+ filename = compose_path(s->files_path, fname);
+ f = fopen(filename, "wb");
+ if (!f) {
+ perror(filename);
+ exit(1);
+ }
+ fprintf(f, "Version: 1\n");
+ fprintf(f, "Revision: 1\n");
+ fprintf(f, "\n");
+ s->f = f;
+ scan_dir(s, src_path);
+ fclose(f);
+
+ /* take into account the filelist size */
+ if (stat(filename, &st) < 0) {
+ perror(filename);
+ exit(1);
+ }
+ add_file_size(s, st.st_size);
+
+ free(filename);
+
+ filename = compose_path(dst_path, HEAD_FILENAME);
+ f = fopen(filename, "wb");
+ if (!f) {
+ perror(filename);
+ exit(1);
+ }
+ fprintf(f, "Version: 1\n");
+ fprintf(f, "Revision: 1\n");
+ fprintf(f, "NextFileID: %" PRIx64 "\n", s->next_inode_num);
+ fprintf(f, "FSFileCount: %" PRIu64 "\n", s->next_inode_num - 1);
+ fprintf(f, "FSSize: %" PRIu64 "\n", s->fs_size);
+ fprintf(f, "FSMaxSize: %" PRIu64 "\n", s->fs_max_size);
+ fprintf(f, "Key:\n"); /* not encrypted */
+ fprintf(f, "RootID: %" PRIx64 "\n", root_id);
+ fclose(f);
+ free(filename);
+
+ filename = compose_path(dst_path, LOCK_FILENAME);
+ f = fopen(filename, "wb");
+ if (!f) {
+ perror(filename);
+ exit(1);
+ }
+ fclose(f);
+ free(filename);
+
+ return 0;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.c b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.c
new file mode 100644
index 0000000..a86f90b
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.c
@@ -0,0 +1,120 @@
+/*
+ * Misc C utilities
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <sys/time.h>
+#include <ctype.h>
+
+#include "cutils.h"
+
+void *mallocz(size_t size)
+{
+ void *ptr;
+ ptr = malloc(size);
+ if (!ptr)
+ return NULL;
+ memset(ptr, 0, size);
+ return ptr;
+}
+
+void pstrcpy(char *buf, int buf_size, const char *str)
+{
+ int c;
+ char *q = buf;
+
+ if (buf_size <= 0)
+ return;
+
+ for(;;) {
+ c = *str++;
+ if (c == 0 || q >= buf + buf_size - 1)
+ break;
+ *q++ = c;
+ }
+ *q = '\0';
+}
+
+char *pstrcat(char *buf, int buf_size, const char *s)
+{
+ int len;
+ len = strlen(buf);
+ if (len < buf_size)
+ pstrcpy(buf + len, buf_size - len, s);
+ return buf;
+}
+
+int strstart(const char *str, const char *val, const char **ptr)
+{
+ const char *p, *q;
+ p = str;
+ q = val;
+ while (*q != '\0') {
+ if (*p != *q)
+ return 0;
+ p++;
+ q++;
+ }
+ if (ptr)
+ *ptr = p;
+ return 1;
+}
+
+void dbuf_init(DynBuf *s)
+{
+ memset(s, 0, sizeof(*s));
+}
+
+void dbuf_write(DynBuf *s, size_t offset, const uint8_t *data, size_t len)
+{
+ size_t end, new_size;
+ new_size = end = offset + len;
+ if (new_size > s->allocated_size) {
+ new_size = max_int(new_size, s->allocated_size * 3 / 2);
+ s->buf = realloc(s->buf, new_size);
+ s->allocated_size = new_size;
+ }
+ memcpy(s->buf + offset, data, len);
+ if (end > s->size)
+ s->size = end;
+}
+
+void dbuf_putc(DynBuf *s, uint8_t c)
+{
+ dbuf_write(s, s->size, &c, 1);
+}
+
+void dbuf_putstr(DynBuf *s, const char *str)
+{
+ dbuf_write(s, s->size, (const uint8_t *)str, strlen(str));
+}
+
+void dbuf_free(DynBuf *s)
+{
+ free(s->buf);
+ memset(s, 0, sizeof(*s));
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.h b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.h
new file mode 100644
index 0000000..689542e
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.h
@@ -0,0 +1,194 @@
+/*
+ * C utilities
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef CUTILS_H
+#define CUTILS_H
+
+#include <inttypes.h>
+
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+#define force_inline inline __attribute__((always_inline))
+#define no_inline __attribute__((noinline))
+#define __maybe_unused __attribute__((unused))
+
+#define xglue(x, y) x ## y
+#define glue(x, y) xglue(x, y)
+#define stringify(s) tostring(s)
+#define tostring(s) #s
+
+#ifndef offsetof
+#define offsetof(type, field) ((size_t) &((type *)0)->field)
+#endif
+#define countof(x) (sizeof(x) / sizeof(x[0]))
+
+#define DLL_PUBLIC __attribute__ ((visibility ("default")))
+
+#ifndef _BOOL_defined
+#define _BOOL_defined
+#undef FALSE
+#undef TRUE
+
+typedef int BOOL;
+enum {
+ FALSE = 0,
+ TRUE = 1,
+};
+#endif
+
+/* this test works at least with gcc */
+#if defined(__SIZEOF_INT128__)
+#define HAVE_INT128
+#endif
+
+#ifdef HAVE_INT128
+typedef __int128 int128_t;
+typedef unsigned __int128 uint128_t;
+#endif
+
+static inline int max_int(int a, int b)
+{
+ if (a > b)
+ return a;
+ else
+ return b;
+}
+
+static inline int min_int(int a, int b)
+{
+ if (a < b)
+ return a;
+ else
+ return b;
+}
+
+void *mallocz(size_t size);
+
+#if defined(_WIN32)
+static inline uint32_t bswap_32(uint32_t v)
+{
+ return ((v & 0xff000000) >> 24) | ((v & 0x00ff0000) >> 8) |
+ ((v & 0x0000ff00) << 8) | ((v & 0x000000ff) << 24);
+}
+#else
+#include <byteswap.h>
+#endif
+
+static inline uint16_t get_le16(const uint8_t *ptr)
+{
+ return ptr[0] | (ptr[1] << 8);
+}
+
+static inline uint32_t get_le32(const uint8_t *ptr)
+{
+ return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24);
+}
+
+static inline uint64_t get_le64(const uint8_t *ptr)
+{
+ return get_le32(ptr) | ((uint64_t)get_le32(ptr + 4) << 32);
+}
+
+static inline void put_le16(uint8_t *ptr, uint16_t v)
+{
+ ptr[0] = v;
+ ptr[1] = v >> 8;
+}
+
+static inline void put_le32(uint8_t *ptr, uint32_t v)
+{
+ ptr[0] = v;
+ ptr[1] = v >> 8;
+ ptr[2] = v >> 16;
+ ptr[3] = v >> 24;
+}
+
+static inline void put_le64(uint8_t *ptr, uint64_t v)
+{
+ put_le32(ptr, v);
+ put_le32(ptr + 4, v >> 32);
+}
+
+static inline uint32_t get_be32(const uint8_t *d)
+{
+ return (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | d[3];
+}
+
+static inline void put_be32(uint8_t *d, uint32_t v)
+{
+ d[0] = v >> 24;
+ d[1] = v >> 16;
+ d[2] = v >> 8;
+ d[3] = v >> 0;
+}
+
+static inline void put_be64(uint8_t *d, uint64_t v)
+{
+ put_be32(d, v >> 32);
+ put_be32(d + 4, v);
+}
+
+#ifdef WORDS_BIGENDIAN
+static inline uint32_t cpu_to_be32(uint32_t v)
+{
+ return v;
+}
+#else
+static inline uint32_t cpu_to_be32(uint32_t v)
+{
+ return bswap_32(v);
+}
+#endif
+
+/* XXX: optimize */
+static inline int ctz32(uint32_t a)
+{
+ int i;
+ if (a == 0)
+ return 32;
+ for(i = 0; i < 32; i++) {
+ if ((a >> i) & 1)
+ return i;
+ }
+ return 32;
+}
+
+
+void *mallocz(size_t size);
+void pstrcpy(char *buf, int buf_size, const char *str);
+char *pstrcat(char *buf, int buf_size, const char *s);
+int strstart(const char *str, const char *val, const char **ptr);
+
+typedef struct {
+ uint8_t *buf;
+ size_t size;
+ size_t allocated_size;
+} DynBuf;
+
+void dbuf_init(DynBuf *s);
+void dbuf_write(DynBuf *s, size_t offset, const uint8_t *data, size_t len);
+void dbuf_putc(DynBuf *s, uint8_t c);
+void dbuf_putstr(DynBuf *s, const char *str);
+void dbuf_free(DynBuf *s);
+
+#endif /* CUTILS_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fbuf.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fbuf.h
new file mode 100644
index 0000000..9736a49
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fbuf.h
@@ -0,0 +1,22 @@
+#ifndef FBUF_H
+#define FBUF_H
+
+typedef struct {
+#if defined(EMSCRIPTEN)
+ int handle;
+#else
+ uint8_t *data;
+#endif
+ size_t allocated_size;
+} FileBuffer;
+
+void file_buffer_init(FileBuffer *bs);
+void file_buffer_reset(FileBuffer *bs);
+int file_buffer_resize(FileBuffer *bs, size_t new_size);
+void file_buffer_write(FileBuffer *bs, size_t offset, const uint8_t *buf,
+ size_t size);
+void file_buffer_set(FileBuffer *bs, size_t offset, int val, size_t size);
+void file_buffer_read(FileBuffer *bs, size_t offset, uint8_t *buf,
+ size_t size);
+
+#endif /* FBUF_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.c
new file mode 100644
index 0000000..7f92d82
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.c
@@ -0,0 +1,104 @@
+/*
+ * Filesystem utilities
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+
+#include "cutils.h"
+#include "fs.h"
+
+FSFile *fs_dup(FSDevice *fs, FSFile *f)
+{
+ FSQID qid;
+ fs->fs_walk(fs, &f, &qid, f, 0, NULL);
+ return f;
+}
+
+FSFile *fs_walk_path1(FSDevice *fs, FSFile *f, const char *path,
+ char **pname)
+{
+ const char *p;
+ char *name;
+ FSFile *f1;
+ FSQID qid;
+ int len, ret;
+ BOOL is_last, is_first;
+
+ if (path[0] == '/')
+ path++;
+
+ is_first = TRUE;
+ for(;;) {
+ p = strchr(path, '/');
+ if (!p) {
+ name = (char *)path;
+ if (pname) {
+ *pname = name;
+ if (is_first) {
+ ret = fs->fs_walk(fs, &f, &qid, f, 0, NULL);
+ if (ret < 0)
+ f = NULL;
+ }
+ return f;
+ }
+ is_last = TRUE;
+ } else {
+ len = p - path;
+ name = malloc(len + 1);
+ memcpy(name, path, len);
+ name[len] = '\0';
+ is_last = FALSE;
+ }
+ ret = fs->fs_walk(fs, &f1, &qid, f, 1, &name);
+ if (!is_last)
+ free(name);
+ if (!is_first)
+ fs->fs_delete(fs, f);
+ f = f1;
+ is_first = FALSE;
+ if (ret <= 0) {
+ fs->fs_delete(fs, f);
+ f = NULL;
+ break;
+ } else if (is_last) {
+ break;
+ }
+ path = p + 1;
+ }
+ return f;
+}
+
+FSFile *fs_walk_path(FSDevice *fs, FSFile *f, const char *path)
+{
+ return fs_walk_path1(fs, f, path, NULL);
+}
+
+void fs_end(FSDevice *fs)
+{
+ fs->fs_end(fs);
+ free(fs);
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.h
new file mode 100644
index 0000000..4c38e84
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.h
@@ -0,0 +1,211 @@
+/*
+ * Filesystem abstraction
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* FSQID.type */
+#define P9_QTDIR 0x80
+#define P9_QTAPPEND 0x40
+#define P9_QTEXCL 0x20
+#define P9_QTMOUNT 0x10
+#define P9_QTAUTH 0x08
+#define P9_QTTMP 0x04
+#define P9_QTSYMLINK 0x02
+#define P9_QTLINK 0x01
+#define P9_QTFILE 0x00
+
+/* mode bits */
+#define P9_S_IRWXUGO 0x01FF
+#define P9_S_ISVTX 0x0200
+#define P9_S_ISGID 0x0400
+#define P9_S_ISUID 0x0800
+
+#define P9_S_IFMT 0xF000
+#define P9_S_IFIFO 0x1000
+#define P9_S_IFCHR 0x2000
+#define P9_S_IFDIR 0x4000
+#define P9_S_IFBLK 0x6000
+#define P9_S_IFREG 0x8000
+#define P9_S_IFLNK 0xA000
+#define P9_S_IFSOCK 0xC000
+
+/* flags for lopen()/lcreate() */
+#define P9_O_RDONLY 0x00000000
+#define P9_O_WRONLY 0x00000001
+#define P9_O_RDWR 0x00000002
+#define P9_O_NOACCESS 0x00000003
+#define P9_O_CREAT 0x00000040
+#define P9_O_EXCL 0x00000080
+#define P9_O_NOCTTY 0x00000100
+#define P9_O_TRUNC 0x00000200
+#define P9_O_APPEND 0x00000400
+#define P9_O_NONBLOCK 0x00000800
+#define P9_O_DSYNC 0x00001000
+#define P9_O_FASYNC 0x00002000
+#define P9_O_DIRECT 0x00004000
+#define P9_O_LARGEFILE 0x00008000
+#define P9_O_DIRECTORY 0x00010000
+#define P9_O_NOFOLLOW 0x00020000
+#define P9_O_NOATIME 0x00040000
+#define P9_O_CLOEXEC 0x00080000
+#define P9_O_SYNC 0x00100000
+
+/* for fs_setattr() */
+#define P9_SETATTR_MODE 0x00000001
+#define P9_SETATTR_UID 0x00000002
+#define P9_SETATTR_GID 0x00000004
+#define P9_SETATTR_SIZE 0x00000008
+#define P9_SETATTR_ATIME 0x00000010
+#define P9_SETATTR_MTIME 0x00000020
+#define P9_SETATTR_CTIME 0x00000040
+#define P9_SETATTR_ATIME_SET 0x00000080
+#define P9_SETATTR_MTIME_SET 0x00000100
+
+#define P9_EPERM 1
+#define P9_ENOENT 2
+#define P9_EIO 5
+#define P9_EEXIST 17
+#define P9_ENOTDIR 20
+#define P9_EINVAL 22
+#define P9_ENOSPC 28
+#define P9_ENOTEMPTY 39
+#define P9_EPROTO 71
+#define P9_ENOTSUP 524
+
+typedef struct FSDevice FSDevice;
+typedef struct FSFile FSFile;
+
+typedef struct {
+ uint32_t f_bsize;
+ uint64_t f_blocks;
+ uint64_t f_bfree;
+ uint64_t f_bavail;
+ uint64_t f_files;
+ uint64_t f_ffree;
+} FSStatFS;
+
+typedef struct {
+ uint8_t type; /* P9_IFx */
+ uint32_t version;
+ uint64_t path;
+} FSQID;
+
+typedef struct {
+ FSQID qid;
+ uint32_t st_mode;
+ uint32_t st_uid;
+ uint32_t st_gid;
+ uint64_t st_nlink;
+ uint64_t st_rdev;
+ uint64_t st_size;
+ uint64_t st_blksize;
+ uint64_t st_blocks;
+ uint64_t st_atime_sec;
+ uint32_t st_atime_nsec;
+ uint64_t st_mtime_sec;
+ uint32_t st_mtime_nsec;
+ uint64_t st_ctime_sec;
+ uint32_t st_ctime_nsec;
+} FSStat;
+
+#define P9_LOCK_TYPE_RDLCK 0
+#define P9_LOCK_TYPE_WRLCK 1
+#define P9_LOCK_TYPE_UNLCK 2
+
+#define P9_LOCK_FLAGS_BLOCK 1
+#define P9_LOCK_FLAGS_RECLAIM 2
+
+#define P9_LOCK_SUCCESS 0
+#define P9_LOCK_BLOCKED 1
+#define P9_LOCK_ERROR 2
+#define P9_LOCK_GRACE 3
+
+#define FSCMD_NAME ".fscmd"
+
+typedef struct {
+ uint8_t type;
+ uint32_t flags;
+ uint64_t start;
+ uint64_t length;
+ uint32_t proc_id;
+ char *client_id;
+} FSLock;
+
+typedef void FSOpenCompletionFunc(FSDevice *fs, FSQID *qid, int err,
+ void *opaque);
+
+struct FSDevice {
+ void (*fs_end)(FSDevice *s);
+ void (*fs_delete)(FSDevice *s, FSFile *f);
+ void (*fs_statfs)(FSDevice *fs, FSStatFS *st);
+ int (*fs_attach)(FSDevice *fs, FSFile **pf, FSQID *qid, uint32_t uid,
+ const char *uname, const char *aname);
+ int (*fs_walk)(FSDevice *fs, FSFile **pf, FSQID *qids,
+ FSFile *f, int n, char **names);
+ int (*fs_mkdir)(FSDevice *fs, FSQID *qid, FSFile *f,
+ const char *name, uint32_t mode, uint32_t gid);
+ int (*fs_open)(FSDevice *fs, FSQID *qid, FSFile *f, uint32_t flags,
+ FSOpenCompletionFunc *cb, void *opaque);
+ int (*fs_create)(FSDevice *fs, FSQID *qid, FSFile *f, const char *name,
+ uint32_t flags, uint32_t mode, uint32_t gid);
+ int (*fs_stat)(FSDevice *fs, FSFile *f, FSStat *st);
+ int (*fs_setattr)(FSDevice *fs, FSFile *f, uint32_t mask,
+ uint32_t mode, uint32_t uid, uint32_t gid,
+ uint64_t size, uint64_t atime_sec, uint64_t atime_nsec,
+ uint64_t mtime_sec, uint64_t mtime_nsec);
+ void (*fs_close)(FSDevice *fs, FSFile *f);
+ int (*fs_readdir)(FSDevice *fs, FSFile *f, uint64_t offset,
+ uint8_t *buf, int count);
+ int (*fs_read)(FSDevice *fs, FSFile *f, uint64_t offset,
+ uint8_t *buf, int count);
+ int (*fs_write)(FSDevice *fs, FSFile *f, uint64_t offset,
+ const uint8_t *buf, int count);
+ int (*fs_link)(FSDevice *fs, FSFile *df, FSFile *f, const char *name);
+ int (*fs_symlink)(FSDevice *fs, FSQID *qid,
+ FSFile *f, const char *name, const char *symgt, uint32_t gid);
+ int (*fs_mknod)(FSDevice *fs, FSQID *qid,
+ FSFile *f, const char *name, uint32_t mode, uint32_t major,
+ uint32_t minor, uint32_t gid);
+ int (*fs_readlink)(FSDevice *fs, char *buf, int buf_size, FSFile *f);
+ int (*fs_renameat)(FSDevice *fs, FSFile *f, const char *name,
+ FSFile *new_f, const char *new_name);
+ int (*fs_unlinkat)(FSDevice *fs, FSFile *f, const char *name);
+ int (*fs_lock)(FSDevice *fs, FSFile *f, const FSLock *lock);
+ int (*fs_getlock)(FSDevice *fs, FSFile *f, FSLock *lock);
+};
+
+FSDevice *fs_disk_init(const char *root_path);
+FSDevice *fs_mem_init(void);
+FSDevice *fs_net_init(const char *url, void (*start)(void *opaque), void *opaque);
+void fs_net_set_pwd(FSDevice *fs, const char *pwd);
+#ifdef EMSCRIPTEN
+void fs_import_file(const char *filename, uint8_t *buf, int buf_len);
+#endif
+void fs_export_file(const char *filename,
+ const uint8_t *buf, int buf_len);
+void fs_end(FSDevice *fs);
+void fs_dump_cache_load(FSDevice *fs1, const char *filename);
+
+FSFile *fs_dup(FSDevice *fs, FSFile *f);
+FSFile *fs_walk_path1(FSDevice *fs, FSFile *f, const char *path,
+ char **pname);
+FSFile *fs_walk_path(FSDevice *fs, FSFile *f, const char *path);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_disk.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_disk.c
new file mode 100644
index 0000000..bf96c89
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_disk.c
@@ -0,0 +1,659 @@
+/*
+ * Filesystem on disk
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <sys/statfs.h>
+#include <sys/stat.h>
+#include <sys/sysmacros.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <errno.h>
+
+#include "cutils.h"
+#include "list.h"
+#include "fs.h"
+
+typedef struct {
+ FSDevice common;
+ char *root_path;
+} FSDeviceDisk;
+
+static void fs_close(FSDevice *fs, FSFile *f);
+
+struct FSFile {
+ uint32_t uid;
+ char *path; /* complete path */
+ BOOL is_opened;
+ BOOL is_dir;
+ union {
+ int fd;
+ DIR *dirp;
+ } u;
+};
+
+static void fs_delete(FSDevice *fs, FSFile *f)
+{
+ if (f->is_opened)
+ fs_close(fs, f);
+ free(f->path);
+ free(f);
+}
+
+/* warning: path belong to fid_create() */
+static FSFile *fid_create(FSDevice *s1, char *path, uint32_t uid)
+{
+ FSFile *f;
+ f = mallocz(sizeof(*f));
+ f->path = path;
+ f->uid = uid;
+ return f;
+}
+
+
+static int errno_table[][2] = {
+ { P9_EPERM, EPERM },
+ { P9_ENOENT, ENOENT },
+ { P9_EIO, EIO },
+ { P9_EEXIST, EEXIST },
+ { P9_EINVAL, EINVAL },
+ { P9_ENOSPC, ENOSPC },
+ { P9_ENOTEMPTY, ENOTEMPTY },
+ { P9_EPROTO, EPROTO },
+ { P9_ENOTSUP, ENOTSUP },
+};
+
+static int errno_to_p9(int err)
+{
+ int i;
+ if (err == 0)
+ return 0;
+ for(i = 0; i < countof(errno_table); i++) {
+ if (err == errno_table[i][1])
+ return errno_table[i][0];
+ }
+ return P9_EINVAL;
+}
+
+static int open_flags[][2] = {
+ { P9_O_CREAT, O_CREAT },
+ { P9_O_EXCL, O_EXCL },
+ // { P9_O_NOCTTY, O_NOCTTY },
+ { P9_O_TRUNC, O_TRUNC },
+ { P9_O_APPEND, O_APPEND },
+ { P9_O_NONBLOCK, O_NONBLOCK },
+ { P9_O_DSYNC, O_DSYNC },
+ // { P9_O_FASYNC, O_FASYNC },
+ // { P9_O_DIRECT, O_DIRECT },
+ // { P9_O_LARGEFILE, O_LARGEFILE },
+ // { P9_O_DIRECTORY, O_DIRECTORY },
+ { P9_O_NOFOLLOW, O_NOFOLLOW },
+ // { P9_O_NOATIME, O_NOATIME },
+ // { P9_O_CLOEXEC, O_CLOEXEC },
+ { P9_O_SYNC, O_SYNC },
+};
+
+static int p9_flags_to_host(int flags)
+{
+ int ret, i;
+
+ ret = (flags & P9_O_NOACCESS);
+ for(i = 0; i < countof(open_flags); i++) {
+ if (flags & open_flags[i][0])
+ ret |= open_flags[i][1];
+ }
+ return ret;
+}
+
+static void stat_to_qid(FSQID *qid, const struct stat *st)
+{
+ if (S_ISDIR(st->st_mode))
+ qid->type = P9_QTDIR;
+ else if (S_ISLNK(st->st_mode))
+ qid->type = P9_QTSYMLINK;
+ else
+ qid->type = P9_QTFILE;
+ qid->version = 0; /* no caching on client */
+ qid->path = st->st_ino;
+}
+
+static void fs_statfs(FSDevice *fs1, FSStatFS *st)
+{
+ FSDeviceDisk *fs = (FSDeviceDisk *)fs1;
+ struct statfs st1;
+ statfs(fs->root_path, &st1);
+ st->f_bsize = st1.f_bsize;
+ st->f_blocks = st1.f_blocks;
+ st->f_bfree = st1.f_bfree;
+ st->f_bavail = st1.f_bavail;
+ st->f_files = st1.f_files;
+ st->f_ffree = st1.f_ffree;
+}
+
+static char *compose_path(const char *path, const char *name)
+{
+ int path_len, name_len;
+ char *d;
+
+ path_len = strlen(path);
+ name_len = strlen(name);
+ d = malloc(path_len + 1 + name_len + 1);
+ memcpy(d, path, path_len);
+ d[path_len] = '/';
+ memcpy(d + path_len + 1, name, name_len + 1);
+ return d;
+}
+
+static int fs_attach(FSDevice *fs1, FSFile **pf,
+ FSQID *qid, uint32_t uid,
+ const char *uname, const char *aname)
+{
+ FSDeviceDisk *fs = (FSDeviceDisk *)fs1;
+ struct stat st;
+ FSFile *f;
+
+ if (lstat(fs->root_path, &st) != 0) {
+ *pf = NULL;
+ return -errno_to_p9(errno);
+ }
+ f = fid_create(fs1, strdup(fs->root_path), uid);
+ stat_to_qid(qid, &st);
+ *pf = f;
+ return 0;
+}
+
+static int fs_walk(FSDevice *fs, FSFile **pf, FSQID *qids,
+ FSFile *f, int n, char **names)
+{
+ char *path, *path1;
+ struct stat st;
+ int i;
+
+ path = strdup(f->path);
+ for(i = 0; i < n; i++) {
+ path1 = compose_path(path, names[i]);
+ if (lstat(path1, &st) != 0) {
+ free(path1);
+ break;
+ }
+ free(path);
+ path = path1;
+ stat_to_qid(&qids[i], &st);
+ }
+ *pf = fid_create(fs, path, f->uid);
+ return i;
+}
+
+
+static int fs_mkdir(FSDevice *fs, FSQID *qid, FSFile *f,
+ const char *name, uint32_t mode, uint32_t gid)
+{
+ char *path;
+ struct stat st;
+
+ path = compose_path(f->path, name);
+ if (mkdir(path, mode) < 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ if (lstat(path, &st) != 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ free(path);
+ stat_to_qid(qid, &st);
+ return 0;
+}
+
+static int fs_open(FSDevice *fs, FSQID *qid, FSFile *f, uint32_t flags,
+ FSOpenCompletionFunc *cb, void *opaque)
+{
+ struct stat st;
+ fs_close(fs, f);
+
+ if (stat(f->path, &st) != 0)
+ return -errno_to_p9(errno);
+ stat_to_qid(qid, &st);
+
+ if (flags & P9_O_DIRECTORY) {
+ DIR *dirp;
+ dirp = opendir(f->path);
+ if (!dirp)
+ return -errno_to_p9(errno);
+ f->is_opened = TRUE;
+ f->is_dir = TRUE;
+ f->u.dirp = dirp;
+ } else {
+ int fd;
+ fd = open(f->path, p9_flags_to_host(flags) & ~O_CREAT);
+ if (fd < 0)
+ return -errno_to_p9(errno);
+ f->is_opened = TRUE;
+ f->is_dir = FALSE;
+ f->u.fd = fd;
+ }
+ return 0;
+}
+
+static int fs_create(FSDevice *fs, FSQID *qid, FSFile *f, const char *name,
+ uint32_t flags, uint32_t mode, uint32_t gid)
+{
+ struct stat st;
+ char *path;
+ int ret, fd;
+
+ fs_close(fs, f);
+
+ path = compose_path(f->path, name);
+ fd = open(path, p9_flags_to_host(flags) | O_CREAT, mode);
+ if (fd < 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ ret = lstat(path, &st);
+ if (ret != 0) {
+ free(path);
+ close(fd);
+ return -errno_to_p9(errno);
+ }
+ free(f->path);
+ f->path = path;
+ f->is_opened = TRUE;
+ f->is_dir = FALSE;
+ f->u.fd = fd;
+ stat_to_qid(qid, &st);
+ return 0;
+}
+
+static int fs_readdir(FSDevice *fs, FSFile *f, uint64_t offset,
+ uint8_t *buf, int count)
+{
+ struct dirent *de;
+ int len, pos, name_len, type, d_type;
+
+ if (!f->is_opened || !f->is_dir)
+ return -P9_EPROTO;
+ if (offset == 0)
+ rewinddir(f->u.dirp);
+ else
+ seekdir(f->u.dirp, offset);
+ pos = 0;
+ for(;;) {
+ de = readdir(f->u.dirp);
+ if (de == NULL)
+ break;
+ name_len = strlen(de->d_name);
+ len = 13 + 8 + 1 + 2 + name_len;
+ if ((pos + len) > count)
+ break;
+ offset = telldir(f->u.dirp);
+ d_type = de->d_type;
+ if (d_type == DT_UNKNOWN) {
+ char *path;
+ struct stat st;
+ path = compose_path(f->path, de->d_name);
+ if (lstat(path, &st) == 0) {
+ d_type = st.st_mode >> 12;
+ } else {
+ d_type = DT_REG; /* default */
+ }
+ free(path);
+ }
+ if (d_type == DT_DIR)
+ type = P9_QTDIR;
+ else if (d_type == DT_LNK)
+ type = P9_QTSYMLINK;
+ else
+ type = P9_QTFILE;
+ buf[pos++] = type;
+ put_le32(buf + pos, 0); /* version */
+ pos += 4;
+ put_le64(buf + pos, de->d_ino);
+ pos += 8;
+ put_le64(buf + pos, offset);
+ pos += 8;
+ buf[pos++] = d_type;
+ put_le16(buf + pos, name_len);
+ pos += 2;
+ memcpy(buf + pos, de->d_name, name_len);
+ pos += name_len;
+ }
+ return pos;
+}
+
+static int fs_read(FSDevice *fs, FSFile *f, uint64_t offset,
+ uint8_t *buf, int count)
+{
+ int ret;
+
+ if (!f->is_opened || f->is_dir)
+ return -P9_EPROTO;
+ ret = pread(f->u.fd, buf, count, offset);
+ if (ret < 0)
+ return -errno_to_p9(errno);
+ else
+ return ret;
+}
+
+static int fs_write(FSDevice *fs, FSFile *f, uint64_t offset,
+ const uint8_t *buf, int count)
+{
+ int ret;
+
+ if (!f->is_opened || f->is_dir)
+ return -P9_EPROTO;
+ ret = pwrite(f->u.fd, buf, count, offset);
+ if (ret < 0)
+ return -errno_to_p9(errno);
+ else
+ return ret;
+}
+
+static void fs_close(FSDevice *fs, FSFile *f)
+{
+ if (!f->is_opened)
+ return;
+ if (f->is_dir)
+ closedir(f->u.dirp);
+ else
+ close(f->u.fd);
+ f->is_opened = FALSE;
+}
+
+static int fs_stat(FSDevice *fs, FSFile *f, FSStat *st)
+{
+ struct stat st1;
+
+ if (lstat(f->path, &st1) != 0)
+ return -P9_ENOENT;
+ stat_to_qid(&st->qid, &st1);
+ st->st_mode = st1.st_mode;
+ st->st_uid = st1.st_uid;
+ st->st_gid = st1.st_gid;
+ st->st_nlink = st1.st_nlink;
+ st->st_rdev = st1.st_rdev;
+ st->st_size = st1.st_size;
+ st->st_blksize = st1.st_blksize;
+ st->st_blocks = st1.st_blocks;
+ st->st_atime_sec = st1.st_atim.tv_sec;
+ st->st_atime_nsec = st1.st_atim.tv_nsec;
+ st->st_mtime_sec = st1.st_mtim.tv_sec;
+ st->st_mtime_nsec = st1.st_mtim.tv_nsec;
+ st->st_ctime_sec = st1.st_ctim.tv_sec;
+ st->st_ctime_nsec = st1.st_ctim.tv_nsec;
+ return 0;
+}
+
+static int fs_setattr(FSDevice *fs, FSFile *f, uint32_t mask,
+ uint32_t mode, uint32_t uid, uint32_t gid,
+ uint64_t size, uint64_t atime_sec, uint64_t atime_nsec,
+ uint64_t mtime_sec, uint64_t mtime_nsec)
+{
+ BOOL ctime_updated = FALSE;
+
+ if (mask & (P9_SETATTR_UID | P9_SETATTR_GID)) {
+ if (lchown(f->path, (mask & P9_SETATTR_UID) ? uid : -1,
+ (mask & P9_SETATTR_GID) ? gid : -1) < 0)
+ return -errno_to_p9(errno);
+ ctime_updated = TRUE;
+ }
+ /* must be done after uid change for suid */
+ if (mask & P9_SETATTR_MODE) {
+ if (chmod(f->path, mode) < 0)
+ return -errno_to_p9(errno);
+ ctime_updated = TRUE;
+ }
+ if (mask & P9_SETATTR_SIZE) {
+ if (truncate(f->path, size) < 0)
+ return -errno_to_p9(errno);
+ ctime_updated = TRUE;
+ }
+ if (mask & (P9_SETATTR_ATIME | P9_SETATTR_MTIME)) {
+ struct timespec ts[2];
+ if (mask & P9_SETATTR_ATIME) {
+ if (mask & P9_SETATTR_ATIME_SET) {
+ ts[0].tv_sec = atime_sec;
+ ts[0].tv_nsec = atime_nsec;
+ } else {
+ ts[0].tv_sec = 0;
+ ts[0].tv_nsec = UTIME_NOW;
+ }
+ } else {
+ ts[0].tv_sec = 0;
+ ts[0].tv_nsec = UTIME_OMIT;
+ }
+ if (mask & P9_SETATTR_MTIME) {
+ if (mask & P9_SETATTR_MTIME_SET) {
+ ts[1].tv_sec = mtime_sec;
+ ts[1].tv_nsec = mtime_nsec;
+ } else {
+ ts[1].tv_sec = 0;
+ ts[1].tv_nsec = UTIME_NOW;
+ }
+ } else {
+ ts[1].tv_sec = 0;
+ ts[1].tv_nsec = UTIME_OMIT;
+ }
+ if (utimensat(AT_FDCWD, f->path, ts, AT_SYMLINK_NOFOLLOW) < 0)
+ return -errno_to_p9(errno);
+ ctime_updated = TRUE;
+ }
+ if ((mask & P9_SETATTR_CTIME) && !ctime_updated) {
+ if (lchown(f->path, -1, -1) < 0)
+ return -errno_to_p9(errno);
+ }
+ return 0;
+}
+
+static int fs_link(FSDevice *fs, FSFile *df, FSFile *f, const char *name)
+{
+ char *path;
+
+ path = compose_path(df->path, name);
+ if (link(f->path, path) < 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ free(path);
+ return 0;
+}
+
+static int fs_symlink(FSDevice *fs, FSQID *qid,
+ FSFile *f, const char *name, const char *symgt, uint32_t gid)
+{
+ char *path;
+ struct stat st;
+
+ path = compose_path(f->path, name);
+ if (symlink(symgt, path) < 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ if (lstat(path, &st) != 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ free(path);
+ stat_to_qid(qid, &st);
+ return 0;
+}
+
+static int fs_mknod(FSDevice *fs, FSQID *qid,
+ FSFile *f, const char *name, uint32_t mode, uint32_t major,
+ uint32_t minor, uint32_t gid)
+{
+ char *path;
+ struct stat st;
+
+ path = compose_path(f->path, name);
+ if (mknod(path, mode, makedev(major, minor)) < 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ if (lstat(path, &st) != 0) {
+ free(path);
+ return -errno_to_p9(errno);
+ }
+ free(path);
+ stat_to_qid(qid, &st);
+ return 0;
+}
+
+static int fs_readlink(FSDevice *fs, char *buf, int buf_size, FSFile *f)
+{
+ int ret;
+ ret = readlink(f->path, buf, buf_size - 1);
+ if (ret < 0)
+ return -errno_to_p9(errno);
+ buf[ret] = '\0';
+ return 0;
+}
+
+static int fs_renameat(FSDevice *fs, FSFile *f, const char *name,
+ FSFile *new_f, const char *new_name)
+{
+ char *path, *new_path;
+ int ret;
+
+ path = compose_path(f->path, name);
+ new_path = compose_path(new_f->path, new_name);
+ ret = rename(path, new_path);
+ free(path);
+ free(new_path);
+ if (ret < 0)
+ return -errno_to_p9(errno);
+ return 0;
+}
+
+static int fs_unlinkat(FSDevice *fs, FSFile *f, const char *name)
+{
+ char *path;
+ int ret;
+
+ path = compose_path(f->path, name);
+ ret = remove(path);
+ free(path);
+ if (ret < 0)
+ return -errno_to_p9(errno);
+ return 0;
+
+}
+
+static int fs_lock(FSDevice *fs, FSFile *f, const FSLock *lock)
+{
+ int ret;
+ struct flock fl;
+
+ /* XXX: lock directories too */
+ if (!f->is_opened || f->is_dir)
+ return -P9_EPROTO;
+
+ fl.l_type = lock->type;
+ fl.l_whence = SEEK_SET;
+ fl.l_start = lock->start;
+ fl.l_len = lock->length;
+
+ ret = fcntl(f->u.fd, F_SETLK, &fl);
+ if (ret == 0) {
+ ret = P9_LOCK_SUCCESS;
+ } else if (errno == EAGAIN || errno == EACCES) {
+ ret = P9_LOCK_BLOCKED;
+ } else {
+ ret = -errno_to_p9(errno);
+ }
+ return ret;
+}
+
+static int fs_getlock(FSDevice *fs, FSFile *f, FSLock *lock)
+{
+ int ret;
+ struct flock fl;
+
+ /* XXX: lock directories too */
+ if (!f->is_opened || f->is_dir)
+ return -P9_EPROTO;
+
+ fl.l_type = lock->type;
+ fl.l_whence = SEEK_SET;
+ fl.l_start = lock->start;
+ fl.l_len = lock->length;
+
+ ret = fcntl(f->u.fd, F_GETLK, &fl);
+ if (ret < 0) {
+ ret = -errno_to_p9(errno);
+ } else {
+ lock->type = fl.l_type;
+ lock->start = fl.l_start;
+ lock->length = fl.l_len;
+ }
+ return ret;
+}
+
+static void fs_disk_end(FSDevice *fs1)
+{
+ FSDeviceDisk *fs = (FSDeviceDisk *)fs1;
+ free(fs->root_path);
+}
+
+FSDevice *fs_disk_init(const char *root_path)
+{
+ FSDeviceDisk *fs;
+ struct stat st;
+
+ lstat(root_path, &st);
+ if (!S_ISDIR(st.st_mode))
+ return NULL;
+
+ fs = mallocz(sizeof(*fs));
+
+ fs->common.fs_end = fs_disk_end;
+ fs->common.fs_delete = fs_delete;
+ fs->common.fs_statfs = fs_statfs;
+ fs->common.fs_attach = fs_attach;
+ fs->common.fs_walk = fs_walk;
+ fs->common.fs_mkdir = fs_mkdir;
+ fs->common.fs_open = fs_open;
+ fs->common.fs_create = fs_create;
+ fs->common.fs_stat = fs_stat;
+ fs->common.fs_setattr = fs_setattr;
+ fs->common.fs_close = fs_close;
+ fs->common.fs_readdir = fs_readdir;
+ fs->common.fs_read = fs_read;
+ fs->common.fs_write = fs_write;
+ fs->common.fs_link = fs_link;
+ fs->common.fs_symlink = fs_symlink;
+ fs->common.fs_mknod = fs_mknod;
+ fs->common.fs_readlink = fs_readlink;
+ fs->common.fs_renameat = fs_renameat;
+ fs->common.fs_unlinkat = fs_unlinkat;
+ fs->common.fs_lock = fs_lock;
+ fs->common.fs_getlock = fs_getlock;
+
+ fs->root_path = strdup(root_path);
+ return (FSDevice *)fs;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_net.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_net.c
new file mode 100644
index 0000000..c7c7484
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_net.c
@@ -0,0 +1,2910 @@
+/*
+ * Networked Filesystem using HTTP
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <sys/time.h>
+#include <ctype.h>
+
+#include "cutils.h"
+#include "list.h"
+#include "fs.h"
+#include "fs_utils.h"
+#include "fs_wget.h"
+#include "fbuf.h"
+
+#if defined(EMSCRIPTEN)
+#include <emscripten.h>
+#endif
+
+/*
+ TODO:
+ - implement fs_lock/fs_getlock
+ - update fs_size with links ?
+ - limit fs_size in dirent creation
+ - limit filename length
+*/
+
+//#define DEBUG_CACHE
+#if !defined(EMSCRIPTEN)
+#define DUMP_CACHE_LOAD
+#endif
+
+#if defined(EMSCRIPTEN)
+#define DEFAULT_INODE_CACHE_SIZE (64 * 1024 * 1024)
+#else
+#define DEFAULT_INODE_CACHE_SIZE (256 * 1024 * 1024)
+#endif
+
+typedef enum {
+ FT_FIFO = 1,
+ FT_CHR = 2,
+ FT_DIR = 4,
+ FT_BLK = 6,
+ FT_REG = 8,
+ FT_LNK = 10,
+ FT_SOCK = 12,
+} FSINodeTypeEnum;
+
+typedef enum {
+ REG_STATE_LOCAL, /* local content */
+ REG_STATE_UNLOADED, /* content not loaded */
+ REG_STATE_LOADING, /* content is being loaded */
+ REG_STATE_LOADED, /* loaded, not modified, stored in cached_inode_list */
+} FSINodeRegStateEnum;
+
+typedef struct FSBaseURL {
+ struct list_head link;
+ int ref_count;
+ char *base_url_id;
+ char *url;
+ char *user;
+ char *password;
+ BOOL encrypted;
+ AES_KEY aes_state;
+} FSBaseURL;
+
+typedef struct FSINode {
+ struct list_head link;
+ uint64_t inode_num; /* inode number */
+ int32_t refcount;
+ int32_t open_count;
+ FSINodeTypeEnum type;
+ uint32_t mode;
+ uint32_t uid;
+ uint32_t gid;
+ uint32_t mtime_sec;
+ uint32_t ctime_sec;
+ uint32_t mtime_nsec;
+ uint32_t ctime_nsec;
+ union {
+ struct {
+ FSINodeRegStateEnum state;
+ size_t size; /* real file size */
+ FileBuffer fbuf;
+ FSBaseURL *base_url;
+ FSFileID file_id; /* network file ID */
+ struct list_head link;
+ struct FSOpenInfo *open_info; /* used in LOADING state */
+ BOOL is_fscmd;
+#ifdef DUMP_CACHE_LOAD
+ char *filename;
+#endif
+ } reg;
+ struct {
+ struct list_head de_list; /* list of FSDirEntry */
+ int size;
+ } dir;
+ struct {
+ uint32_t major;
+ uint32_t minor;
+ } dev;
+ struct {
+ char *name;
+ } symlink;
+ } u;
+} FSINode;
+
+typedef struct {
+ struct list_head link;
+ FSINode *inode;
+ uint8_t mark; /* temporary use only */
+ char name[0];
+} FSDirEntry;
+
+typedef enum {
+ FS_CMD_XHR,
+ FS_CMD_PBKDF2,
+} FSCMDRequestEnum;
+
+#define FS_CMD_REPLY_LEN_MAX 64
+
+typedef struct {
+ FSCMDRequestEnum type;
+ struct CmdXHRState *xhr_state;
+ int reply_len;
+ uint8_t reply_buf[FS_CMD_REPLY_LEN_MAX];
+} FSCMDRequest;
+
+struct FSFile {
+ uint32_t uid;
+ FSINode *inode;
+ BOOL is_opened;
+ uint32_t open_flags;
+ FSCMDRequest *req;
+};
+
+typedef struct {
+ struct list_head link;
+ BOOL is_archive;
+ const char *name;
+} PreloadFile;
+
+typedef struct {
+ struct list_head link;
+ FSFileID file_id;
+ struct list_head file_list; /* list of PreloadFile.link */
+} PreloadEntry;
+
+typedef struct {
+ struct list_head link;
+ FSFileID file_id;
+ uint64_t size;
+ const char *name;
+} PreloadArchiveFile;
+
+typedef struct {
+ struct list_head link;
+ const char *name;
+ struct list_head file_list; /* list of PreloadArchiveFile.link */
+} PreloadArchive;
+
+typedef struct FSDeviceMem {
+ FSDevice common;
+
+ struct list_head inode_list; /* list of FSINode */
+ int64_t inode_count; /* current number of inodes */
+ uint64_t inode_limit;
+ int64_t fs_blocks;
+ uint64_t fs_max_blocks;
+ uint64_t inode_num_alloc;
+ int block_size_log2;
+ uint32_t block_size; /* for stat/statfs */
+ FSINode *root_inode;
+ struct list_head inode_cache_list; /* list of FSINode.u.reg.link */
+ int64_t inode_cache_size;
+ int64_t inode_cache_size_limit;
+ struct list_head preload_list; /* list of PreloadEntry.link */
+ struct list_head preload_archive_list; /* list of PreloadArchive.link */
+ /* network */
+ struct list_head base_url_list; /* list of FSBaseURL.link */
+ char *import_dir;
+#ifdef DUMP_CACHE_LOAD
+ BOOL dump_cache_load;
+ BOOL dump_started;
+ char *dump_preload_dir;
+ FILE *dump_preload_file;
+ FILE *dump_preload_archive_file;
+
+ char *dump_archive_name;
+ uint64_t dump_archive_size;
+ FILE *dump_archive_file;
+
+ int dump_archive_num;
+ struct list_head dump_preload_list; /* list of PreloadFile.link */
+ struct list_head dump_exclude_list; /* list of PreloadFile.link */
+#endif
+} FSDeviceMem;
+
+typedef enum {
+ FS_OPEN_WGET_REG,
+ FS_OPEN_WGET_ARCHIVE,
+ FS_OPEN_WGET_ARCHIVE_FILE,
+} FSOpenWgetEnum;
+
+typedef struct FSOpenInfo {
+ FSDevice *fs;
+ FSOpenWgetEnum open_type;
+
+ /* used for FS_OPEN_WGET_REG, FS_OPEN_WGET_ARCHIVE */
+ XHRState *xhr;
+ FSINode *n;
+ DecryptFileState *dec_state;
+ size_t cur_pos;
+
+ struct list_head archive_link; /* FS_OPEN_WGET_ARCHIVE_FILE */
+ uint64_t archive_offset; /* FS_OPEN_WGET_ARCHIVE_FILE */
+ struct list_head archive_file_list; /* FS_OPEN_WGET_ARCHIVE */
+
+ /* the following is set in case there is a fs_open callback */
+ FSFile *f;
+ FSOpenCompletionFunc *cb;
+ void *opaque;
+} FSOpenInfo;
+
+static void fs_close(FSDevice *fs, FSFile *f);
+static void inode_decref(FSDevice *fs1, FSINode *n);
+static int fs_cmd_write(FSDevice *fs, FSFile *f, uint64_t offset,
+ const uint8_t *buf, int buf_len);
+static int fs_cmd_read(FSDevice *fs, FSFile *f, uint64_t offset,
+ uint8_t *buf, int buf_len);
+static int fs_truncate(FSDevice *fs1, FSINode *n, uint64_t size);
+static void fs_open_end(FSOpenInfo *oi);
+static void fs_base_url_decref(FSDevice *fs, FSBaseURL *bu);
+static FSBaseURL *fs_net_set_base_url(FSDevice *fs1,
+ const char *base_url_id,
+ const char *url,
+ const char *user, const char *password,
+ AES_KEY *aes_state);
+static void fs_cmd_close(FSDevice *fs, FSFile *f);
+static void fs_error_archive(FSOpenInfo *oi);
+#ifdef DUMP_CACHE_LOAD
+static void dump_loaded_file(FSDevice *fs1, FSINode *n);
+#endif
+
+#if !defined(EMSCRIPTEN)
+/* file buffer (the content of the buffer can be stored elsewhere) */
+void file_buffer_init(FileBuffer *bs)
+{
+ bs->data = NULL;
+ bs->allocated_size = 0;
+}
+
+void file_buffer_reset(FileBuffer *bs)
+{
+ free(bs->data);
+ file_buffer_init(bs);
+}
+
+int file_buffer_resize(FileBuffer *bs, size_t new_size)
+{
+ uint8_t *new_data;
+ new_data = realloc(bs->data, new_size);
+ if (!new_data && new_size != 0)
+ return -1;
+ bs->data = new_data;
+ bs->allocated_size = new_size;
+ return 0;
+}
+
+void file_buffer_write(FileBuffer *bs, size_t offset, const uint8_t *buf,
+ size_t size)
+{
+ memcpy(bs->data + offset, buf, size);
+}
+
+void file_buffer_set(FileBuffer *bs, size_t offset, int val, size_t size)
+{
+ memset(bs->data + offset, val, size);
+}
+
+void file_buffer_read(FileBuffer *bs, size_t offset, uint8_t *buf,
+ size_t size)
+{
+ memcpy(buf, bs->data + offset, size);
+}
+#endif
+
+static int64_t to_blocks(FSDeviceMem *fs, uint64_t size)
+{
+ return (size + fs->block_size - 1) >> fs->block_size_log2;
+}
+
+static FSINode *inode_incref(FSDevice *fs, FSINode *n)
+{
+ n->refcount++;
+ return n;
+}
+
+static FSINode *inode_inc_open(FSDevice *fs, FSINode *n)
+{
+ n->open_count++;
+ return n;
+}
+
+static void inode_free(FSDevice *fs1, FSINode *n)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+
+ // printf("inode_free=%" PRId64 "\n", n->inode_num);
+ assert(n->refcount == 0);
+ assert(n->open_count == 0);
+ switch(n->type) {
+ case FT_REG:
+ fs->fs_blocks -= to_blocks(fs, n->u.reg.size);
+ assert(fs->fs_blocks >= 0);
+ file_buffer_reset(&n->u.reg.fbuf);
+#ifdef DUMP_CACHE_LOAD
+ free(n->u.reg.filename);
+#endif
+ switch(n->u.reg.state) {
+ case REG_STATE_LOADED:
+ list_del(&n->u.reg.link);
+ fs->inode_cache_size -= n->u.reg.size;
+ assert(fs->inode_cache_size >= 0);
+ fs_base_url_decref(fs1, n->u.reg.base_url);
+ break;
+ case REG_STATE_LOADING:
+ {
+ FSOpenInfo *oi = n->u.reg.open_info;
+ if (oi->xhr)
+ fs_wget_free(oi->xhr);
+ if (oi->open_type == FS_OPEN_WGET_ARCHIVE) {
+ fs_error_archive(oi);
+ }
+ fs_open_end(oi);
+ fs_base_url_decref(fs1, n->u.reg.base_url);
+ }
+ break;
+ case REG_STATE_UNLOADED:
+ fs_base_url_decref(fs1, n->u.reg.base_url);
+ break;
+ case REG_STATE_LOCAL:
+ break;
+ default:
+ abort();
+ }
+ break;
+ case FT_LNK:
+ free(n->u.symlink.name);
+ break;
+ case FT_DIR:
+ assert(list_empty(&n->u.dir.de_list));
+ break;
+ default:
+ break;
+ }
+ list_del(&n->link);
+ free(n);
+ fs->inode_count--;
+ assert(fs->inode_count >= 0);
+}
+
+static void inode_decref(FSDevice *fs1, FSINode *n)
+{
+ assert(n->refcount >= 1);
+ if (--n->refcount <= 0 && n->open_count <= 0) {
+ inode_free(fs1, n);
+ }
+}
+
+static void inode_dec_open(FSDevice *fs1, FSINode *n)
+{
+ assert(n->open_count >= 1);
+ if (--n->open_count <= 0 && n->refcount <= 0) {
+ inode_free(fs1, n);
+ }
+}
+
+static void inode_update_mtime(FSDevice *fs, FSINode *n)
+{
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ n->mtime_sec = tv.tv_sec;
+ n->mtime_nsec = tv.tv_usec * 1000;
+}
+
+static FSINode *inode_new(FSDevice *fs1, FSINodeTypeEnum type,
+ uint32_t mode, uint32_t uid, uint32_t gid)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ FSINode *n;
+
+ n = mallocz(sizeof(*n));
+ n->refcount = 1;
+ n->open_count = 0;
+ n->inode_num = fs->inode_num_alloc;
+ fs->inode_num_alloc++;
+ n->type = type;
+ n->mode = mode & 0xfff;
+ n->uid = uid;
+ n->gid = gid;
+
+ switch(type) {
+ case FT_REG:
+ file_buffer_init(&n->u.reg.fbuf);
+ break;
+ case FT_DIR:
+ init_list_head(&n->u.dir.de_list);
+ break;
+ default:
+ break;
+ }
+
+ list_add(&n->link, &fs->inode_list);
+ fs->inode_count++;
+
+ inode_update_mtime(fs1, n);
+ n->ctime_sec = n->mtime_sec;
+ n->ctime_nsec = n->mtime_nsec;
+
+ return n;
+}
+
+/* warning: the refcount of 'n1' is not incremented by this function */
+/* XXX: test FS max size */
+static FSDirEntry *inode_dir_add(FSDevice *fs1, FSINode *n, const char *name,
+ FSINode *n1)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ FSDirEntry *de;
+ int name_len, dirent_size, new_size;
+ assert(n->type == FT_DIR);
+
+ name_len = strlen(name);
+ de = mallocz(sizeof(*de) + name_len + 1);
+ de->inode = n1;
+ memcpy(de->name, name, name_len + 1);
+ dirent_size = sizeof(*de) + name_len + 1;
+ new_size = n->u.dir.size + dirent_size;
+ fs->fs_blocks += to_blocks(fs, new_size) - to_blocks(fs, n->u.dir.size);
+ n->u.dir.size = new_size;
+ list_add_tail(&de->link, &n->u.dir.de_list);
+ return de;
+}
+
+static FSDirEntry *inode_search(FSINode *n, const char *name)
+{
+ struct list_head *el;
+ FSDirEntry *de;
+
+ if (n->type != FT_DIR)
+ return NULL;
+
+ list_for_each(el, &n->u.dir.de_list) {
+ de = list_entry(el, FSDirEntry, link);
+ if (!strcmp(de->name, name))
+ return de;
+ }
+ return NULL;
+}
+
+static FSINode *inode_search_path1(FSDevice *fs, FSINode *n, const char *path)
+{
+ char name[1024];
+ const char *p, *p1;
+ int len;
+ FSDirEntry *de;
+
+ p = path;
+ if (*p == '/')
+ p++;
+ if (*p == '\0')
+ return n;
+ for(;;) {
+ p1 = strchr(p, '/');
+ if (!p1) {
+ len = strlen(p);
+ } else {
+ len = p1 - p;
+ p1++;
+ }
+ if (len > sizeof(name) - 1)
+ return NULL;
+ memcpy(name, p, len);
+ name[len] = '\0';
+ if (n->type != FT_DIR)
+ return NULL;
+ de = inode_search(n, name);
+ if (!de)
+ return NULL;
+ n = de->inode;
+ p = p1;
+ if (!p)
+ break;
+ }
+ return n;
+}
+
+static FSINode *inode_search_path(FSDevice *fs1, const char *path)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ if (!fs1)
+ return NULL;
+ return inode_search_path1(fs1, fs->root_inode, path);
+}
+
+static BOOL is_empty_dir(FSDevice *fs, FSINode *n)
+{
+ struct list_head *el;
+ FSDirEntry *de;
+
+ list_for_each(el, &n->u.dir.de_list) {
+ de = list_entry(el, FSDirEntry, link);
+ if (strcmp(de->name, ".") != 0 &&
+ strcmp(de->name, "..") != 0)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void inode_dirent_delete_no_decref(FSDevice *fs1, FSINode *n, FSDirEntry *de)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ int dirent_size, new_size;
+ dirent_size = sizeof(*de) + strlen(de->name) + 1;
+
+ new_size = n->u.dir.size - dirent_size;
+ fs->fs_blocks += to_blocks(fs, new_size) - to_blocks(fs, n->u.dir.size);
+ n->u.dir.size = new_size;
+ assert(n->u.dir.size >= 0);
+ assert(fs->fs_blocks >= 0);
+ list_del(&de->link);
+ free(de);
+}
+
+static void inode_dirent_delete(FSDevice *fs, FSINode *n, FSDirEntry *de)
+{
+ FSINode *n1;
+ n1 = de->inode;
+ inode_dirent_delete_no_decref(fs, n, de);
+ inode_decref(fs, n1);
+}
+
+static void flush_dir(FSDevice *fs, FSINode *n)
+{
+ struct list_head *el, *el1;
+ FSDirEntry *de;
+ list_for_each_safe(el, el1, &n->u.dir.de_list) {
+ de = list_entry(el, FSDirEntry, link);
+ inode_dirent_delete(fs, n, de);
+ }
+ assert(n->u.dir.size == 0);
+}
+
+static void fs_delete(FSDevice *fs, FSFile *f)
+{
+ fs_close(fs, f);
+ inode_dec_open(fs, f->inode);
+ free(f);
+}
+
+static FSFile *fid_create(FSDevice *fs1, FSINode *n, uint32_t uid)
+{
+ FSFile *f;
+
+ f = mallocz(sizeof(*f));
+ f->inode = inode_inc_open(fs1, n);
+ f->uid = uid;
+ return f;
+}
+
+static void inode_to_qid(FSQID *qid, FSINode *n)
+{
+ if (n->type == FT_DIR)
+ qid->type = P9_QTDIR;
+ else if (n->type == FT_LNK)
+ qid->type = P9_QTSYMLINK;
+ else
+ qid->type = P9_QTFILE;
+ qid->version = 0; /* no caching on client */
+ qid->path = n->inode_num;
+}
+
+static void fs_statfs(FSDevice *fs1, FSStatFS *st)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ st->f_bsize = 1024;
+ st->f_blocks = fs->fs_max_blocks <<
+ (fs->block_size_log2 - 10);
+ st->f_bfree = (fs->fs_max_blocks - fs->fs_blocks) <<
+ (fs->block_size_log2 - 10);
+ st->f_bavail = st->f_bfree;
+ st->f_files = fs->inode_limit;
+ st->f_ffree = fs->inode_limit - fs->inode_count;
+}
+
+static int fs_attach(FSDevice *fs1, FSFile **pf, FSQID *qid, uint32_t uid,
+ const char *uname, const char *aname)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+
+ *pf = fid_create(fs1, fs->root_inode, uid);
+ inode_to_qid(qid, fs->root_inode);
+ return 0;
+}
+
+static int fs_walk(FSDevice *fs, FSFile **pf, FSQID *qids,
+ FSFile *f, int count, char **names)
+{
+ int i;
+ FSINode *n;
+ FSDirEntry *de;
+
+ n = f->inode;
+ for(i = 0; i < count; i++) {
+ de = inode_search(n, names[i]);
+ if (!de)
+ break;
+ n = de->inode;
+ inode_to_qid(&qids[i], n);
+ }
+ *pf = fid_create(fs, n, f->uid);
+ return i;
+}
+
+static int fs_mkdir(FSDevice *fs, FSQID *qid, FSFile *f,
+ const char *name, uint32_t mode, uint32_t gid)
+{
+ FSINode *n, *n1;
+
+ n = f->inode;
+ if (n->type != FT_DIR)
+ return -P9_ENOTDIR;
+ if (inode_search(n, name))
+ return -P9_EEXIST;
+ n1 = inode_new(fs, FT_DIR, mode, f->uid, gid);
+ inode_dir_add(fs, n1, ".", inode_incref(fs, n1));
+ inode_dir_add(fs, n1, "..", inode_incref(fs, n));
+ inode_dir_add(fs, n, name, n1);
+ inode_to_qid(qid, n1);
+ return 0;
+}
+
+/* remove elements in the cache considering that 'added_size' will be
+ added */
+static void fs_trim_cache(FSDevice *fs1, int64_t added_size)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ struct list_head *el, *el1;
+ FSINode *n;
+
+ if ((fs->inode_cache_size + added_size) <= fs->inode_cache_size_limit)
+ return;
+ list_for_each_prev_safe(el, el1, &fs->inode_cache_list) {
+ n = list_entry(el, FSINode, u.reg.link);
+ assert(n->u.reg.state == REG_STATE_LOADED);
+ /* cannot remove open files */
+ // printf("open_count=%d\n", n->open_count);
+ if (n->open_count != 0)
+ continue;
+#ifdef DEBUG_CACHE
+ printf("fs_trim_cache: remove '%s' size=%ld\n",
+ n->u.reg.filename, (long)n->u.reg.size);
+#endif
+ file_buffer_reset(&n->u.reg.fbuf);
+ n->u.reg.state = REG_STATE_UNLOADED;
+ list_del(&n->u.reg.link);
+ fs->inode_cache_size -= n->u.reg.size;
+ assert(fs->inode_cache_size >= 0);
+ if ((fs->inode_cache_size + added_size) <= fs->inode_cache_size_limit)
+ break;
+ }
+}
+
+static void fs_open_end(FSOpenInfo *oi)
+{
+ if (oi->open_type == FS_OPEN_WGET_ARCHIVE_FILE) {
+ list_del(&oi->archive_link);
+ }
+ if (oi->dec_state)
+ decrypt_file_end(oi->dec_state);
+ free(oi);
+}
+
+static int fs_open_write_cb(void *opaque, const uint8_t *data, size_t size)
+{
+ FSOpenInfo *oi = opaque;
+ size_t len;
+ FSINode *n = oi->n;
+
+ /* we ignore extraneous data */
+ len = n->u.reg.size - oi->cur_pos;
+ if (size < len)
+ len = size;
+ file_buffer_write(&n->u.reg.fbuf, oi->cur_pos, data, len);
+ oi->cur_pos += len;
+ return 0;
+}
+
+static void fs_wget_set_loaded(FSINode *n)
+{
+ FSOpenInfo *oi;
+ FSDeviceMem *fs;
+ FSFile *f;
+ FSQID qid;
+
+ assert(n->u.reg.state == REG_STATE_LOADING);
+ oi = n->u.reg.open_info;
+ fs = (FSDeviceMem *)oi->fs;
+ n->u.reg.state = REG_STATE_LOADED;
+ list_add(&n->u.reg.link, &fs->inode_cache_list);
+ fs->inode_cache_size += n->u.reg.size;
+
+ if (oi->cb) {
+ f = oi->f;
+ f->is_opened = TRUE;
+ inode_to_qid(&qid, n);
+ oi->cb(oi->fs, &qid, 0, oi->opaque);
+ }
+ fs_open_end(oi);
+}
+
+static void fs_wget_set_error(FSINode *n)
+{
+ FSOpenInfo *oi;
+ assert(n->u.reg.state == REG_STATE_LOADING);
+ oi = n->u.reg.open_info;
+ n->u.reg.state = REG_STATE_UNLOADED;
+ file_buffer_reset(&n->u.reg.fbuf);
+ if (oi->cb) {
+ oi->cb(oi->fs, NULL, -P9_EIO, oi->opaque);
+ }
+ fs_open_end(oi);
+}
+
+static void fs_read_archive(FSOpenInfo *oi)
+{
+ FSINode *n = oi->n;
+ uint64_t pos, pos1, l;
+ uint8_t buf[1024];
+ FSINode *n1;
+ FSOpenInfo *oi1;
+ struct list_head *el, *el1;
+
+ list_for_each_safe(el, el1, &oi->archive_file_list) {
+ oi1 = list_entry(el, FSOpenInfo, archive_link);
+ n1 = oi1->n;
+ /* copy the archive data to the file */
+ pos = oi1->archive_offset;
+ pos1 = 0;
+ while (pos1 < n1->u.reg.size) {
+ l = n1->u.reg.size - pos1;
+ if (l > sizeof(buf))
+ l = sizeof(buf);
+ file_buffer_read(&n->u.reg.fbuf, pos, buf, l);
+ file_buffer_write(&n1->u.reg.fbuf, pos1, buf, l);
+ pos += l;
+ pos1 += l;
+ }
+ fs_wget_set_loaded(n1);
+ }
+}
+
+static void fs_error_archive(FSOpenInfo *oi)
+{
+ FSOpenInfo *oi1;
+ struct list_head *el, *el1;
+
+ list_for_each_safe(el, el1, &oi->archive_file_list) {
+ oi1 = list_entry(el, FSOpenInfo, archive_link);
+ fs_wget_set_error(oi1->n);
+ }
+}
+
+static void fs_open_cb(void *opaque, int err, void *data, size_t size)
+{
+ FSOpenInfo *oi = opaque;
+ FSINode *n = oi->n;
+
+ // printf("open_cb: err=%d size=%ld\n", err, size);
+ if (err < 0) {
+ error:
+ if (oi->open_type == FS_OPEN_WGET_ARCHIVE)
+ fs_error_archive(oi);
+ fs_wget_set_error(n);
+ } else {
+ if (oi->dec_state) {
+ if (decrypt_file(oi->dec_state, data, size) < 0)
+ goto error;
+ if (err == 0) {
+ if (decrypt_file_flush(oi->dec_state) < 0)
+ goto error;
+ }
+ } else {
+ fs_open_write_cb(oi, data, size);
+ }
+
+ if (err == 0) {
+ /* end of transfer */
+ if (oi->cur_pos != n->u.reg.size)
+ goto error;
+#ifdef DUMP_CACHE_LOAD
+ dump_loaded_file(oi->fs, n);
+#endif
+ if (oi->open_type == FS_OPEN_WGET_ARCHIVE)
+ fs_read_archive(oi);
+ fs_wget_set_loaded(n);
+ }
+ }
+}
+
+
+static int fs_open_wget(FSDevice *fs1, FSINode *n, FSOpenWgetEnum open_type)
+{
+ char *url;
+ FSOpenInfo *oi;
+ char fname[FILEID_SIZE_MAX];
+ FSBaseURL *bu;
+
+ assert(n->u.reg.state == REG_STATE_UNLOADED);
+
+ fs_trim_cache(fs1, n->u.reg.size);
+
+ if (file_buffer_resize(&n->u.reg.fbuf, n->u.reg.size) < 0)
+ return -P9_EIO;
+ n->u.reg.state = REG_STATE_LOADING;
+ oi = mallocz(sizeof(*oi));
+ oi->cur_pos = 0;
+ oi->fs = fs1;
+ oi->n = n;
+ oi->open_type = open_type;
+ if (open_type != FS_OPEN_WGET_ARCHIVE_FILE) {
+ if (open_type == FS_OPEN_WGET_ARCHIVE)
+ init_list_head(&oi->archive_file_list);
+ file_id_to_filename(fname, n->u.reg.file_id);
+ bu = n->u.reg.base_url;
+ url = compose_path(bu->url, fname);
+ if (bu->encrypted) {
+ oi->dec_state = decrypt_file_init(&bu->aes_state, fs_open_write_cb, oi);
+ }
+ oi->xhr = fs_wget(url, bu->user, bu->password, oi, fs_open_cb, FALSE);
+ }
+ n->u.reg.open_info = oi;
+ return 0;
+}
+
+
+static void fs_preload_file(FSDevice *fs1, const char *filename)
+{
+ FSINode *n;
+
+ n = inode_search_path(fs1, filename);
+ if (n && n->type == FT_REG && n->u.reg.state == REG_STATE_UNLOADED) {
+#if defined(DEBUG_CACHE)
+ printf("preload: %s\n", filename);
+#endif
+ fs_open_wget(fs1, n, FS_OPEN_WGET_REG);
+ }
+}
+
+static PreloadArchive *find_preload_archive(FSDeviceMem *fs,
+ const char *filename)
+{
+ PreloadArchive *pa;
+ struct list_head *el;
+ list_for_each(el, &fs->preload_archive_list) {
+ pa = list_entry(el, PreloadArchive, link);
+ if (!strcmp(pa->name, filename))
+ return pa;
+ }
+ return NULL;
+}
+
+static void fs_preload_archive(FSDevice *fs1, const char *filename)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ PreloadArchive *pa;
+ PreloadArchiveFile *paf;
+ struct list_head *el;
+ FSINode *n, *n1;
+ uint64_t offset;
+ BOOL has_unloaded;
+
+ pa = find_preload_archive(fs, filename);
+ if (!pa)
+ return;
+#if defined(DEBUG_CACHE)
+ printf("preload archive: %s\n", filename);
+#endif
+ n = inode_search_path(fs1, filename);
+ if (n && n->type == FT_REG && n->u.reg.state == REG_STATE_UNLOADED) {
+ /* if all the files are loaded, no need to load the archive */
+ offset = 0;
+ has_unloaded = FALSE;
+ list_for_each(el, &pa->file_list) {
+ paf = list_entry(el, PreloadArchiveFile, link);
+ n1 = inode_search_path(fs1, paf->name);
+ if (n1 && n1->type == FT_REG &&
+ n1->u.reg.state == REG_STATE_UNLOADED) {
+ has_unloaded = TRUE;
+ }
+ offset += paf->size;
+ }
+ if (!has_unloaded) {
+#if defined(DEBUG_CACHE)
+ printf("archive files already loaded\n");
+#endif
+ return;
+ }
+ /* check archive size consistency */
+ if (offset != n->u.reg.size) {
+#if defined(DEBUG_CACHE)
+ printf(" inconsistent archive size: %" PRId64 " %" PRId64 "\n",
+ offset, n->u.reg.size);
+#endif
+ goto load_fallback;
+ }
+
+ /* start loading the archive */
+ fs_open_wget(fs1, n, FS_OPEN_WGET_ARCHIVE);
+
+ /* indicate that all the archive files are being loaded. Also
+ check consistency of size and file id */
+ offset = 0;
+ list_for_each(el, &pa->file_list) {
+ paf = list_entry(el, PreloadArchiveFile, link);
+ n1 = inode_search_path(fs1, paf->name);
+ if (n1 && n1->type == FT_REG &&
+ n1->u.reg.state == REG_STATE_UNLOADED) {
+ if (n1->u.reg.size == paf->size &&
+ n1->u.reg.file_id == paf->file_id) {
+ fs_open_wget(fs1, n1, FS_OPEN_WGET_ARCHIVE_FILE);
+ list_add_tail(&n1->u.reg.open_info->archive_link,
+ &n->u.reg.open_info->archive_file_list);
+ n1->u.reg.open_info->archive_offset = offset;
+ } else {
+#if defined(DEBUG_CACHE)
+ printf(" inconsistent archive file: %s\n", paf->name);
+#endif
+ /* fallback to file preload */
+ fs_preload_file(fs1, paf->name);
+ }
+ }
+ offset += paf->size;
+ }
+ } else {
+ load_fallback:
+ /* if the archive is already loaded or not loaded, we load the
+ files separately (XXX: not optimal if the archive is
+ already loaded, but it should not happen often) */
+ list_for_each(el, &pa->file_list) {
+ paf = list_entry(el, PreloadArchiveFile, link);
+ fs_preload_file(fs1, paf->name);
+ }
+ }
+}
+
+static void fs_preload_files(FSDevice *fs1, FSFileID file_id)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ struct list_head *el;
+ PreloadEntry *pe;
+ PreloadFile *pf;
+
+ list_for_each(el, &fs->preload_list) {
+ pe = list_entry(el, PreloadEntry, link);
+ if (pe->file_id == file_id)
+ goto found;
+ }
+ return;
+ found:
+ list_for_each(el, &pe->file_list) {
+ pf = list_entry(el, PreloadFile, link);
+ if (pf->is_archive)
+ fs_preload_archive(fs1, pf->name);
+ else
+ fs_preload_file(fs1, pf->name);
+ }
+}
+
+/* return < 0 if error, 0 if OK, 1 if asynchronous completion */
+/* XXX: we don't support several simultaneous asynchronous open on the
+ same inode */
+static int fs_open(FSDevice *fs1, FSQID *qid, FSFile *f, uint32_t flags,
+ FSOpenCompletionFunc *cb, void *opaque)
+{
+ FSINode *n = f->inode;
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ int ret;
+
+ fs_close(fs1, f);
+
+ if (flags & P9_O_DIRECTORY) {
+ if (n->type != FT_DIR)
+ return -P9_ENOTDIR;
+ } else {
+ if (n->type != FT_REG && n->type != FT_DIR)
+ return -P9_EINVAL; /* XXX */
+ }
+ f->open_flags = flags;
+ if (n->type == FT_REG) {
+ if ((flags & P9_O_TRUNC) && (flags & P9_O_NOACCESS) != P9_O_RDONLY) {
+ fs_truncate(fs1, n, 0);
+ }
+
+ switch(n->u.reg.state) {
+ case REG_STATE_UNLOADED:
+ {
+ FSOpenInfo *oi;
+ /* need to load the file */
+ fs_preload_files(fs1, n->u.reg.file_id);
+ /* The state can be modified by the fs_preload_files */
+ if (n->u.reg.state == REG_STATE_LOADING)
+ goto handle_loading;
+ ret = fs_open_wget(fs1, n, FS_OPEN_WGET_REG);
+ if (ret)
+ return ret;
+ oi = n->u.reg.open_info;
+ oi->f = f;
+ oi->cb = cb;
+ oi->opaque = opaque;
+ return 1; /* completion callback will be called later */
+ }
+ break;
+ case REG_STATE_LOADING:
+ handle_loading:
+ {
+ FSOpenInfo *oi;
+ /* we only handle the case where the file is being preloaded */
+ oi = n->u.reg.open_info;
+ if (oi->cb)
+ return -P9_EIO;
+ oi = n->u.reg.open_info;
+ oi->f = f;
+ oi->cb = cb;
+ oi->opaque = opaque;
+ return 1; /* completion callback will be called later */
+ }
+ break;
+ case REG_STATE_LOCAL:
+ goto do_open;
+ case REG_STATE_LOADED:
+ /* move to front */
+ list_del(&n->u.reg.link);
+ list_add(&n->u.reg.link, &fs->inode_cache_list);
+ goto do_open;
+ default:
+ abort();
+ }
+ } else {
+ do_open:
+ f->is_opened = TRUE;
+ inode_to_qid(qid, n);
+ return 0;
+ }
+}
+
+static int fs_create(FSDevice *fs, FSQID *qid, FSFile *f, const char *name,
+ uint32_t flags, uint32_t mode, uint32_t gid)
+{
+ FSINode *n1, *n = f->inode;
+
+ if (n->type != FT_DIR)
+ return -P9_ENOTDIR;
+ if (inode_search(n, name)) {
+ /* XXX: support it, but Linux does not seem to use this case */
+ return -P9_EEXIST;
+ } else {
+ fs_close(fs, f);
+
+ n1 = inode_new(fs, FT_REG, mode, f->uid, gid);
+ inode_dir_add(fs, n, name, n1);
+
+ inode_dec_open(fs, f->inode);
+ f->inode = inode_inc_open(fs, n1);
+ f->is_opened = TRUE;
+ f->open_flags = flags;
+ inode_to_qid(qid, n1);
+ return 0;
+ }
+}
+
+static int fs_readdir(FSDevice *fs, FSFile *f, uint64_t offset1,
+ uint8_t *buf, int count)
+{
+ FSINode *n1, *n = f->inode;
+ int len, pos, name_len, type;
+ struct list_head *el;
+ FSDirEntry *de;
+ uint64_t offset;
+
+ if (!f->is_opened || n->type != FT_DIR)
+ return -P9_EPROTO;
+
+ el = n->u.dir.de_list.next;
+ offset = 0;
+ while (offset < offset1) {
+ if (el == &n->u.dir.de_list)
+ return 0; /* no more entries */
+ offset++;
+ el = el->next;
+ }
+
+ pos = 0;
+ for(;;) {
+ if (el == &n->u.dir.de_list)
+ break;
+ de = list_entry(el, FSDirEntry, link);
+ name_len = strlen(de->name);
+ len = 13 + 8 + 1 + 2 + name_len;
+ if ((pos + len) > count)
+ break;
+ offset++;
+ n1 = de->inode;
+ if (n1->type == FT_DIR)
+ type = P9_QTDIR;
+ else if (n1->type == FT_LNK)
+ type = P9_QTSYMLINK;
+ else
+ type = P9_QTFILE;
+ buf[pos++] = type;
+ put_le32(buf + pos, 0); /* version */
+ pos += 4;
+ put_le64(buf + pos, n1->inode_num);
+ pos += 8;
+ put_le64(buf + pos, offset);
+ pos += 8;
+ buf[pos++] = n1->type;
+ put_le16(buf + pos, name_len);
+ pos += 2;
+ memcpy(buf + pos, de->name, name_len);
+ pos += name_len;
+ el = el->next;
+ }
+ return pos;
+}
+
+static int fs_read(FSDevice *fs, FSFile *f, uint64_t offset,
+ uint8_t *buf, int count)
+{
+ FSINode *n = f->inode;
+ uint64_t count1;
+
+ if (!f->is_opened)
+ return -P9_EPROTO;
+ if (n->type != FT_REG)
+ return -P9_EIO;
+ if ((f->open_flags & P9_O_NOACCESS) == P9_O_WRONLY)
+ return -P9_EIO;
+ if (n->u.reg.is_fscmd)
+ return fs_cmd_read(fs, f, offset, buf, count);
+ if (offset >= n->u.reg.size)
+ return 0;
+ count1 = n->u.reg.size - offset;
+ if (count1 < count)
+ count = count1;
+ file_buffer_read(&n->u.reg.fbuf, offset, buf, count);
+ return count;
+}
+
+static int fs_truncate(FSDevice *fs1, FSINode *n, uint64_t size)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ intptr_t diff, diff_blocks;
+ size_t new_allocated_size;
+
+ if (n->type != FT_REG)
+ return -P9_EINVAL;
+ if (size > UINTPTR_MAX)
+ return -P9_ENOSPC;
+ diff = size - n->u.reg.size;
+ if (diff == 0)
+ return 0;
+ diff_blocks = to_blocks(fs, size) - to_blocks(fs, n->u.reg.size);
+ /* currently cannot resize while loading */
+ switch(n->u.reg.state) {
+ case REG_STATE_LOADING:
+ return -P9_EIO;
+ case REG_STATE_UNLOADED:
+ if (size == 0) {
+ /* now local content */
+ n->u.reg.state = REG_STATE_LOCAL;
+ }
+ break;
+ case REG_STATE_LOADED:
+ case REG_STATE_LOCAL:
+ if (diff > 0) {
+ if ((fs->fs_blocks + diff_blocks) > fs->fs_max_blocks)
+ return -P9_ENOSPC;
+ if (size > n->u.reg.fbuf.allocated_size) {
+ new_allocated_size = n->u.reg.fbuf.allocated_size * 5 / 4;
+ if (size > new_allocated_size)
+ new_allocated_size = size;
+ if (file_buffer_resize(&n->u.reg.fbuf, new_allocated_size) < 0)
+ return -P9_ENOSPC;
+ }
+ file_buffer_set(&n->u.reg.fbuf, n->u.reg.size, 0, diff);
+ } else {
+ new_allocated_size = n->u.reg.fbuf.allocated_size * 4 / 5;
+ if (size <= new_allocated_size) {
+ if (file_buffer_resize(&n->u.reg.fbuf, new_allocated_size) < 0)
+ return -P9_ENOSPC;
+ }
+ }
+ /* file is modified, so it is now local */
+ if (n->u.reg.state == REG_STATE_LOADED) {
+ list_del(&n->u.reg.link);
+ fs->inode_cache_size -= n->u.reg.size;
+ assert(fs->inode_cache_size >= 0);
+ n->u.reg.state = REG_STATE_LOCAL;
+ }
+ break;
+ default:
+ abort();
+ }
+ fs->fs_blocks += diff_blocks;
+ assert(fs->fs_blocks >= 0);
+ n->u.reg.size = size;
+ return 0;
+}
+
+static int fs_write(FSDevice *fs1, FSFile *f, uint64_t offset,
+ const uint8_t *buf, int count)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ FSINode *n = f->inode;
+ uint64_t end;
+ int err;
+
+ if (!f->is_opened)
+ return -P9_EPROTO;
+ if (n->type != FT_REG)
+ return -P9_EIO;
+ if ((f->open_flags & P9_O_NOACCESS) == P9_O_RDONLY)
+ return -P9_EIO;
+ if (count == 0)
+ return 0;
+ if (n->u.reg.is_fscmd) {
+ return fs_cmd_write(fs1, f, offset, buf, count);
+ }
+ end = offset + count;
+ if (end > n->u.reg.size) {
+ err = fs_truncate(fs1, n, end);
+ if (err)
+ return err;
+ }
+ inode_update_mtime(fs1, n);
+ /* file is modified, so it is now local */
+ if (n->u.reg.state == REG_STATE_LOADED) {
+ list_del(&n->u.reg.link);
+ fs->inode_cache_size -= n->u.reg.size;
+ assert(fs->inode_cache_size >= 0);
+ n->u.reg.state = REG_STATE_LOCAL;
+ }
+ file_buffer_write(&n->u.reg.fbuf, offset, buf, count);
+ return count;
+}
+
+static void fs_close(FSDevice *fs, FSFile *f)
+{
+ if (f->is_opened) {
+ f->is_opened = FALSE;
+ }
+ if (f->req)
+ fs_cmd_close(fs, f);
+}
+
+static int fs_stat(FSDevice *fs1, FSFile *f, FSStat *st)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ FSINode *n = f->inode;
+
+ inode_to_qid(&st->qid, n);
+ st->st_mode = n->mode | (n->type << 12);
+ st->st_uid = n->uid;
+ st->st_gid = n->gid;
+ st->st_nlink = n->refcount;
+ if (n->type == FT_BLK || n->type == FT_CHR) {
+ /* XXX: check */
+ st->st_rdev = (n->u.dev.major << 8) | n->u.dev.minor;
+ } else {
+ st->st_rdev = 0;
+ }
+ st->st_blksize = fs->block_size;
+ if (n->type == FT_REG) {
+ st->st_size = n->u.reg.size;
+ } else if (n->type == FT_LNK) {
+ st->st_size = strlen(n->u.symlink.name);
+ } else if (n->type == FT_DIR) {
+ st->st_size = n->u.dir.size;
+ } else {
+ st->st_size = 0;
+ }
+ /* in 512 byte blocks */
+ st->st_blocks = to_blocks(fs, st->st_size) << (fs->block_size_log2 - 9);
+
+ /* Note: atime is not supported */
+ st->st_atime_sec = n->mtime_sec;
+ st->st_atime_nsec = n->mtime_nsec;
+ st->st_mtime_sec = n->mtime_sec;
+ st->st_mtime_nsec = n->mtime_nsec;
+ st->st_ctime_sec = n->ctime_sec;
+ st->st_ctime_nsec = n->ctime_nsec;
+ return 0;
+}
+
+static int fs_setattr(FSDevice *fs1, FSFile *f, uint32_t mask,
+ uint32_t mode, uint32_t uid, uint32_t gid,
+ uint64_t size, uint64_t atime_sec, uint64_t atime_nsec,
+ uint64_t mtime_sec, uint64_t mtime_nsec)
+{
+ FSINode *n = f->inode;
+ int ret;
+
+ if (mask & P9_SETATTR_MODE) {
+ n->mode = mode;
+ }
+ if (mask & P9_SETATTR_UID) {
+ n->uid = uid;
+ }
+ if (mask & P9_SETATTR_GID) {
+ n->gid = gid;
+ }
+ if (mask & P9_SETATTR_SIZE) {
+ ret = fs_truncate(fs1, n, size);
+ if (ret)
+ return ret;
+ }
+ if (mask & P9_SETATTR_MTIME) {
+ if (mask & P9_SETATTR_MTIME_SET) {
+ n->mtime_sec = mtime_sec;
+ n->mtime_nsec = mtime_nsec;
+ } else {
+ inode_update_mtime(fs1, n);
+ }
+ }
+ if (mask & P9_SETATTR_CTIME) {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ n->ctime_sec = tv.tv_sec;
+ n->ctime_nsec = tv.tv_usec * 1000;
+ }
+ return 0;
+}
+
+static int fs_link(FSDevice *fs, FSFile *df, FSFile *f, const char *name)
+{
+ FSINode *n = df->inode;
+
+ if (f->inode->type == FT_DIR)
+ return -P9_EPERM;
+ if (inode_search(n, name))
+ return -P9_EEXIST;
+ inode_dir_add(fs, n, name, inode_incref(fs, f->inode));
+ return 0;
+}
+
+static int fs_symlink(FSDevice *fs, FSQID *qid,
+ FSFile *f, const char *name, const char *symgt, uint32_t gid)
+{
+ FSINode *n1, *n = f->inode;
+
+ if (inode_search(n, name))
+ return -P9_EEXIST;
+
+ n1 = inode_new(fs, FT_LNK, 0777, f->uid, gid);
+ n1->u.symlink.name = strdup(symgt);
+ inode_dir_add(fs, n, name, n1);
+ inode_to_qid(qid, n1);
+ return 0;
+}
+
+static int fs_mknod(FSDevice *fs, FSQID *qid,
+ FSFile *f, const char *name, uint32_t mode, uint32_t major,
+ uint32_t minor, uint32_t gid)
+{
+ int type;
+ FSINode *n1, *n = f->inode;
+
+ type = (mode & P9_S_IFMT) >> 12;
+ /* XXX: add FT_DIR support */
+ if (type != FT_FIFO && type != FT_CHR && type != FT_BLK &&
+ type != FT_REG && type != FT_SOCK)
+ return -P9_EINVAL;
+ if (inode_search(n, name))
+ return -P9_EEXIST;
+ n1 = inode_new(fs, type, mode, f->uid, gid);
+ if (type == FT_CHR || type == FT_BLK) {
+ n1->u.dev.major = major;
+ n1->u.dev.minor = minor;
+ }
+ inode_dir_add(fs, n, name, n1);
+ inode_to_qid(qid, n1);
+ return 0;
+}
+
+static int fs_readlink(FSDevice *fs, char *buf, int buf_size, FSFile *f)
+{
+ FSINode *n = f->inode;
+ int len;
+ if (n->type != FT_LNK)
+ return -P9_EIO;
+ len = min_int(strlen(n->u.symlink.name), buf_size - 1);
+ memcpy(buf, n->u.symlink.name, len);
+ buf[len] = '\0';
+ return 0;
+}
+
+static int fs_renameat(FSDevice *fs, FSFile *f, const char *name,
+ FSFile *new_f, const char *new_name)
+{
+ FSDirEntry *de, *de1;
+ FSINode *n1;
+
+ de = inode_search(f->inode, name);
+ if (!de)
+ return -P9_ENOENT;
+ de1 = inode_search(new_f->inode, new_name);
+ n1 = NULL;
+ if (de1) {
+ n1 = de1->inode;
+ if (n1->type == FT_DIR)
+ return -P9_EEXIST; /* XXX: handle the case */
+ inode_dirent_delete_no_decref(fs, new_f->inode, de1);
+ }
+ inode_dir_add(fs, new_f->inode, new_name, inode_incref(fs, de->inode));
+ inode_dirent_delete(fs, f->inode, de);
+ if (n1)
+ inode_decref(fs, n1);
+ return 0;
+}
+
+static int fs_unlinkat(FSDevice *fs, FSFile *f, const char *name)
+{
+ FSDirEntry *de;
+ FSINode *n;
+
+ if (!strcmp(name, ".") || !strcmp(name, ".."))
+ return -P9_ENOENT;
+ de = inode_search(f->inode, name);
+ if (!de)
+ return -P9_ENOENT;
+ n = de->inode;
+ if (n->type == FT_DIR) {
+ if (!is_empty_dir(fs, n))
+ return -P9_ENOTEMPTY;
+ flush_dir(fs, n);
+ }
+ inode_dirent_delete(fs, f->inode, de);
+ return 0;
+}
+
+static int fs_lock(FSDevice *fs, FSFile *f, const FSLock *lock)
+{
+ FSINode *n = f->inode;
+ if (!f->is_opened)
+ return -P9_EPROTO;
+ if (n->type != FT_REG)
+ return -P9_EIO;
+ /* XXX: implement it */
+ return P9_LOCK_SUCCESS;
+}
+
+static int fs_getlock(FSDevice *fs, FSFile *f, FSLock *lock)
+{
+ FSINode *n = f->inode;
+ if (!f->is_opened)
+ return -P9_EPROTO;
+ if (n->type != FT_REG)
+ return -P9_EIO;
+ /* XXX: implement it */
+ return 0;
+}
+
+/* XXX: only used with file lists, so not all the data is released */
+static void fs_mem_end(FSDevice *fs1)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ struct list_head *el, *el1, *el2, *el3;
+ FSINode *n;
+ FSDirEntry *de;
+
+ list_for_each_safe(el, el1, &fs->inode_list) {
+ n = list_entry(el, FSINode, link);
+ n->refcount = 0;
+ if (n->type == FT_DIR) {
+ list_for_each_safe(el2, el3, &n->u.dir.de_list) {
+ de = list_entry(el2, FSDirEntry, link);
+ list_del(&de->link);
+ free(de);
+ }
+ init_list_head(&n->u.dir.de_list);
+ }
+ inode_free(fs1, n);
+ }
+ assert(list_empty(&fs->inode_cache_list));
+ free(fs->import_dir);
+}
+
+FSDevice *fs_mem_init(void)
+{
+ FSDeviceMem *fs;
+ FSDevice *fs1;
+ FSINode *n;
+
+ fs = mallocz(sizeof(*fs));
+ fs1 = &fs->common;
+
+ fs->common.fs_end = fs_mem_end;
+ fs->common.fs_delete = fs_delete;
+ fs->common.fs_statfs = fs_statfs;
+ fs->common.fs_attach = fs_attach;
+ fs->common.fs_walk = fs_walk;
+ fs->common.fs_mkdir = fs_mkdir;
+ fs->common.fs_open = fs_open;
+ fs->common.fs_create = fs_create;
+ fs->common.fs_stat = fs_stat;
+ fs->common.fs_setattr = fs_setattr;
+ fs->common.fs_close = fs_close;
+ fs->common.fs_readdir = fs_readdir;
+ fs->common.fs_read = fs_read;
+ fs->common.fs_write = fs_write;
+ fs->common.fs_link = fs_link;
+ fs->common.fs_symlink = fs_symlink;
+ fs->common.fs_mknod = fs_mknod;
+ fs->common.fs_readlink = fs_readlink;
+ fs->common.fs_renameat = fs_renameat;
+ fs->common.fs_unlinkat = fs_unlinkat;
+ fs->common.fs_lock = fs_lock;
+ fs->common.fs_getlock = fs_getlock;
+
+ init_list_head(&fs->inode_list);
+ fs->inode_num_alloc = 1;
+ fs->block_size_log2 = FS_BLOCK_SIZE_LOG2;
+ fs->block_size = 1 << fs->block_size_log2;
+ fs->inode_limit = 1 << 20; /* arbitrary */
+ fs->fs_max_blocks = 1 << (30 - fs->block_size_log2); /* arbitrary */
+
+ init_list_head(&fs->inode_cache_list);
+ fs->inode_cache_size_limit = DEFAULT_INODE_CACHE_SIZE;
+
+ init_list_head(&fs->preload_list);
+ init_list_head(&fs->preload_archive_list);
+
+ init_list_head(&fs->base_url_list);
+
+ /* create the root inode */
+ n = inode_new(fs1, FT_DIR, 0777, 0, 0);
+ inode_dir_add(fs1, n, ".", inode_incref(fs1, n));
+ inode_dir_add(fs1, n, "..", inode_incref(fs1, n));
+ fs->root_inode = n;
+
+ return (FSDevice *)fs;
+}
+
+static BOOL fs_is_net(FSDevice *fs)
+{
+ return (fs->fs_end == fs_mem_end);
+}
+
+static FSBaseURL *fs_find_base_url(FSDevice *fs1,
+ const char *base_url_id)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ struct list_head *el;
+ FSBaseURL *bu;
+
+ list_for_each(el, &fs->base_url_list) {
+ bu = list_entry(el, FSBaseURL, link);
+ if (!strcmp(bu->base_url_id, base_url_id))
+ return bu;
+ }
+ return NULL;
+}
+
+static void fs_base_url_decref(FSDevice *fs, FSBaseURL *bu)
+{
+ assert(bu->ref_count >= 1);
+ if (--bu->ref_count == 0) {
+ free(bu->base_url_id);
+ free(bu->url);
+ free(bu->user);
+ free(bu->password);
+ list_del(&bu->link);
+ free(bu);
+ }
+}
+
+static FSBaseURL *fs_net_set_base_url(FSDevice *fs1,
+ const char *base_url_id,
+ const char *url,
+ const char *user, const char *password,
+ AES_KEY *aes_state)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ FSBaseURL *bu;
+
+ assert(fs_is_net(fs1));
+ bu = fs_find_base_url(fs1, base_url_id);
+ if (!bu) {
+ bu = mallocz(sizeof(*bu));
+ bu->base_url_id = strdup(base_url_id);
+ bu->ref_count = 1;
+ list_add_tail(&bu->link, &fs->base_url_list);
+ } else {
+ free(bu->url);
+ free(bu->user);
+ free(bu->password);
+ }
+
+ bu->url = strdup(url);
+ if (user)
+ bu->user = strdup(user);
+ else
+ bu->user = NULL;
+ if (password)
+ bu->password = strdup(password);
+ else
+ bu->password = NULL;
+ if (aes_state) {
+ bu->encrypted = TRUE;
+ bu->aes_state = *aes_state;
+ } else {
+ bu->encrypted = FALSE;
+ }
+ return bu;
+}
+
+static int fs_net_reset_base_url(FSDevice *fs1,
+ const char *base_url_id)
+{
+ FSBaseURL *bu;
+
+ assert(fs_is_net(fs1));
+ bu = fs_find_base_url(fs1, base_url_id);
+ if (!bu)
+ return -P9_ENOENT;
+ fs_base_url_decref(fs1, bu);
+ return 0;
+}
+
+static void fs_net_set_fs_max_size(FSDevice *fs1, uint64_t fs_max_size)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+
+ assert(fs_is_net(fs1));
+ fs->fs_max_blocks = to_blocks(fs, fs_max_size);
+}
+
+static int fs_net_set_url(FSDevice *fs1, FSINode *n,
+ const char *base_url_id, FSFileID file_id, uint64_t size)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ FSBaseURL *bu;
+
+ assert(fs_is_net(fs1));
+
+ bu = fs_find_base_url(fs1, base_url_id);
+ if (!bu)
+ return -P9_ENOENT;
+
+ /* XXX: could accept more state */
+ if (n->type != FT_REG ||
+ n->u.reg.state != REG_STATE_LOCAL ||
+ n->u.reg.fbuf.allocated_size != 0)
+ return -P9_EIO;
+
+ if (size > 0) {
+ n->u.reg.state = REG_STATE_UNLOADED;
+ n->u.reg.base_url = bu;
+ bu->ref_count++;
+ n->u.reg.size = size;
+ fs->fs_blocks += to_blocks(fs, size);
+ n->u.reg.file_id = file_id;
+ }
+ return 0;
+}
+
+#ifdef DUMP_CACHE_LOAD
+
+#include "json.h"
+
+#define ARCHIVE_SIZE_MAX (4 << 20)
+
+static void fs_dump_add_file(struct list_head *head, const char *name)
+{
+ PreloadFile *pf;
+ pf = mallocz(sizeof(*pf));
+ pf->name = strdup(name);
+ list_add_tail(&pf->link, head);
+}
+
+static PreloadFile *fs_dump_find_file(struct list_head *head, const char *name)
+{
+ PreloadFile *pf;
+ struct list_head *el;
+ list_for_each(el, head) {
+ pf = list_entry(el, PreloadFile, link);
+ if (!strcmp(pf->name, name))
+ return pf;
+ }
+ return NULL;
+}
+
+static void dump_close_archive(FSDevice *fs1)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ if (fs->dump_archive_file) {
+ fclose(fs->dump_archive_file);
+ }
+ fs->dump_archive_file = NULL;
+ fs->dump_archive_size = 0;
+}
+
+static void dump_loaded_file(FSDevice *fs1, FSINode *n)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ char filename[1024];
+ const char *fname, *p;
+
+ if (!fs->dump_cache_load || !n->u.reg.filename)
+ return;
+ fname = n->u.reg.filename;
+
+ if (fs_dump_find_file(&fs->dump_preload_list, fname)) {
+ dump_close_archive(fs1);
+ p = strrchr(fname, '/');
+ if (!p)
+ p = fname;
+ else
+ p++;
+ free(fs->dump_archive_name);
+ fs->dump_archive_name = strdup(p);
+ fs->dump_started = TRUE;
+ fs->dump_archive_num = 0;
+
+ fprintf(fs->dump_preload_file, "\n%s :\n", fname);
+ }
+ if (!fs->dump_started)
+ return;
+
+ if (!fs->dump_archive_file) {
+ snprintf(filename, sizeof(filename), "%s/%s%d",
+ fs->dump_preload_dir, fs->dump_archive_name,
+ fs->dump_archive_num);
+ fs->dump_archive_file = fopen(filename, "wb");
+ if (!fs->dump_archive_file) {
+ perror(filename);
+ exit(1);
+ }
+ fprintf(fs->dump_preload_archive_file, "\n@.preload2/%s%d :\n",
+ fs->dump_archive_name, fs->dump_archive_num);
+ fprintf(fs->dump_preload_file, " @.preload2/%s%d\n",
+ fs->dump_archive_name, fs->dump_archive_num);
+ fflush(fs->dump_preload_file);
+ fs->dump_archive_num++;
+ }
+
+ if (n->u.reg.size >= ARCHIVE_SIZE_MAX) {
+ /* exclude large files from archive */
+ /* add indicative size */
+ fprintf(fs->dump_preload_file, " %s %" PRId64 "\n",
+ fname, n->u.reg.size);
+ fflush(fs->dump_preload_file);
+ } else {
+ fprintf(fs->dump_preload_archive_file, " %s %" PRId64 " %" PRIx64 "\n",
+ n->u.reg.filename, n->u.reg.size, n->u.reg.file_id);
+ fflush(fs->dump_preload_archive_file);
+ fwrite(n->u.reg.fbuf.data, 1, n->u.reg.size, fs->dump_archive_file);
+ fflush(fs->dump_archive_file);
+ fs->dump_archive_size += n->u.reg.size;
+ if (fs->dump_archive_size >= ARCHIVE_SIZE_MAX) {
+ dump_close_archive(fs1);
+ }
+ }
+}
+
+static JSONValue json_load(const char *filename)
+{
+ FILE *f;
+ JSONValue val;
+ size_t size;
+ char *buf;
+
+ f = fopen(filename, "rb");
+ if (!f) {
+ perror(filename);
+ exit(1);
+ }
+ fseek(f, 0, SEEK_END);
+ size = ftell(f);
+ fseek(f, 0, SEEK_SET);
+ buf = malloc(size + 1);
+ fread(buf, 1, size, f);
+ fclose(f);
+ val = json_parse_value_len(buf, size);
+ free(buf);
+ return val;
+}
+
+void fs_dump_cache_load(FSDevice *fs1, const char *cfg_filename)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ JSONValue cfg, val, array;
+ char *fname;
+ const char *preload_dir, *name;
+ int i;
+
+ if (!fs_is_net(fs1))
+ return;
+ cfg = json_load(cfg_filename);
+ if (json_is_error(cfg)) {
+ fprintf(stderr, "%s\n", json_get_error(cfg));
+ exit(1);
+ }
+
+ val = json_object_get(cfg, "preload_dir");
+ if (json_is_undefined(cfg)) {
+ config_error:
+ exit(1);
+ }
+ preload_dir = json_get_str(val);
+ if (!preload_dir) {
+ fprintf(stderr, "expecting preload_filename\n");
+ goto config_error;
+ }
+ fs->dump_preload_dir = strdup(preload_dir);
+
+ init_list_head(&fs->dump_preload_list);
+ init_list_head(&fs->dump_exclude_list);
+
+ array = json_object_get(cfg, "preload");
+ if (array.type != JSON_ARRAY) {
+ fprintf(stderr, "expecting preload array\n");
+ goto config_error;
+ }
+ for(i = 0; i < array.u.array->len; i++) {
+ val = json_array_get(array, i);
+ name = json_get_str(val);
+ if (!name) {
+ fprintf(stderr, "expecting a string\n");
+ goto config_error;
+ }
+ fs_dump_add_file(&fs->dump_preload_list, name);
+ }
+ json_free(cfg);
+
+ fname = compose_path(fs->dump_preload_dir, "preload.txt");
+ fs->dump_preload_file = fopen(fname, "w");
+ if (!fs->dump_preload_file) {
+ perror(fname);
+ exit(1);
+ }
+ free(fname);
+
+ fname = compose_path(fs->dump_preload_dir, "preload_archive.txt");
+ fs->dump_preload_archive_file = fopen(fname, "w");
+ if (!fs->dump_preload_archive_file) {
+ perror(fname);
+ exit(1);
+ }
+ free(fname);
+
+ fs->dump_cache_load = TRUE;
+}
+#else
+void fs_dump_cache_load(FSDevice *fs1, const char *cfg_filename)
+{
+}
+#endif
+
+/***********************************************/
+/* file list processing */
+
+static int filelist_load_rec(FSDevice *fs1, const char **pp, FSINode *dir,
+ const char *path)
+{
+ // FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ char fname[1024], lname[1024];
+ int ret;
+ const char *p;
+ FSINodeTypeEnum type;
+ uint32_t mode, uid, gid;
+ uint64_t size;
+ FSINode *n;
+
+ p = *pp;
+ for(;;) {
+ /* skip comments or empty lines */
+ if (*p == '\0')
+ break;
+ if (*p == '#') {
+ skip_line(&p);
+ continue;
+ }
+ /* end of directory */
+ if (*p == '.') {
+ p++;
+ skip_line(&p);
+ break;
+ }
+ if (parse_uint32_base(&mode, &p, 8) < 0) {
+ fprintf(stderr, "invalid mode\n");
+ return -1;
+ }
+ type = mode >> 12;
+ mode &= 0xfff;
+
+ if (parse_uint32(&uid, &p) < 0) {
+ fprintf(stderr, "invalid uid\n");
+ return -1;
+ }
+
+ if (parse_uint32(&gid, &p) < 0) {
+ fprintf(stderr, "invalid gid\n");
+ return -1;
+ }
+
+ n = inode_new(fs1, type, mode, uid, gid);
+
+ size = 0;
+ switch(type) {
+ case FT_CHR:
+ case FT_BLK:
+ if (parse_uint32(&n->u.dev.major, &p) < 0) {
+ fprintf(stderr, "invalid major\n");
+ return -1;
+ }
+ if (parse_uint32(&n->u.dev.minor, &p) < 0) {
+ fprintf(stderr, "invalid minor\n");
+ return -1;
+ }
+ break;
+ case FT_REG:
+ if (parse_uint64(&size, &p) < 0) {
+ fprintf(stderr, "invalid size\n");
+ return -1;
+ }
+ break;
+ case FT_DIR:
+ inode_dir_add(fs1, n, ".", inode_incref(fs1, n));
+ inode_dir_add(fs1, n, "..", inode_incref(fs1, dir));
+ break;
+ default:
+ break;
+ }
+
+ /* modification time */
+ if (parse_time(&n->mtime_sec, &n->mtime_nsec, &p) < 0) {
+ fprintf(stderr, "invalid mtime\n");
+ return -1;
+ }
+
+ if (parse_fname(fname, sizeof(fname), &p) < 0) {
+ fprintf(stderr, "invalid filename\n");
+ return -1;
+ }
+ inode_dir_add(fs1, dir, fname, n);
+
+ if (type == FT_LNK) {
+ if (parse_fname(lname, sizeof(lname), &p) < 0) {
+ fprintf(stderr, "invalid symlink name\n");
+ return -1;
+ }
+ n->u.symlink.name = strdup(lname);
+ } else if (type == FT_REG && size > 0) {
+ FSFileID file_id;
+ if (parse_file_id(&file_id, &p) < 0) {
+ fprintf(stderr, "invalid file id\n");
+ return -1;
+ }
+ fs_net_set_url(fs1, n, "/", file_id, size);
+#ifdef DUMP_CACHE_LOAD
+ {
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ if (fs->dump_cache_load
+#ifdef DEBUG_CACHE
+ || 1
+#endif
+ ) {
+ n->u.reg.filename = compose_path(path, fname);
+ } else {
+ n->u.reg.filename = NULL;
+ }
+ }
+#endif
+ }
+
+ skip_line(&p);
+
+ if (type == FT_DIR) {
+ char *path1;
+ path1 = compose_path(path, fname);
+ ret = filelist_load_rec(fs1, &p, n, path1);
+ free(path1);
+ if (ret)
+ return ret;
+ }
+ }
+ *pp = p;
+ return 0;
+}
+
+static int filelist_load(FSDevice *fs1, const char *str)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ int ret;
+ const char *p;
+
+ if (parse_tag_version(str) != 1)
+ return -1;
+ p = skip_header(str);
+ if (!p)
+ return -1;
+ ret = filelist_load_rec(fs1, &p, fs->root_inode, "");
+ return ret;
+}
+
+/************************************************************/
+/* FS init from network */
+
+static void __attribute__((format(printf, 1, 2))) fatal_error(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ fprintf(stderr, "Error: ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+static void fs_create_cmd(FSDevice *fs)
+{
+ FSFile *root_fd;
+ FSQID qid;
+ FSINode *n;
+
+ assert(!fs->fs_attach(fs, &root_fd, &qid, 0, "", ""));
+ assert(!fs->fs_create(fs, &qid, root_fd, FSCMD_NAME, P9_O_RDWR | P9_O_TRUNC,
+ 0666, 0));
+ n = root_fd->inode;
+ n->u.reg.is_fscmd = TRUE;
+ fs->fs_delete(fs, root_fd);
+}
+
+typedef struct {
+ FSDevice *fs;
+ char *url;
+ void (*start_cb)(void *opaque);
+ void *start_opaque;
+
+ FSFile *root_fd;
+ FSFile *fd;
+ int file_index;
+
+} FSNetInitState;
+
+static void fs_initial_sync(FSDevice *fs,
+ const char *url, void (*start_cb)(void *opaque),
+ void *start_opaque);
+static void head_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque);
+static void filelist_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque);
+static void kernel_load_cb(FSDevice *fs, FSQID *qid, int err,
+ void *opaque);
+static int preload_parse(FSDevice *fs, const char *fname, BOOL is_new);
+
+#ifdef EMSCRIPTEN
+static FSDevice *fs_import_fs;
+#endif
+
+#define DEFAULT_IMPORT_FILE_PATH "/tmp"
+
+FSDevice *fs_net_init(const char *url, void (*start_cb)(void *opaque),
+ void *start_opaque)
+{
+ FSDevice *fs;
+ FSDeviceMem *fs1;
+
+ fs_wget_init();
+
+ fs = fs_mem_init();
+#ifdef EMSCRIPTEN
+ if (!fs_import_fs)
+ fs_import_fs = fs;
+#endif
+ fs1 = (FSDeviceMem *)fs;
+ fs1->import_dir = strdup(DEFAULT_IMPORT_FILE_PATH);
+
+ fs_create_cmd(fs);
+
+ if (url) {
+ fs_initial_sync(fs, url, start_cb, start_opaque);
+ }
+ return fs;
+}
+
+static void fs_initial_sync(FSDevice *fs,
+ const char *url, void (*start_cb)(void *opaque),
+ void *start_opaque)
+{
+ FSNetInitState *s;
+ FSFile *head_fd;
+ FSQID qid;
+ char *head_url;
+ char buf[128];
+ struct timeval tv;
+
+ s = mallocz(sizeof(*s));
+ s->fs = fs;
+ s->url = strdup(url);
+ s->start_cb = start_cb;
+ s->start_opaque = start_opaque;
+ assert(!fs->fs_attach(fs, &s->root_fd, &qid, 0, "", ""));
+
+ /* avoid using cached version */
+ gettimeofday(&tv, NULL);
+ snprintf(buf, sizeof(buf), HEAD_FILENAME "?nocache=%" PRId64,
+ (int64_t)tv.tv_sec * 1000000 + tv.tv_usec);
+ head_url = compose_url(s->url, buf);
+ head_fd = fs_dup(fs, s->root_fd);
+ assert(!fs->fs_create(fs, &qid, head_fd, ".head",
+ P9_O_RDWR | P9_O_TRUNC, 0644, 0));
+ fs_wget_file2(fs, head_fd, head_url, NULL, NULL, NULL, 0,
+ head_loaded, s, NULL);
+ free(head_url);
+}
+
+static void head_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque)
+{
+ FSNetInitState *s = opaque;
+ char *buf, *root_url, *url;
+ char fname[FILEID_SIZE_MAX];
+ FSFileID root_id;
+ FSFile *new_filelist_fd;
+ FSQID qid;
+ uint64_t fs_max_size;
+
+ if (size < 0)
+ fatal_error("could not load 'head' file (HTTP error=%d)", -(int)size);
+
+ buf = malloc(size + 1);
+ fs->fs_read(fs, f, 0, (uint8_t *)buf, size);
+ buf[size] = '\0';
+ fs->fs_delete(fs, f);
+ fs->fs_unlinkat(fs, s->root_fd, ".head");
+
+ if (parse_tag_version(buf) != 1)
+ fatal_error("invalid head version");
+
+ if (parse_tag_file_id(&root_id, buf, "RootID") < 0)
+ fatal_error("expected RootID tag");
+
+ if (parse_tag_uint64(&fs_max_size, buf, "FSMaxSize") == 0 &&
+ fs_max_size >= ((uint64_t)1 << 20)) {
+ fs_net_set_fs_max_size(fs, fs_max_size);
+ }
+
+ /* set the Root URL in the filesystem */
+ root_url = compose_url(s->url, ROOT_FILENAME);
+ fs_net_set_base_url(fs, "/", root_url, NULL, NULL, NULL);
+
+ new_filelist_fd = fs_dup(fs, s->root_fd);
+ assert(!fs->fs_create(fs, &qid, new_filelist_fd, ".filelist.txt",
+ P9_O_RDWR | P9_O_TRUNC, 0644, 0));
+
+ file_id_to_filename(fname, root_id);
+ url = compose_url(root_url, fname);
+ fs_wget_file2(fs, new_filelist_fd, url, NULL, NULL, NULL, 0,
+ filelist_loaded, s, NULL);
+ free(root_url);
+ free(url);
+}
+
+static void filelist_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque)
+{
+ FSNetInitState *s = opaque;
+ uint8_t *buf;
+
+ if (size < 0)
+ fatal_error("could not load file list (HTTP error=%d)", -(int)size);
+
+ buf = malloc(size + 1);
+ fs->fs_read(fs, f, 0, buf, size);
+ buf[size] = '\0';
+ fs->fs_delete(fs, f);
+ fs->fs_unlinkat(fs, s->root_fd, ".filelist.txt");
+
+ if (filelist_load(fs, (char *)buf) != 0)
+ fatal_error("error while parsing file list");
+
+ /* try to load the kernel and the preload file */
+ s->file_index = 0;
+ kernel_load_cb(fs, NULL, 0, s);
+}
+
+
+#define FILE_LOAD_COUNT 2
+
+static const char *kernel_file_list[FILE_LOAD_COUNT] = {
+ ".preload",
+ ".preload2/preload.txt",
+};
+
+static void kernel_load_cb(FSDevice *fs, FSQID *qid1, int err,
+ void *opaque)
+{
+ FSNetInitState *s = opaque;
+ FSQID qid;
+
+#ifdef DUMP_CACHE_LOAD
+ /* disable preloading if dumping cache load */
+ if (((FSDeviceMem *)fs)->dump_cache_load)
+ return;
+#endif
+
+ if (s->fd) {
+ fs->fs_delete(fs, s->fd);
+ s->fd = NULL;
+ }
+
+ if (s->file_index >= FILE_LOAD_COUNT) {
+ /* all files are loaded */
+ if (preload_parse(fs, ".preload2/preload.txt", TRUE) < 0) {
+ preload_parse(fs, ".preload", FALSE);
+ }
+ fs->fs_delete(fs, s->root_fd);
+ if (s->start_cb)
+ s->start_cb(s->start_opaque);
+ free(s);
+ } else {
+ s->fd = fs_walk_path(fs, s->root_fd, kernel_file_list[s->file_index++]);
+ if (!s->fd)
+ goto done;
+ err = fs->fs_open(fs, &qid, s->fd, P9_O_RDONLY, kernel_load_cb, s);
+ if (err <= 0) {
+ done:
+ kernel_load_cb(fs, NULL, 0, s);
+ }
+ }
+}
+
+static void preload_parse_str_old(FSDevice *fs1, const char *p)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ char fname[1024];
+ PreloadEntry *pe;
+ PreloadFile *pf;
+ FSINode *n;
+
+ for(;;) {
+ while (isspace_nolf(*p))
+ p++;
+ if (*p == '\n') {
+ p++;
+ continue;
+ }
+ if (*p == '\0')
+ break;
+ if (parse_fname(fname, sizeof(fname), &p) < 0) {
+ fprintf(stderr, "invalid filename\n");
+ return;
+ }
+ // printf("preload file='%s\n", fname);
+ n = inode_search_path(fs1, fname);
+ if (!n || n->type != FT_REG || n->u.reg.state == REG_STATE_LOCAL) {
+ fprintf(stderr, "invalid preload file: '%s'\n", fname);
+ while (*p != '\n' && *p != '\0')
+ p++;
+ } else {
+ pe = mallocz(sizeof(*pe));
+ pe->file_id = n->u.reg.file_id;
+ init_list_head(&pe->file_list);
+ list_add_tail(&pe->link, &fs->preload_list);
+ for(;;) {
+ while (isspace_nolf(*p))
+ p++;
+ if (*p == '\0' || *p == '\n')
+ break;
+ if (parse_fname(fname, sizeof(fname), &p) < 0) {
+ fprintf(stderr, "invalid filename\n");
+ return;
+ }
+ // printf(" adding '%s'\n", fname);
+ pf = mallocz(sizeof(*pf));
+ pf->name = strdup(fname);
+ list_add_tail(&pf->link, &pe->file_list);
+ }
+ }
+ }
+}
+
+static void preload_parse_str(FSDevice *fs1, const char *p)
+{
+ FSDeviceMem *fs = (FSDeviceMem *)fs1;
+ PreloadEntry *pe;
+ PreloadArchive *pa;
+ FSINode *n;
+ BOOL is_archive;
+ char fname[1024];
+
+ pe = NULL;
+ pa = NULL;
+ for(;;) {
+ while (isspace_nolf(*p))
+ p++;
+ if (*p == '\n') {
+ pe = NULL;
+ p++;
+ continue;
+ }
+ if (*p == '#')
+ continue; /* comment */
+ if (*p == '\0')
+ break;
+
+ is_archive = FALSE;
+ if (*p == '@') {
+ is_archive = TRUE;
+ p++;
+ }
+ if (parse_fname(fname, sizeof(fname), &p) < 0) {
+ fprintf(stderr, "invalid filename\n");
+ return;
+ }
+ while (isspace_nolf(*p))
+ p++;
+ if (*p == ':') {
+ p++;
+ // printf("preload file='%s' archive=%d\n", fname, is_archive);
+ n = inode_search_path(fs1, fname);
+ pe = NULL;
+ pa = NULL;
+ if (!n || n->type != FT_REG || n->u.reg.state == REG_STATE_LOCAL) {
+ fprintf(stderr, "invalid preload file: '%s'\n", fname);
+ while (*p != '\n' && *p != '\0')
+ p++;
+ } else if (is_archive) {
+ pa = mallocz(sizeof(*pa));
+ pa->name = strdup(fname);
+ init_list_head(&pa->file_list);
+ list_add_tail(&pa->link, &fs->preload_archive_list);
+ } else {
+ pe = mallocz(sizeof(*pe));
+ pe->file_id = n->u.reg.file_id;
+ init_list_head(&pe->file_list);
+ list_add_tail(&pe->link, &fs->preload_list);
+ }
+ } else {
+ if (!pe && !pa) {
+ fprintf(stderr, "filename without target: %s\n", fname);
+ return;
+ }
+ if (pa) {
+ PreloadArchiveFile *paf;
+ FSFileID file_id;
+ uint64_t size;
+
+ if (parse_uint64(&size, &p) < 0) {
+ fprintf(stderr, "invalid size\n");
+ return;
+ }
+
+ if (parse_file_id(&file_id, &p) < 0) {
+ fprintf(stderr, "invalid file id\n");
+ return;
+ }
+
+ paf = mallocz(sizeof(*paf));
+ paf->name = strdup(fname);
+ paf->file_id = file_id;
+ paf->size = size;
+ list_add_tail(&paf->link, &pa->file_list);
+ } else {
+ PreloadFile *pf;
+ pf = mallocz(sizeof(*pf));
+ pf->name = strdup(fname);
+ pf->is_archive = is_archive;
+ list_add_tail(&pf->link, &pe->file_list);
+ }
+ }
+ /* skip the rest of the line */
+ while (*p != '\n' && *p != '\0')
+ p++;
+ if (*p == '\n')
+ p++;
+ }
+}
+
+static int preload_parse(FSDevice *fs, const char *fname, BOOL is_new)
+{
+ FSINode *n;
+ char *buf;
+ size_t size;
+
+ n = inode_search_path(fs, fname);
+ if (!n || n->type != FT_REG || n->u.reg.state != REG_STATE_LOADED)
+ return -1;
+ /* transform to zero terminated string */
+ size = n->u.reg.size;
+ buf = malloc(size + 1);
+ file_buffer_read(&n->u.reg.fbuf, 0, (uint8_t *)buf, size);
+ buf[size] = '\0';
+ if (is_new)
+ preload_parse_str(fs, buf);
+ else
+ preload_parse_str_old(fs, buf);
+ free(buf);
+ return 0;
+}
+
+
+
+/************************************************************/
+/* FS user interface */
+
+typedef struct CmdXHRState {
+ FSFile *req_fd;
+ FSFile *root_fd;
+ FSFile *fd;
+ FSFile *post_fd;
+ AES_KEY aes_state;
+} CmdXHRState;
+
+static void fs_cmd_xhr_on_load(FSDevice *fs, FSFile *f, int64_t size,
+ void *opaque);
+
+static int parse_hex_buf(uint8_t *buf, int buf_size, const char **pp)
+{
+ char buf1[1024];
+ int len;
+
+ if (parse_fname(buf1, sizeof(buf1), pp) < 0)
+ return -1;
+ len = strlen(buf1);
+ if ((len & 1) != 0)
+ return -1;
+ len >>= 1;
+ if (len > buf_size)
+ return -1;
+ if (decode_hex(buf, buf1, len) < 0)
+ return -1;
+ return len;
+}
+
+static int fs_cmd_xhr(FSDevice *fs, FSFile *f,
+ const char *p, uint32_t uid, uint32_t gid)
+{
+ char url[1024], post_filename[1024], filename[1024];
+ char user_buf[128], *user;
+ char password_buf[128], *password;
+ FSQID qid;
+ FSFile *fd, *root_fd, *post_fd;
+ uint64_t post_data_len;
+ int err, aes_key_len;
+ CmdXHRState *s;
+ char *name;
+ AES_KEY *paes_state;
+ uint8_t aes_key[FS_KEY_LEN];
+ uint32_t flags;
+ FSCMDRequest *req;
+
+ /* a request is already done or in progress */
+ if (f->req != NULL)
+ return -P9_EIO;
+
+ if (parse_fname(url, sizeof(url), &p) < 0)
+ goto fail;
+ if (parse_fname(user_buf, sizeof(user_buf), &p) < 0)
+ goto fail;
+ if (parse_fname(password_buf, sizeof(password_buf), &p) < 0)
+ goto fail;
+ if (parse_fname(post_filename, sizeof(post_filename), &p) < 0)
+ goto fail;
+ if (parse_fname(filename, sizeof(filename), &p) < 0)
+ goto fail;
+ aes_key_len = parse_hex_buf(aes_key, FS_KEY_LEN, &p);
+ if (aes_key_len < 0)
+ goto fail;
+ if (parse_uint32(&flags, &p) < 0)
+ goto fail;
+ if (aes_key_len != 0 && aes_key_len != FS_KEY_LEN)
+ goto fail;
+
+ if (user_buf[0] != '\0')
+ user = user_buf;
+ else
+ user = NULL;
+ if (password_buf[0] != '\0')
+ password = password_buf;
+ else
+ password = NULL;
+
+ // printf("url='%s' '%s' '%s' filename='%s'\n", url, user, password, filename);
+ assert(!fs->fs_attach(fs, &root_fd, &qid, uid, "", ""));
+ post_fd = NULL;
+
+ fd = fs_walk_path1(fs, root_fd, filename, &name);
+ if (!fd) {
+ err = -P9_ENOENT;
+ goto fail1;
+ }
+ /* XXX: until fs_create is fixed */
+ fs->fs_unlinkat(fs, fd, name);
+
+ err = fs->fs_create(fs, &qid, fd, name,
+ P9_O_RDWR | P9_O_TRUNC, 0600, gid);
+ if (err < 0) {
+ goto fail1;
+ }
+
+ if (post_filename[0] != '\0') {
+ FSINode *n;
+
+ post_fd = fs_walk_path(fs, root_fd, post_filename);
+ if (!post_fd) {
+ err = -P9_ENOENT;
+ goto fail1;
+ }
+ err = fs->fs_open(fs, &qid, post_fd, P9_O_RDONLY, NULL, NULL);
+ if (err < 0)
+ goto fail1;
+ n = post_fd->inode;
+ assert(n->type == FT_REG && n->u.reg.state == REG_STATE_LOCAL);
+ post_data_len = n->u.reg.size;
+ } else {
+ post_data_len = 0;
+ }
+
+ s = mallocz(sizeof(*s));
+ s->root_fd = root_fd;
+ s->fd = fd;
+ s->post_fd = post_fd;
+ if (aes_key_len != 0) {
+ AES_set_decrypt_key(aes_key, FS_KEY_LEN * 8, &s->aes_state);
+ paes_state = &s->aes_state;
+ } else {
+ paes_state = NULL;
+ }
+
+ req = mallocz(sizeof(*req));
+ req->type = FS_CMD_XHR;
+ req->reply_len = 0;
+ req->xhr_state = s;
+ s->req_fd = f;
+ f->req = req;
+
+ fs_wget_file2(fs, fd, url, user, password, post_fd, post_data_len,
+ fs_cmd_xhr_on_load, s, paes_state);
+ return 0;
+ fail1:
+ if (fd)
+ fs->fs_delete(fs, fd);
+ if (post_fd)
+ fs->fs_delete(fs, post_fd);
+ fs->fs_delete(fs, root_fd);
+ return err;
+ fail:
+ return -P9_EIO;
+}
+
+static void fs_cmd_xhr_on_load(FSDevice *fs, FSFile *f, int64_t size,
+ void *opaque)
+{
+ CmdXHRState *s = opaque;
+ FSCMDRequest *req;
+ int ret;
+
+ // printf("fs_cmd_xhr_on_load: size=%d\n", (int)size);
+
+ if (s->fd)
+ fs->fs_delete(fs, s->fd);
+ if (s->post_fd)
+ fs->fs_delete(fs, s->post_fd);
+ fs->fs_delete(fs, s->root_fd);
+
+ if (s->req_fd) {
+ req = s->req_fd->req;
+ if (size < 0) {
+ ret = size;
+ } else {
+ ret = 0;
+ }
+ put_le32(req->reply_buf, ret);
+ req->reply_len = sizeof(ret);
+ req->xhr_state = NULL;
+ }
+ free(s);
+}
+
+static int fs_cmd_set_base_url(FSDevice *fs, const char *p)
+{
+ // FSDeviceMem *fs1 = (FSDeviceMem *)fs;
+ char url[1024], base_url_id[1024];
+ char user_buf[128], *user;
+ char password_buf[128], *password;
+ AES_KEY aes_state, *paes_state;
+ uint8_t aes_key[FS_KEY_LEN];
+ int aes_key_len;
+
+ if (parse_fname(base_url_id, sizeof(base_url_id), &p) < 0)
+ goto fail;
+ if (parse_fname(url, sizeof(url), &p) < 0)
+ goto fail;
+ if (parse_fname(user_buf, sizeof(user_buf), &p) < 0)
+ goto fail;
+ if (parse_fname(password_buf, sizeof(password_buf), &p) < 0)
+ goto fail;
+ aes_key_len = parse_hex_buf(aes_key, FS_KEY_LEN, &p);
+ if (aes_key_len < 0)
+ goto fail;
+
+ if (user_buf[0] != '\0')
+ user = user_buf;
+ else
+ user = NULL;
+ if (password_buf[0] != '\0')
+ password = password_buf;
+ else
+ password = NULL;
+
+ if (aes_key_len != 0) {
+ if (aes_key_len != FS_KEY_LEN)
+ goto fail;
+ AES_set_decrypt_key(aes_key, FS_KEY_LEN * 8, &aes_state);
+ paes_state = &aes_state;
+ } else {
+ paes_state = NULL;
+ }
+
+ fs_net_set_base_url(fs, base_url_id, url, user, password,
+ paes_state);
+ return 0;
+ fail:
+ return -P9_EINVAL;
+}
+
+static int fs_cmd_reset_base_url(FSDevice *fs, const char *p)
+{
+ char base_url_id[1024];
+
+ if (parse_fname(base_url_id, sizeof(base_url_id), &p) < 0)
+ goto fail;
+ fs_net_reset_base_url(fs, base_url_id);
+ return 0;
+ fail:
+ return -P9_EINVAL;
+}
+
+static int fs_cmd_set_url(FSDevice *fs, const char *p)
+{
+ char base_url_id[1024];
+ char filename[1024];
+ FSFileID file_id;
+ uint64_t size;
+ FSINode *n;
+
+ if (parse_fname(filename, sizeof(filename), &p) < 0)
+ goto fail;
+ if (parse_fname(base_url_id, sizeof(base_url_id), &p) < 0)
+ goto fail;
+ if (parse_file_id(&file_id, &p) < 0)
+ goto fail;
+ if (parse_uint64(&size, &p) < 0)
+ goto fail;
+
+ n = inode_search_path(fs, filename);
+ if (!n) {
+ return -P9_ENOENT;
+ }
+ return fs_net_set_url(fs, n, base_url_id, file_id, size);
+ fail:
+ return -P9_EINVAL;
+}
+
+static int fs_cmd_export_file(FSDevice *fs, const char *p)
+{
+ char filename[1024];
+ FSINode *n;
+ const char *name;
+ uint8_t *buf;
+
+ if (parse_fname(filename, sizeof(filename), &p) < 0)
+ goto fail;
+ n = inode_search_path(fs, filename);
+ if (!n)
+ return -P9_ENOENT;
+ if (n->type != FT_REG ||
+ (n->u.reg.state != REG_STATE_LOCAL &&
+ n->u.reg.state != REG_STATE_LOADED))
+ goto fail;
+ name = strrchr(filename, '/');
+ if (name)
+ name++;
+ else
+ name = filename;
+ /* XXX: pass the buffer to JS to avoid the allocation */
+ buf = malloc(n->u.reg.size);
+ file_buffer_read(&n->u.reg.fbuf, 0, buf, n->u.reg.size);
+ fs_export_file(name, buf, n->u.reg.size);
+ free(buf);
+ return 0;
+ fail:
+ return -P9_EIO;
+}
+
+/* PBKDF2 crypto acceleration */
+static int fs_cmd_pbkdf2(FSDevice *fs, FSFile *f, const char *p)
+{
+ uint8_t pwd[1024];
+ uint8_t salt[128];
+ uint32_t iter, key_len;
+ int pwd_len, salt_len;
+ FSCMDRequest *req;
+
+ /* a request is already done or in progress */
+ if (f->req != NULL)
+ return -P9_EIO;
+
+ pwd_len = parse_hex_buf(pwd, sizeof(pwd), &p);
+ if (pwd_len < 0)
+ goto fail;
+ salt_len = parse_hex_buf(salt, sizeof(salt), &p);
+ if (pwd_len < 0)
+ goto fail;
+ if (parse_uint32(&iter, &p) < 0)
+ goto fail;
+ if (parse_uint32(&key_len, &p) < 0)
+ goto fail;
+ if (key_len > FS_CMD_REPLY_LEN_MAX ||
+ key_len == 0)
+ goto fail;
+ req = mallocz(sizeof(*req));
+ req->type = FS_CMD_PBKDF2;
+ req->reply_len = key_len;
+ pbkdf2_hmac_sha256(pwd, pwd_len, salt, salt_len, iter, key_len,
+ req->reply_buf);
+ f->req = req;
+ return 0;
+ fail:
+ return -P9_EINVAL;
+}
+
+static int fs_cmd_set_import_dir(FSDevice *fs, FSFile *f, const char *p)
+{
+ FSDeviceMem *fs1 = (FSDeviceMem *)fs;
+ char filename[1024];
+
+ if (parse_fname(filename, sizeof(filename), &p) < 0)
+ return -P9_EINVAL;
+ free(fs1->import_dir);
+ fs1->import_dir = strdup(filename);
+ return 0;
+}
+
+static int fs_cmd_write(FSDevice *fs, FSFile *f, uint64_t offset,
+ const uint8_t *buf, int buf_len)
+{
+ char *buf1;
+ const char *p;
+ char cmd[64];
+ int err;
+
+ /* transform into a string */
+ buf1 = malloc(buf_len + 1);
+ memcpy(buf1, buf, buf_len);
+ buf1[buf_len] = '\0';
+
+ err = 0;
+ p = buf1;
+ if (parse_fname(cmd, sizeof(cmd), &p) < 0)
+ goto fail;
+ if (!strcmp(cmd, "xhr")) {
+ err = fs_cmd_xhr(fs, f, p, f->uid, 0);
+ } else if (!strcmp(cmd, "set_base_url")) {
+ err = fs_cmd_set_base_url(fs, p);
+ } else if (!strcmp(cmd, "reset_base_url")) {
+ err = fs_cmd_reset_base_url(fs, p);
+ } else if (!strcmp(cmd, "set_url")) {
+ err = fs_cmd_set_url(fs, p);
+ } else if (!strcmp(cmd, "export_file")) {
+ err = fs_cmd_export_file(fs, p);
+ } else if (!strcmp(cmd, "pbkdf2")) {
+ err = fs_cmd_pbkdf2(fs, f, p);
+ } else if (!strcmp(cmd, "set_import_dir")) {
+ err = fs_cmd_set_import_dir(fs, f, p);
+ } else {
+ printf("unknown command: '%s'\n", cmd);
+ fail:
+ err = -P9_EIO;
+ }
+ free(buf1);
+ if (err == 0)
+ return buf_len;
+ else
+ return err;
+}
+
+static int fs_cmd_read(FSDevice *fs, FSFile *f, uint64_t offset,
+ uint8_t *buf, int buf_len)
+{
+ FSCMDRequest *req;
+ int l;
+
+ req = f->req;
+ if (!req)
+ return -P9_EIO;
+ l = min_int(req->reply_len, buf_len);
+ memcpy(buf, req->reply_buf, l);
+ return l;
+}
+
+static void fs_cmd_close(FSDevice *fs, FSFile *f)
+{
+ FSCMDRequest *req;
+ req = f->req;
+
+ if (req) {
+ if (req->xhr_state) {
+ req->xhr_state->req_fd = NULL;
+ }
+ free(req);
+ f->req = NULL;
+ }
+}
+
+/* Create a .fscmd_pwd file to avoid passing the password thru the
+ Linux command line */
+void fs_net_set_pwd(FSDevice *fs, const char *pwd)
+{
+ FSFile *root_fd;
+ FSQID qid;
+
+ assert(fs_is_net(fs));
+
+ assert(!fs->fs_attach(fs, &root_fd, &qid, 0, "", ""));
+ assert(!fs->fs_create(fs, &qid, root_fd, ".fscmd_pwd", P9_O_RDWR | P9_O_TRUNC,
+ 0600, 0));
+ fs->fs_write(fs, root_fd, 0, (uint8_t *)pwd, strlen(pwd));
+ fs->fs_delete(fs, root_fd);
+}
+
+/* external file import */
+
+#ifdef EMSCRIPTEN
+
+void fs_import_file(const char *filename, uint8_t *buf, int buf_len)
+{
+ FSDevice *fs;
+ FSDeviceMem *fs1;
+ FSFile *fd, *root_fd;
+ FSQID qid;
+
+ // printf("importing file: %s len=%d\n", filename, buf_len);
+ fs = fs_import_fs;
+ if (!fs) {
+ free(buf);
+ return;
+ }
+
+ assert(!fs->fs_attach(fs, &root_fd, &qid, 1000, "", ""));
+ fs1 = (FSDeviceMem *)fs;
+ fd = fs_walk_path(fs, root_fd, fs1->import_dir);
+ if (!fd)
+ goto fail;
+ fs_unlinkat(fs, root_fd, filename);
+ if (fs->fs_create(fs, &qid, fd, filename, P9_O_RDWR | P9_O_TRUNC,
+ 0600, 0) < 0)
+ goto fail;
+ fs->fs_write(fs, fd, 0, buf, buf_len);
+ fail:
+ if (fd)
+ fs->fs_delete(fs, fd);
+ if (root_fd)
+ fs->fs_delete(fs, root_fd);
+ free(buf);
+}
+
+#else
+
+void fs_export_file(const char *filename,
+ const uint8_t *buf, int buf_len)
+{
+}
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.c
new file mode 100644
index 0000000..37f399d
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.c
@@ -0,0 +1,370 @@
+/*
+ * Misc FS utilities
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+#include <ctype.h>
+#include <sys/file.h>
+
+#include "cutils.h"
+#include "list.h"
+#include "fs_utils.h"
+
+/* last byte is the version */
+const uint8_t encrypted_file_magic[4] = { 0xfb, 0xa2, 0xe9, 0x01 };
+
+char *compose_path(const char *path, const char *name)
+{
+ int path_len, name_len;
+ char *d, *q;
+
+ if (path[0] == '\0') {
+ d = strdup(name);
+ } else {
+ path_len = strlen(path);
+ name_len = strlen(name);
+ d = malloc(path_len + 1 + name_len + 1);
+ q = d;
+ memcpy(q, path, path_len);
+ q += path_len;
+ if (path[path_len - 1] != '/')
+ *q++ = '/';
+ memcpy(q, name, name_len + 1);
+ }
+ return d;
+}
+
+char *compose_url(const char *base_url, const char *name)
+{
+ if (strchr(name, ':')) {
+ return strdup(name);
+ } else {
+ return compose_path(base_url, name);
+ }
+}
+
+void skip_line(const char **pp)
+{
+ const char *p;
+ p = *pp;
+ while (*p != '\n' && *p != '\0')
+ p++;
+ if (*p == '\n')
+ p++;
+ *pp = p;
+}
+
+char *quoted_str(const char *str)
+{
+ const char *s;
+ char *q;
+ int c;
+ char *buf;
+
+ if (str[0] == '\0')
+ goto use_quote;
+ s = str;
+ while (*s != '\0') {
+ if (*s <= ' ' || *s > '~')
+ goto use_quote;
+ s++;
+ }
+ return strdup(str);
+ use_quote:
+ buf = malloc(strlen(str) * 4 + 2 + 1);
+ q = buf;
+ s = str;
+ *q++ = '"';
+ while (*s != '\0') {
+ c = *(uint8_t *)s;
+ if (c < ' ' || c == 127) {
+ q += sprintf(q, "\\x%02x", c);
+ } else if (c == '\\' || c == '\"') {
+ q += sprintf(q, "\\%c", c);
+ } else {
+ *q++ = c;
+ }
+ s++;
+ }
+ *q++ = '"';
+ *q = '\0';
+ return buf;
+}
+
+int parse_fname(char *buf, int buf_size, const char **pp)
+{
+ const char *p;
+ char *q;
+ int c, h;
+
+ p = *pp;
+ while (isspace_nolf(*p))
+ p++;
+ if (*p == '\0')
+ return -1;
+ q = buf;
+ if (*p == '"') {
+ p++;
+ for(;;) {
+ c = *p++;
+ if (c == '\0' || c == '\n') {
+ return -1;
+ } else if (c == '\"') {
+ break;
+ } else if (c == '\\') {
+ c = *p++;
+ switch(c) {
+ case '\'':
+ case '\"':
+ case '\\':
+ goto add_char;
+ case 'n':
+ c = '\n';
+ goto add_char;
+ case 'r':
+ c = '\r';
+ goto add_char;
+ case 't':
+ c = '\t';
+ goto add_char;
+ case 'x':
+ h = from_hex(*p++);
+ if (h < 0)
+ return -1;
+ c = h << 4;
+ h = from_hex(*p++);
+ if (h < 0)
+ return -1;
+ c |= h;
+ goto add_char;
+ default:
+ return -1;
+ }
+ } else {
+ add_char:
+ if (q >= buf + buf_size - 1)
+ return -1;
+ *q++ = c;
+ }
+ }
+ } else {
+ while (!isspace_nolf(*p) && *p != '\0' && *p != '\n') {
+ if (q >= buf + buf_size - 1)
+ return -1;
+ *q++ = *p++;
+ }
+ }
+ *q = '\0';
+ *pp = p;
+ return 0;
+}
+
+int parse_uint32_base(uint32_t *pval, const char **pp, int base)
+{
+ const char *p, *p1;
+ p = *pp;
+ while (isspace_nolf(*p))
+ p++;
+ *pval = strtoul(p, (char **)&p1, base);
+ if (p1 == p)
+ return -1;
+ *pp = p1;
+ return 0;
+}
+
+int parse_uint64_base(uint64_t *pval, const char **pp, int base)
+{
+ const char *p, *p1;
+ p = *pp;
+ while (isspace_nolf(*p))
+ p++;
+ *pval = strtoull(p, (char **)&p1, base);
+ if (p1 == p)
+ return -1;
+ *pp = p1;
+ return 0;
+}
+
+int parse_uint64(uint64_t *pval, const char **pp)
+{
+ return parse_uint64_base(pval, pp, 0);
+}
+
+int parse_uint32(uint32_t *pval, const char **pp)
+{
+ return parse_uint32_base(pval, pp, 0);
+}
+
+int parse_time(uint32_t *psec, uint32_t *pnsec, const char **pp)
+{
+ const char *p;
+ uint32_t v, m;
+ p = *pp;
+ if (parse_uint32(psec, &p) < 0)
+ return -1;
+ v = 0;
+ if (*p == '.') {
+ p++;
+ /* XXX: inefficient */
+ m = 1000000000;
+ v = 0;
+ while (*p >= '0' && *p <= '9') {
+ m /= 10;
+ v += (*p - '0') * m;
+ p++;
+ }
+ }
+ *pnsec = v;
+ *pp = p;
+ return 0;
+}
+
+int parse_file_id(FSFileID *pval, const char **pp)
+{
+ return parse_uint64_base(pval, pp, 16);
+}
+
+char *file_id_to_filename(char *buf, FSFileID file_id)
+{
+ sprintf(buf, "%016" PRIx64, file_id);
+ return buf;
+}
+
+void encode_hex(char *str, const uint8_t *buf, int len)
+{
+ int i;
+ for(i = 0; i < len; i++)
+ sprintf(str + 2 * i, "%02x", buf[i]);
+}
+
+int decode_hex(uint8_t *buf, const char *str, int len)
+{
+ int h0, h1, i;
+
+ for(i = 0; i < len; i++) {
+ h0 = from_hex(str[2 * i]);
+ if (h0 < 0)
+ return -1;
+ h1 = from_hex(str[2 * i + 1]);
+ if (h1 < 0)
+ return -1;
+ buf[i] = (h0 << 4) | h1;
+ }
+ return 0;
+}
+
+/* return NULL if no end of header found */
+const char *skip_header(const char *p)
+{
+ p = strstr(p, "\n\n");
+ if (!p)
+ return NULL;
+ return p + 2;
+}
+
+/* return 0 if OK, < 0 if error */
+int parse_tag(char *buf, int buf_size, const char *str, const char *tag)
+{
+ char tagname[128], *q;
+ const char *p, *p1;
+ int len;
+
+ p = str;
+ for(;;) {
+ if (*p == '\0' || *p == '\n')
+ break;
+ q = tagname;
+ while (*p != ':' && *p != '\n' && *p != '\0') {
+ if ((q - tagname) < sizeof(tagname) - 1)
+ *q++ = *p;
+ p++;
+ }
+ *q = '\0';
+ if (*p != ':')
+ return -1;
+ p++;
+ while (isspace_nolf(*p))
+ p++;
+ p1 = p;
+ p = strchr(p, '\n');
+ if (!p)
+ len = strlen(p1);
+ else
+ len = p - p1;
+ if (!strcmp(tagname, tag)) {
+ if (len > buf_size - 1)
+ len = buf_size - 1;
+ memcpy(buf, p1, len);
+ buf[len] = '\0';
+ return 0;
+ }
+ if (!p)
+ break;
+ else
+ p++;
+ }
+ return -1;
+}
+
+int parse_tag_uint64(uint64_t *pval, const char *str, const char *tag)
+{
+ char buf[64];
+ const char *p;
+ if (parse_tag(buf, sizeof(buf), str, tag))
+ return -1;
+ p = buf;
+ return parse_uint64(pval, &p);
+}
+
+int parse_tag_file_id(FSFileID *pval, const char *str, const char *tag)
+{
+ char buf[64];
+ const char *p;
+ if (parse_tag(buf, sizeof(buf), str, tag))
+ return -1;
+ p = buf;
+ return parse_uint64_base(pval, &p, 16);
+}
+
+int parse_tag_version(const char *str)
+{
+ uint64_t version;
+ if (parse_tag_uint64(&version, str, "Version"))
+ return -1;
+ return version;
+}
+
+BOOL is_url(const char *path)
+{
+ return (strstart(path, "http:", NULL) ||
+ strstart(path, "https:", NULL) ||
+ strstart(path, "file:", NULL));
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.h
new file mode 100644
index 0000000..4e4b9cd
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.h
@@ -0,0 +1,95 @@
+/*
+ * Misc FS utilities
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#define HEAD_FILENAME "head"
+#define ROOT_FILENAME "files"
+
+#define FILEID_SIZE_MAX 32
+
+#define FS_KEY_LEN 16
+
+/* default block size to determine the total filesytem size */
+#define FS_BLOCK_SIZE_LOG2 12
+#define FS_BLOCK_SIZE (1 << FS_BLOCK_SIZE_LOG2)
+
+typedef enum {
+ FS_ERR_OK = 0,
+ FS_ERR_GENERIC = -1,
+ FS_ERR_SYNTAX = -2,
+ FS_ERR_REVISION = -3,
+ FS_ERR_FILE_ID = -4,
+ FS_ERR_IO = -5,
+ FS_ERR_NOENT = -6,
+ FS_ERR_COUNTERS = -7,
+ FS_ERR_QUOTA = -8,
+ FS_ERR_PROTOCOL_VERSION = -9,
+ FS_ERR_HEAD = -10,
+} FSCommitErrorCode;
+
+typedef uint64_t FSFileID;
+
+static inline BOOL isspace_nolf(int c)
+{
+ return (c == ' ' || c == '\t');
+}
+
+static inline int from_hex(int c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ else if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ else if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ else
+ return -1;
+}
+
+static inline uint64_t block_align(uint64_t val, uint64_t align)
+{
+ return (val + align - 1) & ~(align - 1);
+}
+
+void pstrcpy(char *buf, int buf_size, const char *str);
+char *pstrcat(char *buf, int buf_size, const char *s);
+char *compose_path(const char *path, const char *name);
+char *compose_url(const char *base_url, const char *name);
+void skip_line(const char **pp);
+char *quoted_str(const char *str);
+int parse_fname(char *buf, int buf_size, const char **pp);
+int parse_uint32_base(uint32_t *pval, const char **pp, int base);
+int parse_uint64_base(uint64_t *pval, const char **pp, int base);
+int parse_uint64(uint64_t *pval, const char **pp);
+int parse_uint32(uint32_t *pval, const char **pp);
+int parse_time(uint32_t *psec, uint32_t *pnsec, const char **pp);
+int parse_file_id(FSFileID *pval, const char **pp);
+char *file_id_to_filename(char *buf, FSFileID file_id);
+void encode_hex(char *str, const uint8_t *buf, int len);
+int decode_hex(uint8_t *buf, const char *str, int len);
+BOOL is_url(const char *path);
+
+const char *skip_header(const char *p);
+int parse_tag(char *buf, int buf_size, const char *str, const char *tag);
+int parse_tag_uint64(uint64_t *pval, const char *str, const char *tag);
+int parse_tag_file_id(FSFileID *pval, const char *str, const char *tag);
+int parse_tag_version(const char *str);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.c
new file mode 100644
index 0000000..b4857b0
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.c
@@ -0,0 +1,625 @@
+/*
+ * HTTP file download
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <sys/time.h>
+#include <ctype.h>
+
+#include "cutils.h"
+#include "list.h"
+#include "fs.h"
+#include "fs_utils.h"
+#include "fs_wget.h"
+
+#if defined(EMSCRIPTEN)
+#include <emscripten.h>
+#else
+#include <curl/multi.h>
+#endif
+
+/***********************************************/
+/* HTTP get */
+
+#ifdef EMSCRIPTEN
+
+struct XHRState {
+ void *opaque;
+ WGetWriteCallback *cb;
+};
+
+static int downloading_count;
+
+void fs_wget_init(void)
+{
+}
+
+extern void fs_wget_update_downloading(int flag);
+
+static void fs_wget_update_downloading_count(int incr)
+{
+ int prev_state, state;
+ prev_state = (downloading_count > 0);
+ downloading_count += incr;
+ state = (downloading_count > 0);
+ if (prev_state != state)
+ fs_wget_update_downloading(state);
+}
+
+static void fs_wget_onerror(unsigned int handle, void *opaque, int status,
+ const char *status_text)
+{
+ XHRState *s = opaque;
+ if (status <= 0)
+ status = -404; /* HTTP not found error */
+ else
+ status = -status;
+ fs_wget_update_downloading_count(-1);
+ if (s->cb)
+ s->cb(s->opaque, status, NULL, 0);
+}
+
+static void fs_wget_onload(unsigned int handle,
+ void *opaque, void *data, unsigned int size)
+{
+ XHRState *s = opaque;
+ fs_wget_update_downloading_count(-1);
+ if (s->cb)
+ s->cb(s->opaque, 0, data, size);
+}
+
+extern int emscripten_async_wget3_data(const char* url, const char* requesttype, const char *user, const char *password, const uint8_t *post_data, int post_data_len, void *arg, int free, em_async_wget2_data_onload_func onload, em_async_wget2_data_onerror_func onerror, em_async_wget2_data_onprogress_func onprogress);
+
+XHRState *fs_wget2(const char *url, const char *user, const char *password,
+ WGetReadCallback *read_cb, uint64_t post_data_len,
+ void *opaque, WGetWriteCallback *cb, BOOL single_write)
+{
+ XHRState *s;
+ const char *request;
+ uint8_t *post_data;
+
+ s = mallocz(sizeof(*s));
+ s->opaque = opaque;
+ s->cb = cb;
+
+ if (post_data_len != 0) {
+ request = "POST";
+ post_data = malloc(post_data_len);
+ read_cb(opaque, post_data, post_data_len);
+ } else {
+ request = "GET";
+ post_data = NULL;
+ }
+ fs_wget_update_downloading_count(1);
+
+ emscripten_async_wget3_data(url, request, user, password,
+ post_data, post_data_len, s, 1, fs_wget_onload,
+ fs_wget_onerror, NULL);
+ if (post_data_len != 0)
+ free(post_data);
+ return s;
+}
+
+void fs_wget_free(XHRState *s)
+{
+ s->cb = NULL;
+ s->opaque = NULL;
+}
+
+#else
+
+struct XHRState {
+ struct list_head link;
+ CURL *eh;
+ void *opaque;
+ WGetWriteCallback *write_cb;
+ WGetReadCallback *read_cb;
+
+ BOOL single_write;
+ DynBuf dbuf; /* used if single_write */
+};
+
+typedef struct {
+ struct list_head link;
+ int64_t timeout;
+ void (*cb)(void *opaque);
+ void *opaque;
+} AsyncCallState;
+
+static CURLM *curl_multi_ctx;
+static struct list_head xhr_list; /* list of XHRState.link */
+
+void fs_wget_init(void)
+{
+ if (curl_multi_ctx)
+ return;
+ curl_global_init(CURL_GLOBAL_ALL);
+ curl_multi_ctx = curl_multi_init();
+ init_list_head(&xhr_list);
+}
+
+void fs_wget_end(void)
+{
+ curl_multi_cleanup(curl_multi_ctx);
+ curl_global_cleanup();
+}
+
+static size_t fs_wget_write_cb(char *ptr, size_t size, size_t nmemb,
+ void *userdata)
+{
+ XHRState *s = userdata;
+ size *= nmemb;
+
+ if (s->single_write) {
+ dbuf_write(&s->dbuf, s->dbuf.size, (void *)ptr, size);
+ } else {
+ s->write_cb(s->opaque, 1, ptr, size);
+ }
+ return size;
+}
+
+static size_t fs_wget_read_cb(char *ptr, size_t size, size_t nmemb,
+ void *userdata)
+{
+ XHRState *s = userdata;
+ size *= nmemb;
+ return s->read_cb(s->opaque, ptr, size);
+}
+
+XHRState *fs_wget2(const char *url, const char *user, const char *password,
+ WGetReadCallback *read_cb, uint64_t post_data_len,
+ void *opaque, WGetWriteCallback *write_cb, BOOL single_write)
+{
+ XHRState *s;
+ s = mallocz(sizeof(*s));
+ s->eh = curl_easy_init();
+ s->opaque = opaque;
+ s->write_cb = write_cb;
+ s->read_cb = read_cb;
+ s->single_write = single_write;
+ dbuf_init(&s->dbuf);
+
+ curl_easy_setopt(s->eh, CURLOPT_PRIVATE, s);
+ curl_easy_setopt(s->eh, CURLOPT_WRITEDATA, s);
+ curl_easy_setopt(s->eh, CURLOPT_WRITEFUNCTION, fs_wget_write_cb);
+ curl_easy_setopt(s->eh, CURLOPT_HEADER, 0);
+ curl_easy_setopt(s->eh, CURLOPT_URL, url);
+ curl_easy_setopt(s->eh, CURLOPT_VERBOSE, 0L);
+ curl_easy_setopt(s->eh, CURLOPT_ACCEPT_ENCODING, "");
+ if (user) {
+ curl_easy_setopt(s->eh, CURLOPT_USERNAME, user);
+ curl_easy_setopt(s->eh, CURLOPT_PASSWORD, password);
+ }
+ if (post_data_len != 0) {
+ struct curl_slist *headers = NULL;
+ headers = curl_slist_append(headers,
+ "Content-Type: application/octet-stream");
+ curl_easy_setopt(s->eh, CURLOPT_HTTPHEADER, headers);
+ curl_easy_setopt(s->eh, CURLOPT_POST, 1L);
+ curl_easy_setopt(s->eh, CURLOPT_POSTFIELDSIZE_LARGE,
+ (curl_off_t)post_data_len);
+ curl_easy_setopt(s->eh, CURLOPT_READDATA, s);
+ curl_easy_setopt(s->eh, CURLOPT_READFUNCTION, fs_wget_read_cb);
+ }
+ curl_multi_add_handle(curl_multi_ctx, s->eh);
+ list_add_tail(&s->link, &xhr_list);
+ return s;
+}
+
+void fs_wget_free(XHRState *s)
+{
+ dbuf_free(&s->dbuf);
+ curl_easy_cleanup(s->eh);
+ list_del(&s->link);
+ free(s);
+}
+
+/* timeout is in ms */
+void fs_net_set_fdset(int *pfd_max, fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int *ptimeout)
+{
+ long timeout;
+ int n, fd_max;
+ CURLMsg *msg;
+
+ if (!curl_multi_ctx)
+ return;
+
+ curl_multi_perform(curl_multi_ctx, &n);
+
+ for(;;) {
+ msg = curl_multi_info_read(curl_multi_ctx, &n);
+ if (!msg)
+ break;
+ if (msg->msg == CURLMSG_DONE) {
+ XHRState *s;
+ long http_code;
+
+ curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, (char **)&s);
+ curl_easy_getinfo(msg->easy_handle, CURLINFO_RESPONSE_CODE,
+ &http_code);
+ /* signal the end of the transfer or error */
+ if (http_code == 200) {
+ if (s->single_write) {
+ s->write_cb(s->opaque, 0, s->dbuf.buf, s->dbuf.size);
+ } else {
+ s->write_cb(s->opaque, 0, NULL, 0);
+ }
+ } else {
+ s->write_cb(s->opaque, -http_code, NULL, 0);
+ }
+ curl_multi_remove_handle(curl_multi_ctx, s->eh);
+ curl_easy_cleanup(s->eh);
+ dbuf_free(&s->dbuf);
+ list_del(&s->link);
+ free(s);
+ }
+ }
+
+ curl_multi_fdset(curl_multi_ctx, rfds, wfds, efds, &fd_max);
+ *pfd_max = max_int(*pfd_max, fd_max);
+ curl_multi_timeout(curl_multi_ctx, &timeout);
+ if (timeout >= 0)
+ *ptimeout = min_int(*ptimeout, timeout);
+}
+
+void fs_net_event_loop(FSNetEventLoopCompletionFunc *cb, void *opaque)
+{
+ fd_set rfds, wfds, efds;
+ int timeout, fd_max;
+ struct timeval tv;
+
+ if (!curl_multi_ctx)
+ return;
+
+ for(;;) {
+ fd_max = -1;
+ FD_ZERO(&rfds);
+ FD_ZERO(&wfds);
+ FD_ZERO(&efds);
+ timeout = 10000;
+ fs_net_set_fdset(&fd_max, &rfds, &wfds, &efds, &timeout);
+ if (cb) {
+ if (cb(opaque))
+ break;
+ } else {
+ if (list_empty(&xhr_list))
+ break;
+ }
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ select(fd_max + 1, &rfds, &wfds, &efds, &tv);
+ }
+}
+
+#endif /* !EMSCRIPTEN */
+
+XHRState *fs_wget(const char *url, const char *user, const char *password,
+ void *opaque, WGetWriteCallback *cb, BOOL single_write)
+{
+ return fs_wget2(url, user, password, NULL, 0, opaque, cb, single_write);
+}
+
+/***********************************************/
+/* file decryption */
+
+#define ENCRYPTED_FILE_HEADER_SIZE (4 + AES_BLOCK_SIZE)
+
+#define DEC_BUF_SIZE (256 * AES_BLOCK_SIZE)
+
+struct DecryptFileState {
+ DecryptFileCB *write_cb;
+ void *opaque;
+ int dec_state;
+ int dec_buf_pos;
+ AES_KEY *aes_state;
+ uint8_t iv[AES_BLOCK_SIZE];
+ uint8_t dec_buf[DEC_BUF_SIZE];
+};
+
+DecryptFileState *decrypt_file_init(AES_KEY *aes_state,
+ DecryptFileCB *write_cb,
+ void *opaque)
+{
+ DecryptFileState *s;
+ s = mallocz(sizeof(*s));
+ s->write_cb = write_cb;
+ s->opaque = opaque;
+ s->aes_state = aes_state;
+ return s;
+}
+
+int decrypt_file(DecryptFileState *s, const uint8_t *data,
+ size_t size)
+{
+ int l, len, ret;
+
+ while (size != 0) {
+ switch(s->dec_state) {
+ case 0:
+ l = min_int(size, ENCRYPTED_FILE_HEADER_SIZE - s->dec_buf_pos);
+ memcpy(s->dec_buf + s->dec_buf_pos, data, l);
+ s->dec_buf_pos += l;
+ if (s->dec_buf_pos >= ENCRYPTED_FILE_HEADER_SIZE) {
+ if (memcmp(s->dec_buf, encrypted_file_magic, 4) != 0)
+ return -1;
+ memcpy(s->iv, s->dec_buf + 4, AES_BLOCK_SIZE);
+ s->dec_state = 1;
+ s->dec_buf_pos = 0;
+ }
+ break;
+ case 1:
+ l = min_int(size, DEC_BUF_SIZE - s->dec_buf_pos);
+ memcpy(s->dec_buf + s->dec_buf_pos, data, l);
+ s->dec_buf_pos += l;
+ if (s->dec_buf_pos >= DEC_BUF_SIZE) {
+ /* keep one block in case it is the padding */
+ len = s->dec_buf_pos - AES_BLOCK_SIZE;
+ AES_cbc_encrypt(s->dec_buf, s->dec_buf, len,
+ s->aes_state, s->iv, FALSE);
+ ret = s->write_cb(s->opaque, s->dec_buf, len);
+ if (ret < 0)
+ return ret;
+ memcpy(s->dec_buf, s->dec_buf + s->dec_buf_pos - AES_BLOCK_SIZE,
+ AES_BLOCK_SIZE);
+ s->dec_buf_pos = AES_BLOCK_SIZE;
+ }
+ break;
+ default:
+ abort();
+ }
+ data += l;
+ size -= l;
+ }
+ return 0;
+}
+
+/* write last blocks */
+int decrypt_file_flush(DecryptFileState *s)
+{
+ int len, pad_len, ret;
+
+ if (s->dec_state != 1)
+ return -1;
+ len = s->dec_buf_pos;
+ if (len == 0 ||
+ (len % AES_BLOCK_SIZE) != 0)
+ return -1;
+ AES_cbc_encrypt(s->dec_buf, s->dec_buf, len,
+ s->aes_state, s->iv, FALSE);
+ pad_len = s->dec_buf[s->dec_buf_pos - 1];
+ if (pad_len < 1 || pad_len > AES_BLOCK_SIZE)
+ return -1;
+ len -= pad_len;
+ if (len != 0) {
+ ret = s->write_cb(s->opaque, s->dec_buf, len);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+
+void decrypt_file_end(DecryptFileState *s)
+{
+ free(s);
+}
+
+/* XHR file */
+
+typedef struct {
+ FSDevice *fs;
+ FSFile *f;
+ int64_t pos;
+ FSWGetFileCB *cb;
+ void *opaque;
+ FSFile *posted_file;
+ int64_t read_pos;
+ DecryptFileState *dec_state;
+} FSWGetFileState;
+
+static int fs_wget_file_write_cb(void *opaque, const uint8_t *data,
+ size_t size)
+{
+ FSWGetFileState *s = opaque;
+ FSDevice *fs = s->fs;
+ int ret;
+
+ ret = fs->fs_write(fs, s->f, s->pos, data, size);
+ if (ret < 0)
+ return ret;
+ s->pos += ret;
+ return ret;
+}
+
+static void fs_wget_file_on_load(void *opaque, int err, void *data, size_t size)
+{
+ FSWGetFileState *s = opaque;
+ FSDevice *fs = s->fs;
+ int ret;
+ int64_t ret_size;
+
+ // printf("err=%d size=%ld\n", err, size);
+ if (err < 0) {
+ ret_size = err;
+ goto done;
+ } else {
+ if (s->dec_state) {
+ ret = decrypt_file(s->dec_state, data, size);
+ if (ret >= 0 && err == 0) {
+ /* handle the end of file */
+ decrypt_file_flush(s->dec_state);
+ }
+ } else {
+ ret = fs_wget_file_write_cb(s, data, size);
+ }
+ if (ret < 0) {
+ ret_size = ret;
+ goto done;
+ } else if (err == 0) {
+ /* end of transfer */
+ ret_size = s->pos;
+ done:
+ s->cb(fs, s->f, ret_size, s->opaque);
+ if (s->dec_state)
+ decrypt_file_end(s->dec_state);
+ free(s);
+ }
+ }
+}
+
+static size_t fs_wget_file_read_cb(void *opaque, void *data, size_t size)
+{
+ FSWGetFileState *s = opaque;
+ FSDevice *fs = s->fs;
+ int ret;
+
+ if (!s->posted_file)
+ return 0;
+ ret = fs->fs_read(fs, s->posted_file, s->read_pos, data, size);
+ if (ret < 0)
+ return 0;
+ s->read_pos += ret;
+ return ret;
+}
+
+void fs_wget_file2(FSDevice *fs, FSFile *f, const char *url,
+ const char *user, const char *password,
+ FSFile *posted_file, uint64_t post_data_len,
+ FSWGetFileCB *cb, void *opaque,
+ AES_KEY *aes_state)
+{
+ FSWGetFileState *s;
+ s = mallocz(sizeof(*s));
+ s->fs = fs;
+ s->f = f;
+ s->pos = 0;
+ s->cb = cb;
+ s->opaque = opaque;
+ s->posted_file = posted_file;
+ s->read_pos = 0;
+ if (aes_state) {
+ s->dec_state = decrypt_file_init(aes_state, fs_wget_file_write_cb, s);
+ }
+
+ fs_wget2(url, user, password, fs_wget_file_read_cb, post_data_len,
+ s, fs_wget_file_on_load, FALSE);
+}
+
+/***********************************************/
+/* PBKDF2 */
+
+#ifdef USE_BUILTIN_CRYPTO
+
+#define HMAC_BLOCK_SIZE 64
+
+typedef struct {
+ SHA256_CTX ctx;
+ uint8_t K[HMAC_BLOCK_SIZE + SHA256_DIGEST_LENGTH];
+} HMAC_SHA256_CTX;
+
+void hmac_sha256_init(HMAC_SHA256_CTX *s, const uint8_t *key, int key_len)
+{
+ int i, l;
+
+ if (key_len > HMAC_BLOCK_SIZE) {
+ SHA256(key, key_len, s->K);
+ l = SHA256_DIGEST_LENGTH;
+ } else {
+ memcpy(s->K, key, key_len);
+ l = key_len;
+ }
+ memset(s->K + l, 0, HMAC_BLOCK_SIZE - l);
+ for(i = 0; i < HMAC_BLOCK_SIZE; i++)
+ s->K[i] ^= 0x36;
+ SHA256_Init(&s->ctx);
+ SHA256_Update(&s->ctx, s->K, HMAC_BLOCK_SIZE);
+}
+
+void hmac_sha256_update(HMAC_SHA256_CTX *s, const uint8_t *buf, int len)
+{
+ SHA256_Update(&s->ctx, buf, len);
+}
+
+/* out has a length of SHA256_DIGEST_LENGTH */
+void hmac_sha256_final(HMAC_SHA256_CTX *s, uint8_t *out)
+{
+ int i;
+
+ SHA256_Final(s->K + HMAC_BLOCK_SIZE, &s->ctx);
+ for(i = 0; i < HMAC_BLOCK_SIZE; i++)
+ s->K[i] ^= (0x36 ^ 0x5c);
+ SHA256(s->K, HMAC_BLOCK_SIZE + SHA256_DIGEST_LENGTH, out);
+}
+
+#define SALT_LEN_MAX 32
+
+void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len,
+ const uint8_t *salt, int salt_len,
+ int iter, int key_len, uint8_t *out)
+{
+ uint8_t F[SHA256_DIGEST_LENGTH], U[SALT_LEN_MAX + 4];
+ HMAC_SHA256_CTX ctx;
+ int it, U_len, j, l;
+ uint32_t i;
+
+ assert(salt_len <= SALT_LEN_MAX);
+ i = 1;
+ while (key_len > 0) {
+ memset(F, 0, SHA256_DIGEST_LENGTH);
+ memcpy(U, salt, salt_len);
+ U[salt_len] = i >> 24;
+ U[salt_len + 1] = i >> 16;
+ U[salt_len + 2] = i >> 8;
+ U[salt_len + 3] = i;
+ U_len = salt_len + 4;
+ for(it = 0; it < iter; it++) {
+ hmac_sha256_init(&ctx, pwd, pwd_len);
+ hmac_sha256_update(&ctx, U, U_len);
+ hmac_sha256_final(&ctx, U);
+ for(j = 0; j < SHA256_DIGEST_LENGTH; j++)
+ F[j] ^= U[j];
+ U_len = SHA256_DIGEST_LENGTH;
+ }
+ l = min_int(key_len, SHA256_DIGEST_LENGTH);
+ memcpy(out, F, l);
+ out += l;
+ key_len -= l;
+ i++;
+ }
+}
+
+#else
+
+void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len,
+ const uint8_t *salt, int salt_len,
+ int iter, int key_len, uint8_t *out)
+{
+ PKCS5_PBKDF2_HMAC((const char *)pwd, pwd_len, salt, salt_len,
+ iter, EVP_sha256(), key_len, out);
+}
+
+#endif /* !USE_BUILTIN_CRYPTO */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.h
new file mode 100644
index 0000000..35b6a4b
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.h
@@ -0,0 +1,93 @@
+/*
+ * HTTP file download
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#if defined(EMSCRIPTEN)
+#define USE_BUILTIN_CRYPTO
+#endif
+
+#ifdef USE_BUILTIN_CRYPTO
+#include "aes.h"
+#include "sha256.h"
+#else
+#include <openssl/aes.h>
+#include <openssl/sha.h>
+#include <openssl/evp.h>
+#endif
+#ifdef _WIN32
+#include <winsock2.h>
+#endif
+
+#define LOG() printf("%s:%d\n", __func__, __LINE__)
+
+/* XHR */
+
+/* err < 0: error (no data provided)
+ err = 0: end of transfer (data can be provided too)
+ err = 1: data chunk
+*/
+typedef void WGetWriteCallback(void *opaque, int err, void *data, size_t size);
+typedef size_t WGetReadCallback(void *opaque, void *data, size_t size);
+typedef struct XHRState XHRState;
+
+XHRState *fs_wget(const char *url, const char *user, const char *password,
+ void *opaque, WGetWriteCallback *cb, BOOL single_write);
+void fs_wget_free(XHRState *s);
+
+void fs_wget_init(void);
+void fs_wget_end(void);
+
+#ifndef EMSCRIPTEN
+typedef BOOL FSNetEventLoopCompletionFunc(void *opaque);
+void fs_net_set_fdset(int *pfd_max, fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int *ptimeout);
+void fs_net_event_loop(FSNetEventLoopCompletionFunc *cb, void *opaque);
+#endif
+
+/* crypto */
+
+extern const uint8_t encrypted_file_magic[4];
+
+typedef int DecryptFileCB(void *opaque, const uint8_t *data, size_t len);
+typedef struct DecryptFileState DecryptFileState;
+
+DecryptFileState *decrypt_file_init(AES_KEY *aes_state,
+ DecryptFileCB *write_cb,
+ void *opaque);
+int decrypt_file(DecryptFileState *s, const uint8_t *data,
+ size_t size);
+int decrypt_file_flush(DecryptFileState *s);
+void decrypt_file_end(DecryptFileState *s);
+
+void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len,
+ const uint8_t *salt, int salt_len,
+ int iter, int key_len, uint8_t *out);
+
+/* XHR file */
+
+typedef void FSWGetFileCB(FSDevice *fs, FSFile *f, int64_t size, void *opaque);
+
+void fs_wget_file2(FSDevice *fs, FSFile *f, const char *url,
+ const char *user, const char *password,
+ FSFile *posted_file, uint64_t post_data_len,
+ FSWGetFileCB *cb, void *opaque,
+ AES_KEY *aes_state);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ide.c b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.c
new file mode 100644
index 0000000..4952965
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.c
@@ -0,0 +1,835 @@
+/*
+ * IDE emulation
+ *
+ * Copyright (c) 2003-2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "ide.h"
+
+//#define DEBUG_IDE
+
+/* Bits of HD_STATUS */
+#define ERR_STAT 0x01
+#define INDEX_STAT 0x02
+#define ECC_STAT 0x04 /* Corrected error */
+#define DRQ_STAT 0x08
+#define SEEK_STAT 0x10
+#define SRV_STAT 0x10
+#define WRERR_STAT 0x20
+#define READY_STAT 0x40
+#define BUSY_STAT 0x80
+
+/* Bits for HD_ERROR */
+#define MARK_ERR 0x01 /* Bad address mark */
+#define TRK0_ERR 0x02 /* couldn't find track 0 */
+#define ABRT_ERR 0x04 /* Command aborted */
+#define MCR_ERR 0x08 /* media change request */
+#define ID_ERR 0x10 /* ID field not found */
+#define MC_ERR 0x20 /* media changed */
+#define ECC_ERR 0x40 /* Uncorrectable ECC error */
+#define BBD_ERR 0x80 /* pre-EIDE meaning: block marked bad */
+#define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */
+
+/* Bits of HD_NSECTOR */
+#define CD 0x01
+#define IO 0x02
+#define REL 0x04
+#define TAG_MASK 0xf8
+
+#define IDE_CMD_RESET 0x04
+#define IDE_CMD_DISABLE_IRQ 0x02
+
+/* ATA/ATAPI Commands pre T13 Spec */
+#define WIN_NOP 0x00
+/*
+ * 0x01->0x02 Reserved
+ */
+#define CFA_REQ_EXT_ERROR_CODE 0x03 /* CFA Request Extended Error Code */
+/*
+ * 0x04->0x07 Reserved
+ */
+#define WIN_SRST 0x08 /* ATAPI soft reset command */
+#define WIN_DEVICE_RESET 0x08
+/*
+ * 0x09->0x0F Reserved
+ */
+#define WIN_RECAL 0x10
+#define WIN_RESTORE WIN_RECAL
+/*
+ * 0x10->0x1F Reserved
+ */
+#define WIN_READ 0x20 /* 28-Bit */
+#define WIN_READ_ONCE 0x21 /* 28-Bit without retries */
+#define WIN_READ_LONG 0x22 /* 28-Bit */
+#define WIN_READ_LONG_ONCE 0x23 /* 28-Bit without retries */
+#define WIN_READ_EXT 0x24 /* 48-Bit */
+#define WIN_READDMA_EXT 0x25 /* 48-Bit */
+#define WIN_READDMA_QUEUED_EXT 0x26 /* 48-Bit */
+#define WIN_READ_NATIVE_MAX_EXT 0x27 /* 48-Bit */
+/*
+ * 0x28
+ */
+#define WIN_MULTREAD_EXT 0x29 /* 48-Bit */
+/*
+ * 0x2A->0x2F Reserved
+ */
+#define WIN_WRITE 0x30 /* 28-Bit */
+#define WIN_WRITE_ONCE 0x31 /* 28-Bit without retries */
+#define WIN_WRITE_LONG 0x32 /* 28-Bit */
+#define WIN_WRITE_LONG_ONCE 0x33 /* 28-Bit without retries */
+#define WIN_WRITE_EXT 0x34 /* 48-Bit */
+#define WIN_WRITEDMA_EXT 0x35 /* 48-Bit */
+#define WIN_WRITEDMA_QUEUED_EXT 0x36 /* 48-Bit */
+#define WIN_SET_MAX_EXT 0x37 /* 48-Bit */
+#define CFA_WRITE_SECT_WO_ERASE 0x38 /* CFA Write Sectors without erase */
+#define WIN_MULTWRITE_EXT 0x39 /* 48-Bit */
+/*
+ * 0x3A->0x3B Reserved
+ */
+#define WIN_WRITE_VERIFY 0x3C /* 28-Bit */
+/*
+ * 0x3D->0x3F Reserved
+ */
+#define WIN_VERIFY 0x40 /* 28-Bit - Read Verify Sectors */
+#define WIN_VERIFY_ONCE 0x41 /* 28-Bit - without retries */
+#define WIN_VERIFY_EXT 0x42 /* 48-Bit */
+/*
+ * 0x43->0x4F Reserved
+ */
+#define WIN_FORMAT 0x50
+/*
+ * 0x51->0x5F Reserved
+ */
+#define WIN_INIT 0x60
+/*
+ * 0x61->0x5F Reserved
+ */
+#define WIN_SEEK 0x70 /* 0x70-0x7F Reserved */
+#define CFA_TRANSLATE_SECTOR 0x87 /* CFA Translate Sector */
+#define WIN_DIAGNOSE 0x90
+#define WIN_SPECIFY 0x91 /* set drive geometry translation */
+#define WIN_DOWNLOAD_MICROCODE 0x92
+#define WIN_STANDBYNOW2 0x94
+#define WIN_STANDBY2 0x96
+#define WIN_SETIDLE2 0x97
+#define WIN_CHECKPOWERMODE2 0x98
+#define WIN_SLEEPNOW2 0x99
+/*
+ * 0x9A VENDOR
+ */
+#define WIN_PACKETCMD 0xA0 /* Send a packet command. */
+#define WIN_PIDENTIFY 0xA1 /* identify ATAPI device */
+#define WIN_QUEUED_SERVICE 0xA2
+#define WIN_SMART 0xB0 /* self-monitoring and reporting */
+#define CFA_ERASE_SECTORS 0xC0
+#define WIN_MULTREAD 0xC4 /* read sectors using multiple mode*/
+#define WIN_MULTWRITE 0xC5 /* write sectors using multiple mode */
+#define WIN_SETMULT 0xC6 /* enable/disable multiple mode */
+#define WIN_READDMA_QUEUED 0xC7 /* read sectors using Queued DMA transfers */
+#define WIN_READDMA 0xC8 /* read sectors using DMA transfers */
+#define WIN_READDMA_ONCE 0xC9 /* 28-Bit - without retries */
+#define WIN_WRITEDMA 0xCA /* write sectors using DMA transfers */
+#define WIN_WRITEDMA_ONCE 0xCB /* 28-Bit - without retries */
+#define WIN_WRITEDMA_QUEUED 0xCC /* write sectors using Queued DMA transfers */
+#define CFA_WRITE_MULTI_WO_ERASE 0xCD /* CFA Write multiple without erase */
+#define WIN_GETMEDIASTATUS 0xDA
+#define WIN_ACKMEDIACHANGE 0xDB /* ATA-1, ATA-2 vendor */
+#define WIN_POSTBOOT 0xDC
+#define WIN_PREBOOT 0xDD
+#define WIN_DOORLOCK 0xDE /* lock door on removable drives */
+#define WIN_DOORUNLOCK 0xDF /* unlock door on removable drives */
+#define WIN_STANDBYNOW1 0xE0
+#define WIN_IDLEIMMEDIATE 0xE1 /* force drive to become "ready" */
+#define WIN_STANDBY 0xE2 /* Set device in Standby Mode */
+#define WIN_SETIDLE1 0xE3
+#define WIN_READ_BUFFER 0xE4 /* force read only 1 sector */
+#define WIN_CHECKPOWERMODE1 0xE5
+#define WIN_SLEEPNOW1 0xE6
+#define WIN_FLUSH_CACHE 0xE7
+#define WIN_WRITE_BUFFER 0xE8 /* force write only 1 sector */
+#define WIN_WRITE_SAME 0xE9 /* read ata-2 to use */
+ /* SET_FEATURES 0x22 or 0xDD */
+#define WIN_FLUSH_CACHE_EXT 0xEA /* 48-Bit */
+#define WIN_IDENTIFY 0xEC /* ask drive to identify itself */
+#define WIN_MEDIAEJECT 0xED
+#define WIN_IDENTIFY_DMA 0xEE /* same as WIN_IDENTIFY, but DMA */
+#define WIN_SETFEATURES 0xEF /* set special drive features */
+#define EXABYTE_ENABLE_NEST 0xF0
+#define WIN_SECURITY_SET_PASS 0xF1
+#define WIN_SECURITY_UNLOCK 0xF2
+#define WIN_SECURITY_ERASE_PREPARE 0xF3
+#define WIN_SECURITY_ERASE_UNIT 0xF4
+#define WIN_SECURITY_FREEZE_LOCK 0xF5
+#define WIN_SECURITY_DISABLE 0xF6
+#define WIN_READ_NATIVE_MAX 0xF8 /* return the native maximum address */
+#define WIN_SET_MAX 0xF9
+#define DISABLE_SEAGATE 0xFB
+
+#define MAX_MULT_SECTORS 128
+
+typedef struct IDEState IDEState;
+
+typedef void EndTransferFunc(IDEState *);
+
+struct IDEState {
+ IDEIFState *ide_if;
+ BlockDevice *bs;
+ int cylinders, heads, sectors;
+ int mult_sectors;
+ int64_t nb_sectors;
+
+ /* ide regs */
+ uint8_t feature;
+ uint8_t error;
+ uint16_t nsector; /* 0 is 256 to ease computations */
+ uint8_t sector;
+ uint8_t lcyl;
+ uint8_t hcyl;
+ uint8_t select;
+ uint8_t status;
+
+ int io_nb_sectors;
+ int req_nb_sectors;
+ EndTransferFunc *end_transfer_func;
+
+ int data_index;
+ int data_end;
+ uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4];
+};
+
+struct IDEIFState {
+ IRQSignal *irq;
+ IDEState *cur_drive;
+ IDEState *drives[2];
+ /* 0x3f6 command */
+ uint8_t cmd;
+};
+
+static void ide_sector_read_cb(void *opaque, int ret);
+static void ide_sector_read_cb_end(IDEState *s);
+static void ide_sector_write_cb2(void *opaque, int ret);
+
+static void padstr(char *str, const char *src, int len)
+{
+ int i, v;
+ for(i = 0; i < len; i++) {
+ if (*src)
+ v = *src++;
+ else
+ v = ' ';
+ *(char *)((long)str ^ 1) = v;
+ str++;
+ }
+}
+
+/* little endian assume */
+static void stw(uint16_t *buf, int v)
+{
+ *buf = v;
+}
+
+static void ide_identify(IDEState *s)
+{
+ uint16_t *tab;
+ uint32_t oldsize;
+
+ tab = (uint16_t *)s->io_buffer;
+
+ memset(tab, 0, 512 * 2);
+
+ stw(tab + 0, 0x0040);
+ stw(tab + 1, s->cylinders);
+ stw(tab + 3, s->heads);
+ stw(tab + 4, 512 * s->sectors); /* sectors */
+ stw(tab + 5, 512); /* sector size */
+ stw(tab + 6, s->sectors);
+ stw(tab + 20, 3); /* buffer type */
+ stw(tab + 21, 512); /* cache size in sectors */
+ stw(tab + 22, 4); /* ecc bytes */
+ padstr((char *)(tab + 27), "RISCVEMU HARDDISK", 40);
+ stw(tab + 47, 0x8000 | MAX_MULT_SECTORS);
+ stw(tab + 48, 0); /* dword I/O */
+ stw(tab + 49, 1 << 9); /* LBA supported, no DMA */
+ stw(tab + 51, 0x200); /* PIO transfer cycle */
+ stw(tab + 52, 0x200); /* DMA transfer cycle */
+ stw(tab + 54, s->cylinders);
+ stw(tab + 55, s->heads);
+ stw(tab + 56, s->sectors);
+ oldsize = s->cylinders * s->heads * s->sectors;
+ stw(tab + 57, oldsize);
+ stw(tab + 58, oldsize >> 16);
+ if (s->mult_sectors)
+ stw(tab + 59, 0x100 | s->mult_sectors);
+ stw(tab + 60, s->nb_sectors);
+ stw(tab + 61, s->nb_sectors >> 16);
+ stw(tab + 80, (1 << 1) | (1 << 2));
+ stw(tab + 82, (1 << 14));
+ stw(tab + 83, (1 << 14));
+ stw(tab + 84, (1 << 14));
+ stw(tab + 85, (1 << 14));
+ stw(tab + 86, 0);
+ stw(tab + 87, (1 << 14));
+}
+
+static void ide_set_signature(IDEState *s)
+{
+ s->select &= 0xf0;
+ s->nsector = 1;
+ s->sector = 1;
+ s->lcyl = 0;
+ s->hcyl = 0;
+}
+
+static void ide_abort_command(IDEState *s)
+{
+ s->status = READY_STAT | ERR_STAT;
+ s->error = ABRT_ERR;
+}
+
+static void ide_set_irq(IDEState *s)
+{
+ IDEIFState *ide_if = s->ide_if;
+ if (!(ide_if->cmd & IDE_CMD_DISABLE_IRQ)) {
+ set_irq(ide_if->irq, 1);
+ }
+}
+
+/* prepare data transfer and tell what to do after */
+static void ide_transfer_start(IDEState *s, int size,
+ EndTransferFunc *end_transfer_func)
+{
+ s->end_transfer_func = end_transfer_func;
+ s->data_index = 0;
+ s->data_end = size;
+}
+
+static void ide_transfer_stop(IDEState *s)
+{
+ s->end_transfer_func = ide_transfer_stop;
+ s->data_index = 0;
+ s->data_end = 0;
+}
+
+static int64_t ide_get_sector(IDEState *s)
+{
+ int64_t sector_num;
+ if (s->select & 0x40) {
+ /* lba */
+ sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
+ (s->lcyl << 8) | s->sector;
+ } else {
+ sector_num = ((s->hcyl << 8) | s->lcyl) *
+ s->heads * s->sectors +
+ (s->select & 0x0f) * s->sectors + (s->sector - 1);
+ }
+ return sector_num;
+}
+
+static void ide_set_sector(IDEState *s, int64_t sector_num)
+{
+ unsigned int cyl, r;
+ if (s->select & 0x40) {
+ s->select = (s->select & 0xf0) | ((sector_num >> 24) & 0x0f);
+ s->hcyl = (sector_num >> 16) & 0xff;
+ s->lcyl = (sector_num >> 8) & 0xff;
+ s->sector = sector_num & 0xff;
+ } else {
+ cyl = sector_num / (s->heads * s->sectors);
+ r = sector_num % (s->heads * s->sectors);
+ s->hcyl = (cyl >> 8) & 0xff;
+ s->lcyl = cyl & 0xff;
+ s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
+ s->sector = (r % s->sectors) + 1;
+ }
+}
+
+static void ide_sector_read(IDEState *s)
+{
+ int64_t sector_num;
+ int ret, n;
+
+ sector_num = ide_get_sector(s);
+ n = s->nsector;
+ if (n == 0)
+ n = 256;
+ if (n > s->req_nb_sectors)
+ n = s->req_nb_sectors;
+#if defined(DEBUG_IDE)
+ printf("read sector=%" PRId64 " count=%d\n", sector_num, n);
+#endif
+ s->io_nb_sectors = n;
+ ret = s->bs->read_async(s->bs, sector_num, s->io_buffer, n,
+ ide_sector_read_cb, s);
+ if (ret < 0) {
+ /* error */
+ ide_abort_command(s);
+ ide_set_irq(s);
+ } else if (ret == 0) {
+ /* synchronous case (needed for performance) */
+ ide_sector_read_cb(s, 0);
+ } else {
+ /* async case */
+ s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
+ s->error = 0; /* not needed by IDE spec, but needed by Windows */
+ }
+}
+
+static void ide_sector_read_cb(void *opaque, int ret)
+{
+ IDEState *s = opaque;
+ int n;
+ EndTransferFunc *func;
+
+ n = s->io_nb_sectors;
+ ide_set_sector(s, ide_get_sector(s) + n);
+ s->nsector = (s->nsector - n) & 0xff;
+ if (s->nsector == 0)
+ func = ide_sector_read_cb_end;
+ else
+ func = ide_sector_read;
+ ide_transfer_start(s, 512 * n, func);
+ ide_set_irq(s);
+ s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
+ s->error = 0; /* not needed by IDE spec, but needed by Windows */
+}
+
+static void ide_sector_read_cb_end(IDEState *s)
+{
+ /* no more sector to read from disk */
+ s->status = READY_STAT | SEEK_STAT;
+ s->error = 0; /* not needed by IDE spec, but needed by Windows */
+ ide_transfer_stop(s);
+}
+
+static void ide_sector_write_cb1(IDEState *s)
+{
+ int64_t sector_num;
+ int ret;
+
+ ide_transfer_stop(s);
+ sector_num = ide_get_sector(s);
+#if defined(DEBUG_IDE)
+ printf("write sector=%" PRId64 " count=%d\n",
+ sector_num, s->io_nb_sectors);
+#endif
+ ret = s->bs->write_async(s->bs, sector_num, s->io_buffer, s->io_nb_sectors,
+ ide_sector_write_cb2, s);
+ if (ret < 0) {
+ /* error */
+ ide_abort_command(s);
+ ide_set_irq(s);
+ } else if (ret == 0) {
+ /* synchronous case (needed for performance) */
+ ide_sector_write_cb2(s, 0);
+ } else {
+ /* async case */
+ s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
+ }
+}
+
+static void ide_sector_write_cb2(void *opaque, int ret)
+{
+ IDEState *s = opaque;
+ int n;
+
+ n = s->io_nb_sectors;
+ ide_set_sector(s, ide_get_sector(s) + n);
+ s->nsector = (s->nsector - n) & 0xff;
+ if (s->nsector == 0) {
+ /* no more sectors to write */
+ s->status = READY_STAT | SEEK_STAT;
+ } else {
+ n = s->nsector;
+ if (n > s->req_nb_sectors)
+ n = s->req_nb_sectors;
+ s->io_nb_sectors = n;
+ ide_transfer_start(s, 512 * n, ide_sector_write_cb1);
+ s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
+ }
+ ide_set_irq(s);
+}
+
+static void ide_sector_write(IDEState *s)
+{
+ int n;
+ n = s->nsector;
+ if (n == 0)
+ n = 256;
+ if (n > s->req_nb_sectors)
+ n = s->req_nb_sectors;
+ s->io_nb_sectors = n;
+ ide_transfer_start(s, 512 * n, ide_sector_write_cb1);
+ s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
+}
+
+static void ide_identify_cb(IDEState *s)
+{
+ ide_transfer_stop(s);
+ s->status = READY_STAT;
+}
+
+static void ide_exec_cmd(IDEState *s, int val)
+{
+#if defined(DEBUG_IDE)
+ printf("ide: exec_cmd=0x%02x\n", val);
+#endif
+ switch(val) {
+ case WIN_IDENTIFY:
+ ide_identify(s);
+ s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
+ ide_transfer_start(s, 512, ide_identify_cb);
+ ide_set_irq(s);
+ break;
+ case WIN_SPECIFY:
+ case WIN_RECAL:
+ s->error = 0;
+ s->status = READY_STAT | SEEK_STAT;
+ ide_set_irq(s);
+ break;
+ case WIN_SETMULT:
+ if (s->nsector > MAX_MULT_SECTORS ||
+ (s->nsector & (s->nsector - 1)) != 0) {
+ ide_abort_command(s);
+ } else {
+ s->mult_sectors = s->nsector;
+#if defined(DEBUG_IDE)
+ printf("ide: setmult=%d\n", s->mult_sectors);
+#endif
+ s->status = READY_STAT;
+ }
+ ide_set_irq(s);
+ break;
+ case WIN_READ:
+ case WIN_READ_ONCE:
+ s->req_nb_sectors = 1;
+ ide_sector_read(s);
+ break;
+ case WIN_WRITE:
+ case WIN_WRITE_ONCE:
+ s->req_nb_sectors = 1;
+ ide_sector_write(s);
+ break;
+ case WIN_MULTREAD:
+ if (!s->mult_sectors) {
+ ide_abort_command(s);
+ ide_set_irq(s);
+ } else {
+ s->req_nb_sectors = s->mult_sectors;
+ ide_sector_read(s);
+ }
+ break;
+ case WIN_MULTWRITE:
+ if (!s->mult_sectors) {
+ ide_abort_command(s);
+ ide_set_irq(s);
+ } else {
+ s->req_nb_sectors = s->mult_sectors;
+ ide_sector_write(s);
+ }
+ break;
+ case WIN_READ_NATIVE_MAX:
+ ide_set_sector(s, s->nb_sectors - 1);
+ s->status = READY_STAT;
+ ide_set_irq(s);
+ break;
+ default:
+ ide_abort_command(s);
+ ide_set_irq(s);
+ break;
+ }
+}
+
+static void ide_ioport_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ IDEIFState *s1 = opaque;
+ IDEState *s = s1->cur_drive;
+ int addr = offset + 1;
+
+#ifdef DEBUG_IDE
+ printf("ide: write addr=0x%02x val=0x%02x\n", addr, val);
+#endif
+ switch(addr) {
+ case 0:
+ break;
+ case 1:
+ if (s) {
+ s->feature = val;
+ }
+ break;
+ case 2:
+ if (s) {
+ s->nsector = val;
+ }
+ break;
+ case 3:
+ if (s) {
+ s->sector = val;
+ }
+ break;
+ case 4:
+ if (s) {
+ s->lcyl = val;
+ }
+ break;
+ case 5:
+ if (s) {
+ s->hcyl = val;
+ }
+ break;
+ case 6:
+ /* select drive */
+ s = s1->cur_drive = s1->drives[(val >> 4) & 1];
+ if (s) {
+ s->select = val;
+ }
+ break;
+ default:
+ case 7:
+ /* command */
+ if (s) {
+ ide_exec_cmd(s, val);
+ }
+ break;
+ }
+}
+
+static uint32_t ide_ioport_read(void *opaque, uint32_t offset, int size_log2)
+{
+ IDEIFState *s1 = opaque;
+ IDEState *s = s1->cur_drive;
+ int ret, addr = offset + 1;
+
+ if (!s) {
+ ret = 0x00;
+ } else {
+ switch(addr) {
+ case 0:
+ ret = 0xff;
+ break;
+ case 1:
+ ret = s->error;
+ break;
+ case 2:
+ ret = s->nsector;
+ break;
+ case 3:
+ ret = s->sector;
+ break;
+ case 4:
+ ret = s->lcyl;
+ break;
+ case 5:
+ ret = s->hcyl;
+ break;
+ case 6:
+ ret = s->select;
+ break;
+ default:
+ case 7:
+ ret = s->status;
+ set_irq(s1->irq, 0);
+ break;
+ }
+ }
+#ifdef DEBUG_IDE
+ printf("ide: read addr=0x%02x val=0x%02x\n", addr, ret);
+#endif
+ return ret;
+}
+
+static uint32_t ide_status_read(void *opaque, uint32_t offset, int size_log2)
+{
+ IDEIFState *s1 = opaque;
+ IDEState *s = s1->cur_drive;
+ int ret;
+
+ if (s) {
+ ret = s->status;
+ } else {
+ ret = 0;
+ }
+#ifdef DEBUG_IDE
+ printf("ide: read status=0x%02x\n", ret);
+#endif
+ return ret;
+}
+
+static void ide_cmd_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ IDEIFState *s1 = opaque;
+ IDEState *s;
+ int i;
+
+#ifdef DEBUG_IDE
+ printf("ide: cmd write=0x%02x\n", val);
+#endif
+ if (!(s1->cmd & IDE_CMD_RESET) && (val & IDE_CMD_RESET)) {
+ /* low to high */
+ for(i = 0; i < 2; i++) {
+ s = s1->drives[i];
+ if (s) {
+ s->status = BUSY_STAT | SEEK_STAT;
+ s->error = 0x01;
+ }
+ }
+ } else if ((s1->cmd & IDE_CMD_RESET) && !(val & IDE_CMD_RESET)) {
+ /* high to low */
+ for(i = 0; i < 2; i++) {
+ s = s1->drives[i];
+ if (s) {
+ s->status = READY_STAT | SEEK_STAT;
+ ide_set_signature(s);
+ }
+ }
+ }
+ s1->cmd = val;
+}
+
+static void ide_data_writew(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ IDEIFState *s1 = opaque;
+ IDEState *s = s1->cur_drive;
+ int p;
+ uint8_t *tab;
+
+ if (!s)
+ return;
+ p = s->data_index;
+ tab = s->io_buffer;
+ tab[p] = val & 0xff;
+ tab[p + 1] = (val >> 8) & 0xff;
+ p += 2;
+ s->data_index = p;
+ if (p >= s->data_end)
+ s->end_transfer_func(s);
+}
+
+static uint32_t ide_data_readw(void *opaque, uint32_t offset, int size_log2)
+{
+ IDEIFState *s1 = opaque;
+ IDEState *s = s1->cur_drive;
+ int p, ret;
+ uint8_t *tab;
+
+ if (!s) {
+ ret = 0;
+ } else {
+ p = s->data_index;
+ tab = s->io_buffer;
+ ret = tab[p] | (tab[p + 1] << 8);
+ p += 2;
+ s->data_index = p;
+ if (p >= s->data_end)
+ s->end_transfer_func(s);
+ }
+ return ret;
+}
+
+static IDEState *ide_drive_init(IDEIFState *ide_if, BlockDevice *bs)
+{
+ IDEState *s;
+ uint32_t cylinders;
+ uint64_t nb_sectors;
+
+ s = malloc(sizeof(*s));
+ memset(s, 0, sizeof(*s));
+
+ s->ide_if = ide_if;
+ s->bs = bs;
+
+ nb_sectors = s->bs->get_sector_count(s->bs);
+ cylinders = nb_sectors / (16 * 63);
+ if (cylinders > 16383)
+ cylinders = 16383;
+ else if (cylinders < 2)
+ cylinders = 2;
+ s->cylinders = cylinders;
+ s->heads = 16;
+ s->sectors = 63;
+ s->nb_sectors = nb_sectors;
+
+ s->mult_sectors = MAX_MULT_SECTORS;
+ /* ide regs */
+ s->feature = 0;
+ s->error = 0;
+ s->nsector = 0;
+ s->sector = 0;
+ s->lcyl = 0;
+ s->hcyl = 0;
+ s->select = 0xa0;
+ s->status = READY_STAT | SEEK_STAT;
+
+ /* init I/O buffer */
+ s->data_index = 0;
+ s->data_end = 0;
+ s->end_transfer_func = ide_transfer_stop;
+
+ s->req_nb_sectors = 0; /* temp for read/write */
+ s->io_nb_sectors = 0; /* temp for read/write */
+ return s;
+}
+
+IDEIFState *ide_init(PhysMemoryMap *port_map, uint32_t addr, uint32_t addr2,
+ IRQSignal *irq, BlockDevice **tab_bs)
+{
+ int i;
+ IDEIFState *s;
+
+ s = malloc(sizeof(IDEIFState));
+ memset(s, 0, sizeof(*s));
+
+ s->irq = irq;
+ s->cmd = 0;
+
+ cpu_register_device(port_map, addr, 1, s, ide_data_readw, ide_data_writew,
+ DEVIO_SIZE16);
+ cpu_register_device(port_map, addr + 1, 7, s, ide_ioport_read, ide_ioport_write,
+ DEVIO_SIZE8);
+ if (addr2) {
+ cpu_register_device(port_map, addr2, 1, s, ide_status_read, ide_cmd_write,
+ DEVIO_SIZE8);
+ }
+
+ for(i = 0; i < 2; i++) {
+ if (tab_bs[i])
+ s->drives[i] = ide_drive_init(s, tab_bs[i]);
+ }
+ s->cur_drive = s->drives[0];
+ return s;
+}
+
+/* dummy PCI device for the IDE */
+PCIDevice *piix3_ide_init(PCIBus *pci_bus, int devfn)
+{
+ PCIDevice *d;
+ d = pci_register_device(pci_bus, "PIIX3 IDE", devfn, 0x8086, 0x7010, 0x00, 0x0101);
+ pci_device_set_config8(d, 0x09, 0x00); /* ISA IDE ports, no DMA */
+ return d;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ide.h b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.h
new file mode 100644
index 0000000..257a6a0
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.h
@@ -0,0 +1,32 @@
+/*
+ * IDE emulation
+ *
+ * Copyright (c) 2003-2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "virtio.h"
+#include "iomem.h"
+#include "pci.h"
+
+typedef struct IDEIFState IDEIFState;
+
+IDEIFState *ide_init(PhysMemoryMap *port_map, uint32_t addr, uint32_t addr2,
+ IRQSignal *irq, BlockDevice **tab_bs);
+PCIDevice *piix3_ide_init(PCIBus *pci_bus, int devfn);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.c b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.c
new file mode 100644
index 0000000..c63ada0
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.c
@@ -0,0 +1,264 @@
+/*
+ * IO memory handling
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "iomem.h"
+
+static PhysMemoryRange *default_register_ram(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, int devram_flags);
+static void default_free_ram(PhysMemoryMap *s, PhysMemoryRange *pr);
+static const uint32_t *default_get_dirty_bits(PhysMemoryMap *map, PhysMemoryRange *pr);
+static void default_set_addr(PhysMemoryMap *map,
+ PhysMemoryRange *pr, uint64_t addr, BOOL enabled);
+
+PhysMemoryMap *phys_mem_map_init(void)
+{
+ PhysMemoryMap *s;
+ s = mallocz(sizeof(*s));
+ s->register_ram = default_register_ram;
+ s->free_ram = default_free_ram;
+ s->get_dirty_bits = default_get_dirty_bits;
+ s->set_ram_addr = default_set_addr;
+ return s;
+}
+
+void phys_mem_map_end(PhysMemoryMap *s)
+{
+ int i;
+ PhysMemoryRange *pr;
+
+ for(i = 0; i < s->n_phys_mem_range; i++) {
+ pr = &s->phys_mem_range[i];
+ if (pr->is_ram) {
+ s->free_ram(s, pr);
+ }
+ }
+ free(s);
+}
+
+/* return NULL if not found */
+/* XXX: optimize */
+PhysMemoryRange *get_phys_mem_range(PhysMemoryMap *s, uint64_t paddr)
+{
+ PhysMemoryRange *pr;
+ int i;
+ for(i = 0; i < s->n_phys_mem_range; i++) {
+ pr = &s->phys_mem_range[i];
+ if (paddr >= pr->addr && paddr < pr->addr + pr->size)
+ return pr;
+ }
+ return NULL;
+}
+
+PhysMemoryRange *register_ram_entry(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, int devram_flags)
+{
+ PhysMemoryRange *pr;
+
+ assert(s->n_phys_mem_range < PHYS_MEM_RANGE_MAX);
+ assert((size & (DEVRAM_PAGE_SIZE - 1)) == 0 && size != 0);
+ pr = &s->phys_mem_range[s->n_phys_mem_range++];
+ pr->map = s;
+ pr->is_ram = TRUE;
+ pr->devram_flags = devram_flags & ~DEVRAM_FLAG_DISABLED;
+ pr->addr = addr;
+ pr->org_size = size;
+ if (devram_flags & DEVRAM_FLAG_DISABLED)
+ pr->size = 0;
+ else
+ pr->size = pr->org_size;
+ pr->phys_mem = NULL;
+ pr->dirty_bits = NULL;
+ return pr;
+}
+
+static PhysMemoryRange *default_register_ram(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, int devram_flags)
+{
+ PhysMemoryRange *pr;
+
+ pr = register_ram_entry(s, addr, size, devram_flags);
+
+ pr->phys_mem = mallocz(size);
+ if (!pr->phys_mem) {
+ fprintf(stderr, "Could not allocate VM memory\n");
+ exit(1);
+ }
+
+ if (devram_flags & DEVRAM_FLAG_DIRTY_BITS) {
+ size_t nb_pages;
+ int i;
+ nb_pages = size >> DEVRAM_PAGE_SIZE_LOG2;
+ pr->dirty_bits_size = ((nb_pages + 31) / 32) * sizeof(uint32_t);
+ pr->dirty_bits_index = 0;
+ for(i = 0; i < 2; i++) {
+ pr->dirty_bits_tab[i] = mallocz(pr->dirty_bits_size);
+ }
+ pr->dirty_bits = pr->dirty_bits_tab[pr->dirty_bits_index];
+ }
+ return pr;
+}
+
+/* return a pointer to the bitmap of dirty bits and reset them */
+static const uint32_t *default_get_dirty_bits(PhysMemoryMap *map,
+ PhysMemoryRange *pr)
+{
+ uint32_t *dirty_bits;
+ BOOL has_dirty_bits;
+ size_t n, i;
+
+ dirty_bits = pr->dirty_bits;
+
+ has_dirty_bits = FALSE;
+ n = pr->dirty_bits_size / sizeof(uint32_t);
+ for(i = 0; i < n; i++) {
+ if (dirty_bits[i] != 0) {
+ has_dirty_bits = TRUE;
+ break;
+ }
+ }
+ if (has_dirty_bits && pr->size != 0) {
+ /* invalidate the corresponding CPU write TLBs */
+ map->flush_tlb_write_range(map->opaque, pr->phys_mem, pr->org_size);
+ }
+
+ pr->dirty_bits_index ^= 1;
+ pr->dirty_bits = pr->dirty_bits_tab[pr->dirty_bits_index];
+ memset(pr->dirty_bits, 0, pr->dirty_bits_size);
+ return dirty_bits;
+}
+
+/* reset the dirty bit of one page at 'offset' inside 'pr' */
+void phys_mem_reset_dirty_bit(PhysMemoryRange *pr, size_t offset)
+{
+ size_t page_index;
+ uint32_t mask, *dirty_bits_ptr;
+ PhysMemoryMap *map;
+ if (pr->dirty_bits) {
+ page_index = offset >> DEVRAM_PAGE_SIZE_LOG2;
+ mask = 1 << (page_index & 0x1f);
+ dirty_bits_ptr = pr->dirty_bits + (page_index >> 5);
+ if (*dirty_bits_ptr & mask) {
+ *dirty_bits_ptr &= ~mask;
+ /* invalidate the corresponding CPU write TLBs */
+ map = pr->map;
+ map->flush_tlb_write_range(map->opaque,
+ pr->phys_mem + (offset & ~(DEVRAM_PAGE_SIZE - 1)),
+ DEVRAM_PAGE_SIZE);
+ }
+ }
+}
+
+static void default_free_ram(PhysMemoryMap *s, PhysMemoryRange *pr)
+{
+ free(pr->phys_mem);
+}
+
+PhysMemoryRange *cpu_register_device(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, void *opaque,
+ DeviceReadFunc *read_func, DeviceWriteFunc *write_func,
+ int devio_flags)
+{
+ PhysMemoryRange *pr;
+ assert(s->n_phys_mem_range < PHYS_MEM_RANGE_MAX);
+ assert(size <= 0xffffffff);
+ pr = &s->phys_mem_range[s->n_phys_mem_range++];
+ pr->map = s;
+ pr->addr = addr;
+ pr->org_size = size;
+ if (devio_flags & DEVIO_DISABLED)
+ pr->size = 0;
+ else
+ pr->size = pr->org_size;
+ pr->is_ram = FALSE;
+ pr->opaque = opaque;
+ pr->read_func = read_func;
+ pr->write_func = write_func;
+ pr->devio_flags = devio_flags;
+ return pr;
+}
+
+static void default_set_addr(PhysMemoryMap *map,
+ PhysMemoryRange *pr, uint64_t addr, BOOL enabled)
+{
+ if (enabled) {
+ if (pr->size == 0 || pr->addr != addr) {
+ /* enable or move mapping */
+ if (pr->is_ram) {
+ map->flush_tlb_write_range(map->opaque,
+ pr->phys_mem, pr->org_size);
+ }
+ pr->addr = addr;
+ pr->size = pr->org_size;
+ }
+ } else {
+ if (pr->size != 0) {
+ /* disable mapping */
+ if (pr->is_ram) {
+ map->flush_tlb_write_range(map->opaque,
+ pr->phys_mem, pr->org_size);
+ }
+ pr->addr = 0;
+ pr->size = 0;
+ }
+ }
+}
+
+void phys_mem_set_addr(PhysMemoryRange *pr, uint64_t addr, BOOL enabled)
+{
+ PhysMemoryMap *map = pr->map;
+ if (!pr->is_ram) {
+ default_set_addr(map, pr, addr, enabled);
+ } else {
+ return map->set_ram_addr(map, pr, addr, enabled);
+ }
+}
+
+/* return NULL if no valid RAM page. The access can only be done in the page */
+uint8_t *phys_mem_get_ram_ptr(PhysMemoryMap *map, uint64_t paddr, BOOL is_rw)
+{
+ PhysMemoryRange *pr = get_phys_mem_range(map, paddr);
+ uintptr_t offset;
+ if (!pr || !pr->is_ram)
+ return NULL;
+ offset = paddr - pr->addr;
+ if (is_rw)
+ phys_mem_set_dirty_bit(pr, offset);
+ return pr->phys_mem + (uintptr_t)offset;
+}
+
+/* IRQ support */
+
+void irq_init(IRQSignal *irq, SetIRQFunc *set_irq, void *opaque, int irq_num)
+{
+ irq->set_irq = set_irq;
+ irq->opaque = opaque;
+ irq->irq_num = irq_num;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.h b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.h
new file mode 100644
index 0000000..cc561b4
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.h
@@ -0,0 +1,148 @@
+/*
+ * IO memory handling
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef IOMEM_H
+#define IOMEM_H
+
+typedef void DeviceWriteFunc(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+typedef uint32_t DeviceReadFunc(void *opaque, uint32_t offset, int size_log2);
+
+#define DEVIO_SIZE8 (1 << 0)
+#define DEVIO_SIZE16 (1 << 1)
+#define DEVIO_SIZE32 (1 << 2)
+/* not supported, could add specific 64 bit callbacks when needed */
+//#define DEVIO_SIZE64 (1 << 3)
+#define DEVIO_DISABLED (1 << 4)
+
+#define DEVRAM_FLAG_ROM (1 << 0) /* not writable */
+#define DEVRAM_FLAG_DIRTY_BITS (1 << 1) /* maintain dirty bits */
+#define DEVRAM_FLAG_DISABLED (1 << 2) /* allocated but not mapped */
+#define DEVRAM_PAGE_SIZE_LOG2 12
+#define DEVRAM_PAGE_SIZE (1 << DEVRAM_PAGE_SIZE_LOG2)
+
+typedef struct PhysMemoryMap PhysMemoryMap;
+
+typedef struct {
+ PhysMemoryMap *map;
+ uint64_t addr;
+ uint64_t org_size; /* original size */
+ uint64_t size; /* =org_size or 0 if the mapping is disabled */
+ BOOL is_ram;
+ /* the following is used for RAM access */
+ int devram_flags;
+ uint8_t *phys_mem;
+ int dirty_bits_size; /* in bytes */
+ uint32_t *dirty_bits; /* NULL if not used */
+ uint32_t *dirty_bits_tab[2];
+ int dirty_bits_index; /* 0-1 */
+ /* the following is used for I/O access */
+ void *opaque;
+ DeviceReadFunc *read_func;
+ DeviceWriteFunc *write_func;
+ int devio_flags;
+} PhysMemoryRange;
+
+#define PHYS_MEM_RANGE_MAX 32
+
+struct PhysMemoryMap {
+ int n_phys_mem_range;
+ PhysMemoryRange phys_mem_range[PHYS_MEM_RANGE_MAX];
+ PhysMemoryRange *(*register_ram)(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, int devram_flags);
+ void (*free_ram)(PhysMemoryMap *s, PhysMemoryRange *pr);
+ const uint32_t *(*get_dirty_bits)(PhysMemoryMap *s, PhysMemoryRange *pr);
+ void (*set_ram_addr)(PhysMemoryMap *s, PhysMemoryRange *pr, uint64_t addr,
+ BOOL enabled);
+ void *opaque;
+ void (*flush_tlb_write_range)(void *opaque, uint8_t *ram_addr,
+ size_t ram_size);
+};
+
+
+PhysMemoryMap *phys_mem_map_init(void);
+void phys_mem_map_end(PhysMemoryMap *s);
+PhysMemoryRange *register_ram_entry(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, int devram_flags);
+static inline PhysMemoryRange *cpu_register_ram(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, int devram_flags)
+{
+ return s->register_ram(s, addr, size, devram_flags);
+}
+PhysMemoryRange *cpu_register_device(PhysMemoryMap *s, uint64_t addr,
+ uint64_t size, void *opaque,
+ DeviceReadFunc *read_func, DeviceWriteFunc *write_func,
+ int devio_flags);
+PhysMemoryRange *get_phys_mem_range(PhysMemoryMap *s, uint64_t paddr);
+void phys_mem_set_addr(PhysMemoryRange *pr, uint64_t addr, BOOL enabled);
+
+static inline const uint32_t *phys_mem_get_dirty_bits(PhysMemoryRange *pr)
+{
+ PhysMemoryMap *map = pr->map;
+ return map->get_dirty_bits(map, pr);
+}
+
+static inline void phys_mem_set_dirty_bit(PhysMemoryRange *pr, size_t offset)
+{
+ size_t page_index;
+ uint32_t mask, *dirty_bits_ptr;
+ if (pr->dirty_bits) {
+ page_index = offset >> DEVRAM_PAGE_SIZE_LOG2;
+ mask = 1 << (page_index & 0x1f);
+ dirty_bits_ptr = pr->dirty_bits + (page_index >> 5);
+ *dirty_bits_ptr |= mask;
+ }
+}
+
+static inline BOOL phys_mem_is_dirty_bit(PhysMemoryRange *pr, size_t offset)
+{
+ size_t page_index;
+ uint32_t *dirty_bits_ptr;
+ if (!pr->dirty_bits)
+ return TRUE;
+ page_index = offset >> DEVRAM_PAGE_SIZE_LOG2;
+ dirty_bits_ptr = pr->dirty_bits + (page_index >> 5);
+ return (*dirty_bits_ptr >> (page_index & 0x1f)) & 1;
+}
+
+void phys_mem_reset_dirty_bit(PhysMemoryRange *pr, size_t offset);
+uint8_t *phys_mem_get_ram_ptr(PhysMemoryMap *map, uint64_t paddr, BOOL is_rw);
+
+/* IRQ support */
+
+typedef void SetIRQFunc(void *opaque, int irq_num, int level);
+
+typedef struct {
+ SetIRQFunc *set_irq;
+ void *opaque;
+ int irq_num;
+} IRQSignal;
+
+void irq_init(IRQSignal *irq, SetIRQFunc *set_irq, void *opaque, int irq_num);
+
+static inline void set_irq(IRQSignal *irq, int level)
+{
+ irq->set_irq(irq->opaque, irq->irq_num, level);
+}
+
+#endif /* IOMEM_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/js/lib.js b/jslinux-2019-12-21/tinyemu-2019-12-21/js/lib.js
new file mode 100644
index 0000000..5dbf2b2
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/js/lib.js
@@ -0,0 +1,280 @@
+/*
+ * JS emulator library
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+mergeInto(LibraryManager.library, {
+ console_write: function(opaque, buf, len)
+ {
+ var str;
+ /* Note: we really send byte values. It would be up to the
+ * terminal to support UTF-8 */
+ str = String.fromCharCode.apply(String, HEAPU8.subarray(buf, buf + len));
+ term.write(str);
+ },
+
+ console_get_size: function(pw, ph)
+ {
+ var w, h, r;
+ r = term.getSize();
+ HEAPU32[pw >> 2] = r[0];
+ HEAPU32[ph >> 2] = r[1];
+ },
+
+ fs_export_file: function(filename, buf, buf_len)
+ {
+ var _filename = Pointer_stringify(filename);
+// console.log("exporting " + _filename);
+ var data = HEAPU8.subarray(buf, buf + buf_len);
+ var file = new Blob([data], { type: "application/octet-stream" });
+ var url = URL.createObjectURL(file);
+ var a = document.createElement("a");
+ a.href = url;
+ a.setAttribute("download", _filename);
+ a.innerHTML = "downloading";
+ document.body.appendChild(a);
+ /* click on the link and remove it */
+ setTimeout(function() {
+ a.click();
+ document.body.removeChild(a);
+ }, 50);
+ },
+
+ emscripten_async_wget3_data: function(url, request, user, password, post_data, post_data_len, arg, free, onload, onerror, onprogress) {
+ var _url = Pointer_stringify(url);
+ var _request = Pointer_stringify(request);
+ var _user;
+ var _password;
+
+ var http = new XMLHttpRequest();
+
+ if (user)
+ _user = Pointer_stringify(user);
+ else
+ _user = null;
+ if (password)
+ _password = Pointer_stringify(password);
+ else
+ _password = null;
+
+ http.open(_request, _url, true);
+ http.responseType = 'arraybuffer';
+ if (_user) {
+ http.setRequestHeader("Authorization", "Basic " + btoa(_user + ':' + _password));
+ }
+
+ var handle = Browser.getNextWgetRequestHandle();
+
+ // LOAD
+ http.onload = function http_onload(e) {
+ if (http.status == 200 || _url.substr(0,4).toLowerCase() != "http") {
+ var byteArray = new Uint8Array(http.response);
+ var buffer = _malloc(byteArray.length);
+ HEAPU8.set(byteArray, buffer);
+ if (onload) Runtime.dynCall('viiii', onload, [handle, arg, buffer, byteArray.length]);
+ if (free) _free(buffer);
+ } else {
+ if (onerror) Runtime.dynCall('viiii', onerror, [handle, arg, http.status, http.statusText]);
+ }
+ delete Browser.wgetRequests[handle];
+ };
+
+ // ERROR
+ http.onerror = function http_onerror(e) {
+ if (onerror) {
+ Runtime.dynCall('viiii', onerror, [handle, arg, http.status, http.statusText]);
+ }
+ delete Browser.wgetRequests[handle];
+ };
+
+ // PROGRESS
+ http.onprogress = function http_onprogress(e) {
+ if (onprogress) Runtime.dynCall('viiii', onprogress, [handle, arg, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0]);
+ };
+
+ // ABORT
+ http.onabort = function http_onabort(e) {
+ delete Browser.wgetRequests[handle];
+ };
+
+ // Useful because the browser can limit the number of redirection
+ try {
+ if (http.channel instanceof Ci.nsIHttpChannel)
+ http.channel.redirectionLimit = 0;
+ } catch (ex) { /* whatever */ }
+
+ if (_request == "POST") {
+ var _post_data = HEAPU8.subarray(post_data, post_data + post_data_len);
+ //Send the proper header information along with the request
+ http.setRequestHeader("Content-type", "application/octet-stream");
+ http.setRequestHeader("Content-length", post_data_len);
+ http.setRequestHeader("Connection", "close");
+ http.send(_post_data);
+ } else {
+ http.send(null);
+ }
+
+ Browser.wgetRequests[handle] = http;
+
+ return handle;
+ },
+
+ fs_wget_update_downloading: function (flag)
+ {
+ update_downloading(Boolean(flag));
+ },
+
+ fb_refresh: function(opaque, data, x, y, w, h, stride)
+ {
+ var i, j, v, src, image_data, dst_pos, display, dst_pos1, image_stride;
+
+ display = graphic_display;
+ /* current x = 0 and w = width for all refreshes */
+// console.log("fb_refresh: x=" + x + " y=" + y + " w=" + w + " h=" + h);
+ image_data = display.image.data;
+ image_stride = display.width * 4;
+ dst_pos1 = (y * display.width + x) * 4;
+ for(i = 0; i < h; i = (i + 1) | 0) {
+ src = data;
+ dst_pos = dst_pos1;
+ for(j = 0; j < w; j = (j + 1) | 0) {
+ v = HEAPU32[src >> 2];
+ image_data[dst_pos] = (v >> 16) & 0xff;
+ image_data[dst_pos + 1] = (v >> 8) & 0xff;
+ image_data[dst_pos + 2] = v & 0xff;
+ image_data[dst_pos + 3] = 0xff; /* XXX: do it once */
+ src = (src + 4) | 0;
+ dst_pos = (dst_pos + 4) | 0;
+ }
+ data = (data + stride) | 0;
+ dst_pos1 = (dst_pos1 + image_stride) | 0;
+ }
+ display.ctx.putImageData(display.image, 0, 0, x, y, w, h);
+ },
+
+ net_recv_packet: function(bs, buf, buf_len)
+ {
+ if (net_state) {
+ net_state.recv_packet(HEAPU8.subarray(buf, buf + buf_len));
+ }
+ },
+
+ /* file buffer API */
+ file_buffer_get_new_handle: function()
+ {
+ var h;
+ if (typeof Browser.fbuf_table == "undefined") {
+ Browser.fbuf_table = new Object();
+ Browser.fbuf_next_handle = 1;
+ }
+ for(;;) {
+ h = Browser.fbuf_next_handle;
+ Browser.fbuf_next_handle++;
+ if (Browser.fbuf_next_handle == 0x80000000)
+ Browser.fbuf_next_handle = 1;
+ if (typeof Browser.fbuf_table[h] == "undefined") {
+// console.log("new handle=" + h);
+ return h;
+ }
+ }
+ },
+
+ file_buffer_init: function(bs)
+ {
+ var h;
+ HEAPU32[bs >> 2] = 0;
+ HEAPU32[(bs + 4) >> 2] = 0;
+ },
+
+ file_buffer_resize__deps: ['file_buffer_get_new_handle'],
+ file_buffer_resize: function(bs, new_size)
+ {
+ var h, size, new_data, size1, i, data;
+ h = HEAPU32[bs >> 2];
+ size = HEAPU32[(bs + 4) >> 2];
+ if (new_size == 0) {
+ if (h != 0) {
+ delete Browser.fbuf_table[h];
+ h = 0;
+ }
+ } else if (size == 0) {
+ h = _file_buffer_get_new_handle();
+ new_data = new Uint8Array(new_size);
+ Browser.fbuf_table[h] = new_data;
+ } else if (size != new_size) {
+ data = Browser.fbuf_table[h];
+ new_data = new Uint8Array(new_size);
+ if (new_size > size) {
+ new_data.set(data, 0);
+ } else {
+ for(i = 0; i < new_size; i = (i + 1) | 0)
+ new_data[i] = data[i];
+ }
+ Browser.fbuf_table[h] = new_data;
+ }
+ HEAPU32[bs >> 2] = h;
+ HEAPU32[(bs + 4) >> 2] = new_size;
+ return 0;
+ },
+
+ file_buffer_reset: function(bs)
+ {
+ _file_buffer_resize(bs, 0);
+ _file_buffer_init(bs);
+ },
+
+ file_buffer_write: function(bs, offset, buf, size)
+ {
+ var h, data, i;
+ h = HEAPU32[bs >> 2];
+ if (h) {
+ data = Browser.fbuf_table[h];
+ for(i = 0; i < size; i = (i + 1) | 0) {
+ data[offset + i] = HEAPU8[buf + i];
+ }
+ }
+ },
+
+ file_buffer_read: function(bs, offset, buf, size)
+ {
+ var h, data, i;
+ h = HEAPU32[bs >> 2];
+ if (h) {
+ data = Browser.fbuf_table[h];
+ for(i = 0; i < size; i = (i + 1) | 0) {
+ HEAPU8[buf + i] = data[offset + i];
+ }
+ }
+ },
+
+ file_buffer_set: function(bs, offset, val, size)
+ {
+ var h, data, i;
+ h = HEAPU32[bs >> 2];
+ if (h) {
+ data = Browser.fbuf_table[h];
+ for(i = 0; i < size; i = (i + 1) | 0) {
+ data[offset + i] = val;
+ }
+ }
+ },
+
+});
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/jsemu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/jsemu.c
new file mode 100644
index 0000000..3641db4
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/jsemu.c
@@ -0,0 +1,349 @@
+/*
+ * JS emulator main
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+#include <emscripten.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "virtio.h"
+#include "machine.h"
+#include "list.h"
+#include "fbuf.h"
+
+void virt_machine_run(void *opaque);
+
+/* provided in lib.js */
+extern void console_write(void *opaque, const uint8_t *buf, int len);
+extern void console_get_size(int *pw, int *ph);
+extern void fb_refresh(void *opaque, void *data,
+ int x, int y, int w, int h, int stride);
+extern void net_recv_packet(EthernetDevice *bs,
+ const uint8_t *buf, int len);
+
+static uint8_t console_fifo[1024];
+static int console_fifo_windex;
+static int console_fifo_rindex;
+static int console_fifo_count;
+static BOOL console_resize_pending;
+
+static int global_width;
+static int global_height;
+static VirtMachine *global_vm;
+static BOOL global_carrier_state;
+
+static int console_read(void *opaque, uint8_t *buf, int len)
+{
+ int out_len, l;
+ len = min_int(len, console_fifo_count);
+ console_fifo_count -= len;
+ out_len = 0;
+ while (len != 0) {
+ l = min_int(len, sizeof(console_fifo) - console_fifo_rindex);
+ memcpy(buf + out_len, console_fifo + console_fifo_rindex, l);
+ len -= l;
+ out_len += l;
+ console_fifo_rindex += l;
+ if (console_fifo_rindex == sizeof(console_fifo))
+ console_fifo_rindex = 0;
+ }
+ return out_len;
+}
+
+/* called from JS */
+void console_queue_char(int c)
+{
+ if (console_fifo_count < sizeof(console_fifo)) {
+ console_fifo[console_fifo_windex] = c;
+ if (++console_fifo_windex == sizeof(console_fifo))
+ console_fifo_windex = 0;
+ console_fifo_count++;
+ }
+}
+
+/* called from JS */
+void display_key_event(int is_down, int key_code)
+{
+ if (global_vm) {
+ vm_send_key_event(global_vm, is_down, key_code);
+ }
+}
+
+/* called from JS */
+static int mouse_last_x, mouse_last_y, mouse_last_buttons;
+
+void display_mouse_event(int dx, int dy, int buttons)
+{
+ if (global_vm) {
+ if (vm_mouse_is_absolute(global_vm) || 1) {
+ dx = min_int(dx, global_width - 1);
+ dy = min_int(dy, global_height - 1);
+ dx = (dx * VIRTIO_INPUT_ABS_SCALE) / global_width;
+ dy = (dy * VIRTIO_INPUT_ABS_SCALE) / global_height;
+ } else {
+ /* relative mouse is not supported */
+ dx = 0;
+ dy = 0;
+ }
+ mouse_last_x = dx;
+ mouse_last_y = dy;
+ mouse_last_buttons = buttons;
+ vm_send_mouse_event(global_vm, dx, dy, 0, buttons);
+ }
+}
+
+/* called from JS */
+void display_wheel_event(int dz)
+{
+ if (global_vm) {
+ vm_send_mouse_event(global_vm, mouse_last_x, mouse_last_y, dz,
+ mouse_last_buttons);
+ }
+}
+
+/* called from JS */
+void net_write_packet(const uint8_t *buf, int buf_len)
+{
+ EthernetDevice *net = global_vm->net;
+ if (net) {
+ net->device_write_packet(net, buf, buf_len);
+ }
+}
+
+/* called from JS */
+void net_set_carrier(BOOL carrier_state)
+{
+ EthernetDevice *net;
+ global_carrier_state = carrier_state;
+ if (global_vm && global_vm->net) {
+ net = global_vm->net;
+ net->device_set_carrier(net, carrier_state);
+ }
+}
+
+static void fb_refresh1(FBDevice *fb_dev, void *opaque,
+ int x, int y, int w, int h)
+{
+ int stride = fb_dev->stride;
+ fb_refresh(opaque, fb_dev->fb_data + y * stride + x * 4, x, y, w, h,
+ stride);
+}
+
+static CharacterDevice *console_init(void)
+{
+ CharacterDevice *dev;
+ console_resize_pending = TRUE;
+ dev = mallocz(sizeof(*dev));
+ dev->write_data = console_write;
+ dev->read_data = console_read;
+ return dev;
+}
+
+typedef struct {
+ VirtMachineParams *p;
+ int ram_size;
+ char *cmdline;
+ BOOL has_network;
+ char *pwd;
+} VMStartState;
+
+static void init_vm(void *arg);
+static void init_vm_fs(void *arg);
+static void init_vm_drive(void *arg);
+
+void vm_start(const char *url, int ram_size, const char *cmdline,
+ const char *pwd, int width, int height, BOOL has_network)
+{
+ VMStartState *s;
+
+ s = mallocz(sizeof(*s));
+ s->ram_size = ram_size;
+ s->cmdline = strdup(cmdline);
+ if (pwd)
+ s->pwd = strdup(pwd);
+ global_width = width;
+ global_height = height;
+ s->has_network = has_network;
+ s->p = mallocz(sizeof(VirtMachineParams));
+ virt_machine_set_defaults(s->p);
+ virt_machine_load_config_file(s->p, url, init_vm_fs, s);
+}
+
+static void init_vm_fs(void *arg)
+{
+ VMStartState *s = arg;
+ VirtMachineParams *p = s->p;
+
+ if (p->fs_count > 0) {
+ assert(p->fs_count == 1);
+ p->tab_fs[0].fs_dev = fs_net_init(p->tab_fs[0].filename,
+ init_vm_drive, s);
+ if (s->pwd) {
+ fs_net_set_pwd(p->tab_fs[0].fs_dev, s->pwd);
+ }
+ } else {
+ init_vm_drive(s);
+ }
+}
+
+static void init_vm_drive(void *arg)
+{
+ VMStartState *s = arg;
+ VirtMachineParams *p = s->p;
+
+ if (p->drive_count > 0) {
+ assert(p->drive_count == 1);
+ p->tab_drive[0].block_dev =
+ block_device_init_http(p->tab_drive[0].filename,
+ 131072,
+ init_vm, s);
+ } else {
+ init_vm(s);
+ }
+}
+
+static void init_vm(void *arg)
+{
+ VMStartState *s = arg;
+ VirtMachine *m;
+ VirtMachineParams *p = s->p;
+ int i;
+
+ p->rtc_real_time = TRUE;
+ p->ram_size = s->ram_size << 20;
+ if (s->cmdline && s->cmdline[0] != '\0') {
+ vm_add_cmdline(s->p, s->cmdline);
+ }
+
+ if (global_width > 0 && global_height > 0) {
+ /* enable graphic output if needed */
+ if (!p->display_device)
+ p->display_device = strdup("simplefb");
+ p->width = global_width;
+ p->height = global_height;
+ } else {
+ p->console = console_init();
+ }
+
+ if (p->eth_count > 0 && !s->has_network) {
+ /* remove the interfaces */
+ for(i = 0; i < p->eth_count; i++) {
+ free(p->tab_eth[i].ifname);
+ free(p->tab_eth[i].driver);
+ }
+ p->eth_count = 0;
+ }
+
+ if (p->eth_count > 0) {
+ EthernetDevice *net;
+ int i;
+ assert(p->eth_count == 1);
+ net = mallocz(sizeof(EthernetDevice));
+ net->mac_addr[0] = 0x02;
+ for(i = 1; i < 6; i++)
+ net->mac_addr[i] = (int)(emscripten_random() * 256);
+ net->write_packet = net_recv_packet;
+ net->opaque = NULL;
+ p->tab_eth[0].net = net;
+ }
+
+ m = virt_machine_init(p);
+ global_vm = m;
+
+ virt_machine_free_config(s->p);
+
+ if (m->net) {
+ m->net->device_set_carrier(m->net, global_carrier_state);
+ }
+
+ free(s->p);
+ free(s->cmdline);
+ if (s->pwd) {
+ memset(s->pwd, 0, strlen(s->pwd));
+ free(s->pwd);
+ }
+ free(s);
+
+ emscripten_async_call(virt_machine_run, m, 0);
+}
+
+/* need to be long enough to hide the non zero delay of setTimeout(_, 0) */
+#define MAX_EXEC_TOTAL_CYCLE 3000000
+#define MAX_EXEC_CYCLE 200000
+
+#define MAX_SLEEP_TIME 10 /* in ms */
+
+void virt_machine_run(void *opaque)
+{
+ VirtMachine *m = opaque;
+ int delay, i;
+ FBDevice *fb_dev;
+
+ if (m->console_dev && virtio_console_can_write_data(m->console_dev)) {
+ uint8_t buf[128];
+ int ret, len;
+ len = virtio_console_get_write_len(m->console_dev);
+ len = min_int(len, sizeof(buf));
+ ret = m->console->read_data(m->console->opaque, buf, len);
+ if (ret > 0)
+ virtio_console_write_data(m->console_dev, buf, ret);
+ if (console_resize_pending) {
+ int w, h;
+ console_get_size(&w, &h);
+ virtio_console_resize_event(m->console_dev, w, h);
+ console_resize_pending = FALSE;
+ }
+ }
+
+ fb_dev = m->fb_dev;
+ if (fb_dev) {
+ /* refresh the display */
+ fb_dev->refresh(fb_dev, fb_refresh1, NULL);
+ }
+
+ i = 0;
+ for(;;) {
+ /* wait for an event: the only asynchronous event is the RTC timer */
+ delay = virt_machine_get_sleep_duration(m, MAX_SLEEP_TIME);
+ if (delay != 0 || i >= MAX_EXEC_TOTAL_CYCLE / MAX_EXEC_CYCLE)
+ break;
+ virt_machine_interp(m, MAX_EXEC_CYCLE);
+ i++;
+ }
+
+ if (delay == 0) {
+ emscripten_async_call(virt_machine_run, m, 0);
+ } else {
+ emscripten_async_call(virt_machine_run, m, MAX_SLEEP_TIME);
+ }
+}
+
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/json.c b/jslinux-2019-12-21/tinyemu-2019-12-21/json.c
new file mode 100644
index 0000000..d1ebe82
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/json.c
@@ -0,0 +1,464 @@
+/*
+ * Pseudo JSON parser
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+#include <ctype.h>
+
+#include "cutils.h"
+#include "json.h"
+#include "fs_utils.h"
+
+static JSONValue parse_string(const char **pp)
+{
+ char buf[4096], *q;
+ const char *p;
+ int c, h;
+
+ q = buf;
+ p = *pp;
+ p++;
+ for(;;) {
+ c = *p++;
+ if (c == '\0' || c == '\n') {
+ return json_error_new("unterminated string");
+ } else if (c == '\"') {
+ break;
+ } else if (c == '\\') {
+ c = *p++;
+ switch(c) {
+ case '\'':
+ case '\"':
+ case '\\':
+ goto add_char;
+ case 'n':
+ c = '\n';
+ goto add_char;
+ case 'r':
+ c = '\r';
+ goto add_char;
+ case 't':
+ c = '\t';
+ goto add_char;
+ case 'x':
+ h = from_hex(*p++);
+ if (h < 0)
+ return json_error_new("invalig hex digit");
+ c = h << 4;
+ h = from_hex(*p++);
+ if (h < 0)
+ return json_error_new("invalig hex digit");
+ c |= h;
+ goto add_char;
+ default:
+ return json_error_new("unknown escape code");
+ }
+ } else {
+ add_char:
+ if (q >= buf + sizeof(buf) - 1)
+ return json_error_new("string too long");
+ *q++ = c;
+ }
+ }
+ *q = '\0';
+ *pp = p;
+ return json_string_new(buf);
+}
+
+static JSONProperty *json_object_get2(JSONObject *obj, const char *name)
+{
+ JSONProperty *f;
+ int i;
+ for(i = 0; i < obj->len; i++) {
+ f = &obj->props[i];
+ if (!strcmp(f->name.u.str->data, name))
+ return f;
+ }
+ return NULL;
+}
+
+JSONValue json_object_get(JSONValue val, const char *name)
+{
+ JSONProperty *f;
+ JSONObject *obj;
+
+ if (val.type != JSON_OBJ)
+ return json_undefined_new();
+ obj = val.u.obj;
+ f = json_object_get2(obj, name);
+ if (!f)
+ return json_undefined_new();
+ return f->value;
+}
+
+int json_object_set(JSONValue val, const char *name, JSONValue prop_val)
+{
+ JSONObject *obj;
+ JSONProperty *f;
+ int new_size;
+
+ if (val.type != JSON_OBJ)
+ return -1;
+ obj = val.u.obj;
+ f = json_object_get2(obj, name);
+ if (f) {
+ json_free(f->value);
+ f->value = prop_val;
+ } else {
+ if (obj->len >= obj->size) {
+ new_size = max_int(obj->len + 1, obj->size * 3 / 2);
+ obj->props = realloc(obj->props, new_size * sizeof(JSONProperty));
+ obj->size = new_size;
+ }
+ f = &obj->props[obj->len++];
+ f->name = json_string_new(name);
+ f->value = prop_val;
+ }
+ return 0;
+}
+
+JSONValue json_array_get(JSONValue val, unsigned int idx)
+{
+ JSONArray *array;
+
+ if (val.type != JSON_ARRAY)
+ return json_undefined_new();
+ array = val.u.array;
+ if (idx < array->len) {
+ return array->tab[idx];
+ } else {
+ return json_undefined_new();
+ }
+}
+
+int json_array_set(JSONValue val, unsigned int idx, JSONValue prop_val)
+{
+ JSONArray *array;
+ int new_size;
+
+ if (val.type != JSON_ARRAY)
+ return -1;
+ array = val.u.array;
+ if (idx < array->len) {
+ json_free(array->tab[idx]);
+ array->tab[idx] = prop_val;
+ } else if (idx == array->len) {
+ if (array->len >= array->size) {
+ new_size = max_int(array->len + 1, array->size * 3 / 2);
+ array->tab = realloc(array->tab, new_size * sizeof(JSONValue));
+ array->size = new_size;
+ }
+ array->tab[array->len++] = prop_val;
+ } else {
+ return -1;
+ }
+ return 0;
+}
+
+const char *json_get_str(JSONValue val)
+{
+ if (val.type != JSON_STR)
+ return NULL;
+ return val.u.str->data;
+}
+
+const char *json_get_error(JSONValue val)
+{
+ if (val.type != JSON_EXCEPTION)
+ return NULL;
+ return val.u.str->data;
+}
+
+JSONValue json_string_new2(const char *str, int len)
+{
+ JSONValue val;
+ JSONString *str1;
+
+ str1 = malloc(sizeof(JSONString) + len + 1);
+ str1->len = len;
+ memcpy(str1->data, str, len + 1);
+ val.type = JSON_STR;
+ val.u.str = str1;
+ return val;
+}
+
+JSONValue json_string_new(const char *str)
+{
+ return json_string_new2(str, strlen(str));
+}
+
+JSONValue __attribute__((format(printf, 1, 2))) json_error_new(const char *fmt, ...)
+{
+ JSONValue val;
+ va_list ap;
+ char buf[256];
+
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+ va_end(ap);
+ val = json_string_new(buf);
+ val.type = JSON_EXCEPTION;
+ return val;
+}
+
+JSONValue json_object_new(void)
+{
+ JSONValue val;
+ JSONObject *obj;
+ obj = mallocz(sizeof(JSONObject));
+ val.type = JSON_OBJ;
+ val.u.obj = obj;
+ return val;
+}
+
+JSONValue json_array_new(void)
+{
+ JSONValue val;
+ JSONArray *array;
+ array = mallocz(sizeof(JSONArray));
+ val.type = JSON_ARRAY;
+ val.u.array = array;
+ return val;
+}
+
+void json_free(JSONValue val)
+{
+ switch(val.type) {
+ case JSON_STR:
+ case JSON_EXCEPTION:
+ free(val.u.str);
+ break;
+ case JSON_INT:
+ case JSON_BOOL:
+ case JSON_NULL:
+ case JSON_UNDEFINED:
+ break;
+ case JSON_ARRAY:
+ {
+ JSONArray *array = val.u.array;
+ int i;
+
+ for(i = 0; i < array->len; i++) {
+ json_free(array->tab[i]);
+ }
+ free(array);
+ }
+ break;
+ case JSON_OBJ:
+ {
+ JSONObject *obj = val.u.obj;
+ JSONProperty *f;
+ int i;
+
+ for(i = 0; i < obj->len; i++) {
+ f = &obj->props[i];
+ json_free(f->name);
+ json_free(f->value);
+ }
+ free(obj);
+ }
+ break;
+ default:
+ abort();
+ }
+}
+
+static void skip_spaces(const char **pp)
+{
+ const char *p;
+ p = *pp;
+ for(;;) {
+ if (isspace(*p)) {
+ p++;
+ } else if (p[0] == '/' && p[1] == '/') {
+ p += 2;
+ while (*p != '\0' && *p != '\n')
+ p++;
+ } else if (p[0] == '/' && p[1] == '*') {
+ p += 2;
+ while (*p != '\0' && (p[0] != '*' || p[1] != '/'))
+ p++;
+ if (*p != '\0')
+ p += 2;
+ } else {
+ break;
+ }
+ }
+ *pp = p;
+}
+
+static inline BOOL is_ident_first(int c)
+{
+ return (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ c == '_' || c == '$';
+}
+
+static int parse_ident(char *buf, int buf_size, const char **pp)
+{
+ char *q;
+ const char *p;
+ p = *pp;
+ q = buf;
+ *q++ = *p++; /* first char is already tested */
+ while (is_ident_first(*p) || isdigit(*p)) {
+ if ((q - buf) >= buf_size - 1)
+ return -1;
+ *q++ = *p++;
+ }
+ *pp = p;
+ *q = '\0';
+ return 0;
+}
+
+JSONValue json_parse_value2(const char **pp)
+{
+ char buf[128];
+ const char *p;
+ JSONValue val, val1, tag;
+
+ p = *pp;
+ skip_spaces(&p);
+ if (*p == '\0') {
+ return json_error_new("unexpected end of file");
+ }
+ if (isdigit(*p)) {
+ val = json_int32_new(strtol(p, (char **)&p, 0));
+ } else if (*p == '"') {
+ val = parse_string(&p);
+ } else if (*p == '{') {
+ p++;
+ val = json_object_new();
+ for(;;) {
+ skip_spaces(&p);
+ if (*p == '}') {
+ p++;
+ break;
+ }
+ if (*p == '"') {
+ tag = parse_string(&p);
+ if (json_is_error(tag))
+ return tag;
+ } else if (is_ident_first(*p)) {
+ if (parse_ident(buf, sizeof(buf), &p) < 0)
+ goto invalid_prop;
+ tag = json_string_new(buf);
+ } else {
+ goto invalid_prop;
+ }
+ // printf("property: %s\n", json_get_str(tag));
+ if (tag.u.str->len == 0) {
+ invalid_prop:
+ return json_error_new("Invalid property name");
+ }
+ skip_spaces(&p);
+ if (*p != ':') {
+ return json_error_new("':' expected");
+ }
+ p++;
+
+ val1 = json_parse_value2(&p);
+ json_object_set(val, tag.u.str->data, val1);
+
+ skip_spaces(&p);
+ if (*p == ',') {
+ p++;
+ } else if (*p != '}') {
+ return json_error_new("expecting ',' or '}'");
+ }
+ }
+ } else if (*p == '[') {
+ int idx;
+
+ p++;
+ val = json_array_new();
+ idx = 0;
+ for(;;) {
+ skip_spaces(&p);
+ if (*p == ']') {
+ p++;
+ break;
+ }
+ val1 = json_parse_value2(&p);
+ json_array_set(val, idx++, val1);
+
+ skip_spaces(&p);
+ if (*p == ',') {
+ p++;
+ } else if (*p != ']') {
+ return json_error_new("expecting ',' or ']'");
+ }
+ }
+ } else if (is_ident_first(*p)) {
+ if (parse_ident(buf, sizeof(buf), &p) < 0)
+ goto unknown_id;
+ if (!strcmp(buf, "null")) {
+ val = json_null_new();
+ } else if (!strcmp(buf, "true")) {
+ val = json_bool_new(TRUE);
+ } else if (!strcmp(buf, "false")) {
+ val = json_bool_new(FALSE);
+ } else {
+ unknown_id:
+ return json_error_new("unknown identifier: '%s'", buf);
+ }
+ } else {
+ return json_error_new("unexpected character");
+ }
+ *pp = p;
+ return val;
+}
+
+JSONValue json_parse_value(const char *p)
+{
+ JSONValue val;
+ val = json_parse_value2(&p);
+ if (json_is_error(val))
+ return val;
+ skip_spaces(&p);
+ if (*p != '\0') {
+ json_free(val);
+ return json_error_new("unexpected characters at the end");
+ }
+ return val;
+}
+
+JSONValue json_parse_value_len(const char *p, int len)
+{
+ char *str;
+ JSONValue val;
+ str = malloc(len + 1);
+ memcpy(str, p, len);
+ str[len] = '\0';
+ val = json_parse_value(str);
+ free(str);
+ return val;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/json.h b/jslinux-2019-12-21/tinyemu-2019-12-21/json.h
new file mode 100644
index 0000000..148d050
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/json.h
@@ -0,0 +1,132 @@
+/*
+ * Pseudo JSON parser
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef JSON_H
+#define JSON_H
+
+typedef enum {
+ JSON_STR,
+ JSON_INT,
+ JSON_OBJ,
+ JSON_ARRAY,
+ JSON_BOOL,
+ JSON_NULL,
+ JSON_UNDEFINED,
+ JSON_EXCEPTION,
+} JSONTypeEnum;
+
+typedef struct {
+ int len;
+ char data[0];
+} JSONString;
+
+typedef struct JSONValue {
+ JSONTypeEnum type;
+ union {
+ JSONString *str;
+ int int32;
+ BOOL b;
+ struct JSONObject *obj;
+ struct JSONArray *array;
+ } u;
+} JSONValue;
+
+typedef struct JSONProperty {
+ JSONValue name;
+ JSONValue value;
+} JSONProperty;
+
+typedef struct JSONObject {
+ int len;
+ int size;
+ JSONProperty *props;
+} JSONObject;
+
+typedef struct JSONArray {
+ int len;
+ int size;
+ JSONValue *tab;
+} JSONArray;
+
+JSONValue json_string_new2(const char *str, int len);
+JSONValue json_string_new(const char *str);
+JSONValue __attribute__((format(printf, 1, 2))) json_error_new(const char *fmt, ...);
+void json_free(JSONValue val);
+
+JSONValue json_object_new(void);
+JSONValue json_object_get(JSONValue val, const char *name);
+int json_object_set(JSONValue val, const char *name, JSONValue prop_val);
+
+JSONValue json_array_new(void);
+JSONValue json_array_get(JSONValue val, unsigned int idx);
+int json_array_set(JSONValue val, unsigned int idx, JSONValue prop_val);
+
+static inline BOOL json_is_error(JSONValue val)
+{
+ return val.type == JSON_EXCEPTION;
+}
+
+static inline BOOL json_is_undefined(JSONValue val)
+{
+ return val.type == JSON_UNDEFINED;
+}
+
+static inline JSONValue json_undefined_new(void)
+{
+ JSONValue val;
+ val.type = JSON_UNDEFINED;
+ val.u.int32 = 0;
+ return val;
+}
+
+static inline JSONValue json_null_new(void)
+{
+ JSONValue val;
+ val.type = JSON_NULL;
+ val.u.int32 = 0;
+ return val;
+}
+
+static inline JSONValue json_int32_new(int v)
+{
+ JSONValue val;
+ val.type = JSON_INT;
+ val.u.int32 = v;
+ return val;
+}
+
+static inline JSONValue json_bool_new(BOOL v)
+{
+ JSONValue val;
+ val.type = JSON_BOOL;
+ val.u.b = v;
+ return val;
+}
+
+const char *json_get_str(JSONValue val);
+const char *json_get_error(JSONValue val);
+
+JSONValue json_parse_value(const char *p);
+JSONValue json_parse_value_len(const char *p, int len);
+
+#endif /* JSON_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/list.h b/jslinux-2019-12-21/tinyemu-2019-12-21/list.h
new file mode 100644
index 0000000..3fbea04
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/list.h
@@ -0,0 +1,94 @@
+/*
+ * Linux klist like system
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef LIST_H
+#define LIST_H
+
+struct list_head {
+ struct list_head *prev;
+ struct list_head *next;
+};
+
+/* return the pointer of type 'type *' containing 'el' as field 'member' */
+#define list_entry(el, type, member) \
+ ((type *)((uint8_t *)(el) - offsetof(type, member)))
+
+static inline void init_list_head(struct list_head *head)
+{
+ head->prev = head;
+ head->next = head;
+}
+
+/* insert 'el' between 'prev' and 'next' */
+static inline void __list_add(struct list_head *el,
+ struct list_head *prev, struct list_head *next)
+{
+ prev->next = el;
+ el->prev = prev;
+ el->next = next;
+ next->prev = el;
+}
+
+/* add 'el' at the head of the list 'head' (= after element head) */
+static inline void list_add(struct list_head *el, struct list_head *head)
+{
+ __list_add(el, head, head->next);
+}
+
+/* add 'el' at the end of the list 'head' (= before element head) */
+static inline void list_add_tail(struct list_head *el, struct list_head *head)
+{
+ __list_add(el, head->prev, head);
+}
+
+static inline void list_del(struct list_head *el)
+{
+ struct list_head *prev, *next;
+ prev = el->prev;
+ next = el->next;
+ prev->next = next;
+ next->prev = prev;
+ el->prev = NULL; /* fail safe */
+ el->next = NULL; /* fail safe */
+}
+
+static inline int list_empty(struct list_head *el)
+{
+ return el->next == el;
+}
+
+#define list_for_each(el, head) \
+ for(el = (head)->next; el != (head); el = el->next)
+
+#define list_for_each_safe(el, el1, head) \
+ for(el = (head)->next, el1 = el->next; el != (head); \
+ el = el1, el1 = el->next)
+
+#define list_for_each_prev(el, head) \
+ for(el = (head)->prev; el != (head); el = el->prev)
+
+#define list_for_each_prev_safe(el, el1, head) \
+ for(el = (head)->prev, el1 = el->prev; el != (head); \
+ el = el1, el1 = el->prev)
+
+#endif /* LIST_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/machine.c b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.c
new file mode 100644
index 0000000..09c7940
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.c
@@ -0,0 +1,640 @@
+/*
+ * VM utilities
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "virtio.h"
+#include "machine.h"
+#include "fs_utils.h"
+#ifdef CONFIG_FS_NET
+#include "fs_wget.h"
+#endif
+
+void __attribute__((format(printf, 1, 2))) vm_error(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+#ifdef EMSCRIPTEN
+ vprintf(fmt, ap);
+#else
+ vfprintf(stderr, fmt, ap);
+#endif
+ va_end(ap);
+}
+
+int vm_get_int(JSONValue obj, const char *name, int *pval)
+{
+ JSONValue val;
+ val = json_object_get(obj, name);
+ if (json_is_undefined(val)) {
+ vm_error("expecting '%s' property\n", name);
+ return -1;
+ }
+ if (val.type != JSON_INT) {
+ vm_error("%s: integer expected\n", name);
+ return -1;
+ }
+ *pval = val.u.int32;
+ return 0;
+}
+
+int vm_get_int_opt(JSONValue obj, const char *name, int *pval, int def_val)
+{
+ JSONValue val;
+ val = json_object_get(obj, name);
+ if (json_is_undefined(val)) {
+ *pval = def_val;
+ return 0;
+ }
+ if (val.type != JSON_INT) {
+ vm_error("%s: integer expected\n", name);
+ return -1;
+ }
+ *pval = val.u.int32;
+ return 0;
+}
+
+static int vm_get_str2(JSONValue obj, const char *name, const char **pstr,
+ BOOL is_opt)
+{
+ JSONValue val;
+ val = json_object_get(obj, name);
+ if (json_is_undefined(val)) {
+ if (is_opt) {
+ *pstr = NULL;
+ return 0;
+ } else {
+ vm_error("expecting '%s' property\n", name);
+ return -1;
+ }
+ }
+ if (val.type != JSON_STR) {
+ vm_error("%s: string expected\n", name);
+ return -1;
+ }
+ *pstr = val.u.str->data;
+ return 0;
+}
+
+static int vm_get_str(JSONValue obj, const char *name, const char **pstr)
+{
+ return vm_get_str2(obj, name, pstr, FALSE);
+}
+
+static int vm_get_str_opt(JSONValue obj, const char *name, const char **pstr)
+{
+ return vm_get_str2(obj, name, pstr, TRUE);
+}
+
+static char *strdup_null(const char *str)
+{
+ if (!str)
+ return NULL;
+ else
+ return strdup(str);
+}
+
+/* currently only for "TZ" */
+static char *cmdline_subst(const char *cmdline)
+{
+ DynBuf dbuf;
+ const char *p;
+ char var_name[32], *q, buf[32];
+
+ dbuf_init(&dbuf);
+ p = cmdline;
+ while (*p != '\0') {
+ if (p[0] == '$' && p[1] == '{') {
+ p += 2;
+ q = var_name;
+ while (*p != '\0' && *p != '}') {
+ if ((q - var_name) < sizeof(var_name) - 1)
+ *q++ = *p;
+ p++;
+ }
+ *q = '\0';
+ if (*p == '}')
+ p++;
+ if (!strcmp(var_name, "TZ")) {
+ time_t ti;
+ struct tm tm;
+ int n, sg;
+ /* get the offset to UTC */
+ time(&ti);
+ localtime_r(&ti, &tm);
+ n = tm.tm_gmtoff / 60;
+ sg = '-';
+ if (n < 0) {
+ sg = '+';
+ n = -n;
+ }
+ snprintf(buf, sizeof(buf), "UTC%c%02d:%02d",
+ sg, n / 60, n % 60);
+ dbuf_putstr(&dbuf, buf);
+ }
+ } else {
+ dbuf_putc(&dbuf, *p++);
+ }
+ }
+ dbuf_putc(&dbuf, 0);
+ return (char *)dbuf.buf;
+}
+
+static BOOL find_name(const char *name, const char *name_list)
+{
+ size_t len;
+ const char *p, *r;
+
+ p = name_list;
+ for(;;) {
+ r = strchr(p, ',');
+ if (!r) {
+ if (!strcmp(name, p))
+ return TRUE;
+ break;
+ } else {
+ len = r - p;
+ if (len == strlen(name) && !memcmp(name, p, len))
+ return TRUE;
+ p = r + 1;
+ }
+ }
+ return FALSE;
+}
+
+static const VirtMachineClass *virt_machine_list[] = {
+#if defined(EMSCRIPTEN)
+ /* only a single machine in the EMSCRIPTEN target */
+#ifndef CONFIG_X86EMU
+ &riscv_machine_class,
+#endif
+#else
+ &riscv_machine_class,
+#endif /* !EMSCRIPTEN */
+#ifdef CONFIG_X86EMU
+ &pc_machine_class,
+#endif
+ NULL,
+};
+
+static const VirtMachineClass *virt_machine_find_class(const char *machine_name)
+{
+ const VirtMachineClass *vmc, **pvmc;
+
+ for(pvmc = virt_machine_list; *pvmc != NULL; pvmc++) {
+ vmc = *pvmc;
+ if (find_name(machine_name, vmc->machine_names))
+ return vmc;
+ }
+ return NULL;
+}
+
+static int virt_machine_parse_config(VirtMachineParams *p,
+ char *config_file_str, int len)
+{
+ int version, val;
+ const char *tag_name, *str;
+ char buf1[256];
+ JSONValue cfg, obj, el;
+
+ cfg = json_parse_value_len(config_file_str, len);
+ if (json_is_error(cfg)) {
+ vm_error("error: %s\n", json_get_error(cfg));
+ json_free(cfg);
+ return -1;
+ }
+
+ if (vm_get_int(cfg, "version", &version) < 0)
+ goto tag_fail;
+ if (version != VM_CONFIG_VERSION) {
+ if (version > VM_CONFIG_VERSION) {
+ vm_error("The emulator is too old to run this VM: please upgrade\n");
+ return -1;
+ } else {
+ vm_error("The VM configuration file is too old for this emulator version: please upgrade the VM configuration file\n");
+ return -1;
+ }
+ }
+
+ if (vm_get_str(cfg, "machine", &str) < 0)
+ goto tag_fail;
+ p->machine_name = strdup(str);
+ p->vmc = virt_machine_find_class(p->machine_name);
+ if (!p->vmc) {
+ vm_error("Unknown machine name: %s\n", p->machine_name);
+ goto tag_fail;
+ }
+ p->vmc->virt_machine_set_defaults(p);
+
+ tag_name = "memory_size";
+ if (vm_get_int(cfg, tag_name, &val) < 0)
+ goto tag_fail;
+ p->ram_size = (uint64_t)val << 20;
+
+ tag_name = "bios";
+ if (vm_get_str_opt(cfg, tag_name, &str) < 0)
+ goto tag_fail;
+ if (str) {
+ p->files[VM_FILE_BIOS].filename = strdup(str);
+ }
+
+ tag_name = "kernel";
+ if (vm_get_str_opt(cfg, tag_name, &str) < 0)
+ goto tag_fail;
+ if (str) {
+ p->files[VM_FILE_KERNEL].filename = strdup(str);
+ }
+
+ tag_name = "initrd";
+ if (vm_get_str_opt(cfg, tag_name, &str) < 0)
+ goto tag_fail;
+ if (str) {
+ p->files[VM_FILE_INITRD].filename = strdup(str);
+ }
+
+ if (vm_get_str_opt(cfg, "cmdline", &str) < 0)
+ goto tag_fail;
+ if (str) {
+ p->cmdline = cmdline_subst(str);
+ }
+
+ for(;;) {
+ snprintf(buf1, sizeof(buf1), "drive%d", p->drive_count);
+ obj = json_object_get(cfg, buf1);
+ if (json_is_undefined(obj))
+ break;
+ if (p->drive_count >= MAX_DRIVE_DEVICE) {
+ vm_error("Too many drives\n");
+ return -1;
+ }
+ if (vm_get_str(obj, "file", &str) < 0)
+ goto tag_fail;
+ p->tab_drive[p->drive_count].filename = strdup(str);
+ if (vm_get_str_opt(obj, "device", &str) < 0)
+ goto tag_fail;
+ p->tab_drive[p->drive_count].device = strdup_null(str);
+ p->drive_count++;
+ }
+
+ for(;;) {
+ snprintf(buf1, sizeof(buf1), "fs%d", p->fs_count);
+ obj = json_object_get(cfg, buf1);
+ if (json_is_undefined(obj))
+ break;
+ if (p->fs_count >= MAX_DRIVE_DEVICE) {
+ vm_error("Too many filesystems\n");
+ return -1;
+ }
+ if (vm_get_str(obj, "file", &str) < 0)
+ goto tag_fail;
+ p->tab_fs[p->fs_count].filename = strdup(str);
+ if (vm_get_str_opt(obj, "tag", &str) < 0)
+ goto tag_fail;
+ if (!str) {
+ if (p->fs_count == 0)
+ strcpy(buf1, "/dev/root");
+ else
+ snprintf(buf1, sizeof(buf1), "/dev/root%d", p->fs_count);
+ str = buf1;
+ }
+ p->tab_fs[p->fs_count].tag = strdup(str);
+ p->fs_count++;
+ }
+
+ for(;;) {
+ snprintf(buf1, sizeof(buf1), "eth%d", p->eth_count);
+ obj = json_object_get(cfg, buf1);
+ if (json_is_undefined(obj))
+ break;
+ if (p->eth_count >= MAX_ETH_DEVICE) {
+ vm_error("Too many ethernet interfaces\n");
+ return -1;
+ }
+ if (vm_get_str(obj, "driver", &str) < 0)
+ goto tag_fail;
+ p->tab_eth[p->eth_count].driver = strdup(str);
+ if (!strcmp(str, "tap")) {
+ if (vm_get_str(obj, "ifname", &str) < 0)
+ goto tag_fail;
+ p->tab_eth[p->eth_count].ifname = strdup(str);
+ }
+ p->eth_count++;
+ }
+
+ p->display_device = NULL;
+ obj = json_object_get(cfg, "display0");
+ if (!json_is_undefined(obj)) {
+ if (vm_get_str(obj, "device", &str) < 0)
+ goto tag_fail;
+ p->display_device = strdup(str);
+ if (vm_get_int(obj, "width", &p->width) < 0)
+ goto tag_fail;
+ if (vm_get_int(obj, "height", &p->height) < 0)
+ goto tag_fail;
+ if (vm_get_str_opt(obj, "vga_bios", &str) < 0)
+ goto tag_fail;
+ if (str) {
+ p->files[VM_FILE_VGA_BIOS].filename = strdup(str);
+ }
+ }
+
+ if (vm_get_str_opt(cfg, "input_device", &str) < 0)
+ goto tag_fail;
+ p->input_device = strdup_null(str);
+
+ if (vm_get_str_opt(cfg, "accel", &str) < 0)
+ goto tag_fail;
+ if (str) {
+ if (!strcmp(str, "none")) {
+ p->accel_enable = FALSE;
+ } else if (!strcmp(str, "auto")) {
+ p->accel_enable = TRUE;
+ } else {
+ vm_error("unsupported 'accel' config: %s\n", str);
+ return -1;
+ }
+ }
+
+ tag_name = "rtc_local_time";
+ el = json_object_get(cfg, tag_name);
+ if (!json_is_undefined(el)) {
+ if (el.type != JSON_BOOL) {
+ vm_error("%s: boolean expected\n", tag_name);
+ goto tag_fail;
+ }
+ p->rtc_local_time = el.u.b;
+ }
+
+ json_free(cfg);
+ return 0;
+ tag_fail:
+ json_free(cfg);
+ return -1;
+}
+
+typedef void FSLoadFileCB(void *opaque, uint8_t *buf, int buf_len);
+
+typedef struct {
+ VirtMachineParams *vm_params;
+ void (*start_cb)(void *opaque);
+ void *opaque;
+
+ FSLoadFileCB *file_load_cb;
+ void *file_load_opaque;
+ int file_index;
+} VMConfigLoadState;
+
+static void config_file_loaded(void *opaque, uint8_t *buf, int buf_len);
+static void config_additional_file_load(VMConfigLoadState *s);
+static void config_additional_file_load_cb(void *opaque,
+ uint8_t *buf, int buf_len);
+
+/* XXX: win32, URL */
+char *get_file_path(const char *base_filename, const char *filename)
+{
+ int len, len1;
+ char *fname, *p;
+
+ if (!base_filename)
+ goto done;
+ if (strchr(filename, ':'))
+ goto done; /* full URL */
+ if (filename[0] == '/')
+ goto done;
+ p = strrchr(base_filename, '/');
+ if (!p) {
+ done:
+ return strdup(filename);
+ }
+ len = p + 1 - base_filename;
+ len1 = strlen(filename);
+ fname = malloc(len + len1 + 1);
+ memcpy(fname, base_filename, len);
+ memcpy(fname + len, filename, len1 + 1);
+ return fname;
+}
+
+
+#ifdef EMSCRIPTEN
+static int load_file(uint8_t **pbuf, const char *filename)
+{
+ abort();
+}
+#else
+/* return -1 if error. */
+static int load_file(uint8_t **pbuf, const char *filename)
+{
+ FILE *f;
+ int size;
+ uint8_t *buf;
+
+ f = fopen(filename, "rb");
+ if (!f) {
+ perror(filename);
+ exit(1);
+ }
+ fseek(f, 0, SEEK_END);
+ size = ftell(f);
+ fseek(f, 0, SEEK_SET);
+ buf = malloc(size);
+ if (fread(buf, 1, size, f) != size) {
+ fprintf(stderr, "%s: read error\n", filename);
+ exit(1);
+ }
+ fclose(f);
+ *pbuf = buf;
+ return size;
+}
+#endif
+
+#ifdef CONFIG_FS_NET
+static void config_load_file_cb(void *opaque, int err, void *data, size_t size)
+{
+ VMConfigLoadState *s = opaque;
+
+ // printf("err=%d data=%p size=%ld\n", err, data, size);
+ if (err < 0) {
+ vm_error("Error %d while loading file\n", -err);
+ exit(1);
+ }
+ s->file_load_cb(s->file_load_opaque, data, size);
+}
+#endif
+
+static void config_load_file(VMConfigLoadState *s, const char *filename,
+ FSLoadFileCB *cb, void *opaque)
+{
+ // printf("loading %s\n", filename);
+#ifdef CONFIG_FS_NET
+ if (is_url(filename)) {
+ s->file_load_cb = cb;
+ s->file_load_opaque = opaque;
+ fs_wget(filename, NULL, NULL, s, config_load_file_cb, TRUE);
+ } else
+#endif
+ {
+ uint8_t *buf;
+ int size;
+ size = load_file(&buf, filename);
+ cb(opaque, buf, size);
+ free(buf);
+ }
+}
+
+void virt_machine_load_config_file(VirtMachineParams *p,
+ const char *filename,
+ void (*start_cb)(void *opaque),
+ void *opaque)
+{
+ VMConfigLoadState *s;
+
+ s = mallocz(sizeof(*s));
+ s->vm_params = p;
+ s->start_cb = start_cb;
+ s->opaque = opaque;
+ p->cfg_filename = strdup(filename);
+
+ config_load_file(s, filename, config_file_loaded, s);
+}
+
+static void config_file_loaded(void *opaque, uint8_t *buf, int buf_len)
+{
+ VMConfigLoadState *s = opaque;
+ VirtMachineParams *p = s->vm_params;
+
+ if (virt_machine_parse_config(p, (char *)buf, buf_len) < 0)
+ exit(1);
+
+ /* load the additional files */
+ s->file_index = 0;
+ config_additional_file_load(s);
+}
+
+static void config_additional_file_load(VMConfigLoadState *s)
+{
+ VirtMachineParams *p = s->vm_params;
+ while (s->file_index < VM_FILE_COUNT &&
+ p->files[s->file_index].filename == NULL) {
+ s->file_index++;
+ }
+ if (s->file_index == VM_FILE_COUNT) {
+ if (s->start_cb)
+ s->start_cb(s->opaque);
+ free(s);
+ } else {
+ char *fname;
+
+ fname = get_file_path(p->cfg_filename,
+ p->files[s->file_index].filename);
+ config_load_file(s, fname,
+ config_additional_file_load_cb, s);
+ free(fname);
+ }
+}
+
+static void config_additional_file_load_cb(void *opaque,
+ uint8_t *buf, int buf_len)
+{
+ VMConfigLoadState *s = opaque;
+ VirtMachineParams *p = s->vm_params;
+
+ p->files[s->file_index].buf = malloc(buf_len);
+ memcpy(p->files[s->file_index].buf, buf, buf_len);
+ p->files[s->file_index].len = buf_len;
+
+ /* load the next files */
+ s->file_index++;
+ config_additional_file_load(s);
+}
+
+void vm_add_cmdline(VirtMachineParams *p, const char *cmdline)
+{
+ char *new_cmdline, *old_cmdline;
+ if (cmdline[0] == '!') {
+ new_cmdline = strdup(cmdline + 1);
+ } else {
+ old_cmdline = p->cmdline;
+ if (!old_cmdline)
+ old_cmdline = "";
+ new_cmdline = malloc(strlen(old_cmdline) + 1 + strlen(cmdline) + 1);
+ strcpy(new_cmdline, old_cmdline);
+ strcat(new_cmdline, " ");
+ strcat(new_cmdline, cmdline);
+ }
+ free(p->cmdline);
+ p->cmdline = new_cmdline;
+}
+
+void virt_machine_free_config(VirtMachineParams *p)
+{
+ int i;
+
+ free(p->machine_name);
+ free(p->cmdline);
+ for(i = 0; i < VM_FILE_COUNT; i++) {
+ free(p->files[i].filename);
+ free(p->files[i].buf);
+ }
+ for(i = 0; i < p->drive_count; i++) {
+ free(p->tab_drive[i].filename);
+ free(p->tab_drive[i].device);
+ }
+ for(i = 0; i < p->fs_count; i++) {
+ free(p->tab_fs[i].filename);
+ free(p->tab_fs[i].tag);
+ }
+ for(i = 0; i < p->eth_count; i++) {
+ free(p->tab_eth[i].driver);
+ free(p->tab_eth[i].ifname);
+ }
+ free(p->input_device);
+ free(p->display_device);
+ free(p->cfg_filename);
+}
+
+VirtMachine *virt_machine_init(const VirtMachineParams *p)
+{
+ const VirtMachineClass *vmc = p->vmc;
+ return vmc->virt_machine_init(p);
+}
+
+void virt_machine_set_defaults(VirtMachineParams *p)
+{
+ memset(p, 0, sizeof(*p));
+}
+
+void virt_machine_end(VirtMachine *s)
+{
+ s->vmc->virt_machine_end(s);
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h
new file mode 100644
index 0000000..76217ee
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h
@@ -0,0 +1,196 @@
+/*
+ * VM definitions
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "json.h"
+
+typedef struct FBDevice FBDevice;
+
+typedef void SimpleFBDrawFunc(FBDevice *fb_dev, void *opaque,
+ int x, int y, int w, int h);
+
+struct FBDevice {
+ /* the following is set by the device */
+ int width;
+ int height;
+ int stride; /* current stride in bytes */
+ uint8_t *fb_data; /* current pointer to the pixel data */
+ int fb_size; /* frame buffer memory size (info only) */
+ void *device_opaque;
+ void (*refresh)(struct FBDevice *fb_dev,
+ SimpleFBDrawFunc *redraw_func, void *opaque);
+};
+
+#define MAX_DRIVE_DEVICE 4
+#define MAX_FS_DEVICE 4
+#define MAX_ETH_DEVICE 1
+
+#define VM_CONFIG_VERSION 1
+
+typedef enum {
+ VM_FILE_BIOS,
+ VM_FILE_VGA_BIOS,
+ VM_FILE_KERNEL,
+ VM_FILE_INITRD,
+
+ VM_FILE_COUNT,
+} VMFileTypeEnum;
+
+typedef struct {
+ char *filename;
+ uint8_t *buf;
+ int len;
+} VMFileEntry;
+
+typedef struct {
+ char *device;
+ char *filename;
+ BlockDevice *block_dev;
+} VMDriveEntry;
+
+typedef struct {
+ char *device;
+ char *tag; /* 9p mount tag */
+ char *filename;
+ FSDevice *fs_dev;
+} VMFSEntry;
+
+typedef struct {
+ char *driver;
+ char *ifname;
+ EthernetDevice *net;
+} VMEthEntry;
+
+typedef struct VirtMachineClass VirtMachineClass;
+
+typedef struct {
+ char *cfg_filename;
+ const VirtMachineClass *vmc;
+ char *machine_name;
+ uint64_t ram_size;
+ BOOL rtc_real_time;
+ BOOL rtc_local_time;
+ char *display_device; /* NULL means no display */
+ int width, height; /* graphic width & height */
+ CharacterDevice *console;
+ VMDriveEntry tab_drive[MAX_DRIVE_DEVICE];
+ int drive_count;
+ VMFSEntry tab_fs[MAX_FS_DEVICE];
+ int fs_count;
+ VMEthEntry tab_eth[MAX_ETH_DEVICE];
+ int eth_count;
+
+ char *cmdline; /* bios or kernel command line */
+ BOOL accel_enable; /* enable acceleration (KVM) */
+ char *input_device; /* NULL means no input */
+
+ /* kernel, bios and other auxiliary files */
+ VMFileEntry files[VM_FILE_COUNT];
+} VirtMachineParams;
+
+typedef struct VirtMachine {
+ const VirtMachineClass *vmc;
+ /* network */
+ EthernetDevice *net;
+ /* console */
+ VIRTIODevice *console_dev;
+ CharacterDevice *console;
+ /* graphics */
+ FBDevice *fb_dev;
+} VirtMachine;
+
+struct VirtMachineClass {
+ const char *machine_names;
+ void (*virt_machine_set_defaults)(VirtMachineParams *p);
+ VirtMachine *(*virt_machine_init)(const VirtMachineParams *p);
+ void (*virt_machine_end)(VirtMachine *s);
+ int (*virt_machine_get_sleep_duration)(VirtMachine *s, int delay);
+ void (*virt_machine_interp)(VirtMachine *s, int max_exec_cycle);
+ BOOL (*vm_mouse_is_absolute)(VirtMachine *s);
+ void (*vm_send_mouse_event)(VirtMachine *s1, int dx, int dy, int dz,
+ unsigned int buttons);
+ void (*vm_send_key_event)(VirtMachine *s1, BOOL is_down, uint16_t key_code);
+};
+
+extern const VirtMachineClass riscv_machine_class;
+extern const VirtMachineClass pc_machine_class;
+
+void __attribute__((format(printf, 1, 2))) vm_error(const char *fmt, ...);
+int vm_get_int(JSONValue obj, const char *name, int *pval);
+int vm_get_int_opt(JSONValue obj, const char *name, int *pval, int def_val);
+
+void virt_machine_set_defaults(VirtMachineParams *p);
+void virt_machine_load_config_file(VirtMachineParams *p,
+ const char *filename,
+ void (*start_cb)(void *opaque),
+ void *opaque);
+void vm_add_cmdline(VirtMachineParams *p, const char *cmdline);
+char *get_file_path(const char *base_filename, const char *filename);
+void virt_machine_free_config(VirtMachineParams *p);
+VirtMachine *virt_machine_init(const VirtMachineParams *p);
+void virt_machine_end(VirtMachine *s);
+static inline int virt_machine_get_sleep_duration(VirtMachine *s, int delay)
+{
+ return s->vmc->virt_machine_get_sleep_duration(s, delay);
+}
+static inline void virt_machine_interp(VirtMachine *s, int max_exec_cycle)
+{
+ s->vmc->virt_machine_interp(s, max_exec_cycle);
+}
+static inline BOOL vm_mouse_is_absolute(VirtMachine *s)
+{
+ return s->vmc->vm_mouse_is_absolute(s);
+}
+static inline void vm_send_mouse_event(VirtMachine *s1, int dx, int dy, int dz,
+ unsigned int buttons)
+{
+ s1->vmc->vm_send_mouse_event(s1, dx, dy, dz, buttons);
+}
+static inline void vm_send_key_event(VirtMachine *s1, BOOL is_down, uint16_t key_code)
+{
+ s1->vmc->vm_send_key_event(s1, is_down, key_code);
+}
+
+/* gui */
+void sdl_refresh(VirtMachine *m);
+void sdl_init(int width, int height);
+
+/* simplefb.c */
+typedef struct SimpleFBState SimpleFBState;
+SimpleFBState *simplefb_init(PhysMemoryMap *map, uint64_t phys_addr,
+ FBDevice *fb_dev, int width, int height);
+void simplefb_refresh(FBDevice *fb_dev,
+ SimpleFBDrawFunc *redraw_func, void *opaque,
+ PhysMemoryRange *mem_range,
+ int fb_page_count);
+
+/* vga.c */
+typedef struct VGAState VGAState;
+VGAState *pci_vga_init(PCIBus *bus, FBDevice *fb_dev,
+ int width, int height,
+ const uint8_t *vga_rom_buf, int vga_rom_size);
+
+/* block_net.c */
+BlockDevice *block_device_init_http(const char *url,
+ int max_cache_size_kb,
+ void (*start_cb)(void *opaque),
+ void *start_opaque);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/netinit.sh b/jslinux-2019-12-21/tinyemu-2019-12-21/netinit.sh
new file mode 100755
index 0000000..c2dadf9
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/netinit.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# RISCVEMU Ethernet bridge and NAT configuration (run with sudo)
+#
+# Copyright (c) 2017 Fabrice Bellard
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+# host network interface connected to Internet (change it)
+internet_ifname="enp0s20f0u1"
+
+# setup bridge interface
+ip link add br0 type bridge
+# create and add tap0 interface to bridge
+ip tuntap add dev tap0 mode tap user $USER
+ip link set tap0 master br0
+
+ip link set dev br0 up
+ip link set dev tap0 up
+ifconfig br0 192.168.3.1
+
+# setup NAT to access to Internet
+echo 1 > /proc/sys/net/ipv4/ip_forward
+# delete forwarding reject rule if present
+#iptables -D FORWARD 1
+iptables -t nat -A POSTROUTING -o $internet_ifname -j MASQUERADE
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/pci.c b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.c
new file mode 100644
index 0000000..d37b737
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.c
@@ -0,0 +1,588 @@
+/*
+ * Simple PCI bus driver
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+
+#include "cutils.h"
+#include "pci.h"
+
+//#define DEBUG_CONFIG
+
+typedef struct {
+ uint32_t size; /* 0 means no mapping defined */
+ uint8_t type;
+ uint8_t enabled; /* true if mapping is enabled */
+ void *opaque;
+ PCIBarSetFunc *bar_set;
+} PCIIORegion;
+
+struct PCIDevice {
+ PCIBus *bus;
+ uint8_t devfn;
+ IRQSignal irq[4];
+ uint8_t config[256];
+ uint8_t next_cap_offset; /* offset of the next capability */
+ char *name; /* for debug only */
+ PCIIORegion io_regions[PCI_NUM_REGIONS];
+};
+
+struct PCIBus {
+ int bus_num;
+ PCIDevice *device[256];
+ PhysMemoryMap *mem_map;
+ PhysMemoryMap *port_map;
+ uint32_t irq_state[4][8]; /* one bit per device */
+ IRQSignal irq[4];
+};
+
+static int bus_map_irq(PCIDevice *d, int irq_num)
+{
+ int slot_addend;
+ slot_addend = (d->devfn >> 3) - 1;
+ return (irq_num + slot_addend) & 3;
+}
+
+static void pci_device_set_irq(void *opaque, int irq_num, int level)
+{
+ PCIDevice *d = opaque;
+ PCIBus *b = d->bus;
+ uint32_t mask;
+ int i, irq_level;
+
+ // printf("%s: pci_device_seq_irq: %d %d\n", d->name, irq_num, level);
+ irq_num = bus_map_irq(d, irq_num);
+ mask = 1 << (d->devfn & 0x1f);
+ if (level)
+ b->irq_state[irq_num][d->devfn >> 5] |= mask;
+ else
+ b->irq_state[irq_num][d->devfn >> 5] &= ~mask;
+
+ /* compute the IRQ state */
+ mask = 0;
+ for(i = 0; i < 8; i++)
+ mask |= b->irq_state[irq_num][i];
+ irq_level = (mask != 0);
+ set_irq(&b->irq[irq_num], irq_level);
+}
+
+static int devfn_alloc(PCIBus *b)
+{
+ int devfn;
+ for(devfn = 0; devfn < 256; devfn += 8) {
+ if (!b->device[devfn])
+ return devfn;
+ }
+ return -1;
+}
+
+/* devfn < 0 means to allocate it */
+PCIDevice *pci_register_device(PCIBus *b, const char *name, int devfn,
+ uint16_t vendor_id, uint16_t device_id,
+ uint8_t revision, uint16_t class_id)
+{
+ PCIDevice *d;
+ int i;
+
+ if (devfn < 0) {
+ devfn = devfn_alloc(b);
+ if (devfn < 0)
+ return NULL;
+ }
+ if (b->device[devfn])
+ return NULL;
+
+ d = mallocz(sizeof(PCIDevice));
+ d->bus = b;
+ d->name = strdup(name);
+ d->devfn = devfn;
+
+ put_le16(d->config + 0x00, vendor_id);
+ put_le16(d->config + 0x02, device_id);
+ d->config[0x08] = revision;
+ put_le16(d->config + 0x0a, class_id);
+ d->config[0x0e] = 0x00; /* header type */
+ d->next_cap_offset = 0x40;
+
+ for(i = 0; i < 4; i++)
+ irq_init(&d->irq[i], pci_device_set_irq, d, i);
+ b->device[devfn] = d;
+
+ return d;
+}
+
+IRQSignal *pci_device_get_irq(PCIDevice *d, unsigned int irq_num)
+{
+ assert(irq_num < 4);
+ return &d->irq[irq_num];
+}
+
+static uint32_t pci_device_config_read(PCIDevice *d, uint32_t addr,
+ int size_log2)
+{
+ uint32_t val;
+ switch(size_log2) {
+ case 0:
+ val = *(uint8_t *)(d->config + addr);
+ break;
+ case 1:
+ /* Note: may be unaligned */
+ if (addr <= 0xfe)
+ val = get_le16(d->config + addr);
+ else
+ val = *(uint8_t *)(d->config + addr);
+ break;
+ case 2:
+ /* always aligned */
+ val = get_le32(d->config + addr);
+ break;
+ default:
+ abort();
+ }
+#ifdef DEBUG_CONFIG
+ printf("pci_config_read: dev=%s addr=0x%02x val=0x%x s=%d\n",
+ d->name, addr, val, 1 << size_log2);
+#endif
+ return val;
+}
+
+PhysMemoryMap *pci_device_get_mem_map(PCIDevice *d)
+{
+ return d->bus->mem_map;
+}
+
+PhysMemoryMap *pci_device_get_port_map(PCIDevice *d)
+{
+ return d->bus->port_map;
+}
+
+void pci_register_bar(PCIDevice *d, unsigned int bar_num,
+ uint32_t size, int type,
+ void *opaque, PCIBarSetFunc *bar_set)
+{
+ PCIIORegion *r;
+ uint32_t val, config_addr;
+
+ assert(bar_num < PCI_NUM_REGIONS);
+ assert((size & (size - 1)) == 0); /* power of two */
+ assert(size >= 4);
+ r = &d->io_regions[bar_num];
+ assert(r->size == 0);
+ r->size = size;
+ r->type = type;
+ r->enabled = FALSE;
+ r->opaque = opaque;
+ r->bar_set = bar_set;
+ /* set the config value */
+ val = 0;
+ if (bar_num == PCI_ROM_SLOT) {
+ config_addr = 0x30;
+ } else {
+ val |= r->type;
+ config_addr = 0x10 + 4 * bar_num;
+ }
+ put_le32(&d->config[config_addr], val);
+}
+
+static void pci_update_mappings(PCIDevice *d)
+{
+ int cmd, i, offset;
+ uint32_t new_addr;
+ BOOL new_enabled;
+ PCIIORegion *r;
+
+ cmd = get_le16(&d->config[PCI_COMMAND]);
+
+ for(i = 0; i < PCI_NUM_REGIONS; i++) {
+ r = &d->io_regions[i];
+ if (i == PCI_ROM_SLOT) {
+ offset = 0x30;
+ } else {
+ offset = 0x10 + i * 4;
+ }
+ new_addr = get_le32(&d->config[offset]);
+ new_enabled = FALSE;
+ if (r->size != 0) {
+ if ((r->type & PCI_ADDRESS_SPACE_IO) &&
+ (cmd & PCI_COMMAND_IO)) {
+ new_enabled = TRUE;
+ } else {
+ if (cmd & PCI_COMMAND_MEMORY) {
+ if (i == PCI_ROM_SLOT) {
+ new_enabled = (new_addr & 1);
+ } else {
+ new_enabled = TRUE;
+ }
+ }
+ }
+ }
+ if (new_enabled) {
+ /* new address */
+ new_addr = get_le32(&d->config[offset]) & ~(r->size - 1);
+ r->bar_set(r->opaque, i, new_addr, TRUE);
+ r->enabled = TRUE;
+ } else if (r->enabled) {
+ r->bar_set(r->opaque, i, 0, FALSE);
+ r->enabled = FALSE;
+ }
+ }
+}
+
+/* return != 0 if write is not handled */
+static int pci_write_bar(PCIDevice *d, uint32_t addr,
+ uint32_t val)
+{
+ PCIIORegion *r;
+ int reg;
+
+ if (addr == 0x30)
+ reg = PCI_ROM_SLOT;
+ else
+ reg = (addr - 0x10) >> 2;
+ // printf("%s: write bar addr=%x data=%x\n", d->name, addr, val);
+ r = &d->io_regions[reg];
+ if (r->size == 0)
+ return -1;
+ if (reg == PCI_ROM_SLOT) {
+ val = val & ((~(r->size - 1)) | 1);
+ } else {
+ val = (val & ~(r->size - 1)) | r->type;
+ }
+ put_le32(d->config + addr, val);
+ pci_update_mappings(d);
+ return 0;
+}
+
+static void pci_device_config_write8(PCIDevice *d, uint32_t addr,
+ uint32_t data)
+{
+ int can_write;
+
+ if (addr == PCI_STATUS || addr == (PCI_STATUS + 1)) {
+ /* write 1 reset bits */
+ d->config[addr] &= ~data;
+ return;
+ }
+
+ switch(d->config[0x0e]) {
+ case 0x00:
+ case 0x80:
+ switch(addr) {
+ case 0x00:
+ case 0x01:
+ case 0x02:
+ case 0x03:
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0e:
+ case 0x10 ... 0x27: /* base */
+ case 0x30 ... 0x33: /* rom */
+ case 0x3d:
+ can_write = 0;
+ break;
+ default:
+ can_write = 1;
+ break;
+ }
+ break;
+ default:
+ case 0x01:
+ switch(addr) {
+ case 0x00:
+ case 0x01:
+ case 0x02:
+ case 0x03:
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0e:
+ case 0x38 ... 0x3b: /* rom */
+ case 0x3d:
+ can_write = 0;
+ break;
+ default:
+ can_write = 1;
+ break;
+ }
+ break;
+ }
+ if (can_write)
+ d->config[addr] = data;
+}
+
+
+static void pci_device_config_write(PCIDevice *d, uint32_t addr,
+ uint32_t data, int size_log2)
+{
+ int size, i;
+ uint32_t addr1;
+
+#ifdef DEBUG_CONFIG
+ printf("pci_config_write: dev=%s addr=0x%02x val=0x%x s=%d\n",
+ d->name, addr, data, 1 << size_log2);
+#endif
+ if (size_log2 == 2 &&
+ ((addr >= 0x10 && addr < 0x10 + 4 * 6) ||
+ addr == 0x30)) {
+ if (pci_write_bar(d, addr, data) == 0)
+ return;
+ }
+ size = 1 << size_log2;
+ for(i = 0; i < size; i++) {
+ addr1 = addr + i;
+ if (addr1 <= 0xff) {
+ pci_device_config_write8(d, addr1, (data >> (i * 8)) & 0xff);
+ }
+ }
+ if (PCI_COMMAND >= addr && PCI_COMMAND < addr + size) {
+ pci_update_mappings(d);
+ }
+}
+
+
+static void pci_data_write(PCIBus *s, uint32_t addr,
+ uint32_t data, int size_log2)
+{
+ PCIDevice *d;
+ int bus_num, devfn, config_addr;
+
+ bus_num = (addr >> 16) & 0xff;
+ if (bus_num != s->bus_num)
+ return;
+ devfn = (addr >> 8) & 0xff;
+ d = s->device[devfn];
+ if (!d)
+ return;
+ config_addr = addr & 0xff;
+ pci_device_config_write(d, config_addr, data, size_log2);
+}
+
+static const uint32_t val_ones[3] = { 0xff, 0xffff, 0xffffffff };
+
+static uint32_t pci_data_read(PCIBus *s, uint32_t addr, int size_log2)
+{
+ PCIDevice *d;
+ int bus_num, devfn, config_addr;
+
+ bus_num = (addr >> 16) & 0xff;
+ if (bus_num != s->bus_num)
+ return val_ones[size_log2];
+ devfn = (addr >> 8) & 0xff;
+ d = s->device[devfn];
+ if (!d)
+ return val_ones[size_log2];
+ config_addr = addr & 0xff;
+ return pci_device_config_read(d, config_addr, size_log2);
+}
+
+/* warning: only valid for one DEVIO page. Return NULL if no memory at
+ the given address */
+uint8_t *pci_device_get_dma_ptr(PCIDevice *d, uint64_t addr, BOOL is_rw)
+{
+ return phys_mem_get_ram_ptr(d->bus->mem_map, addr, is_rw);
+}
+
+void pci_device_set_config8(PCIDevice *d, uint8_t addr, uint8_t val)
+{
+ d->config[addr] = val;
+}
+
+void pci_device_set_config16(PCIDevice *d, uint8_t addr, uint16_t val)
+{
+ put_le16(&d->config[addr], val);
+}
+
+int pci_device_get_devfn(PCIDevice *d)
+{
+ return d->devfn;
+}
+
+/* return the offset of the capability or < 0 if error. */
+int pci_add_capability(PCIDevice *d, const uint8_t *buf, int size)
+{
+ int offset;
+
+ offset = d->next_cap_offset;
+ if ((offset + size) > 256)
+ return -1;
+ d->next_cap_offset += size;
+ d->config[PCI_STATUS] |= PCI_STATUS_CAP_LIST;
+ memcpy(d->config + offset, buf, size);
+ d->config[offset + 1] = d->config[PCI_CAPABILITY_LIST];
+ d->config[PCI_CAPABILITY_LIST] = offset;
+ return offset;
+}
+
+/* i440FX host bridge */
+
+struct I440FXState {
+ PCIBus *pci_bus;
+ PCIDevice *pci_dev;
+ PCIDevice *piix3_dev;
+ uint32_t config_reg;
+ uint8_t pic_irq_state[16];
+ IRQSignal *pic_irqs; /* 16 irqs */
+};
+
+static void i440fx_write_addr(void *opaque, uint32_t offset,
+ uint32_t data, int size_log2)
+{
+ I440FXState *s = opaque;
+ s->config_reg = data;
+}
+
+static uint32_t i440fx_read_addr(void *opaque, uint32_t offset, int size_log2)
+{
+ I440FXState *s = opaque;
+ return s->config_reg;
+}
+
+static void i440fx_write_data(void *opaque, uint32_t offset,
+ uint32_t data, int size_log2)
+{
+ I440FXState *s = opaque;
+ if (s->config_reg & 0x80000000) {
+ if (size_log2 == 2) {
+ /* it is simpler to assume 32 bit config accesses are
+ always aligned */
+ pci_data_write(s->pci_bus, s->config_reg & ~3, data, size_log2);
+ } else {
+ pci_data_write(s->pci_bus, s->config_reg | offset, data, size_log2);
+ }
+ }
+}
+
+static uint32_t i440fx_read_data(void *opaque, uint32_t offset, int size_log2)
+{
+ I440FXState *s = opaque;
+ if (!(s->config_reg & 0x80000000))
+ return val_ones[size_log2];
+ if (size_log2 == 2) {
+ /* it is simpler to assume 32 bit config accesses are
+ always aligned */
+ return pci_data_read(s->pci_bus, s->config_reg & ~3, size_log2);
+ } else {
+ return pci_data_read(s->pci_bus, s->config_reg | offset, size_log2);
+ }
+}
+
+static void i440fx_set_irq(void *opaque, int irq_num, int irq_level)
+{
+ I440FXState *s = opaque;
+ PCIDevice *hd = s->piix3_dev;
+ int pic_irq;
+
+ /* map to the PIC irq (different IRQs can be mapped to the same
+ PIC irq) */
+ hd->config[0x60 + irq_num] &= ~0x80;
+ pic_irq = hd->config[0x60 + irq_num];
+ if (pic_irq < 16) {
+ if (irq_level)
+ s->pic_irq_state[pic_irq] |= 1 << irq_num;
+ else
+ s->pic_irq_state[pic_irq] &= ~(1 << irq_num);
+ set_irq(&s->pic_irqs[pic_irq], (s->pic_irq_state[pic_irq] != 0));
+ }
+}
+
+I440FXState *i440fx_init(PCIBus **pbus, int *ppiix3_devfn,
+ PhysMemoryMap *mem_map, PhysMemoryMap *port_map,
+ IRQSignal *pic_irqs)
+{
+ I440FXState *s;
+ PCIBus *b;
+ PCIDevice *d;
+ int i;
+
+ s = mallocz(sizeof(*s));
+
+ b = mallocz(sizeof(PCIBus));
+ b->bus_num = 0;
+ b->mem_map = mem_map;
+ b->port_map = port_map;
+
+ s->pic_irqs = pic_irqs;
+ for(i = 0; i < 4; i++) {
+ irq_init(&b->irq[i], i440fx_set_irq, s, i);
+ }
+
+ cpu_register_device(port_map, 0xcf8, 1, s, i440fx_read_addr, i440fx_write_addr,
+ DEVIO_SIZE32);
+ cpu_register_device(port_map, 0xcfc, 4, s, i440fx_read_data, i440fx_write_data,
+ DEVIO_SIZE8 | DEVIO_SIZE16 | DEVIO_SIZE32);
+ d = pci_register_device(b, "i440FX", 0, 0x8086, 0x1237, 0x02, 0x0600);
+ put_le16(&d->config[PCI_SUBSYSTEM_VENDOR_ID], 0x1af4); /* Red Hat, Inc. */
+ put_le16(&d->config[PCI_SUBSYSTEM_ID], 0x1100); /* QEMU virtual machine */
+
+ s->pci_dev = d;
+ s->pci_bus = b;
+
+ s->piix3_dev = pci_register_device(b, "PIIX3", 8, 0x8086, 0x7000,
+ 0x00, 0x0601);
+ pci_device_set_config8(s->piix3_dev, 0x0e, 0x80); /* header type */
+
+ *pbus = b;
+ *ppiix3_devfn = s->piix3_dev->devfn;
+ return s;
+}
+
+/* in case no BIOS is used, map the interrupts. */
+void i440fx_map_interrupts(I440FXState *s, uint8_t *elcr,
+ const uint8_t *pci_irqs)
+{
+ PCIBus *b = s->pci_bus;
+ PCIDevice *d, *hd;
+ int irq_num, pic_irq, devfn, i;
+
+ /* set a default PCI IRQ mapping to PIC IRQs */
+ hd = s->piix3_dev;
+
+ elcr[0] = 0;
+ elcr[1] = 0;
+ for(i = 0; i < 4; i++) {
+ irq_num = pci_irqs[i];
+ hd->config[0x60 + i] = irq_num;
+ elcr[irq_num >> 3] |= (1 << (irq_num & 7));
+ }
+
+ for(devfn = 0; devfn < 256; devfn++) {
+ d = b->device[devfn];
+ if (!d)
+ continue;
+ if (d->config[PCI_INTERRUPT_PIN]) {
+ irq_num = 0;
+ irq_num = bus_map_irq(d, irq_num);
+ pic_irq = hd->config[0x60 + irq_num];
+ if (pic_irq < 16) {
+ d->config[PCI_INTERRUPT_LINE] = pic_irq;
+ }
+ }
+ }
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/pci.h b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.h
new file mode 100644
index 0000000..39d6efe
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.h
@@ -0,0 +1,81 @@
+/*
+ * Simple PCI bus driver
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef PCI_H
+#define PCI_H
+
+#include "iomem.h"
+
+typedef struct PCIBus PCIBus;
+typedef struct PCIDevice PCIDevice;
+
+/* bar type */
+#define PCI_ADDRESS_SPACE_MEM 0x00
+#define PCI_ADDRESS_SPACE_IO 0x01
+#define PCI_ADDRESS_SPACE_MEM_PREFETCH 0x08
+
+#define PCI_ROM_SLOT 6
+#define PCI_NUM_REGIONS 7
+
+/* PCI config addresses */
+#define PCI_VENDOR_ID 0x00 /* 16 bits */
+#define PCI_DEVICE_ID 0x02 /* 16 bits */
+#define PCI_COMMAND 0x04 /* 16 bits */
+#define PCI_COMMAND_IO (1 << 0)
+#define PCI_COMMAND_MEMORY (1 << 1)
+#define PCI_STATUS 0x06 /* 16 bits */
+#define PCI_STATUS_CAP_LIST (1 << 4)
+#define PCI_CLASS_PROG 0x09
+#define PCI_SUBSYSTEM_VENDOR_ID 0x2c /* 16 bits */
+#define PCI_SUBSYSTEM_ID 0x2e /* 16 bits */
+#define PCI_CAPABILITY_LIST 0x34 /* 8 bits */
+#define PCI_INTERRUPT_LINE 0x3c /* 8 bits */
+#define PCI_INTERRUPT_PIN 0x3d /* 8 bits */
+
+typedef void PCIBarSetFunc(void *opaque, int bar_num, uint32_t addr,
+ BOOL enabled);
+
+PCIDevice *pci_register_device(PCIBus *b, const char *name, int devfn,
+ uint16_t vendor_id, uint16_t device_id,
+ uint8_t revision, uint16_t class_id);
+PhysMemoryMap *pci_device_get_mem_map(PCIDevice *d);
+PhysMemoryMap *pci_device_get_port_map(PCIDevice *d);
+void pci_register_bar(PCIDevice *d, unsigned int bar_num,
+ uint32_t size, int type,
+ void *opaque, PCIBarSetFunc *bar_set);
+IRQSignal *pci_device_get_irq(PCIDevice *d, unsigned int irq_num);
+uint8_t *pci_device_get_dma_ptr(PCIDevice *d, uint64_t addr, BOOL is_rw);
+void pci_device_set_config8(PCIDevice *d, uint8_t addr, uint8_t val);
+void pci_device_set_config16(PCIDevice *d, uint8_t addr, uint16_t val);
+int pci_device_get_devfn(PCIDevice *d);
+int pci_add_capability(PCIDevice *d, const uint8_t *buf, int size);
+
+typedef struct I440FXState I440FXState;
+
+I440FXState *i440fx_init(PCIBus **pbus, int *ppiix3_devfn,
+ PhysMemoryMap *mem_map, PhysMemoryMap *port_map,
+ IRQSignal *pic_irqs);
+void i440fx_map_interrupts(I440FXState *s, uint8_t *elcr,
+ const uint8_t *pci_irqs);
+
+#endif /* PCI_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/pckbd.c b/jslinux-2019-12-21/tinyemu-2019-12-21/pckbd.c
new file mode 100644
index 0000000..e1c73d7
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/pckbd.c
@@ -0,0 +1,342 @@
+/*
+ * QEMU PC keyboard emulation
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "ps2.h"
+#include "virtio.h"
+#include "machine.h"
+
+/* debug PC keyboard */
+//#define DEBUG_KBD
+
+/* debug PC keyboard : only mouse */
+//#define DEBUG_MOUSE
+
+/* Keyboard Controller Commands */
+#define KBD_CCMD_READ_MODE 0x20 /* Read mode bits */
+#define KBD_CCMD_WRITE_MODE 0x60 /* Write mode bits */
+#define KBD_CCMD_GET_VERSION 0xA1 /* Get controller version */
+#define KBD_CCMD_MOUSE_DISABLE 0xA7 /* Disable mouse interface */
+#define KBD_CCMD_MOUSE_ENABLE 0xA8 /* Enable mouse interface */
+#define KBD_CCMD_TEST_MOUSE 0xA9 /* Mouse interface test */
+#define KBD_CCMD_SELF_TEST 0xAA /* Controller self test */
+#define KBD_CCMD_KBD_TEST 0xAB /* Keyboard interface test */
+#define KBD_CCMD_KBD_DISABLE 0xAD /* Keyboard interface disable */
+#define KBD_CCMD_KBD_ENABLE 0xAE /* Keyboard interface enable */
+#define KBD_CCMD_READ_INPORT 0xC0 /* read input port */
+#define KBD_CCMD_READ_OUTPORT 0xD0 /* read output port */
+#define KBD_CCMD_WRITE_OUTPORT 0xD1 /* write output port */
+#define KBD_CCMD_WRITE_OBUF 0xD2
+#define KBD_CCMD_WRITE_AUX_OBUF 0xD3 /* Write to output buffer as if
+ initiated by the auxiliary device */
+#define KBD_CCMD_WRITE_MOUSE 0xD4 /* Write the following byte to the mouse */
+#define KBD_CCMD_DISABLE_A20 0xDD /* HP vectra only ? */
+#define KBD_CCMD_ENABLE_A20 0xDF /* HP vectra only ? */
+#define KBD_CCMD_RESET 0xFE
+
+/* Status Register Bits */
+#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */
+#define KBD_STAT_IBF 0x02 /* Keyboard input buffer full */
+#define KBD_STAT_SELFTEST 0x04 /* Self test successful */
+#define KBD_STAT_CMD 0x08 /* Last write was a command write (0=data) */
+#define KBD_STAT_UNLOCKED 0x10 /* Zero if keyboard locked */
+#define KBD_STAT_MOUSE_OBF 0x20 /* Mouse output buffer full */
+#define KBD_STAT_GTO 0x40 /* General receive/xmit timeout */
+#define KBD_STAT_PERR 0x80 /* Parity error */
+
+/* Controller Mode Register Bits */
+#define KBD_MODE_KBD_INT 0x01 /* Keyboard data generate IRQ1 */
+#define KBD_MODE_MOUSE_INT 0x02 /* Mouse data generate IRQ12 */
+#define KBD_MODE_SYS 0x04 /* The system flag (?) */
+#define KBD_MODE_NO_KEYLOCK 0x08 /* The keylock doesn't affect the keyboard if set */
+#define KBD_MODE_DISABLE_KBD 0x10 /* Disable keyboard interface */
+#define KBD_MODE_DISABLE_MOUSE 0x20 /* Disable mouse interface */
+#define KBD_MODE_KCC 0x40 /* Scan code conversion to PC format */
+#define KBD_MODE_RFU 0x80
+
+#define KBD_PENDING_KBD 1
+#define KBD_PENDING_AUX 2
+
+struct KBDState {
+ uint8_t write_cmd; /* if non zero, write data to port 60 is expected */
+ uint8_t status;
+ uint8_t mode;
+ /* Bitmask of devices with data available. */
+ uint8_t pending;
+ PS2KbdState *kbd;
+ PS2MouseState *mouse;
+
+ IRQSignal *irq_kbd;
+ IRQSignal *irq_mouse;
+};
+
+static void qemu_system_reset_request(void)
+{
+ printf("system_reset_request\n");
+ exit(1);
+ /* XXX */
+}
+
+static void ioport_set_a20(int val)
+{
+}
+
+static int ioport_get_a20(void)
+{
+ return 1;
+}
+
+/* update irq and KBD_STAT_[MOUSE_]OBF */
+/* XXX: not generating the irqs if KBD_MODE_DISABLE_KBD is set may be
+ incorrect, but it avoids having to simulate exact delays */
+static void kbd_update_irq(KBDState *s)
+{
+ int irq_kbd_level, irq_mouse_level;
+
+ irq_kbd_level = 0;
+ irq_mouse_level = 0;
+ s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF);
+ if (s->pending) {
+ s->status |= KBD_STAT_OBF;
+ /* kbd data takes priority over aux data. */
+ if (s->pending == KBD_PENDING_AUX) {
+ s->status |= KBD_STAT_MOUSE_OBF;
+ if (s->mode & KBD_MODE_MOUSE_INT)
+ irq_mouse_level = 1;
+ } else {
+ if ((s->mode & KBD_MODE_KBD_INT) &&
+ !(s->mode & KBD_MODE_DISABLE_KBD))
+ irq_kbd_level = 1;
+ }
+ }
+ set_irq(s->irq_kbd, irq_kbd_level);
+ set_irq(s->irq_mouse, irq_mouse_level);
+}
+
+static void kbd_update_kbd_irq(void *opaque, int level)
+{
+ KBDState *s = (KBDState *)opaque;
+
+ if (level)
+ s->pending |= KBD_PENDING_KBD;
+ else
+ s->pending &= ~KBD_PENDING_KBD;
+ kbd_update_irq(s);
+}
+
+static void kbd_update_aux_irq(void *opaque, int level)
+{
+ KBDState *s = (KBDState *)opaque;
+
+ if (level)
+ s->pending |= KBD_PENDING_AUX;
+ else
+ s->pending &= ~KBD_PENDING_AUX;
+ kbd_update_irq(s);
+}
+
+static uint32_t kbd_read_status(void *opaque, uint32_t addr, int size_log2)
+{
+ KBDState *s = opaque;
+ int val;
+ val = s->status;
+#if defined(DEBUG_KBD)
+ printf("kbd: read status=0x%02x\n", val);
+#endif
+ return val;
+}
+
+static void kbd_queue(KBDState *s, int b, int aux)
+{
+ if (aux)
+ ps2_queue(s->mouse, b);
+ else
+ ps2_queue(s->kbd, b);
+}
+
+static void kbd_write_command(void *opaque, uint32_t addr, uint32_t val,
+ int size_log2)
+{
+ KBDState *s = opaque;
+
+#if defined(DEBUG_KBD)
+ printf("kbd: write cmd=0x%02x\n", val);
+#endif
+ switch(val) {
+ case KBD_CCMD_READ_MODE:
+ kbd_queue(s, s->mode, 1);
+ break;
+ case KBD_CCMD_WRITE_MODE:
+ case KBD_CCMD_WRITE_OBUF:
+ case KBD_CCMD_WRITE_AUX_OBUF:
+ case KBD_CCMD_WRITE_MOUSE:
+ case KBD_CCMD_WRITE_OUTPORT:
+ s->write_cmd = val;
+ break;
+ case KBD_CCMD_MOUSE_DISABLE:
+ s->mode |= KBD_MODE_DISABLE_MOUSE;
+ break;
+ case KBD_CCMD_MOUSE_ENABLE:
+ s->mode &= ~KBD_MODE_DISABLE_MOUSE;
+ break;
+ case KBD_CCMD_TEST_MOUSE:
+ kbd_queue(s, 0x00, 0);
+ break;
+ case KBD_CCMD_SELF_TEST:
+ s->status |= KBD_STAT_SELFTEST;
+ kbd_queue(s, 0x55, 0);
+ break;
+ case KBD_CCMD_KBD_TEST:
+ kbd_queue(s, 0x00, 0);
+ break;
+ case KBD_CCMD_KBD_DISABLE:
+ s->mode |= KBD_MODE_DISABLE_KBD;
+ kbd_update_irq(s);
+ break;
+ case KBD_CCMD_KBD_ENABLE:
+ s->mode &= ~KBD_MODE_DISABLE_KBD;
+ kbd_update_irq(s);
+ break;
+ case KBD_CCMD_READ_INPORT:
+ kbd_queue(s, 0x00, 0);
+ break;
+ case KBD_CCMD_READ_OUTPORT:
+ /* XXX: check that */
+ val = 0x01 | (ioport_get_a20() << 1);
+ if (s->status & KBD_STAT_OBF)
+ val |= 0x10;
+ if (s->status & KBD_STAT_MOUSE_OBF)
+ val |= 0x20;
+ kbd_queue(s, val, 0);
+ break;
+ case KBD_CCMD_ENABLE_A20:
+ ioport_set_a20(1);
+ break;
+ case KBD_CCMD_DISABLE_A20:
+ ioport_set_a20(0);
+ break;
+ case KBD_CCMD_RESET:
+ qemu_system_reset_request();
+ break;
+ case 0xff:
+ /* ignore that - I don't know what is its use */
+ break;
+ default:
+ fprintf(stderr, "qemu: unsupported keyboard cmd=0x%02x\n", val);
+ break;
+ }
+}
+
+static uint32_t kbd_read_data(void *opaque, uint32_t addr, int size_log2)
+{
+ KBDState *s = opaque;
+ uint32_t val;
+ if (s->pending == KBD_PENDING_AUX)
+ val = ps2_read_data(s->mouse);
+ else
+ val = ps2_read_data(s->kbd);
+#ifdef DEBUG_KBD
+ printf("kbd: read data=0x%02x\n", val);
+#endif
+ return val;
+}
+
+static void kbd_write_data(void *opaque, uint32_t addr, uint32_t val, int size_log2)
+{
+ KBDState *s = opaque;
+
+#ifdef DEBUG_KBD
+ printf("kbd: write data=0x%02x\n", val);
+#endif
+
+ switch(s->write_cmd) {
+ case 0:
+ ps2_write_keyboard(s->kbd, val);
+ break;
+ case KBD_CCMD_WRITE_MODE:
+ s->mode = val;
+ ps2_keyboard_set_translation(s->kbd, (s->mode & KBD_MODE_KCC) != 0);
+ /* ??? */
+ kbd_update_irq(s);
+ break;
+ case KBD_CCMD_WRITE_OBUF:
+ kbd_queue(s, val, 0);
+ break;
+ case KBD_CCMD_WRITE_AUX_OBUF:
+ kbd_queue(s, val, 1);
+ break;
+ case KBD_CCMD_WRITE_OUTPORT:
+ ioport_set_a20((val >> 1) & 1);
+ if (!(val & 1)) {
+ qemu_system_reset_request();
+ }
+ break;
+ case KBD_CCMD_WRITE_MOUSE:
+ ps2_write_mouse(s->mouse, val);
+ break;
+ default:
+ break;
+ }
+ s->write_cmd = 0;
+}
+
+static void kbd_reset(void *opaque)
+{
+ KBDState *s = opaque;
+
+ s->mode = KBD_MODE_KBD_INT | KBD_MODE_MOUSE_INT;
+ s->status = KBD_STAT_CMD | KBD_STAT_UNLOCKED;
+}
+
+KBDState *i8042_init(PS2KbdState **pkbd,
+ PS2MouseState **pmouse,
+ PhysMemoryMap *port_map,
+ IRQSignal *kbd_irq, IRQSignal *mouse_irq, uint32_t io_base)
+{
+ KBDState *s;
+
+ s = mallocz(sizeof(*s));
+
+ s->irq_kbd = kbd_irq;
+ s->irq_mouse = mouse_irq;
+
+ kbd_reset(s);
+ cpu_register_device(port_map, io_base, 1, s, kbd_read_data, kbd_write_data,
+ DEVIO_SIZE8);
+ cpu_register_device(port_map, io_base + 4, 1, s, kbd_read_status, kbd_write_command,
+ DEVIO_SIZE8);
+
+ s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
+ s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
+
+ *pkbd = s->kbd;
+ *pmouse = s->mouse;
+ return s;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.c b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.c
new file mode 100644
index 0000000..c787568
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.c
@@ -0,0 +1,489 @@
+/*
+ * QEMU PS/2 keyboard/mouse emulation
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "ps2.h"
+
+/* debug PC keyboard */
+//#define DEBUG_KBD
+
+/* debug PC keyboard : only mouse */
+//#define DEBUG_MOUSE
+
+/* Keyboard Commands */
+#define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */
+#define KBD_CMD_ECHO 0xEE
+#define KBD_CMD_GET_ID 0xF2 /* get keyboard ID */
+#define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */
+#define KBD_CMD_ENABLE 0xF4 /* Enable scanning */
+#define KBD_CMD_RESET_DISABLE 0xF5 /* reset and disable scanning */
+#define KBD_CMD_RESET_ENABLE 0xF6 /* reset and enable scanning */
+#define KBD_CMD_RESET 0xFF /* Reset */
+
+/* Keyboard Replies */
+#define KBD_REPLY_POR 0xAA /* Power on reset */
+#define KBD_REPLY_ACK 0xFA /* Command ACK */
+#define KBD_REPLY_RESEND 0xFE /* Command NACK, send the cmd again */
+
+/* Mouse Commands */
+#define AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */
+#define AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */
+#define AUX_SET_RES 0xE8 /* Set resolution */
+#define AUX_GET_SCALE 0xE9 /* Get scaling factor */
+#define AUX_SET_STREAM 0xEA /* Set stream mode */
+#define AUX_POLL 0xEB /* Poll */
+#define AUX_RESET_WRAP 0xEC /* Reset wrap mode */
+#define AUX_SET_WRAP 0xEE /* Set wrap mode */
+#define AUX_SET_REMOTE 0xF0 /* Set remote mode */
+#define AUX_GET_TYPE 0xF2 /* Get type */
+#define AUX_SET_SAMPLE 0xF3 /* Set sample rate */
+#define AUX_ENABLE_DEV 0xF4 /* Enable aux device */
+#define AUX_DISABLE_DEV 0xF5 /* Disable aux device */
+#define AUX_SET_DEFAULT 0xF6
+#define AUX_RESET 0xFF /* Reset aux device */
+#define AUX_ACK 0xFA /* Command byte ACK. */
+
+#define MOUSE_STATUS_REMOTE 0x40
+#define MOUSE_STATUS_ENABLED 0x20
+#define MOUSE_STATUS_SCALE21 0x10
+
+#define PS2_QUEUE_SIZE 256
+
+typedef struct {
+ uint8_t data[PS2_QUEUE_SIZE];
+ int rptr, wptr, count;
+} PS2Queue;
+
+typedef struct {
+ PS2Queue queue;
+ int32_t write_cmd;
+ void (*update_irq)(void *, int);
+ void *update_arg;
+} PS2State;
+
+struct PS2KbdState {
+ PS2State common;
+ int scan_enabled;
+ /* Qemu uses translated PC scancodes internally. To avoid multiple
+ conversions we do the translation (if any) in the PS/2 emulation
+ not the keyboard controller. */
+ int translate;
+};
+
+struct PS2MouseState {
+ PS2State common;
+ uint8_t mouse_status;
+ uint8_t mouse_resolution;
+ uint8_t mouse_sample_rate;
+ uint8_t mouse_wrap;
+ uint8_t mouse_type; /* 0 = PS2, 3 = IMPS/2, 4 = IMEX */
+ uint8_t mouse_detect_state;
+ int mouse_dx; /* current values, needed for 'poll' mode */
+ int mouse_dy;
+ int mouse_dz;
+ uint8_t mouse_buttons;
+};
+
+void ps2_queue(void *opaque, int b)
+{
+ PS2State *s = (PS2State *)opaque;
+ PS2Queue *q = &s->queue;
+
+ if (q->count >= PS2_QUEUE_SIZE)
+ return;
+ q->data[q->wptr] = b;
+ if (++q->wptr == PS2_QUEUE_SIZE)
+ q->wptr = 0;
+ q->count++;
+ s->update_irq(s->update_arg, 1);
+}
+
+#define INPUT_MAKE_KEY_MIN 96
+#define INPUT_MAKE_KEY_MAX 127
+
+static const uint8_t linux_input_to_keycode_set1[INPUT_MAKE_KEY_MAX - INPUT_MAKE_KEY_MIN + 1] = {
+ 0x1c, 0x1d, 0x35, 0x00, 0x38, 0x00, 0x47, 0x48,
+ 0x49, 0x4b, 0x4d, 0x4f, 0x50, 0x51, 0x52, 0x53,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5c, 0x5d,
+};
+
+/* keycode is a Linux input layer keycode. We only support the PS/2
+ keycode set 1 */
+void ps2_put_keycode(PS2KbdState *s, BOOL is_down, int keycode)
+{
+ if (keycode >= INPUT_MAKE_KEY_MIN) {
+ if (keycode > INPUT_MAKE_KEY_MAX)
+ return;
+ keycode = linux_input_to_keycode_set1[keycode - INPUT_MAKE_KEY_MIN];
+ if (keycode == 0)
+ return;
+ ps2_queue(&s->common, 0xe0);
+ }
+ ps2_queue(&s->common, keycode | ((!is_down) << 7));
+}
+
+uint32_t ps2_read_data(void *opaque)
+{
+ PS2State *s = (PS2State *)opaque;
+ PS2Queue *q;
+ int val, index;
+
+ q = &s->queue;
+ if (q->count == 0) {
+ /* NOTE: if no data left, we return the last keyboard one
+ (needed for EMM386) */
+ /* XXX: need a timer to do things correctly */
+ index = q->rptr - 1;
+ if (index < 0)
+ index = PS2_QUEUE_SIZE - 1;
+ val = q->data[index];
+ } else {
+ val = q->data[q->rptr];
+ if (++q->rptr == PS2_QUEUE_SIZE)
+ q->rptr = 0;
+ q->count--;
+ /* reading deasserts IRQ */
+ s->update_irq(s->update_arg, 0);
+ /* reassert IRQs if data left */
+ s->update_irq(s->update_arg, q->count != 0);
+ }
+ return val;
+}
+
+static void ps2_reset_keyboard(PS2KbdState *s)
+{
+ s->scan_enabled = 1;
+}
+
+void ps2_write_keyboard(void *opaque, int val)
+{
+ PS2KbdState *s = (PS2KbdState *)opaque;
+
+ switch(s->common.write_cmd) {
+ default:
+ case -1:
+ switch(val) {
+ case 0x00:
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ break;
+ case 0x05:
+ ps2_queue(&s->common, KBD_REPLY_RESEND);
+ break;
+ case KBD_CMD_GET_ID:
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ ps2_queue(&s->common, 0xab);
+ ps2_queue(&s->common, 0x83);
+ break;
+ case KBD_CMD_ECHO:
+ ps2_queue(&s->common, KBD_CMD_ECHO);
+ break;
+ case KBD_CMD_ENABLE:
+ s->scan_enabled = 1;
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ break;
+ case KBD_CMD_SET_LEDS:
+ case KBD_CMD_SET_RATE:
+ s->common.write_cmd = val;
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ break;
+ case KBD_CMD_RESET_DISABLE:
+ ps2_reset_keyboard(s);
+ s->scan_enabled = 0;
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ break;
+ case KBD_CMD_RESET_ENABLE:
+ ps2_reset_keyboard(s);
+ s->scan_enabled = 1;
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ break;
+ case KBD_CMD_RESET:
+ ps2_reset_keyboard(s);
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ ps2_queue(&s->common, KBD_REPLY_POR);
+ break;
+ default:
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ break;
+ }
+ break;
+ case KBD_CMD_SET_LEDS:
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ s->common.write_cmd = -1;
+ break;
+ case KBD_CMD_SET_RATE:
+ ps2_queue(&s->common, KBD_REPLY_ACK);
+ s->common.write_cmd = -1;
+ break;
+ }
+}
+
+/* Set the scancode translation mode.
+ 0 = raw scancodes.
+ 1 = translated scancodes (used by qemu internally). */
+
+void ps2_keyboard_set_translation(void *opaque, int mode)
+{
+ PS2KbdState *s = (PS2KbdState *)opaque;
+ s->translate = mode;
+}
+
+static void ps2_mouse_send_packet(PS2MouseState *s)
+{
+ unsigned int b;
+ int dx1, dy1, dz1;
+
+ dx1 = s->mouse_dx;
+ dy1 = s->mouse_dy;
+ dz1 = s->mouse_dz;
+ /* XXX: increase range to 8 bits ? */
+ if (dx1 > 127)
+ dx1 = 127;
+ else if (dx1 < -127)
+ dx1 = -127;
+ if (dy1 > 127)
+ dy1 = 127;
+ else if (dy1 < -127)
+ dy1 = -127;
+ b = 0x08 | ((dx1 < 0) << 4) | ((dy1 < 0) << 5) | (s->mouse_buttons & 0x07);
+ ps2_queue(&s->common, b);
+ ps2_queue(&s->common, dx1 & 0xff);
+ ps2_queue(&s->common, dy1 & 0xff);
+ /* extra byte for IMPS/2 or IMEX */
+ switch(s->mouse_type) {
+ default:
+ break;
+ case 3:
+ if (dz1 > 127)
+ dz1 = 127;
+ else if (dz1 < -127)
+ dz1 = -127;
+ ps2_queue(&s->common, dz1 & 0xff);
+ break;
+ case 4:
+ if (dz1 > 7)
+ dz1 = 7;
+ else if (dz1 < -7)
+ dz1 = -7;
+ b = (dz1 & 0x0f) | ((s->mouse_buttons & 0x18) << 1);
+ ps2_queue(&s->common, b);
+ break;
+ }
+
+ /* update deltas */
+ s->mouse_dx -= dx1;
+ s->mouse_dy -= dy1;
+ s->mouse_dz -= dz1;
+}
+
+void ps2_mouse_event(PS2MouseState *s,
+ int dx, int dy, int dz, int buttons_state)
+{
+ /* check if deltas are recorded when disabled */
+ if (!(s->mouse_status & MOUSE_STATUS_ENABLED))
+ return;
+
+ s->mouse_dx += dx;
+ s->mouse_dy -= dy;
+ s->mouse_dz += dz;
+ /* XXX: SDL sometimes generates nul events: we delete them */
+ if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0 &&
+ s->mouse_buttons == buttons_state)
+ return;
+ s->mouse_buttons = buttons_state;
+
+ if (!(s->mouse_status & MOUSE_STATUS_REMOTE) &&
+ (s->common.queue.count < (PS2_QUEUE_SIZE - 16))) {
+ for(;;) {
+ /* if not remote, send event. Multiple events are sent if
+ too big deltas */
+ ps2_mouse_send_packet(s);
+ if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0)
+ break;
+ }
+ }
+}
+
+void ps2_write_mouse(void *opaque, int val)
+{
+ PS2MouseState *s = (PS2MouseState *)opaque;
+#ifdef DEBUG_MOUSE
+ printf("kbd: write mouse 0x%02x\n", val);
+#endif
+ switch(s->common.write_cmd) {
+ default:
+ case -1:
+ /* mouse command */
+ if (s->mouse_wrap) {
+ if (val == AUX_RESET_WRAP) {
+ s->mouse_wrap = 0;
+ ps2_queue(&s->common, AUX_ACK);
+ return;
+ } else if (val != AUX_RESET) {
+ ps2_queue(&s->common, val);
+ return;
+ }
+ }
+ switch(val) {
+ case AUX_SET_SCALE11:
+ s->mouse_status &= ~MOUSE_STATUS_SCALE21;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_SET_SCALE21:
+ s->mouse_status |= MOUSE_STATUS_SCALE21;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_SET_STREAM:
+ s->mouse_status &= ~MOUSE_STATUS_REMOTE;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_SET_WRAP:
+ s->mouse_wrap = 1;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_SET_REMOTE:
+ s->mouse_status |= MOUSE_STATUS_REMOTE;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_GET_TYPE:
+ ps2_queue(&s->common, AUX_ACK);
+ ps2_queue(&s->common, s->mouse_type);
+ break;
+ case AUX_SET_RES:
+ case AUX_SET_SAMPLE:
+ s->common.write_cmd = val;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_GET_SCALE:
+ ps2_queue(&s->common, AUX_ACK);
+ ps2_queue(&s->common, s->mouse_status);
+ ps2_queue(&s->common, s->mouse_resolution);
+ ps2_queue(&s->common, s->mouse_sample_rate);
+ break;
+ case AUX_POLL:
+ ps2_queue(&s->common, AUX_ACK);
+ ps2_mouse_send_packet(s);
+ break;
+ case AUX_ENABLE_DEV:
+ s->mouse_status |= MOUSE_STATUS_ENABLED;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_DISABLE_DEV:
+ s->mouse_status &= ~MOUSE_STATUS_ENABLED;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_SET_DEFAULT:
+ s->mouse_sample_rate = 100;
+ s->mouse_resolution = 2;
+ s->mouse_status = 0;
+ ps2_queue(&s->common, AUX_ACK);
+ break;
+ case AUX_RESET:
+ s->mouse_sample_rate = 100;
+ s->mouse_resolution = 2;
+ s->mouse_status = 0;
+ s->mouse_type = 0;
+ ps2_queue(&s->common, AUX_ACK);
+ ps2_queue(&s->common, 0xaa);
+ ps2_queue(&s->common, s->mouse_type);
+ break;
+ default:
+ break;
+ }
+ break;
+ case AUX_SET_SAMPLE:
+ s->mouse_sample_rate = val;
+ /* detect IMPS/2 or IMEX */
+ switch(s->mouse_detect_state) {
+ default:
+ case 0:
+ if (val == 200)
+ s->mouse_detect_state = 1;
+ break;
+ case 1:
+ if (val == 100)
+ s->mouse_detect_state = 2;
+ else if (val == 200)
+ s->mouse_detect_state = 3;
+ else
+ s->mouse_detect_state = 0;
+ break;
+ case 2:
+ if (val == 80)
+ s->mouse_type = 3; /* IMPS/2 */
+ s->mouse_detect_state = 0;
+ break;
+ case 3:
+ if (val == 80)
+ s->mouse_type = 4; /* IMEX */
+ s->mouse_detect_state = 0;
+ break;
+ }
+ ps2_queue(&s->common, AUX_ACK);
+ s->common.write_cmd = -1;
+ break;
+ case AUX_SET_RES:
+ s->mouse_resolution = val;
+ ps2_queue(&s->common, AUX_ACK);
+ s->common.write_cmd = -1;
+ break;
+ }
+}
+
+static void ps2_reset(void *opaque)
+{
+ PS2State *s = (PS2State *)opaque;
+ PS2Queue *q;
+ s->write_cmd = -1;
+ q = &s->queue;
+ q->rptr = 0;
+ q->wptr = 0;
+ q->count = 0;
+}
+
+PS2KbdState *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg)
+{
+ PS2KbdState *s = (PS2KbdState *)mallocz(sizeof(PS2KbdState));
+
+ s->common.update_irq = update_irq;
+ s->common.update_arg = update_arg;
+ ps2_reset(&s->common);
+ return s;
+}
+
+PS2MouseState *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
+{
+ PS2MouseState *s = (PS2MouseState *)mallocz(sizeof(PS2MouseState));
+
+ s->common.update_irq = update_irq;
+ s->common.update_arg = update_arg;
+ ps2_reset(&s->common);
+ return s;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.h b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.h
new file mode 100644
index 0000000..47bcfe9
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.h
@@ -0,0 +1,34 @@
+/* ps2.c */
+typedef struct PS2MouseState PS2MouseState;
+typedef struct PS2KbdState PS2KbdState;
+
+PS2KbdState *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg);
+PS2MouseState *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg);
+void ps2_write_mouse(void *, int val);
+void ps2_write_keyboard(void *, int val);
+uint32_t ps2_read_data(void *);
+void ps2_queue(void *, int b);
+void ps2_keyboard_set_translation(void *opaque, int mode);
+
+void ps2_put_keycode(PS2KbdState *s, BOOL is_down, int keycode);
+void ps2_mouse_event(PS2MouseState *s,
+ int dx, int dy, int dz, int buttons_state);
+
+/* vmmouse.c */
+typedef struct VMMouseState VMMouseState;
+
+VMMouseState *vmmouse_init(PS2MouseState *ps2_mouse);
+BOOL vmmouse_is_absolute(VMMouseState *s);
+void vmmouse_send_mouse_event(VMMouseState *s, int x, int y, int dz,
+ int buttons);
+void vmmouse_handler(VMMouseState *s, uint32_t *regs);
+
+/* pckbd.c */
+
+typedef struct KBDState KBDState;
+
+KBDState *i8042_init(PS2KbdState **pkbd,
+ PS2MouseState **pmouse,
+ PhysMemoryMap *port_map,
+ IRQSignal *kbd_irq, IRQSignal *mouse_irq,
+ uint32_t io_base);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/readme.txt b/jslinux-2019-12-21/tinyemu-2019-12-21/readme.txt
new file mode 100644
index 0000000..ca72f7d
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/readme.txt
@@ -0,0 +1,204 @@
+TinyEMU System Emulator by Fabrice Bellard
+==========================================
+
+1) Features
+-----------
+
+- RISC-V system emulator supporting the RV128IMAFDQC base ISA (user
+ level ISA version 2.2, priviledged architecture version 1.10)
+ including:
+
+ - 32/64/128 bit integer registers
+ - 32/64/128 bit floating point instructions
+ - Compressed instructions
+ - dynamic XLEN change
+
+- x86 system emulator based on KVM
+
+- VirtIO console, network, block device, input and 9P filesystem
+
+- Graphical display with SDL
+
+- JSON configuration file
+
+- Remote HTTP block device and filesystem
+
+- small code, easy to modify, no external dependancies
+
+- Javascript demo version
+
+2) Installation
+---------------
+
+- The libraries libcurl, OpenSSL and SDL should be installed. On a Fedora
+ system you can do it with:
+
+ sudo dnf install openssl-devel libcurl-devel SDL-devel
+
+ It is possible to compile the programs without these libraries by
+ commenting CONFIG_FS_NET and/or CONFIG_SDL in the Makefile.
+
+- Edit the Makefile to disable the 128 bit target if you compile on a
+ 32 bit host (for the 128 bit RISCV target the compiler must support
+ the __int128 C extension).
+
+- Use 'make' to compile the binaries.
+
+- You can optionally install the program to '/usr/local/bin' with:
+
+ make install
+
+3) Usage
+--------
+
+3.1 Quick examples
+------------------
+
+- Use the VM images available from https://bellard.org/jslinux (no
+ need to download them):
+
+ Terminal:
+
+ ./temu https://bellard.org/jslinux/buildroot-riscv64.cfg
+
+ Graphical (with SDL):
+
+ ./temu https://bellard.org/jslinux/buildroot-x86-xwin.cfg
+
+ ./temu https://bellard.org/jslinux/win2k.cfg
+
+- Download the example RISC-V Linux image
+ (diskimage-linux-riscv-yyyy-mm-dd.tar.gz) and use it:
+
+ ./temu root-riscv64.cfg
+
+ ./temu rv128test/rv128test.cfg
+
+- Access to your local hard disk (/tmp directory) in the guest:
+
+ ./temu root_9p-riscv64.cfg
+
+then type:
+mount -t 9p /dev/root /mnt
+
+in the guest. The content of the host '/tmp' directory is visible in '/mnt'.
+
+3.2 Invocation
+--------------
+
+usage: temu [options] config_file
+options are:
+-m ram_size set the RAM size in MB
+-rw allow write access to the disk image (default=snapshot)
+-ctrlc the C-c key stops the emulator instead of being sent to the
+ emulated software
+-append cmdline append cmdline to the kernel command line
+-no-accel disable VM acceleration (KVM, x86 machine only)
+
+Console keys:
+Press C-a x to exit the emulator, C-a h to get some help.
+
+3.3 Network usage
+-----------------
+
+The easiest way is to use the "user" mode network driver. No specific
+configuration is necessary.
+
+TinyEMU also supports a "tap" network driver to redirect the network
+traffic from a VirtIO network adapter.
+
+You can look at the netinit.sh script to create the tap network
+interface and to redirect the virtual traffic to Internet thru a
+NAT. The exact configuration may depend on the Linux distribution and
+local firewall configuration.
+
+The VM configuration file must include:
+
+eth0: { driver: "tap", ifname: "tap0" }
+
+and configure the network in the guest system with:
+
+ifconfig eth0 192.168.3.2
+route add -net 0.0.0.0 gw 192.168.3.1 eth0
+
+3.4 Network filesystem
+----------------------
+
+TinyEMU supports the VirtIO 9P filesystem to access local or remote
+filesystems. For remote filesystems, it does HTTP requests to download
+the files. The protocol is compatible with the vfsync utility. In the
+"mount" command, "/dev/rootN" must be used as device name where N is
+the index of the filesystem. When N=0 it is omitted.
+
+The build_filelist tool builds the file list from a root directory. A
+simple web server is enough to serve the files.
+
+The '.preload' file gives a list of files to preload when opening a
+given file.
+
+3.5 Network block device
+------------------------
+
+TinyEMU supports an HTTP block device. The disk image is split into
+small files. Use the 'splitimg' utility to generate images. The URL of
+the JSON blk.txt file must be provided as disk image filename.
+
+4) Technical notes
+------------------
+
+4.1) 128 bit support
+
+The RISC-V specification does not define all the instruction encodings
+for the 128 bit integer and floating point operations. The missing
+ones were interpolated from the 32 and 64 ones.
+
+Unfortunately there is no RISC-V 128 bit toolchain nor OS now
+(volunteers for the Linux port ?), so rv128test.bin may be the first
+128 bit code for RISC-V !
+
+4.2) Floating point emulation
+
+The floating point emulation is bit exact and supports all the
+specified instructions for 32, 64 and 128 bit floating point
+numbers. It uses the new SoftFP library.
+
+4.3) HTIF console
+
+The standard HTIF console uses registers at variable addresses which
+are deduced by loading specific ELF symbols. TinyEMU does not rely on
+an ELF loader, so it is much simpler to use registers at fixed
+addresses (0x40008000). A small modification was made in the
+"riscv-pk" boot loader to support it. The HTIF console is only used to
+display boot messages and to power off the virtual system. The OS
+should use the VirtIO console.
+
+4.4) Javascript version
+
+The Javascript version (JSLinux) can be compiled with Makefile.js and
+emscripten. A complete precompiled and preconfigured demo is available
+in the jslinux-yyyy-mm-dd.tar.gz archive (read the readme.txt file
+inside the archive).
+
+4.5) x86 emulator
+
+A small x86 emulator is included. It is not really an emulator because
+it uses the Linux KVM API to run the x86 code at near native
+performance. The x86 emulator uses the same set of VirtIO devices as
+the RISCV emulator and is able to run many operating systems.
+
+The x86 emulator accepts a Linux kernel image (bzImage). No BIOS image
+is necessary.
+
+The x86 emulator comes from my JS/Linux project (2011) which was one
+of the first emulator running Linux fully implemented in
+Javascript. It is provided to allow easy access to the x86 images
+hosted at https://bellard.org/jslinux .
+
+
+5) License / Credits
+--------------------
+
+TinyEMU is released under the MIT license. If there is no explicit
+license in a file, the license from MIT-LICENSE.txt applies.
+
+The SLIRP library has its own license (two clause BSD license).
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.c
new file mode 100644
index 0000000..ba4fa4c
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.c
@@ -0,0 +1,1377 @@
+/*
+ * RISCV CPU emulator
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "riscv_cpu.h"
+
+#ifndef MAX_XLEN
+#error MAX_XLEN must be defined
+#endif
+#ifndef CONFIG_RISCV_MAX_XLEN
+#error CONFIG_RISCV_MAX_XLEN must be defined
+#endif
+
+//#define DUMP_INVALID_MEM_ACCESS
+//#define DUMP_MMU_EXCEPTIONS
+//#define DUMP_INTERRUPTS
+//#define DUMP_INVALID_CSR
+//#define DUMP_EXCEPTIONS
+//#define DUMP_CSR
+//#define CONFIG_LOGFILE
+
+#include "riscv_cpu_priv.h"
+
+#if FLEN > 0
+#include "softfp.h"
+#endif
+
+#ifdef USE_GLOBAL_STATE
+static RISCVCPUState riscv_cpu_global_state;
+#endif
+#ifdef USE_GLOBAL_VARIABLES
+#define code_ptr s->__code_ptr
+#define code_end s->__code_end
+#define code_to_pc_addend s->__code_to_pc_addend
+#endif
+
+#ifdef CONFIG_LOGFILE
+static FILE *log_file;
+
+static void log_vprintf(const char *fmt, va_list ap)
+{
+ if (!log_file)
+ log_file = fopen("/tmp/riscemu.log", "wb");
+ vfprintf(log_file, fmt, ap);
+}
+#else
+static void log_vprintf(const char *fmt, va_list ap)
+{
+ vprintf(fmt, ap);
+}
+#endif
+
+static void __attribute__((format(printf, 1, 2), unused)) log_printf(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ log_vprintf(fmt, ap);
+ va_end(ap);
+}
+
+#if MAX_XLEN == 128
+static void fprint_target_ulong(FILE *f, target_ulong a)
+{
+ fprintf(f, "%016" PRIx64 "%016" PRIx64, (uint64_t)(a >> 64), (uint64_t)a);
+}
+#else
+static void fprint_target_ulong(FILE *f, target_ulong a)
+{
+ fprintf(f, "%" PR_target_ulong, a);
+}
+#endif
+
+static void print_target_ulong(target_ulong a)
+{
+ fprint_target_ulong(stdout, a);
+}
+
+static char *reg_name[32] = {
+"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
+"s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5",
+"a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7",
+"s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6"
+};
+
+static void dump_regs(RISCVCPUState *s)
+{
+ int i, cols;
+ const char priv_str[4] = "USHM";
+ cols = 256 / MAX_XLEN;
+ printf("pc =");
+ print_target_ulong(s->pc);
+ printf(" ");
+ for(i = 1; i < 32; i++) {
+ printf("%-3s=", reg_name[i]);
+ print_target_ulong(s->reg[i]);
+ if ((i & (cols - 1)) == (cols - 1))
+ printf("\n");
+ else
+ printf(" ");
+ }
+ printf("priv=%c", priv_str[s->priv]);
+ printf(" mstatus=");
+ print_target_ulong(s->mstatus);
+ printf(" cycles=%" PRId64, s->insn_counter);
+ printf("\n");
+#if 1
+ printf(" mideleg=");
+ print_target_ulong(s->mideleg);
+ printf(" mie=");
+ print_target_ulong(s->mie);
+ printf(" mip=");
+ print_target_ulong(s->mip);
+ printf("\n");
+#endif
+}
+
+static __attribute__((unused)) void cpu_abort(RISCVCPUState *s)
+{
+ dump_regs(s);
+ abort();
+}
+
+/* addr must be aligned. Only RAM accesses are supported */
+#define PHYS_MEM_READ_WRITE(size, uint_type) \
+static __maybe_unused inline void phys_write_u ## size(RISCVCPUState *s, target_ulong addr,\
+ uint_type val) \
+{\
+ PhysMemoryRange *pr = get_phys_mem_range(s->mem_map, addr);\
+ if (!pr || !pr->is_ram)\
+ return;\
+ *(uint_type *)(pr->phys_mem + \
+ (uintptr_t)(addr - pr->addr)) = val;\
+}\
+\
+static __maybe_unused inline uint_type phys_read_u ## size(RISCVCPUState *s, target_ulong addr) \
+{\
+ PhysMemoryRange *pr = get_phys_mem_range(s->mem_map, addr);\
+ if (!pr || !pr->is_ram)\
+ return 0;\
+ return *(uint_type *)(pr->phys_mem + \
+ (uintptr_t)(addr - pr->addr)); \
+}
+
+PHYS_MEM_READ_WRITE(8, uint8_t)
+PHYS_MEM_READ_WRITE(32, uint32_t)
+PHYS_MEM_READ_WRITE(64, uint64_t)
+
+#define PTE_V_MASK (1 << 0)
+#define PTE_U_MASK (1 << 4)
+#define PTE_A_MASK (1 << 6)
+#define PTE_D_MASK (1 << 7)
+
+#define ACCESS_READ 0
+#define ACCESS_WRITE 1
+#define ACCESS_CODE 2
+
+/* access = 0: read, 1 = write, 2 = code. Set the exception_pending
+ field if necessary. return 0 if OK, -1 if translation error */
+static int get_phys_addr(RISCVCPUState *s,
+ target_ulong *ppaddr, target_ulong vaddr,
+ int access)
+{
+ int mode, levels, pte_bits, pte_idx, pte_mask, pte_size_log2, xwr, priv;
+ int need_write, vaddr_shift, i, pte_addr_bits;
+ target_ulong pte_addr, pte, vaddr_mask, paddr;
+
+ if ((s->mstatus & MSTATUS_MPRV) && access != ACCESS_CODE) {
+ /* use previous priviledge */
+ priv = (s->mstatus >> MSTATUS_MPP_SHIFT) & 3;
+ } else {
+ priv = s->priv;
+ }
+
+ if (priv == PRV_M) {
+ if (s->cur_xlen < MAX_XLEN) {
+ /* truncate virtual address */
+ *ppaddr = vaddr & (((target_ulong)1 << s->cur_xlen) - 1);
+ } else {
+ *ppaddr = vaddr;
+ }
+ return 0;
+ }
+#if MAX_XLEN == 32
+ /* 32 bits */
+ mode = s->satp >> 31;
+ if (mode == 0) {
+ /* bare: no translation */
+ *ppaddr = vaddr;
+ return 0;
+ } else {
+ /* sv32 */
+ levels = 2;
+ pte_size_log2 = 2;
+ pte_addr_bits = 22;
+ }
+#else
+ mode = (s->satp >> 60) & 0xf;
+ if (mode == 0) {
+ /* bare: no translation */
+ *ppaddr = vaddr;
+ return 0;
+ } else {
+ /* sv39/sv48 */
+ levels = mode - 8 + 3;
+ pte_size_log2 = 3;
+ vaddr_shift = MAX_XLEN - (PG_SHIFT + levels * 9);
+ if ((((target_long)vaddr << vaddr_shift) >> vaddr_shift) != vaddr)
+ return -1;
+ pte_addr_bits = 44;
+ }
+#endif
+ pte_addr = (s->satp & (((target_ulong)1 << pte_addr_bits) - 1)) << PG_SHIFT;
+ pte_bits = 12 - pte_size_log2;
+ pte_mask = (1 << pte_bits) - 1;
+ for(i = 0; i < levels; i++) {
+ vaddr_shift = PG_SHIFT + pte_bits * (levels - 1 - i);
+ pte_idx = (vaddr >> vaddr_shift) & pte_mask;
+ pte_addr += pte_idx << pte_size_log2;
+ if (pte_size_log2 == 2)
+ pte = phys_read_u32(s, pte_addr);
+ else
+ pte = phys_read_u64(s, pte_addr);
+ //printf("pte=0x%08" PRIx64 "\n", pte);
+ if (!(pte & PTE_V_MASK))
+ return -1; /* invalid PTE */
+ paddr = (pte >> 10) << PG_SHIFT;
+ xwr = (pte >> 1) & 7;
+ if (xwr != 0) {
+ if (xwr == 2 || xwr == 6)
+ return -1;
+ /* priviledge check */
+ if (priv == PRV_S) {
+ if ((pte & PTE_U_MASK) && !(s->mstatus & MSTATUS_SUM))
+ return -1;
+ } else {
+ if (!(pte & PTE_U_MASK))
+ return -1;
+ }
+ /* protection check */
+ /* MXR allows read access to execute-only pages */
+ if (s->mstatus & MSTATUS_MXR)
+ xwr |= (xwr >> 2);
+
+ if (((xwr >> access) & 1) == 0)
+ return -1;
+ need_write = !(pte & PTE_A_MASK) ||
+ (!(pte & PTE_D_MASK) && access == ACCESS_WRITE);
+ pte |= PTE_A_MASK;
+ if (access == ACCESS_WRITE)
+ pte |= PTE_D_MASK;
+ if (need_write) {
+ if (pte_size_log2 == 2)
+ phys_write_u32(s, pte_addr, pte);
+ else
+ phys_write_u64(s, pte_addr, pte);
+ }
+ vaddr_mask = ((target_ulong)1 << vaddr_shift) - 1;
+ *ppaddr = (vaddr & vaddr_mask) | (paddr & ~vaddr_mask);
+ return 0;
+ } else {
+ pte_addr = paddr;
+ }
+ }
+ return -1;
+}
+
+/* return 0 if OK, != 0 if exception */
+int target_read_slow(RISCVCPUState *s, mem_uint_t *pval,
+ target_ulong addr, int size_log2)
+{
+ int size, tlb_idx, err, al;
+ target_ulong paddr, offset;
+ uint8_t *ptr;
+ PhysMemoryRange *pr;
+ mem_uint_t ret;
+
+ /* first handle unaligned accesses */
+ size = 1 << size_log2;
+ al = addr & (size - 1);
+ if (al != 0) {
+ switch(size_log2) {
+ case 1:
+ {
+ uint8_t v0, v1;
+ err = target_read_u8(s, &v0, addr);
+ if (err)
+ return err;
+ err = target_read_u8(s, &v1, addr + 1);
+ if (err)
+ return err;
+ ret = v0 | (v1 << 8);
+ }
+ break;
+ case 2:
+ {
+ uint32_t v0, v1;
+ addr -= al;
+ err = target_read_u32(s, &v0, addr);
+ if (err)
+ return err;
+ err = target_read_u32(s, &v1, addr + 4);
+ if (err)
+ return err;
+ ret = (v0 >> (al * 8)) | (v1 << (32 - al * 8));
+ }
+ break;
+#if MLEN >= 64
+ case 3:
+ {
+ uint64_t v0, v1;
+ addr -= al;
+ err = target_read_u64(s, &v0, addr);
+ if (err)
+ return err;
+ err = target_read_u64(s, &v1, addr + 8);
+ if (err)
+ return err;
+ ret = (v0 >> (al * 8)) | (v1 << (64 - al * 8));
+ }
+ break;
+#endif
+#if MLEN >= 128
+ case 4:
+ {
+ uint128_t v0, v1;
+ addr -= al;
+ err = target_read_u128(s, &v0, addr);
+ if (err)
+ return err;
+ err = target_read_u128(s, &v1, addr + 16);
+ if (err)
+ return err;
+ ret = (v0 >> (al * 8)) | (v1 << (128 - al * 8));
+ }
+ break;
+#endif
+ default:
+ abort();
+ }
+ } else {
+ if (get_phys_addr(s, &paddr, addr, ACCESS_READ)) {
+ s->pending_tval = addr;
+ s->pending_exception = CAUSE_LOAD_PAGE_FAULT;
+ return -1;
+ }
+ pr = get_phys_mem_range(s->mem_map, paddr);
+ if (!pr) {
+#ifdef DUMP_INVALID_MEM_ACCESS
+ printf("target_read_slow: invalid physical address 0x");
+ print_target_ulong(paddr);
+ printf("\n");
+#endif
+ return 0;
+ } else if (pr->is_ram) {
+ tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);
+ ptr = pr->phys_mem + (uintptr_t)(paddr - pr->addr);
+ s->tlb_read[tlb_idx].vaddr = addr & ~PG_MASK;
+ s->tlb_read[tlb_idx].mem_addend = (uintptr_t)ptr - addr;
+ switch(size_log2) {
+ case 0:
+ ret = *(uint8_t *)ptr;
+ break;
+ case 1:
+ ret = *(uint16_t *)ptr;
+ break;
+ case 2:
+ ret = *(uint32_t *)ptr;
+ break;
+#if MLEN >= 64
+ case 3:
+ ret = *(uint64_t *)ptr;
+ break;
+#endif
+#if MLEN >= 128
+ case 4:
+ ret = *(uint128_t *)ptr;
+ break;
+#endif
+ default:
+ abort();
+ }
+ } else {
+ offset = paddr - pr->addr;
+ if (((pr->devio_flags >> size_log2) & 1) != 0) {
+ ret = pr->read_func(pr->opaque, offset, size_log2);
+ }
+#if MLEN >= 64
+ else if ((pr->devio_flags & DEVIO_SIZE32) && size_log2 == 3) {
+ /* emulate 64 bit access */
+ ret = pr->read_func(pr->opaque, offset, 2);
+ ret |= (uint64_t)pr->read_func(pr->opaque, offset + 4, 2) << 32;
+
+ }
+#endif
+ else {
+#ifdef DUMP_INVALID_MEM_ACCESS
+ printf("unsupported device read access: addr=0x");
+ print_target_ulong(paddr);
+ printf(" width=%d bits\n", 1 << (3 + size_log2));
+#endif
+ ret = 0;
+ }
+ }
+ }
+ *pval = ret;
+ return 0;
+}
+
+/* return 0 if OK, != 0 if exception */
+int target_write_slow(RISCVCPUState *s, target_ulong addr,
+ mem_uint_t val, int size_log2)
+{
+ int size, i, tlb_idx, err;
+ target_ulong paddr, offset;
+ uint8_t *ptr;
+ PhysMemoryRange *pr;
+
+ /* first handle unaligned accesses */
+ size = 1 << size_log2;
+ if ((addr & (size - 1)) != 0) {
+ /* XXX: should avoid modifying the memory in case of exception */
+ for(i = 0; i < size; i++) {
+ err = target_write_u8(s, addr + i, (val >> (8 * i)) & 0xff);
+ if (err)
+ return err;
+ }
+ } else {
+ if (get_phys_addr(s, &paddr, addr, ACCESS_WRITE)) {
+ s->pending_tval = addr;
+ s->pending_exception = CAUSE_STORE_PAGE_FAULT;
+ return -1;
+ }
+ pr = get_phys_mem_range(s->mem_map, paddr);
+ if (!pr) {
+#ifdef DUMP_INVALID_MEM_ACCESS
+ printf("target_write_slow: invalid physical address 0x");
+ print_target_ulong(paddr);
+ printf("\n");
+#endif
+ } else if (pr->is_ram) {
+ phys_mem_set_dirty_bit(pr, paddr - pr->addr);
+ tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);
+ ptr = pr->phys_mem + (uintptr_t)(paddr - pr->addr);
+ s->tlb_write[tlb_idx].vaddr = addr & ~PG_MASK;
+ s->tlb_write[tlb_idx].mem_addend = (uintptr_t)ptr - addr;
+ switch(size_log2) {
+ case 0:
+ *(uint8_t *)ptr = val;
+ break;
+ case 1:
+ *(uint16_t *)ptr = val;
+ break;
+ case 2:
+ *(uint32_t *)ptr = val;
+ break;
+#if MLEN >= 64
+ case 3:
+ *(uint64_t *)ptr = val;
+ break;
+#endif
+#if MLEN >= 128
+ case 4:
+ *(uint128_t *)ptr = val;
+ break;
+#endif
+ default:
+ abort();
+ }
+ } else {
+ offset = paddr - pr->addr;
+ if (((pr->devio_flags >> size_log2) & 1) != 0) {
+ pr->write_func(pr->opaque, offset, val, size_log2);
+ }
+#if MLEN >= 64
+ else if ((pr->devio_flags & DEVIO_SIZE32) && size_log2 == 3) {
+ /* emulate 64 bit access */
+ pr->write_func(pr->opaque, offset,
+ val & 0xffffffff, 2);
+ pr->write_func(pr->opaque, offset + 4,
+ (val >> 32) & 0xffffffff, 2);
+ }
+#endif
+ else {
+#ifdef DUMP_INVALID_MEM_ACCESS
+ printf("unsupported device write access: addr=0x");
+ print_target_ulong(paddr);
+ printf(" width=%d bits\n", 1 << (3 + size_log2));
+#endif
+ }
+ }
+ }
+ return 0;
+}
+
+struct __attribute__((packed)) unaligned_u32 {
+ uint32_t u32;
+};
+
+/* unaligned access at an address known to be a multiple of 2 */
+static uint32_t get_insn32(uint8_t *ptr)
+{
+#if defined(EMSCRIPTEN)
+ return ((uint16_t *)ptr)[0] | (((uint16_t *)ptr)[1] << 16);
+#else
+ return ((struct unaligned_u32 *)ptr)->u32;
+#endif
+}
+
+/* return 0 if OK, != 0 if exception */
+static no_inline __exception int target_read_insn_slow(RISCVCPUState *s,
+ uint8_t **pptr,
+ target_ulong addr)
+{
+ int tlb_idx;
+ target_ulong paddr;
+ uint8_t *ptr;
+ PhysMemoryRange *pr;
+
+ if (get_phys_addr(s, &paddr, addr, ACCESS_CODE)) {
+ s->pending_tval = addr;
+ s->pending_exception = CAUSE_FETCH_PAGE_FAULT;
+ return -1;
+ }
+ pr = get_phys_mem_range(s->mem_map, paddr);
+ if (!pr || !pr->is_ram) {
+ /* XXX: we only access to execute code from RAM */
+ s->pending_tval = addr;
+ s->pending_exception = CAUSE_FAULT_FETCH;
+ return -1;
+ }
+ tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);
+ ptr = pr->phys_mem + (uintptr_t)(paddr - pr->addr);
+ s->tlb_code[tlb_idx].vaddr = addr & ~PG_MASK;
+ s->tlb_code[tlb_idx].mem_addend = (uintptr_t)ptr - addr;
+ *pptr = ptr;
+ return 0;
+}
+
+/* addr must be aligned */
+static inline __exception int target_read_insn_u16(RISCVCPUState *s, uint16_t *pinsn,
+ target_ulong addr)
+{
+ uint32_t tlb_idx;
+ uint8_t *ptr;
+
+ tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);
+ if (likely(s->tlb_code[tlb_idx].vaddr == (addr & ~PG_MASK))) {
+ ptr = (uint8_t *)(s->tlb_code[tlb_idx].mem_addend +
+ (uintptr_t)addr);
+ } else {
+ if (target_read_insn_slow(s, &ptr, addr))
+ return -1;
+ }
+ *pinsn = *(uint16_t *)ptr;
+ return 0;
+}
+
+static void tlb_init(RISCVCPUState *s)
+{
+ int i;
+
+ for(i = 0; i < TLB_SIZE; i++) {
+ s->tlb_read[i].vaddr = -1;
+ s->tlb_write[i].vaddr = -1;
+ s->tlb_code[i].vaddr = -1;
+ }
+}
+
+static void tlb_flush_all(RISCVCPUState *s)
+{
+ tlb_init(s);
+}
+
+static void tlb_flush_vaddr(RISCVCPUState *s, target_ulong vaddr)
+{
+ tlb_flush_all(s);
+}
+
+/* XXX: inefficient but not critical as long as it is seldom used */
+static void glue(riscv_cpu_flush_tlb_write_range_ram,
+ MAX_XLEN)(RISCVCPUState *s,
+ uint8_t *ram_ptr, size_t ram_size)
+{
+ uint8_t *ptr, *ram_end;
+ int i;
+
+ ram_end = ram_ptr + ram_size;
+ for(i = 0; i < TLB_SIZE; i++) {
+ if (s->tlb_write[i].vaddr != -1) {
+ ptr = (uint8_t *)(s->tlb_write[i].mem_addend +
+ (uintptr_t)s->tlb_write[i].vaddr);
+ if (ptr >= ram_ptr && ptr < ram_end) {
+ s->tlb_write[i].vaddr = -1;
+ }
+ }
+ }
+}
+
+
+#define SSTATUS_MASK0 (MSTATUS_UIE | MSTATUS_SIE | \
+ MSTATUS_UPIE | MSTATUS_SPIE | \
+ MSTATUS_SPP | \
+ MSTATUS_FS | MSTATUS_XS | \
+ MSTATUS_SUM | MSTATUS_MXR)
+#if MAX_XLEN >= 64
+#define SSTATUS_MASK (SSTATUS_MASK0 | MSTATUS_UXL_MASK)
+#else
+#define SSTATUS_MASK SSTATUS_MASK0
+#endif
+
+
+#define MSTATUS_MASK (MSTATUS_UIE | MSTATUS_SIE | MSTATUS_MIE | \
+ MSTATUS_UPIE | MSTATUS_SPIE | MSTATUS_MPIE | \
+ MSTATUS_SPP | MSTATUS_MPP | \
+ MSTATUS_FS | \
+ MSTATUS_MPRV | MSTATUS_SUM | MSTATUS_MXR)
+
+/* cycle and insn counters */
+#define COUNTEREN_MASK ((1 << 0) | (1 << 2))
+
+/* return the complete mstatus with the SD bit */
+static target_ulong get_mstatus(RISCVCPUState *s, target_ulong mask)
+{
+ target_ulong val;
+ BOOL sd;
+ val = s->mstatus | (s->fs << MSTATUS_FS_SHIFT);
+ val &= mask;
+ sd = ((val & MSTATUS_FS) == MSTATUS_FS) |
+ ((val & MSTATUS_XS) == MSTATUS_XS);
+ if (sd)
+ val |= (target_ulong)1 << (s->cur_xlen - 1);
+ return val;
+}
+
+static int get_base_from_xlen(int xlen)
+{
+ if (xlen == 32)
+ return 1;
+ else if (xlen == 64)
+ return 2;
+ else
+ return 3;
+}
+
+static void set_mstatus(RISCVCPUState *s, target_ulong val)
+{
+ target_ulong mod, mask;
+
+ /* flush the TLBs if change of MMU config */
+ mod = s->mstatus ^ val;
+ if ((mod & (MSTATUS_MPRV | MSTATUS_SUM | MSTATUS_MXR)) != 0 ||
+ ((s->mstatus & MSTATUS_MPRV) && (mod & MSTATUS_MPP) != 0)) {
+ tlb_flush_all(s);
+ }
+ s->fs = (val >> MSTATUS_FS_SHIFT) & 3;
+
+ mask = MSTATUS_MASK & ~MSTATUS_FS;
+#if MAX_XLEN >= 64
+ {
+ int uxl, sxl;
+ uxl = (val >> MSTATUS_UXL_SHIFT) & 3;
+ if (uxl >= 1 && uxl <= get_base_from_xlen(MAX_XLEN))
+ mask |= MSTATUS_UXL_MASK;
+ sxl = (val >> MSTATUS_UXL_SHIFT) & 3;
+ if (sxl >= 1 && sxl <= get_base_from_xlen(MAX_XLEN))
+ mask |= MSTATUS_SXL_MASK;
+ }
+#endif
+ s->mstatus = (s->mstatus & ~mask) | (val & mask);
+}
+
+/* return -1 if invalid CSR. 0 if OK. 'will_write' indicate that the
+ csr will be written after (used for CSR access check) */
+static int csr_read(RISCVCPUState *s, target_ulong *pval, uint32_t csr,
+ BOOL will_write)
+{
+ target_ulong val;
+
+ if (((csr & 0xc00) == 0xc00) && will_write)
+ return -1; /* read-only CSR */
+ if (s->priv < ((csr >> 8) & 3))
+ return -1; /* not enough priviledge */
+
+ switch(csr) {
+#if FLEN > 0
+ case 0x001: /* fflags */
+ if (s->fs == 0)
+ return -1;
+ val = s->fflags;
+ break;
+ case 0x002: /* frm */
+ if (s->fs == 0)
+ return -1;
+ val = s->frm;
+ break;
+ case 0x003:
+ if (s->fs == 0)
+ return -1;
+ val = s->fflags | (s->frm << 5);
+ break;
+#endif
+ case 0xc00: /* ucycle */
+ case 0xc02: /* uinstret */
+ {
+ uint32_t counteren;
+ if (s->priv < PRV_M) {
+ if (s->priv < PRV_S)
+ counteren = s->scounteren;
+ else
+ counteren = s->mcounteren;
+ if (((counteren >> (csr & 0x1f)) & 1) == 0)
+ goto invalid_csr;
+ }
+ }
+ val = (int64_t)s->insn_counter;
+ break;
+ case 0xc80: /* mcycleh */
+ case 0xc82: /* minstreth */
+ if (s->cur_xlen != 32)
+ goto invalid_csr;
+ {
+ uint32_t counteren;
+ if (s->priv < PRV_M) {
+ if (s->priv < PRV_S)
+ counteren = s->scounteren;
+ else
+ counteren = s->mcounteren;
+ if (((counteren >> (csr & 0x1f)) & 1) == 0)
+ goto invalid_csr;
+ }
+ }
+ val = s->insn_counter >> 32;
+ break;
+
+ case 0x100:
+ val = get_mstatus(s, SSTATUS_MASK);
+ break;
+ case 0x104: /* sie */
+ val = s->mie & s->mideleg;
+ break;
+ case 0x105:
+ val = s->stvec;
+ break;
+ case 0x106:
+ val = s->scounteren;
+ break;
+ case 0x140:
+ val = s->sscratch;
+ break;
+ case 0x141:
+ val = s->sepc;
+ break;
+ case 0x142:
+ val = s->scause;
+ break;
+ case 0x143:
+ val = s->stval;
+ break;
+ case 0x144: /* sip */
+ val = s->mip & s->mideleg;
+ break;
+ case 0x180:
+ val = s->satp;
+ break;
+ case 0x300:
+ val = get_mstatus(s, (target_ulong)-1);
+ break;
+ case 0x301:
+ val = s->misa;
+ val |= (target_ulong)s->mxl << (s->cur_xlen - 2);
+ break;
+ case 0x302:
+ val = s->medeleg;
+ break;
+ case 0x303:
+ val = s->mideleg;
+ break;
+ case 0x304:
+ val = s->mie;
+ break;
+ case 0x305:
+ val = s->mtvec;
+ break;
+ case 0x306:
+ val = s->mcounteren;
+ break;
+ case 0x340:
+ val = s->mscratch;
+ break;
+ case 0x341:
+ val = s->mepc;
+ break;
+ case 0x342:
+ val = s->mcause;
+ break;
+ case 0x343:
+ val = s->mtval;
+ break;
+ case 0x344:
+ val = s->mip;
+ break;
+ case 0xb00: /* mcycle */
+ case 0xb02: /* minstret */
+ val = (int64_t)s->insn_counter;
+ break;
+ case 0xb80: /* mcycleh */
+ case 0xb82: /* minstreth */
+ if (s->cur_xlen != 32)
+ goto invalid_csr;
+ val = s->insn_counter >> 32;
+ break;
+ case 0xf14:
+ val = s->mhartid;
+ break;
+ default:
+ invalid_csr:
+#ifdef DUMP_INVALID_CSR
+ /* the 'time' counter is usually emulated */
+ if (csr != 0xc01 && csr != 0xc81) {
+ printf("csr_read: invalid CSR=0x%x\n", csr);
+ }
+#endif
+ *pval = 0;
+ return -1;
+ }
+ *pval = val;
+ return 0;
+}
+
+#if FLEN > 0
+static void set_frm(RISCVCPUState *s, unsigned int val)
+{
+ if (val >= 5)
+ val = 0;
+ s->frm = val;
+}
+
+/* return -1 if invalid roundind mode */
+static int get_insn_rm(RISCVCPUState *s, unsigned int rm)
+{
+ if (rm == 7)
+ return s->frm;
+ if (rm >= 5)
+ return -1;
+ else
+ return rm;
+}
+#endif
+
+/* return -1 if invalid CSR, 0 if OK, 1 if the interpreter loop must be
+ exited (e.g. XLEN was modified), 2 if TLBs have been flushed. */
+static int csr_write(RISCVCPUState *s, uint32_t csr, target_ulong val)
+{
+ target_ulong mask;
+
+#if defined(DUMP_CSR)
+ printf("csr_write: csr=0x%03x val=0x", csr);
+ print_target_ulong(val);
+ printf("\n");
+#endif
+ switch(csr) {
+#if FLEN > 0
+ case 0x001: /* fflags */
+ s->fflags = val & 0x1f;
+ s->fs = 3;
+ break;
+ case 0x002: /* frm */
+ set_frm(s, val & 7);
+ s->fs = 3;
+ break;
+ case 0x003: /* fcsr */
+ set_frm(s, (val >> 5) & 7);
+ s->fflags = val & 0x1f;
+ s->fs = 3;
+ break;
+#endif
+ case 0x100: /* sstatus */
+ set_mstatus(s, (s->mstatus & ~SSTATUS_MASK) | (val & SSTATUS_MASK));
+ break;
+ case 0x104: /* sie */
+ mask = s->mideleg;
+ s->mie = (s->mie & ~mask) | (val & mask);
+ break;
+ case 0x105:
+ s->stvec = val & ~3;
+ break;
+ case 0x106:
+ s->scounteren = val & COUNTEREN_MASK;
+ break;
+ case 0x140:
+ s->sscratch = val;
+ break;
+ case 0x141:
+ s->sepc = val & ~1;
+ break;
+ case 0x142:
+ s->scause = val;
+ break;
+ case 0x143:
+ s->stval = val;
+ break;
+ case 0x144: /* sip */
+ mask = s->mideleg;
+ s->mip = (s->mip & ~mask) | (val & mask);
+ break;
+ case 0x180:
+ /* no ASID implemented */
+#if MAX_XLEN == 32
+ {
+ int new_mode;
+ new_mode = (val >> 31) & 1;
+ s->satp = (val & (((target_ulong)1 << 22) - 1)) |
+ (new_mode << 31);
+ }
+#else
+ {
+ int mode, new_mode;
+ mode = s->satp >> 60;
+ new_mode = (val >> 60) & 0xf;
+ if (new_mode == 0 || (new_mode >= 8 && new_mode <= 9))
+ mode = new_mode;
+ s->satp = (val & (((uint64_t)1 << 44) - 1)) |
+ ((uint64_t)mode << 60);
+ }
+#endif
+ tlb_flush_all(s);
+ return 2;
+
+ case 0x300:
+ set_mstatus(s, val);
+ break;
+ case 0x301: /* misa */
+#if MAX_XLEN >= 64
+ {
+ int new_mxl;
+ new_mxl = (val >> (s->cur_xlen - 2)) & 3;
+ if (new_mxl >= 1 && new_mxl <= get_base_from_xlen(MAX_XLEN)) {
+ /* Note: misa is only modified in M level, so cur_xlen
+ = 2^(mxl + 4) */
+ if (s->mxl != new_mxl) {
+ s->mxl = new_mxl;
+ s->cur_xlen = 1 << (new_mxl + 4);
+ return 1;
+ }
+ }
+ }
+#endif
+ break;
+ case 0x302:
+ mask = (1 << (CAUSE_STORE_PAGE_FAULT + 1)) - 1;
+ s->medeleg = (s->medeleg & ~mask) | (val & mask);
+ break;
+ case 0x303:
+ mask = MIP_SSIP | MIP_STIP | MIP_SEIP;
+ s->mideleg = (s->mideleg & ~mask) | (val & mask);
+ break;
+ case 0x304:
+ mask = MIP_MSIP | MIP_MTIP | MIP_SSIP | MIP_STIP | MIP_SEIP;
+ s->mie = (s->mie & ~mask) | (val & mask);
+ break;
+ case 0x305:
+ s->mtvec = val & ~3;
+ break;
+ case 0x306:
+ s->mcounteren = val & COUNTEREN_MASK;
+ break;
+ case 0x340:
+ s->mscratch = val;
+ break;
+ case 0x341:
+ s->mepc = val & ~1;
+ break;
+ case 0x342:
+ s->mcause = val;
+ break;
+ case 0x343:
+ s->mtval = val;
+ break;
+ case 0x344:
+ mask = MIP_SSIP | MIP_STIP;
+ s->mip = (s->mip & ~mask) | (val & mask);
+ break;
+ default:
+#ifdef DUMP_INVALID_CSR
+ printf("csr_write: invalid CSR=0x%x\n", csr);
+#endif
+ return -1;
+ }
+ return 0;
+}
+
+static void set_priv(RISCVCPUState *s, int priv)
+{
+ if (s->priv != priv) {
+ tlb_flush_all(s);
+#if MAX_XLEN >= 64
+ /* change the current xlen */
+ {
+ int mxl;
+ if (priv == PRV_S)
+ mxl = (s->mstatus >> MSTATUS_SXL_SHIFT) & 3;
+ else if (priv == PRV_U)
+ mxl = (s->mstatus >> MSTATUS_UXL_SHIFT) & 3;
+ else
+ mxl = s->mxl;
+ s->cur_xlen = 1 << (4 + mxl);
+ }
+#endif
+ s->priv = priv;
+ }
+}
+
+static void raise_exception2(RISCVCPUState *s, uint32_t cause,
+ target_ulong tval)
+{
+ BOOL deleg;
+ target_ulong causel;
+
+#if defined(DUMP_EXCEPTIONS) || defined(DUMP_MMU_EXCEPTIONS) || defined(DUMP_INTERRUPTS)
+ {
+ int flag;
+ flag = 0;
+#ifdef DUMP_MMU_EXCEPTIONS
+ if (cause == CAUSE_FAULT_FETCH ||
+ cause == CAUSE_FAULT_LOAD ||
+ cause == CAUSE_FAULT_STORE ||
+ cause == CAUSE_FETCH_PAGE_FAULT ||
+ cause == CAUSE_LOAD_PAGE_FAULT ||
+ cause == CAUSE_STORE_PAGE_FAULT)
+ flag = 1;
+#endif
+#ifdef DUMP_INTERRUPTS
+ flag |= (cause & CAUSE_INTERRUPT) != 0;
+#endif
+#ifdef DUMP_EXCEPTIONS
+ flag = 1;
+ flag = (cause & CAUSE_INTERRUPT) == 0;
+ if (cause == CAUSE_SUPERVISOR_ECALL || cause == CAUSE_ILLEGAL_INSTRUCTION)
+ flag = 0;
+#endif
+ if (flag) {
+ log_printf("raise_exception: cause=0x%08x tval=0x", cause);
+#ifdef CONFIG_LOGFILE
+ fprint_target_ulong(log_file, tval);
+#else
+ print_target_ulong(tval);
+#endif
+ log_printf("\n");
+ dump_regs(s);
+ }
+ }
+#endif
+
+ if (s->priv <= PRV_S) {
+ /* delegate the exception to the supervisor priviledge */
+ if (cause & CAUSE_INTERRUPT)
+ deleg = (s->mideleg >> (cause & (MAX_XLEN - 1))) & 1;
+ else
+ deleg = (s->medeleg >> cause) & 1;
+ } else {
+ deleg = 0;
+ }
+
+ causel = cause & 0x7fffffff;
+ if (cause & CAUSE_INTERRUPT)
+ causel |= (target_ulong)1 << (s->cur_xlen - 1);
+
+ if (deleg) {
+ s->scause = causel;
+ s->sepc = s->pc;
+ s->stval = tval;
+ s->mstatus = (s->mstatus & ~MSTATUS_SPIE) |
+ (((s->mstatus >> s->priv) & 1) << MSTATUS_SPIE_SHIFT);
+ s->mstatus = (s->mstatus & ~MSTATUS_SPP) |
+ (s->priv << MSTATUS_SPP_SHIFT);
+ s->mstatus &= ~MSTATUS_SIE;
+ set_priv(s, PRV_S);
+ s->pc = s->stvec;
+ } else {
+ s->mcause = causel;
+ s->mepc = s->pc;
+ s->mtval = tval;
+ s->mstatus = (s->mstatus & ~MSTATUS_MPIE) |
+ (((s->mstatus >> s->priv) & 1) << MSTATUS_MPIE_SHIFT);
+ s->mstatus = (s->mstatus & ~MSTATUS_MPP) |
+ (s->priv << MSTATUS_MPP_SHIFT);
+ s->mstatus &= ~MSTATUS_MIE;
+ set_priv(s, PRV_M);
+ s->pc = s->mtvec;
+ }
+}
+
+static void raise_exception(RISCVCPUState *s, uint32_t cause)
+{
+ raise_exception2(s, cause, 0);
+}
+
+static void handle_sret(RISCVCPUState *s)
+{
+ int spp, spie;
+ spp = (s->mstatus >> MSTATUS_SPP_SHIFT) & 1;
+ /* set the IE state to previous IE state */
+ spie = (s->mstatus >> MSTATUS_SPIE_SHIFT) & 1;
+ s->mstatus = (s->mstatus & ~(1 << spp)) |
+ (spie << spp);
+ /* set SPIE to 1 */
+ s->mstatus |= MSTATUS_SPIE;
+ /* set SPP to U */
+ s->mstatus &= ~MSTATUS_SPP;
+ set_priv(s, spp);
+ s->pc = s->sepc;
+}
+
+static void handle_mret(RISCVCPUState *s)
+{
+ int mpp, mpie;
+ mpp = (s->mstatus >> MSTATUS_MPP_SHIFT) & 3;
+ /* set the IE state to previous IE state */
+ mpie = (s->mstatus >> MSTATUS_MPIE_SHIFT) & 1;
+ s->mstatus = (s->mstatus & ~(1 << mpp)) |
+ (mpie << mpp);
+ /* set MPIE to 1 */
+ s->mstatus |= MSTATUS_MPIE;
+ /* set MPP to U */
+ s->mstatus &= ~MSTATUS_MPP;
+ set_priv(s, mpp);
+ s->pc = s->mepc;
+}
+
+static inline uint32_t get_pending_irq_mask(RISCVCPUState *s)
+{
+ uint32_t pending_ints, enabled_ints;
+
+ pending_ints = s->mip & s->mie;
+ if (pending_ints == 0)
+ return 0;
+
+ enabled_ints = 0;
+ switch(s->priv) {
+ case PRV_M:
+ if (s->mstatus & MSTATUS_MIE)
+ enabled_ints = ~s->mideleg;
+ break;
+ case PRV_S:
+ enabled_ints = ~s->mideleg;
+ if (s->mstatus & MSTATUS_SIE)
+ enabled_ints |= s->mideleg;
+ break;
+ default:
+ case PRV_U:
+ enabled_ints = -1;
+ break;
+ }
+ return pending_ints & enabled_ints;
+}
+
+static __exception int raise_interrupt(RISCVCPUState *s)
+{
+ uint32_t mask;
+ int irq_num;
+
+ mask = get_pending_irq_mask(s);
+ if (mask == 0)
+ return 0;
+ irq_num = ctz32(mask);
+ raise_exception(s, irq_num | CAUSE_INTERRUPT);
+ return -1;
+}
+
+static inline int32_t sext(int32_t val, int n)
+{
+ return (val << (32 - n)) >> (32 - n);
+}
+
+static inline uint32_t get_field1(uint32_t val, int src_pos,
+ int dst_pos, int dst_pos_max)
+{
+ int mask;
+ assert(dst_pos_max >= dst_pos);
+ mask = ((1 << (dst_pos_max - dst_pos + 1)) - 1) << dst_pos;
+ if (dst_pos >= src_pos)
+ return (val << (dst_pos - src_pos)) & mask;
+ else
+ return (val >> (src_pos - dst_pos)) & mask;
+}
+
+#define XLEN 32
+#include "riscv_cpu_template.h"
+
+#if MAX_XLEN >= 64
+#define XLEN 64
+#include "riscv_cpu_template.h"
+#endif
+
+#if MAX_XLEN >= 128
+#define XLEN 128
+#include "riscv_cpu_template.h"
+#endif
+
+static void glue(riscv_cpu_interp, MAX_XLEN)(RISCVCPUState *s, int n_cycles)
+{
+#ifdef USE_GLOBAL_STATE
+ s = &riscv_cpu_global_state;
+#endif
+ uint64_t timeout;
+
+ timeout = s->insn_counter + n_cycles;
+ while (!s->power_down_flag &&
+ (int)(timeout - s->insn_counter) > 0) {
+ n_cycles = timeout - s->insn_counter;
+ switch(s->cur_xlen) {
+ case 32:
+ riscv_cpu_interp_x32(s, n_cycles);
+ break;
+#if MAX_XLEN >= 64
+ case 64:
+ riscv_cpu_interp_x64(s, n_cycles);
+ break;
+#endif
+#if MAX_XLEN >= 128
+ case 128:
+ riscv_cpu_interp_x128(s, n_cycles);
+ break;
+#endif
+ default:
+ abort();
+ }
+ }
+}
+
+/* Note: the value is not accurate when called in riscv_cpu_interp() */
+static uint64_t glue(riscv_cpu_get_cycles, MAX_XLEN)(RISCVCPUState *s)
+{
+ return s->insn_counter;
+}
+
+static void glue(riscv_cpu_set_mip, MAX_XLEN)(RISCVCPUState *s, uint32_t mask)
+{
+ s->mip |= mask;
+ /* exit from power down if an interrupt is pending */
+ if (s->power_down_flag && (s->mip & s->mie) != 0)
+ s->power_down_flag = FALSE;
+}
+
+static void glue(riscv_cpu_reset_mip, MAX_XLEN)(RISCVCPUState *s, uint32_t mask)
+{
+ s->mip &= ~mask;
+}
+
+static uint32_t glue(riscv_cpu_get_mip, MAX_XLEN)(RISCVCPUState *s)
+{
+ return s->mip;
+}
+
+static BOOL glue(riscv_cpu_get_power_down, MAX_XLEN)(RISCVCPUState *s)
+{
+ return s->power_down_flag;
+}
+
+static RISCVCPUState *glue(riscv_cpu_init, MAX_XLEN)(PhysMemoryMap *mem_map)
+{
+ RISCVCPUState *s;
+
+#ifdef USE_GLOBAL_STATE
+ s = &riscv_cpu_global_state;
+#else
+ s = mallocz(sizeof(*s));
+#endif
+ s->common.class_ptr = &glue(riscv_cpu_class, MAX_XLEN);
+ s->mem_map = mem_map;
+ s->pc = 0x1000;
+ s->priv = PRV_M;
+ s->cur_xlen = MAX_XLEN;
+ s->mxl = get_base_from_xlen(MAX_XLEN);
+ s->mstatus = ((uint64_t)s->mxl << MSTATUS_UXL_SHIFT) |
+ ((uint64_t)s->mxl << MSTATUS_SXL_SHIFT);
+ s->misa |= MCPUID_SUPER | MCPUID_USER | MCPUID_I | MCPUID_M | MCPUID_A;
+#if FLEN >= 32
+ s->misa |= MCPUID_F;
+#endif
+#if FLEN >= 64
+ s->misa |= MCPUID_D;
+#endif
+#if FLEN >= 128
+ s->misa |= MCPUID_Q;
+#endif
+#ifdef CONFIG_EXT_C
+ s->misa |= MCPUID_C;
+#endif
+ tlb_init(s);
+ return s;
+}
+
+static void glue(riscv_cpu_end, MAX_XLEN)(RISCVCPUState *s)
+{
+#ifdef USE_GLOBAL_STATE
+ free(s);
+#endif
+}
+
+static uint32_t glue(riscv_cpu_get_misa, MAX_XLEN)(RISCVCPUState *s)
+{
+ return s->misa;
+}
+
+const RISCVCPUClass glue(riscv_cpu_class, MAX_XLEN) = {
+ glue(riscv_cpu_init, MAX_XLEN),
+ glue(riscv_cpu_end, MAX_XLEN),
+ glue(riscv_cpu_interp, MAX_XLEN),
+ glue(riscv_cpu_get_cycles, MAX_XLEN),
+ glue(riscv_cpu_set_mip, MAX_XLEN),
+ glue(riscv_cpu_reset_mip, MAX_XLEN),
+ glue(riscv_cpu_get_mip, MAX_XLEN),
+ glue(riscv_cpu_get_power_down, MAX_XLEN),
+ glue(riscv_cpu_get_misa, MAX_XLEN),
+ glue(riscv_cpu_flush_tlb_write_range_ram, MAX_XLEN),
+};
+
+#if CONFIG_RISCV_MAX_XLEN == MAX_XLEN
+RISCVCPUState *riscv_cpu_init(PhysMemoryMap *mem_map, int max_xlen)
+{
+ const RISCVCPUClass *c;
+ switch(max_xlen) {
+ /* with emscripten we compile a single CPU */
+#if defined(EMSCRIPTEN)
+ case MAX_XLEN:
+ c = &glue(riscv_cpu_class, MAX_XLEN);
+ break;
+#else
+ case 32:
+ c = &riscv_cpu_class32;
+ break;
+ case 64:
+ c = &riscv_cpu_class64;
+ break;
+#if CONFIG_RISCV_MAX_XLEN == 128
+ case 128:
+ c = &riscv_cpu_class128;
+ break;
+#endif
+#endif /* !EMSCRIPTEN */
+ default:
+ return NULL;
+ }
+ return c->riscv_cpu_init(mem_map);
+}
+#endif /* CONFIG_RISCV_MAX_XLEN == MAX_XLEN */
+
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.h
new file mode 100644
index 0000000..6fb8b37
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.h
@@ -0,0 +1,118 @@
+/*
+ * RISCV CPU emulator
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef RISCV_CPU_H
+#define RISCV_CPU_H
+
+#include <stdlib.h>
+#include "cutils.h"
+#include "iomem.h"
+
+#define MIP_USIP (1 << 0)
+#define MIP_SSIP (1 << 1)
+#define MIP_HSIP (1 << 2)
+#define MIP_MSIP (1 << 3)
+#define MIP_UTIP (1 << 4)
+#define MIP_STIP (1 << 5)
+#define MIP_HTIP (1 << 6)
+#define MIP_MTIP (1 << 7)
+#define MIP_UEIP (1 << 8)
+#define MIP_SEIP (1 << 9)
+#define MIP_HEIP (1 << 10)
+#define MIP_MEIP (1 << 11)
+
+typedef struct RISCVCPUState RISCVCPUState;
+
+typedef struct {
+ RISCVCPUState *(*riscv_cpu_init)(PhysMemoryMap *mem_map);
+ void (*riscv_cpu_end)(RISCVCPUState *s);
+ void (*riscv_cpu_interp)(RISCVCPUState *s, int n_cycles);
+ uint64_t (*riscv_cpu_get_cycles)(RISCVCPUState *s);
+ void (*riscv_cpu_set_mip)(RISCVCPUState *s, uint32_t mask);
+ void (*riscv_cpu_reset_mip)(RISCVCPUState *s, uint32_t mask);
+ uint32_t (*riscv_cpu_get_mip)(RISCVCPUState *s);
+ BOOL (*riscv_cpu_get_power_down)(RISCVCPUState *s);
+ uint32_t (*riscv_cpu_get_misa)(RISCVCPUState *s);
+ void (*riscv_cpu_flush_tlb_write_range_ram)(RISCVCPUState *s,
+ uint8_t *ram_ptr, size_t ram_size);
+} RISCVCPUClass;
+
+typedef struct {
+ const RISCVCPUClass *class_ptr;
+} RISCVCPUCommonState;
+
+int riscv_cpu_get_max_xlen(void);
+
+extern const RISCVCPUClass riscv_cpu_class32;
+extern const RISCVCPUClass riscv_cpu_class64;
+extern const RISCVCPUClass riscv_cpu_class128;
+
+RISCVCPUState *riscv_cpu_init(PhysMemoryMap *mem_map, int max_xlen);
+static inline void riscv_cpu_end(RISCVCPUState *s)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ c->riscv_cpu_end(s);
+}
+static inline void riscv_cpu_interp(RISCVCPUState *s, int n_cycles)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ c->riscv_cpu_interp(s, n_cycles);
+}
+static inline uint64_t riscv_cpu_get_cycles(RISCVCPUState *s)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ return c->riscv_cpu_get_cycles(s);
+}
+static inline void riscv_cpu_set_mip(RISCVCPUState *s, uint32_t mask)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ c->riscv_cpu_set_mip(s, mask);
+}
+static inline void riscv_cpu_reset_mip(RISCVCPUState *s, uint32_t mask)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ c->riscv_cpu_reset_mip(s, mask);
+}
+static inline uint32_t riscv_cpu_get_mip(RISCVCPUState *s)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ return c->riscv_cpu_get_mip(s);
+}
+static inline BOOL riscv_cpu_get_power_down(RISCVCPUState *s)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ return c->riscv_cpu_get_power_down(s);
+}
+static inline uint32_t riscv_cpu_get_misa(RISCVCPUState *s)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ return c->riscv_cpu_get_misa(s);
+}
+static inline void riscv_cpu_flush_tlb_write_range_ram(RISCVCPUState *s,
+ uint8_t *ram_ptr, size_t ram_size)
+{
+ const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr;
+ c->riscv_cpu_flush_tlb_write_range_ram(s, ram_ptr, ram_size);
+}
+
+#endif /* RISCV_CPU_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_fp_template.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_fp_template.h
new file mode 100644
index 0000000..88d4037
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_fp_template.h
@@ -0,0 +1,304 @@
+/*
+ * RISCV emulator
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#if F_SIZE == 32
+#define OPID 0
+#define F_HIGH F32_HIGH
+#elif F_SIZE == 64
+#define OPID 1
+#define F_HIGH F64_HIGH
+#elif F_SIZE == 128
+#define OPID 3
+#define F_HIGH 0
+#else
+#error unsupported F_SIZE
+#endif
+
+#define FSIGN_MASK glue(FSIGN_MASK, F_SIZE)
+
+ case (0x00 << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0)
+ goto illegal_insn;
+ s->fp_reg[rd] = glue(add_sf, F_SIZE)(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ rm, &s->fflags) | F_HIGH;
+ s->fs = 3;
+ break;
+ case (0x01 << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0)
+ goto illegal_insn;
+ s->fp_reg[rd] = glue(sub_sf, F_SIZE)(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ rm, &s->fflags) | F_HIGH;
+ s->fs = 3;
+ break;
+ case (0x02 << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0)
+ goto illegal_insn;
+ s->fp_reg[rd] = glue(mul_sf, F_SIZE)(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ rm, &s->fflags) | F_HIGH;
+ s->fs = 3;
+ break;
+ case (0x03 << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0)
+ goto illegal_insn;
+ s->fp_reg[rd] = glue(div_sf, F_SIZE)(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ rm, &s->fflags) | F_HIGH;
+ s->fs = 3;
+ break;
+ case (0x0b << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0 || rs2 != 0)
+ goto illegal_insn;
+ s->fp_reg[rd] = glue(sqrt_sf, F_SIZE)(s->fp_reg[rs1],
+ rm, &s->fflags) | F_HIGH;
+ s->fs = 3;
+ break;
+ case (0x04 << 2) | OPID:
+ switch(rm) {
+ case 0: /* fsgnj */
+ s->fp_reg[rd] = (s->fp_reg[rs1] & ~FSIGN_MASK) |
+ (s->fp_reg[rs2] & FSIGN_MASK);
+ break;
+ case 1: /* fsgnjn */
+ s->fp_reg[rd] = (s->fp_reg[rs1] & ~FSIGN_MASK) |
+ ((s->fp_reg[rs2] & FSIGN_MASK) ^ FSIGN_MASK);
+ break;
+ case 2: /* fsgnjx */
+ s->fp_reg[rd] = s->fp_reg[rs1] ^
+ (s->fp_reg[rs2] & FSIGN_MASK);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ break;
+ case (0x05 << 2) | OPID:
+ switch(rm) {
+ case 0: /* fmin */
+ s->fp_reg[rd] = glue(min_sf, F_SIZE)(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ &s->fflags,
+ FMINMAX_IEEE754_201X) | F_HIGH;
+ break;
+ case 1: /* fmax */
+ s->fp_reg[rd] = glue(max_sf, F_SIZE)(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ &s->fflags,
+ FMINMAX_IEEE754_201X) | F_HIGH;
+ break;
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ break;
+ case (0x18 << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0)
+ goto illegal_insn;
+ switch(rs2) {
+ case 0: /* fcvt.w.[sdq] */
+ val = (int32_t)glue(glue(cvt_sf, F_SIZE), _i32)(s->fp_reg[rs1], rm,
+ &s->fflags);
+ break;
+ case 1: /* fcvt.wu.[sdq] */
+ val = (int32_t)glue(glue(cvt_sf, F_SIZE), _u32)(s->fp_reg[rs1], rm,
+ &s->fflags);
+ break;
+#if XLEN >= 64
+ case 2: /* fcvt.l.[sdq] */
+ val = (int64_t)glue(glue(cvt_sf, F_SIZE), _i64)(s->fp_reg[rs1], rm,
+ &s->fflags);
+ break;
+ case 3: /* fcvt.lu.[sdq] */
+ val = (int64_t)glue(glue(cvt_sf, F_SIZE), _u64)(s->fp_reg[rs1], rm,
+ &s->fflags);
+ break;
+#endif
+#if XLEN >= 128
+ /* XXX: the index is not defined in the spec */
+ case 4: /* fcvt.t.[sdq] */
+ val = glue(glue(cvt_sf, F_SIZE), _i128)(s->fp_reg[rs1], rm,
+ &s->fflags);
+ break;
+ case 5: /* fcvt.tu.[sdq] */
+ val = glue(glue(cvt_sf, F_SIZE), _u128)(s->fp_reg[rs1], rm,
+ &s->fflags);
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ break;
+ case (0x14 << 2) | OPID:
+ switch(rm) {
+ case 0: /* fle */
+ val = glue(le_sf, F_SIZE)(s->fp_reg[rs1], s->fp_reg[rs2],
+ &s->fflags);
+ break;
+ case 1: /* flt */
+ val = glue(lt_sf, F_SIZE)(s->fp_reg[rs1], s->fp_reg[rs2],
+ &s->fflags);
+ break;
+ case 2: /* feq */
+ val = glue(eq_quiet_sf, F_SIZE)(s->fp_reg[rs1], s->fp_reg[rs2],
+ &s->fflags);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ break;
+ case (0x1a << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0)
+ goto illegal_insn;
+ switch(rs2) {
+ case 0: /* fcvt.[sdq].w */
+ s->fp_reg[rd] = glue(cvt_i32_sf, F_SIZE)(s->reg[rs1], rm,
+ &s->fflags) | F_HIGH;
+ break;
+ case 1: /* fcvt.[sdq].wu */
+ s->fp_reg[rd] = glue(cvt_u32_sf, F_SIZE)(s->reg[rs1], rm,
+ &s->fflags) | F_HIGH;
+ break;
+#if XLEN >= 64
+ case 2: /* fcvt.[sdq].l */
+ s->fp_reg[rd] = glue(cvt_i64_sf, F_SIZE)(s->reg[rs1], rm,
+ &s->fflags) | F_HIGH;
+ break;
+ case 3: /* fcvt.[sdq].lu */
+ s->fp_reg[rd] = glue(cvt_u64_sf, F_SIZE)(s->reg[rs1], rm,
+ &s->fflags) | F_HIGH;
+ break;
+#endif
+#if XLEN >= 128
+ /* XXX: the index is not defined in the spec */
+ case 4: /* fcvt.[sdq].t */
+ s->fp_reg[rd] = glue(cvt_i128_sf, F_SIZE)(s->reg[rs1], rm,
+ &s->fflags) | F_HIGH;
+ break;
+ case 5: /* fcvt.[sdq].tu */
+ s->fp_reg[rd] = glue(cvt_u128_sf, F_SIZE)(s->reg[rs1], rm,
+ &s->fflags) | F_HIGH;
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ break;
+
+ case (0x08 << 2) | OPID:
+ rm = get_insn_rm(s, rm);
+ if (rm < 0)
+ goto illegal_insn;
+ switch(rs2) {
+#if F_SIZE == 32 && FLEN >= 64
+ case 1: /* cvt.s.d */
+ s->fp_reg[rd] = cvt_sf64_sf32(s->fp_reg[rs1], rm, &s->fflags) | F32_HIGH;
+ break;
+#if FLEN >= 128
+ case 3: /* cvt.s.q */
+ s->fp_reg[rd] = cvt_sf128_sf32(s->fp_reg[rs1], rm, &s->fflags) | F32_HIGH;
+ break;
+#endif
+#endif /* F_SIZE == 32 */
+#if F_SIZE == 64
+ case 0: /* cvt.d.s */
+ s->fp_reg[rd] = cvt_sf32_sf64(s->fp_reg[rs1], &s->fflags) | F64_HIGH;
+ break;
+#if FLEN >= 128
+ case 1: /* cvt.d.q */
+ s->fp_reg[rd] = cvt_sf128_sf64(s->fp_reg[rs1], rm, &s->fflags) | F64_HIGH;
+ break;
+#endif
+#endif /* F_SIZE == 64 */
+#if F_SIZE == 128
+ case 0: /* cvt.q.s */
+ s->fp_reg[rd] = cvt_sf32_sf128(s->fp_reg[rs1], &s->fflags);
+ break;
+ case 1: /* cvt.q.d */
+ s->fp_reg[rd] = cvt_sf64_sf128(s->fp_reg[rs1], &s->fflags);
+ break;
+#endif /* F_SIZE == 128 */
+
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ break;
+
+ case (0x1c << 2) | OPID:
+ if (rs2 != 0)
+ goto illegal_insn;
+ switch(rm) {
+#if F_SIZE <= XLEN
+ case 0: /* fmv.x.s */
+#if F_SIZE == 32
+ val = (int32_t)s->fp_reg[rs1];
+#elif F_SIZE == 64
+ val = (int64_t)s->fp_reg[rs1];
+#else
+ val = (int128_t)s->fp_reg[rs1];
+#endif
+ break;
+#endif /* F_SIZE <= XLEN */
+ case 1: /* fclass */
+ val = glue(fclass_sf, F_SIZE)(s->fp_reg[rs1]);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ break;
+
+#if F_SIZE <= XLEN
+ case (0x1e << 2) | OPID: /* fmv.s.x */
+ if (rs2 != 0 || rm != 0)
+ goto illegal_insn;
+#if F_SIZE == 32
+ s->fp_reg[rd] = (int32_t)s->reg[rs1];
+#elif F_SIZE == 64
+ s->fp_reg[rd] = (int64_t)s->reg[rs1];
+#else
+ s->fp_reg[rd] = (int128_t)s->reg[rs1];
+#endif
+ s->fs = 3;
+ break;
+#endif /* F_SIZE <= XLEN */
+
+#undef F_SIZE
+#undef F_HIGH
+#undef OPID
+#undef FSIGN_MASK
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_priv.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_priv.h
new file mode 100644
index 0000000..983d8b8
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_priv.h
@@ -0,0 +1,293 @@
+/*
+ * RISCV CPU emulator private definitions
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef RISCV_CPU_PRIV_H
+#define RISCV_CPU_PRIV_H
+
+#include "riscv_cpu.h"
+#include "cutils.h"
+
+#define __exception __attribute__((warn_unused_result))
+
+#ifndef FLEN
+#if MAX_XLEN == 128
+#define FLEN 128
+#else
+#define FLEN 64
+#endif
+#endif /* !FLEN */
+
+#define CONFIG_EXT_C /* compressed instructions */
+
+#if defined(EMSCRIPTEN)
+#define USE_GLOBAL_STATE
+/* use local variables slows down the generated JS code */
+#define USE_GLOBAL_VARIABLES
+#endif
+
+#if MAX_XLEN == 32
+typedef uint32_t target_ulong;
+typedef int32_t target_long;
+#define PR_target_ulong "08x"
+#elif MAX_XLEN == 64
+typedef uint64_t target_ulong;
+typedef int64_t target_long;
+#define PR_target_ulong "016" PRIx64
+#elif MAX_XLEN == 128
+typedef uint128_t target_ulong;
+typedef int128_t target_long;
+#define PR_target_ulong "016" PRIx64 /* XXX */
+#else
+#error unsupported MAX_XLEN
+#endif
+
+/* FLEN is the floating point register width */
+#if FLEN > 0
+#if FLEN == 32
+typedef uint32_t fp_uint;
+#define F32_HIGH 0
+#elif FLEN == 64
+typedef uint64_t fp_uint;
+#define F32_HIGH ((fp_uint)-1 << 32)
+#define F64_HIGH 0
+#elif FLEN == 128
+typedef uint128_t fp_uint;
+#define F32_HIGH ((fp_uint)-1 << 32)
+#define F64_HIGH ((fp_uint)-1 << 64)
+#else
+#error unsupported FLEN
+#endif
+#endif
+
+/* MLEN is the maximum memory access width */
+#if MAX_XLEN <= 32 && FLEN <= 32
+#define MLEN 32
+#elif MAX_XLEN <= 64 && FLEN <= 64
+#define MLEN 64
+#else
+#define MLEN 128
+#endif
+
+#if MLEN == 32
+typedef uint32_t mem_uint_t;
+#elif MLEN == 64
+typedef uint64_t mem_uint_t;
+#elif MLEN == 128
+typedef uint128_t mem_uint_t;
+#else
+#unsupported MLEN
+#endif
+
+#define TLB_SIZE 256
+
+#define CAUSE_MISALIGNED_FETCH 0x0
+#define CAUSE_FAULT_FETCH 0x1
+#define CAUSE_ILLEGAL_INSTRUCTION 0x2
+#define CAUSE_BREAKPOINT 0x3
+#define CAUSE_MISALIGNED_LOAD 0x4
+#define CAUSE_FAULT_LOAD 0x5
+#define CAUSE_MISALIGNED_STORE 0x6
+#define CAUSE_FAULT_STORE 0x7
+#define CAUSE_USER_ECALL 0x8
+#define CAUSE_SUPERVISOR_ECALL 0x9
+#define CAUSE_HYPERVISOR_ECALL 0xa
+#define CAUSE_MACHINE_ECALL 0xb
+#define CAUSE_FETCH_PAGE_FAULT 0xc
+#define CAUSE_LOAD_PAGE_FAULT 0xd
+#define CAUSE_STORE_PAGE_FAULT 0xf
+
+/* Note: converted to correct bit position at runtime */
+#define CAUSE_INTERRUPT ((uint32_t)1 << 31)
+
+#define PRV_U 0
+#define PRV_S 1
+#define PRV_H 2
+#define PRV_M 3
+
+/* misa CSR */
+#define MCPUID_SUPER (1 << ('S' - 'A'))
+#define MCPUID_USER (1 << ('U' - 'A'))
+#define MCPUID_I (1 << ('I' - 'A'))
+#define MCPUID_M (1 << ('M' - 'A'))
+#define MCPUID_A (1 << ('A' - 'A'))
+#define MCPUID_F (1 << ('F' - 'A'))
+#define MCPUID_D (1 << ('D' - 'A'))
+#define MCPUID_Q (1 << ('Q' - 'A'))
+#define MCPUID_C (1 << ('C' - 'A'))
+
+/* mstatus CSR */
+
+#define MSTATUS_SPIE_SHIFT 5
+#define MSTATUS_MPIE_SHIFT 7
+#define MSTATUS_SPP_SHIFT 8
+#define MSTATUS_MPP_SHIFT 11
+#define MSTATUS_FS_SHIFT 13
+#define MSTATUS_UXL_SHIFT 32
+#define MSTATUS_SXL_SHIFT 34
+
+#define MSTATUS_UIE (1 << 0)
+#define MSTATUS_SIE (1 << 1)
+#define MSTATUS_HIE (1 << 2)
+#define MSTATUS_MIE (1 << 3)
+#define MSTATUS_UPIE (1 << 4)
+#define MSTATUS_SPIE (1 << MSTATUS_SPIE_SHIFT)
+#define MSTATUS_HPIE (1 << 6)
+#define MSTATUS_MPIE (1 << MSTATUS_MPIE_SHIFT)
+#define MSTATUS_SPP (1 << MSTATUS_SPP_SHIFT)
+#define MSTATUS_HPP (3 << 9)
+#define MSTATUS_MPP (3 << MSTATUS_MPP_SHIFT)
+#define MSTATUS_FS (3 << MSTATUS_FS_SHIFT)
+#define MSTATUS_XS (3 << 15)
+#define MSTATUS_MPRV (1 << 17)
+#define MSTATUS_SUM (1 << 18)
+#define MSTATUS_MXR (1 << 19)
+//#define MSTATUS_TVM (1 << 20)
+//#define MSTATUS_TW (1 << 21)
+//#define MSTATUS_TSR (1 << 22)
+#define MSTATUS_UXL_MASK ((uint64_t)3 << MSTATUS_UXL_SHIFT)
+#define MSTATUS_SXL_MASK ((uint64_t)3 << MSTATUS_SXL_SHIFT)
+
+#define PG_SHIFT 12
+#define PG_MASK ((1 << PG_SHIFT) - 1)
+
+typedef struct {
+ target_ulong vaddr;
+ uintptr_t mem_addend;
+} TLBEntry;
+
+struct RISCVCPUState {
+ RISCVCPUCommonState common; /* must be first */
+
+ target_ulong pc;
+ target_ulong reg[32];
+
+#ifdef USE_GLOBAL_VARIABLES
+ /* faster to use global variables with emscripten */
+ uint8_t *__code_ptr, *__code_end;
+ target_ulong __code_to_pc_addend;
+#endif
+
+#if FLEN > 0
+ fp_uint fp_reg[32];
+ uint32_t fflags;
+ uint8_t frm;
+#endif
+
+ uint8_t cur_xlen; /* current XLEN value, <= MAX_XLEN */
+ uint8_t priv; /* see PRV_x */
+ uint8_t fs; /* MSTATUS_FS value */
+ uint8_t mxl; /* MXL field in MISA register */
+
+ int32_t n_cycles; /* only used inside the CPU loop */
+ uint64_t insn_counter;
+ BOOL power_down_flag;
+ int pending_exception; /* used during MMU exception handling */
+ target_ulong pending_tval;
+
+ /* CSRs */
+ target_ulong mstatus;
+ target_ulong mtvec;
+ target_ulong mscratch;
+ target_ulong mepc;
+ target_ulong mcause;
+ target_ulong mtval;
+ target_ulong mhartid; /* ro */
+ uint32_t misa;
+ uint32_t mie;
+ uint32_t mip;
+ uint32_t medeleg;
+ uint32_t mideleg;
+ uint32_t mcounteren;
+
+ target_ulong stvec;
+ target_ulong sscratch;
+ target_ulong sepc;
+ target_ulong scause;
+ target_ulong stval;
+#if MAX_XLEN == 32
+ uint32_t satp;
+#else
+ uint64_t satp; /* currently 64 bit physical addresses max */
+#endif
+ uint32_t scounteren;
+
+ target_ulong load_res; /* for atomic LR/SC */
+
+ PhysMemoryMap *mem_map;
+
+ TLBEntry tlb_read[TLB_SIZE];
+ TLBEntry tlb_write[TLB_SIZE];
+ TLBEntry tlb_code[TLB_SIZE];
+};
+
+#define target_read_slow glue(glue(riscv, MAX_XLEN), _read_slow)
+#define target_write_slow glue(glue(riscv, MAX_XLEN), _write_slow)
+
+DLL_PUBLIC int target_read_slow(RISCVCPUState *s, mem_uint_t *pval,
+ target_ulong addr, int size_log2);
+DLL_PUBLIC int target_write_slow(RISCVCPUState *s, target_ulong addr,
+ mem_uint_t val, int size_log2);
+
+/* return 0 if OK, != 0 if exception */
+#define TARGET_READ_WRITE(size, uint_type, size_log2) \
+static inline __exception int target_read_u ## size(RISCVCPUState *s, uint_type *pval, target_ulong addr) \
+{\
+ uint32_t tlb_idx;\
+ tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);\
+ if (likely(s->tlb_read[tlb_idx].vaddr == (addr & ~(PG_MASK & ~((size / 8) - 1))))) { \
+ *pval = *(uint_type *)(s->tlb_read[tlb_idx].mem_addend + (uintptr_t)addr);\
+ } else {\
+ mem_uint_t val;\
+ int ret;\
+ ret = target_read_slow(s, &val, addr, size_log2);\
+ if (ret)\
+ return ret;\
+ *pval = val;\
+ }\
+ return 0;\
+}\
+\
+static inline __exception int target_write_u ## size(RISCVCPUState *s, target_ulong addr,\
+ uint_type val) \
+{\
+ uint32_t tlb_idx;\
+ tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);\
+ if (likely(s->tlb_write[tlb_idx].vaddr == (addr & ~(PG_MASK & ~((size / 8) - 1))))) { \
+ *(uint_type *)(s->tlb_write[tlb_idx].mem_addend + (uintptr_t)addr) = val;\
+ return 0;\
+ } else {\
+ return target_write_slow(s, addr, val, size_log2);\
+ }\
+}
+
+TARGET_READ_WRITE(8, uint8_t, 0)
+TARGET_READ_WRITE(16, uint16_t, 1)
+TARGET_READ_WRITE(32, uint32_t, 2)
+#if MLEN >= 64
+TARGET_READ_WRITE(64, uint64_t, 3)
+#endif
+#if MLEN >= 128
+TARGET_READ_WRITE(128, uint128_t, 4)
+#endif
+
+#endif /* RISCV_CPU_PRIV_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_template.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_template.h
new file mode 100644
index 0000000..5092062
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_template.h
@@ -0,0 +1,1739 @@
+/*
+ * RISCV emulator
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#if XLEN == 32
+#define uintx_t uint32_t
+#define intx_t int32_t
+#elif XLEN == 64
+#define uintx_t uint64_t
+#define intx_t int64_t
+#elif XLEN == 128
+#define uintx_t uint128_t
+#define intx_t int128_t
+#else
+#error unsupported XLEN
+#endif
+
+static inline intx_t glue(div, XLEN)(intx_t a, intx_t b)
+{
+ if (b == 0) {
+ return -1;
+ } else if (a == ((intx_t)1 << (XLEN - 1)) && b == -1) {
+ return a;
+ } else {
+ return a / b;
+ }
+}
+
+static inline uintx_t glue(divu, XLEN)(uintx_t a, uintx_t b)
+{
+ if (b == 0) {
+ return -1;
+ } else {
+ return a / b;
+ }
+}
+
+static inline intx_t glue(rem, XLEN)(intx_t a, intx_t b)
+{
+ if (b == 0) {
+ return a;
+ } else if (a == ((intx_t)1 << (XLEN - 1)) && b == -1) {
+ return 0;
+ } else {
+ return a % b;
+ }
+}
+
+static inline uintx_t glue(remu, XLEN)(uintx_t a, uintx_t b)
+{
+ if (b == 0) {
+ return a;
+ } else {
+ return a % b;
+ }
+}
+
+#if XLEN == 32
+
+static inline uint32_t mulh32(int32_t a, int32_t b)
+{
+ return ((int64_t)a * (int64_t)b) >> 32;
+}
+
+static inline uint32_t mulhsu32(int32_t a, uint32_t b)
+{
+ return ((int64_t)a * (int64_t)b) >> 32;
+}
+
+static inline uint32_t mulhu32(uint32_t a, uint32_t b)
+{
+ return ((int64_t)a * (int64_t)b) >> 32;
+}
+
+#elif XLEN == 64 && defined(HAVE_INT128)
+
+static inline uint64_t mulh64(int64_t a, int64_t b)
+{
+ return ((int128_t)a * (int128_t)b) >> 64;
+}
+
+static inline uint64_t mulhsu64(int64_t a, uint64_t b)
+{
+ return ((int128_t)a * (int128_t)b) >> 64;
+}
+
+static inline uint64_t mulhu64(uint64_t a, uint64_t b)
+{
+ return ((int128_t)a * (int128_t)b) >> 64;
+}
+
+#else
+
+#if XLEN == 64
+#define UHALF uint32_t
+#define UHALF_LEN 32
+#elif XLEN == 128
+#define UHALF uint64_t
+#define UHALF_LEN 64
+#else
+#error unsupported XLEN
+#endif
+
+static uintx_t glue(mulhu, XLEN)(uintx_t a, uintx_t b)
+{
+ UHALF a0, a1, b0, b1, r2, r3;
+ uintx_t r00, r01, r10, r11, c;
+ a0 = a;
+ a1 = a >> UHALF_LEN;
+ b0 = b;
+ b1 = b >> UHALF_LEN;
+
+ r00 = (uintx_t)a0 * (uintx_t)b0;
+ r01 = (uintx_t)a0 * (uintx_t)b1;
+ r10 = (uintx_t)a1 * (uintx_t)b0;
+ r11 = (uintx_t)a1 * (uintx_t)b1;
+
+ // r0 = r00;
+ c = (r00 >> UHALF_LEN) + (UHALF)r01 + (UHALF)r10;
+ // r1 = c;
+ c = (c >> UHALF_LEN) + (r01 >> UHALF_LEN) + (r10 >> UHALF_LEN) + (UHALF)r11;
+ r2 = c;
+ r3 = (c >> UHALF_LEN) + (r11 >> UHALF_LEN);
+
+ // *plow = ((uintx_t)r1 << UHALF_LEN) | r0;
+ return ((uintx_t)r3 << UHALF_LEN) | r2;
+}
+
+#undef UHALF
+
+static inline uintx_t glue(mulh, XLEN)(intx_t a, intx_t b)
+{
+ uintx_t r1;
+ r1 = glue(mulhu, XLEN)(a, b);
+ if (a < 0)
+ r1 -= a;
+ if (b < 0)
+ r1 -= b;
+ return r1;
+}
+
+static inline uintx_t glue(mulhsu, XLEN)(intx_t a, uintx_t b)
+{
+ uintx_t r1;
+ r1 = glue(mulhu, XLEN)(a, b);
+ if (a < 0)
+ r1 -= a;
+ return r1;
+}
+
+#endif
+
+#define DUP2(F, n) F(n) F(n+1)
+#define DUP4(F, n) DUP2(F, n) DUP2(F, n + 2)
+#define DUP8(F, n) DUP4(F, n) DUP4(F, n + 4)
+#define DUP16(F, n) DUP8(F, n) DUP8(F, n + 8)
+#define DUP32(F, n) DUP16(F, n) DUP16(F, n + 16)
+
+#define C_QUADRANT(n) \
+ case n+(0 << 2): case n+(1 << 2): case n+(2 << 2): case n+(3 << 2): \
+ case n+(4 << 2): case n+(5 << 2): case n+(6 << 2): case n+(7 << 2): \
+ case n+(8 << 2): case n+(9 << 2): case n+(10 << 2): case n+(11 << 2): \
+ case n+(12 << 2): case n+(13 << 2): case n+(14 << 2): case n+(15 << 2): \
+ case n+(16 << 2): case n+(17 << 2): case n+(18 << 2): case n+(19 << 2): \
+ case n+(20 << 2): case n+(21 << 2): case n+(22 << 2): case n+(23 << 2): \
+ case n+(24 << 2): case n+(25 << 2): case n+(26 << 2): case n+(27 << 2): \
+ case n+(28 << 2): case n+(29 << 2): case n+(30 << 2): case n+(31 << 2):
+
+#define GET_PC() (target_ulong)((uintptr_t)code_ptr + code_to_pc_addend)
+#define GET_INSN_COUNTER() (insn_counter_addend - s->n_cycles)
+
+#define C_NEXT_INSN code_ptr += 2; break
+#define NEXT_INSN code_ptr += 4; break
+#define JUMP_INSN do { \
+ code_ptr = NULL; \
+ code_end = NULL; \
+ code_to_pc_addend = s->pc; \
+ goto jump_insn; \
+ } while (0)
+
+static void no_inline glue(riscv_cpu_interp_x, XLEN)(RISCVCPUState *s,
+ int n_cycles1)
+{
+ uint32_t opcode, insn, rd, rs1, rs2, funct3;
+ int32_t imm, cond, err;
+ target_ulong addr, val, val2;
+#ifndef USE_GLOBAL_VARIABLES
+ uint8_t *code_ptr, *code_end;
+ target_ulong code_to_pc_addend;
+#endif
+ uint64_t insn_counter_addend;
+#if FLEN > 0
+ uint32_t rs3;
+ int32_t rm;
+#endif
+
+ if (n_cycles1 == 0)
+ return;
+ insn_counter_addend = s->insn_counter + n_cycles1;
+ s->n_cycles = n_cycles1;
+
+ /* check pending interrupts */
+ if (unlikely((s->mip & s->mie) != 0)) {
+ if (raise_interrupt(s)) {
+ s->n_cycles--;
+ goto done_interp;
+ }
+ }
+
+ s->pending_exception = -1;
+ /* Note: we assume NULL is represented as a zero number */
+ code_ptr = NULL;
+ code_end = NULL;
+ code_to_pc_addend = s->pc;
+
+ /* we use a single execution loop to keep a simple control flow
+ for emscripten */
+ for(;;) {
+ if (unlikely(code_ptr >= code_end)) {
+ uint32_t tlb_idx;
+ uint16_t insn_high;
+ target_ulong addr;
+ uint8_t *ptr;
+
+ s->pc = GET_PC();
+ /* we test n_cycles only between blocks so that timer
+ interrupts only happen between the blocks. It is
+ important to reduce the translated code size. */
+ if (unlikely(s->n_cycles <= 0))
+ goto the_end;
+
+ /* check pending interrupts */
+ if (unlikely((s->mip & s->mie) != 0)) {
+ if (raise_interrupt(s)) {
+ s->n_cycles--;
+ goto the_end;
+ }
+ }
+
+ addr = s->pc;
+ tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);
+ if (likely(s->tlb_code[tlb_idx].vaddr == (addr & ~PG_MASK))) {
+ /* TLB match */
+ ptr = (uint8_t *)(s->tlb_code[tlb_idx].mem_addend +
+ (uintptr_t)addr);
+ } else {
+ if (unlikely(target_read_insn_slow(s, &ptr, addr)))
+ goto mmu_exception;
+ }
+ code_ptr = ptr;
+ code_end = ptr + (PG_MASK - 1 - (addr & PG_MASK));
+ code_to_pc_addend = addr - (uintptr_t)code_ptr;
+ if (unlikely(code_ptr >= code_end)) {
+ /* instruction is potentially half way between two
+ pages ? */
+ insn = *(uint16_t *)code_ptr;
+ if ((insn & 3) == 3) {
+ /* instruction is half way between two pages */
+ if (unlikely(target_read_insn_u16(s, &insn_high, addr + 2)))
+ goto mmu_exception;
+ insn |= insn_high << 16;
+ }
+ } else {
+ insn = get_insn32(code_ptr);
+ }
+ } else {
+ /* fast path */
+ insn = get_insn32(code_ptr);
+ }
+ s->n_cycles--;
+#if 0
+ if (1) {
+#ifdef CONFIG_LOGFILE
+ log_printf("pc=0x"); fprint_target_ulong(log_file, GET_PC()); log_printf(" insn=%08x\n", insn);
+ fflush(log_file);
+#else
+ printf("pc=0x"); print_target_ulong(GET_PC()); printf(" insn=%08x\n", insn);
+ // dump_regs(s);
+#endif
+ }
+#endif
+ opcode = insn & 0x7f;
+ rd = (insn >> 7) & 0x1f;
+ rs1 = (insn >> 15) & 0x1f;
+ rs2 = (insn >> 20) & 0x1f;
+ switch(opcode) {
+#ifdef CONFIG_EXT_C
+ C_QUADRANT(0)
+ funct3 = (insn >> 13) & 7;
+ rd = ((insn >> 2) & 7) | 8;
+ switch(funct3) {
+ case 0: /* c.addi4spn */
+ imm = get_field1(insn, 11, 4, 5) |
+ get_field1(insn, 7, 6, 9) |
+ get_field1(insn, 6, 2, 2) |
+ get_field1(insn, 5, 3, 3);
+ if (imm == 0)
+ goto illegal_insn;
+ s->reg[rd] = (intx_t)(s->reg[2] + imm);
+ break;
+#if XLEN >= 128
+ case 1: /* c.lq */
+ imm = get_field1(insn, 11, 4, 5) |
+ get_field1(insn, 10, 8, 8) |
+ get_field1(insn, 5, 6, 7);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ if (target_read_u128(s, &val, addr))
+ goto mmu_exception;
+ s->reg[rd] = val;
+ break;
+#elif FLEN >= 64
+ case 1: /* c.fld */
+ {
+ uint64_t rval;
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 5, 6, 7);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ if (target_read_u64(s, &rval, addr))
+ goto mmu_exception;
+ s->fp_reg[rd] = rval | F64_HIGH;
+ s->fs = 3;
+ }
+ break;
+#endif
+ case 2: /* c.lw */
+ {
+ uint32_t rval;
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 6, 2, 2) |
+ get_field1(insn, 5, 6, 6);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ if (target_read_u32(s, &rval, addr))
+ goto mmu_exception;
+ s->reg[rd] = (int32_t)rval;
+ }
+ break;
+#if XLEN >= 64
+ case 3: /* c.ld */
+ {
+ uint64_t rval;
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 5, 6, 7);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ if (target_read_u64(s, &rval, addr))
+ goto mmu_exception;
+ s->reg[rd] = (int64_t)rval;
+ }
+ break;
+#elif FLEN >= 32
+ case 3: /* c.flw */
+ {
+ uint32_t rval;
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 6, 2, 2) |
+ get_field1(insn, 5, 6, 6);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ if (target_read_u32(s, &rval, addr))
+ goto mmu_exception;
+ s->fp_reg[rd] = rval | F32_HIGH;
+ s->fs = 3;
+ }
+ break;
+#endif
+#if XLEN >= 128
+ case 5: /* c.sq */
+ imm = get_field1(insn, 11, 4, 5) |
+ get_field1(insn, 10, 8, 8) |
+ get_field1(insn, 5, 6, 7);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ val = s->reg[rd];
+ if (target_write_u128(s, addr, val))
+ goto mmu_exception;
+ break;
+#elif FLEN >= 64
+ case 5: /* c.fsd */
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 5, 6, 7);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ if (target_write_u64(s, addr, s->fp_reg[rd]))
+ goto mmu_exception;
+ break;
+#endif
+ case 6: /* c.sw */
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 6, 2, 2) |
+ get_field1(insn, 5, 6, 6);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ val = s->reg[rd];
+ if (target_write_u32(s, addr, val))
+ goto mmu_exception;
+ break;
+#if XLEN >= 64
+ case 7: /* c.sd */
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 5, 6, 7);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ val = s->reg[rd];
+ if (target_write_u64(s, addr, val))
+ goto mmu_exception;
+ break;
+#elif FLEN >= 32
+ case 7: /* c.fsw */
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 6, 2, 2) |
+ get_field1(insn, 5, 6, 6);
+ rs1 = ((insn >> 7) & 7) | 8;
+ addr = (intx_t)(s->reg[rs1] + imm);
+ if (target_write_u32(s, addr, s->fp_reg[rd]))
+ goto mmu_exception;
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ C_NEXT_INSN;
+ C_QUADRANT(1)
+ funct3 = (insn >> 13) & 7;
+ switch(funct3) {
+ case 0: /* c.addi/c.nop */
+ if (rd != 0) {
+ imm = sext(get_field1(insn, 12, 5, 5) |
+ get_field1(insn, 2, 0, 4), 6);
+ s->reg[rd] = (intx_t)(s->reg[rd] + imm);
+ }
+ break;
+#if XLEN == 32
+ case 1: /* c.jal */
+ imm = sext(get_field1(insn, 12, 11, 11) |
+ get_field1(insn, 11, 4, 4) |
+ get_field1(insn, 9, 8, 9) |
+ get_field1(insn, 8, 10, 10) |
+ get_field1(insn, 7, 6, 6) |
+ get_field1(insn, 6, 7, 7) |
+ get_field1(insn, 3, 1, 3) |
+ get_field1(insn, 2, 5, 5), 12);
+ s->reg[1] = GET_PC() + 2;
+ s->pc = (intx_t)(GET_PC() + imm);
+ JUMP_INSN;
+#else
+ case 1: /* c.addiw */
+ if (rd != 0) {
+ imm = sext(get_field1(insn, 12, 5, 5) |
+ get_field1(insn, 2, 0, 4), 6);
+ s->reg[rd] = (int32_t)(s->reg[rd] + imm);
+ }
+ break;
+#endif
+ case 2: /* c.li */
+ if (rd != 0) {
+ imm = sext(get_field1(insn, 12, 5, 5) |
+ get_field1(insn, 2, 0, 4), 6);
+ s->reg[rd] = imm;
+ }
+ break;
+ case 3:
+ if (rd == 2) {
+ /* c.addi16sp */
+ imm = sext(get_field1(insn, 12, 9, 9) |
+ get_field1(insn, 6, 4, 4) |
+ get_field1(insn, 5, 6, 6) |
+ get_field1(insn, 3, 7, 8) |
+ get_field1(insn, 2, 5, 5), 10);
+ if (imm == 0)
+ goto illegal_insn;
+ s->reg[2] = (intx_t)(s->reg[2] + imm);
+ } else if (rd != 0) {
+ /* c.lui */
+ imm = sext(get_field1(insn, 12, 17, 17) |
+ get_field1(insn, 2, 12, 16), 18);
+ s->reg[rd] = imm;
+ }
+ break;
+ case 4:
+ funct3 = (insn >> 10) & 3;
+ rd = ((insn >> 7) & 7) | 8;
+ switch(funct3) {
+ case 0: /* c.srli */
+ case 1: /* c.srai */
+ imm = get_field1(insn, 12, 5, 5) |
+ get_field1(insn, 2, 0, 4);
+#if XLEN == 32
+ if (imm & 0x20)
+ goto illegal_insn;
+#elif XLEN == 128
+ if (imm == 0)
+ imm = 64;
+ else if (imm >= 32)
+ imm = 128 - imm;
+#endif
+ if (funct3 == 0)
+ s->reg[rd] = (intx_t)((uintx_t)s->reg[rd] >> imm);
+ else
+ s->reg[rd] = (intx_t)s->reg[rd] >> imm;
+
+ break;
+ case 2: /* c.andi */
+ imm = sext(get_field1(insn, 12, 5, 5) |
+ get_field1(insn, 2, 0, 4), 6);
+ s->reg[rd] &= imm;
+ break;
+ case 3:
+ rs2 = ((insn >> 2) & 7) | 8;
+ funct3 = ((insn >> 5) & 3) | ((insn >> (12 - 2)) & 4);
+ switch(funct3) {
+ case 0: /* c.sub */
+ s->reg[rd] = (intx_t)(s->reg[rd] - s->reg[rs2]);
+ break;
+ case 1: /* c.xor */
+ s->reg[rd] = s->reg[rd] ^ s->reg[rs2];
+ break;
+ case 2: /* c.or */
+ s->reg[rd] = s->reg[rd] | s->reg[rs2];
+ break;
+ case 3: /* c.and */
+ s->reg[rd] = s->reg[rd] & s->reg[rs2];
+ break;
+#if XLEN >= 64
+ case 4: /* c.subw */
+ s->reg[rd] = (int32_t)(s->reg[rd] - s->reg[rs2]);
+ break;
+ case 5: /* c.addw */
+ s->reg[rd] = (int32_t)(s->reg[rd] + s->reg[rs2]);
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ break;
+ }
+ break;
+ case 5: /* c.j */
+ imm = sext(get_field1(insn, 12, 11, 11) |
+ get_field1(insn, 11, 4, 4) |
+ get_field1(insn, 9, 8, 9) |
+ get_field1(insn, 8, 10, 10) |
+ get_field1(insn, 7, 6, 6) |
+ get_field1(insn, 6, 7, 7) |
+ get_field1(insn, 3, 1, 3) |
+ get_field1(insn, 2, 5, 5), 12);
+ s->pc = (intx_t)(GET_PC() + imm);
+ JUMP_INSN;
+ case 6: /* c.beqz */
+ rs1 = ((insn >> 7) & 7) | 8;
+ imm = sext(get_field1(insn, 12, 8, 8) |
+ get_field1(insn, 10, 3, 4) |
+ get_field1(insn, 5, 6, 7) |
+ get_field1(insn, 3, 1, 2) |
+ get_field1(insn, 2, 5, 5), 9);
+ if (s->reg[rs1] == 0) {
+ s->pc = (intx_t)(GET_PC() + imm);
+ JUMP_INSN;
+ }
+ break;
+ case 7: /* c.bnez */
+ rs1 = ((insn >> 7) & 7) | 8;
+ imm = sext(get_field1(insn, 12, 8, 8) |
+ get_field1(insn, 10, 3, 4) |
+ get_field1(insn, 5, 6, 7) |
+ get_field1(insn, 3, 1, 2) |
+ get_field1(insn, 2, 5, 5), 9);
+ if (s->reg[rs1] != 0) {
+ s->pc = (intx_t)(GET_PC() + imm);
+ JUMP_INSN;
+ }
+ break;
+ default:
+ goto illegal_insn;
+ }
+ C_NEXT_INSN;
+ C_QUADRANT(2)
+ funct3 = (insn >> 13) & 7;
+ rs2 = (insn >> 2) & 0x1f;
+ switch(funct3) {
+ case 0: /* c.slli */
+ imm = get_field1(insn, 12, 5, 5) | rs2;
+#if XLEN == 32
+ if (imm & 0x20)
+ goto illegal_insn;
+#elif XLEN == 128
+ if (imm == 0)
+ imm = 64;
+#endif
+ if (rd != 0)
+ s->reg[rd] = (intx_t)(s->reg[rd] << imm);
+ break;
+#if XLEN == 128
+ case 1: /* c.lqsp */
+ imm = get_field1(insn, 12, 5, 5) |
+ (rs2 & (1 << 4)) |
+ get_field1(insn, 2, 6, 9);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_read_u128(s, &val, addr))
+ goto mmu_exception;
+ if (rd != 0)
+ s->reg[rd] = val;
+ break;
+#elif FLEN >= 64
+ case 1: /* c.fldsp */
+ {
+ uint64_t rval;
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 12, 5, 5) |
+ (rs2 & (3 << 3)) |
+ get_field1(insn, 2, 6, 8);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_read_u64(s, &rval, addr))
+ goto mmu_exception;
+ s->fp_reg[rd] = rval | F64_HIGH;
+ s->fs = 3;
+ }
+ break;
+#endif
+ case 2: /* c.lwsp */
+ {
+ uint32_t rval;
+ imm = get_field1(insn, 12, 5, 5) |
+ (rs2 & (7 << 2)) |
+ get_field1(insn, 2, 6, 7);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_read_u32(s, &rval, addr))
+ goto mmu_exception;
+ if (rd != 0)
+ s->reg[rd] = (int32_t)rval;
+ }
+ break;
+#if XLEN >= 64
+ case 3: /* c.ldsp */
+ {
+ uint64_t rval;
+ imm = get_field1(insn, 12, 5, 5) |
+ (rs2 & (3 << 3)) |
+ get_field1(insn, 2, 6, 8);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_read_u64(s, &rval, addr))
+ goto mmu_exception;
+ if (rd != 0)
+ s->reg[rd] = (int64_t)rval;
+ }
+ break;
+#elif FLEN >= 32
+ case 3: /* c.flwsp */
+ {
+ uint32_t rval;
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 12, 5, 5) |
+ (rs2 & (7 << 2)) |
+ get_field1(insn, 2, 6, 7);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_read_u32(s, &rval, addr))
+ goto mmu_exception;
+ s->fp_reg[rd] = rval | F32_HIGH;
+ s->fs = 3;
+ }
+ break;
+#endif
+ case 4:
+ if (((insn >> 12) & 1) == 0) {
+ if (rs2 == 0) {
+ /* c.jr */
+ if (rd == 0)
+ goto illegal_insn;
+ s->pc = s->reg[rd] & ~1;
+ JUMP_INSN;
+ } else {
+ /* c.mv */
+ if (rd != 0)
+ s->reg[rd] = s->reg[rs2];
+ }
+ } else {
+ if (rs2 == 0) {
+ if (rd == 0) {
+ /* c.ebreak */
+ s->pending_exception = CAUSE_BREAKPOINT;
+ goto exception;
+ } else {
+ /* c.jalr */
+ val = GET_PC() + 2;
+ s->pc = s->reg[rd] & ~1;
+ s->reg[1] = val;
+ JUMP_INSN;
+ }
+ } else {
+ if (rd != 0) {
+ s->reg[rd] = (intx_t)(s->reg[rd] + s->reg[rs2]);
+ }
+ }
+ }
+ break;
+#if XLEN == 128
+ case 5: /* c.sqsp */
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 7, 6, 8);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_write_u128(s, addr, s->reg[rs2]))
+ goto mmu_exception;
+ break;
+#elif FLEN >= 64
+ case 5: /* c.fsdsp */
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 7, 6, 8);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_write_u64(s, addr, s->fp_reg[rs2]))
+ goto mmu_exception;
+ break;
+#endif
+ case 6: /* c.swsp */
+ imm = get_field1(insn, 9, 2, 5) |
+ get_field1(insn, 7, 6, 7);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_write_u32(s, addr, s->reg[rs2]))
+ goto mmu_exception;
+ break;
+#if XLEN >= 64
+ case 7: /* c.sdsp */
+ imm = get_field1(insn, 10, 3, 5) |
+ get_field1(insn, 7, 6, 8);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_write_u64(s, addr, s->reg[rs2]))
+ goto mmu_exception;
+ break;
+#elif FLEN >= 32
+ case 7: /* c.swsp */
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = get_field1(insn, 9, 2, 5) |
+ get_field1(insn, 7, 6, 7);
+ addr = (intx_t)(s->reg[2] + imm);
+ if (target_write_u32(s, addr, s->fp_reg[rs2]))
+ goto mmu_exception;
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ C_NEXT_INSN;
+#endif /* CONFIG_EXT_C */
+
+ case 0x37: /* lui */
+ if (rd != 0)
+ s->reg[rd] = (int32_t)(insn & 0xfffff000);
+ NEXT_INSN;
+ case 0x17: /* auipc */
+ if (rd != 0)
+ s->reg[rd] = (intx_t)(GET_PC() + (int32_t)(insn & 0xfffff000));
+ NEXT_INSN;
+ case 0x6f: /* jal */
+ imm = ((insn >> (31 - 20)) & (1 << 20)) |
+ ((insn >> (21 - 1)) & 0x7fe) |
+ ((insn >> (20 - 11)) & (1 << 11)) |
+ (insn & 0xff000);
+ imm = (imm << 11) >> 11;
+ if (rd != 0)
+ s->reg[rd] = GET_PC() + 4;
+ s->pc = (intx_t)(GET_PC() + imm);
+ JUMP_INSN;
+ case 0x67: /* jalr */
+ imm = (int32_t)insn >> 20;
+ val = GET_PC() + 4;
+ s->pc = (intx_t)(s->reg[rs1] + imm) & ~1;
+ if (rd != 0)
+ s->reg[rd] = val;
+ JUMP_INSN;
+ case 0x63:
+ funct3 = (insn >> 12) & 7;
+ switch(funct3 >> 1) {
+ case 0: /* beq/bne */
+ cond = (s->reg[rs1] == s->reg[rs2]);
+ break;
+ case 2: /* blt/bge */
+ cond = ((target_long)s->reg[rs1] < (target_long)s->reg[rs2]);
+ break;
+ case 3: /* bltu/bgeu */
+ cond = (s->reg[rs1] < s->reg[rs2]);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ cond ^= (funct3 & 1);
+ if (cond) {
+ imm = ((insn >> (31 - 12)) & (1 << 12)) |
+ ((insn >> (25 - 5)) & 0x7e0) |
+ ((insn >> (8 - 1)) & 0x1e) |
+ ((insn << (11 - 7)) & (1 << 11));
+ imm = (imm << 19) >> 19;
+ s->pc = (intx_t)(GET_PC() + imm);
+ JUMP_INSN;
+ }
+ NEXT_INSN;
+ case 0x03: /* load */
+ funct3 = (insn >> 12) & 7;
+ imm = (int32_t)insn >> 20;
+ addr = s->reg[rs1] + imm;
+ switch(funct3) {
+ case 0: /* lb */
+ {
+ uint8_t rval;
+ if (target_read_u8(s, &rval, addr))
+ goto mmu_exception;
+ val = (int8_t)rval;
+ }
+ break;
+ case 1: /* lh */
+ {
+ uint16_t rval;
+ if (target_read_u16(s, &rval, addr))
+ goto mmu_exception;
+ val = (int16_t)rval;
+ }
+ break;
+ case 2: /* lw */
+ {
+ uint32_t rval;
+ if (target_read_u32(s, &rval, addr))
+ goto mmu_exception;
+ val = (int32_t)rval;
+ }
+ break;
+ case 4: /* lbu */
+ {
+ uint8_t rval;
+ if (target_read_u8(s, &rval, addr))
+ goto mmu_exception;
+ val = rval;
+ }
+ break;
+ case 5: /* lhu */
+ {
+ uint16_t rval;
+ if (target_read_u16(s, &rval, addr))
+ goto mmu_exception;
+ val = rval;
+ }
+ break;
+#if XLEN >= 64
+ case 3: /* ld */
+ {
+ uint64_t rval;
+ if (target_read_u64(s, &rval, addr))
+ goto mmu_exception;
+ val = (int64_t)rval;
+ }
+ break;
+ case 6: /* lwu */
+ {
+ uint32_t rval;
+ if (target_read_u32(s, &rval, addr))
+ goto mmu_exception;
+ val = rval;
+ }
+ break;
+#endif
+#if XLEN >= 128
+ case 7: /* ldu */
+ {
+ uint64_t rval;
+ if (target_read_u64(s, &rval, addr))
+ goto mmu_exception;
+ val = rval;
+ }
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+ case 0x23: /* store */
+ funct3 = (insn >> 12) & 7;
+ imm = rd | ((insn >> (25 - 5)) & 0xfe0);
+ imm = (imm << 20) >> 20;
+ addr = s->reg[rs1] + imm;
+ val = s->reg[rs2];
+ switch(funct3) {
+ case 0: /* sb */
+ if (target_write_u8(s, addr, val))
+ goto mmu_exception;
+ break;
+ case 1: /* sh */
+ if (target_write_u16(s, addr, val))
+ goto mmu_exception;
+ break;
+ case 2: /* sw */
+ if (target_write_u32(s, addr, val))
+ goto mmu_exception;
+ break;
+#if XLEN >= 64
+ case 3: /* sd */
+ if (target_write_u64(s, addr, val))
+ goto mmu_exception;
+ break;
+#endif
+#if XLEN >= 128
+ case 4: /* sq */
+ if (target_write_u128(s, addr, val))
+ goto mmu_exception;
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ NEXT_INSN;
+ case 0x13:
+ funct3 = (insn >> 12) & 7;
+ imm = (int32_t)insn >> 20;
+ switch(funct3) {
+ case 0: /* addi */
+ val = (intx_t)(s->reg[rs1] + imm);
+ break;
+ case 1: /* slli */
+ if ((imm & ~(XLEN - 1)) != 0)
+ goto illegal_insn;
+ val = (intx_t)(s->reg[rs1] << (imm & (XLEN - 1)));
+ break;
+ case 2: /* slti */
+ val = (target_long)s->reg[rs1] < (target_long)imm;
+ break;
+ case 3: /* sltiu */
+ val = s->reg[rs1] < (target_ulong)imm;
+ break;
+ case 4: /* xori */
+ val = s->reg[rs1] ^ imm;
+ break;
+ case 5: /* srli/srai */
+ if ((imm & ~((XLEN - 1) | 0x400)) != 0)
+ goto illegal_insn;
+ if (imm & 0x400)
+ val = (intx_t)s->reg[rs1] >> (imm & (XLEN - 1));
+ else
+ val = (intx_t)((uintx_t)s->reg[rs1] >> (imm & (XLEN - 1)));
+ break;
+ case 6: /* ori */
+ val = s->reg[rs1] | imm;
+ break;
+ default:
+ case 7: /* andi */
+ val = s->reg[rs1] & imm;
+ break;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+#if XLEN >= 64
+ case 0x1b:/* OP-IMM-32 */
+ funct3 = (insn >> 12) & 7;
+ imm = (int32_t)insn >> 20;
+ val = s->reg[rs1];
+ switch(funct3) {
+ case 0: /* addiw */
+ val = (int32_t)(val + imm);
+ break;
+ case 1: /* slliw */
+ if ((imm & ~31) != 0)
+ goto illegal_insn;
+ val = (int32_t)(val << (imm & 31));
+ break;
+ case 5: /* srliw/sraiw */
+ if ((imm & ~(31 | 0x400)) != 0)
+ goto illegal_insn;
+ if (imm & 0x400)
+ val = (int32_t)val >> (imm & 31);
+ else
+ val = (int32_t)((uint32_t)val >> (imm & 31));
+ break;
+ default:
+ goto illegal_insn;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+#endif
+#if XLEN >= 128
+ case 0x5b: /* OP-IMM-64 */
+ funct3 = (insn >> 12) & 7;
+ imm = (int32_t)insn >> 20;
+ val = s->reg[rs1];
+ switch(funct3) {
+ case 0: /* addid */
+ val = (int64_t)(val + imm);
+ break;
+ case 1: /* sllid */
+ if ((imm & ~63) != 0)
+ goto illegal_insn;
+ val = (int64_t)(val << (imm & 63));
+ break;
+ case 5: /* srlid/sraid */
+ if ((imm & ~(63 | 0x400)) != 0)
+ goto illegal_insn;
+ if (imm & 0x400)
+ val = (int64_t)val >> (imm & 63);
+ else
+ val = (int64_t)((uint64_t)val >> (imm & 63));
+ break;
+ default:
+ goto illegal_insn;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+#endif
+ case 0x33:
+ imm = insn >> 25;
+ val = s->reg[rs1];
+ val2 = s->reg[rs2];
+ if (imm == 1) {
+ funct3 = (insn >> 12) & 7;
+ switch(funct3) {
+ case 0: /* mul */
+ val = (intx_t)((intx_t)val * (intx_t)val2);
+ break;
+ case 1: /* mulh */
+ val = (intx_t)glue(mulh, XLEN)(val, val2);
+ break;
+ case 2:/* mulhsu */
+ val = (intx_t)glue(mulhsu, XLEN)(val, val2);
+ break;
+ case 3:/* mulhu */
+ val = (intx_t)glue(mulhu, XLEN)(val, val2);
+ break;
+ case 4:/* div */
+ val = glue(div, XLEN)(val, val2);
+ break;
+ case 5:/* divu */
+ val = (intx_t)glue(divu, XLEN)(val, val2);
+ break;
+ case 6:/* rem */
+ val = glue(rem, XLEN)(val, val2);
+ break;
+ case 7:/* remu */
+ val = (intx_t)glue(remu, XLEN)(val, val2);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ } else {
+ if (imm & ~0x20)
+ goto illegal_insn;
+ funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3));
+ switch(funct3) {
+ case 0: /* add */
+ val = (intx_t)(val + val2);
+ break;
+ case 0 | 8: /* sub */
+ val = (intx_t)(val - val2);
+ break;
+ case 1: /* sll */
+ val = (intx_t)(val << (val2 & (XLEN - 1)));
+ break;
+ case 2: /* slt */
+ val = (target_long)val < (target_long)val2;
+ break;
+ case 3: /* sltu */
+ val = val < val2;
+ break;
+ case 4: /* xor */
+ val = val ^ val2;
+ break;
+ case 5: /* srl */
+ val = (intx_t)((uintx_t)val >> (val2 & (XLEN - 1)));
+ break;
+ case 5 | 8: /* sra */
+ val = (intx_t)val >> (val2 & (XLEN - 1));
+ break;
+ case 6: /* or */
+ val = val | val2;
+ break;
+ case 7: /* and */
+ val = val & val2;
+ break;
+ default:
+ goto illegal_insn;
+ }
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+#if XLEN >= 64
+ case 0x3b: /* OP-32 */
+ imm = insn >> 25;
+ val = s->reg[rs1];
+ val2 = s->reg[rs2];
+ if (imm == 1) {
+ funct3 = (insn >> 12) & 7;
+ switch(funct3) {
+ case 0: /* mulw */
+ val = (int32_t)((int32_t)val * (int32_t)val2);
+ break;
+ case 4:/* divw */
+ val = div32(val, val2);
+ break;
+ case 5:/* divuw */
+ val = (int32_t)divu32(val, val2);
+ break;
+ case 6:/* remw */
+ val = rem32(val, val2);
+ break;
+ case 7:/* remuw */
+ val = (int32_t)remu32(val, val2);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ } else {
+ if (imm & ~0x20)
+ goto illegal_insn;
+ funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3));
+ switch(funct3) {
+ case 0: /* addw */
+ val = (int32_t)(val + val2);
+ break;
+ case 0 | 8: /* subw */
+ val = (int32_t)(val - val2);
+ break;
+ case 1: /* sllw */
+ val = (int32_t)((uint32_t)val << (val2 & 31));
+ break;
+ case 5: /* srlw */
+ val = (int32_t)((uint32_t)val >> (val2 & 31));
+ break;
+ case 5 | 8: /* sraw */
+ val = (int32_t)val >> (val2 & 31);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+#endif
+#if XLEN >= 128
+ case 0x7b: /* OP-64 */
+ imm = insn >> 25;
+ val = s->reg[rs1];
+ val2 = s->reg[rs2];
+ if (imm == 1) {
+ funct3 = (insn >> 12) & 7;
+ switch(funct3) {
+ case 0: /* muld */
+ val = (int64_t)((int64_t)val * (int64_t)val2);
+ break;
+ case 4:/* divd */
+ val = div64(val, val2);
+ break;
+ case 5:/* divud */
+ val = (int64_t)divu64(val, val2);
+ break;
+ case 6:/* remd */
+ val = rem64(val, val2);
+ break;
+ case 7:/* remud */
+ val = (int64_t)remu64(val, val2);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ } else {
+ if (imm & ~0x20)
+ goto illegal_insn;
+ funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3));
+ switch(funct3) {
+ case 0: /* addd */
+ val = (int64_t)(val + val2);
+ break;
+ case 0 | 8: /* subd */
+ val = (int64_t)(val - val2);
+ break;
+ case 1: /* slld */
+ val = (int64_t)((uint64_t)val << (val2 & 63));
+ break;
+ case 5: /* srld */
+ val = (int64_t)((uint64_t)val >> (val2 & 63));
+ break;
+ case 5 | 8: /* srad */
+ val = (int64_t)val >> (val2 & 63);
+ break;
+ default:
+ goto illegal_insn;
+ }
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+#endif
+ case 0x73:
+ funct3 = (insn >> 12) & 7;
+ imm = insn >> 20;
+ if (funct3 & 4)
+ val = rs1;
+ else
+ val = s->reg[rs1];
+ funct3 &= 3;
+ switch(funct3) {
+ case 1: /* csrrw */
+ s->insn_counter = GET_INSN_COUNTER();
+ if (csr_read(s, &val2, imm, TRUE))
+ goto illegal_insn;
+ val2 = (intx_t)val2;
+ err = csr_write(s, imm, val);
+ if (err < 0)
+ goto illegal_insn;
+ if (rd != 0)
+ s->reg[rd] = val2;
+ if (err > 0) {
+ s->pc = GET_PC() + 4;
+ if (err == 2)
+ JUMP_INSN;
+ else
+ goto done_interp;
+ }
+ break;
+ case 2: /* csrrs */
+ case 3: /* csrrc */
+ s->insn_counter = GET_INSN_COUNTER();
+ if (csr_read(s, &val2, imm, (rs1 != 0)))
+ goto illegal_insn;
+ val2 = (intx_t)val2;
+ if (rs1 != 0) {
+ if (funct3 == 2)
+ val = val2 | val;
+ else
+ val = val2 & ~val;
+ err = csr_write(s, imm, val);
+ if (err < 0)
+ goto illegal_insn;
+ } else {
+ err = 0;
+ }
+ if (rd != 0)
+ s->reg[rd] = val2;
+ if (err > 0) {
+ s->pc = GET_PC() + 4;
+ if (err == 2)
+ JUMP_INSN;
+ else
+ goto done_interp;
+ }
+ break;
+ case 0:
+ switch(imm) {
+ case 0x000: /* ecall */
+ if (insn & 0x000fff80)
+ goto illegal_insn;
+ s->pending_exception = CAUSE_USER_ECALL + s->priv;
+ goto exception;
+ case 0x001: /* ebreak */
+ if (insn & 0x000fff80)
+ goto illegal_insn;
+ s->pending_exception = CAUSE_BREAKPOINT;
+ goto exception;
+ case 0x102: /* sret */
+ {
+ if (insn & 0x000fff80)
+ goto illegal_insn;
+ if (s->priv < PRV_S)
+ goto illegal_insn;
+ s->pc = GET_PC();
+ handle_sret(s);
+ goto done_interp;
+ }
+ break;
+ case 0x302: /* mret */
+ {
+ if (insn & 0x000fff80)
+ goto illegal_insn;
+ if (s->priv < PRV_M)
+ goto illegal_insn;
+ s->pc = GET_PC();
+ handle_mret(s);
+ goto done_interp;
+ }
+ break;
+ case 0x105: /* wfi */
+ if (insn & 0x00007f80)
+ goto illegal_insn;
+ if (s->priv == PRV_U)
+ goto illegal_insn;
+ /* go to power down if no enabled interrupts are
+ pending */
+ if ((s->mip & s->mie) == 0) {
+ s->power_down_flag = TRUE;
+ s->pc = GET_PC() + 4;
+ goto done_interp;
+ }
+ break;
+ default:
+ if ((imm >> 5) == 0x09) {
+ /* sfence.vma */
+ if (insn & 0x00007f80)
+ goto illegal_insn;
+ if (s->priv == PRV_U)
+ goto illegal_insn;
+ if (rs1 == 0) {
+ tlb_flush_all(s);
+ } else {
+ tlb_flush_vaddr(s, s->reg[rs1]);
+ }
+ /* the current code TLB may have been flushed */
+ s->pc = GET_PC() + 4;
+ JUMP_INSN;
+ } else {
+ goto illegal_insn;
+ }
+ break;
+ }
+ break;
+ default:
+ goto illegal_insn;
+ }
+ NEXT_INSN;
+ case 0x0f: /* misc-mem */
+ funct3 = (insn >> 12) & 7;
+ switch(funct3) {
+ case 0: /* fence */
+ if (insn & 0xf00fff80)
+ goto illegal_insn;
+ break;
+ case 1: /* fence.i */
+ if (insn != 0x0000100f)
+ goto illegal_insn;
+ break;
+#if XLEN >= 128
+ case 2: /* lq */
+ imm = (int32_t)insn >> 20;
+ addr = s->reg[rs1] + imm;
+ if (target_read_u128(s, &val, addr))
+ goto mmu_exception;
+ if (rd != 0)
+ s->reg[rd] = val;
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ NEXT_INSN;
+ case 0x2f:
+ funct3 = (insn >> 12) & 7;
+#define OP_A(size) \
+ { \
+ uint ## size ##_t rval; \
+ \
+ addr = s->reg[rs1]; \
+ funct3 = insn >> 27; \
+ switch(funct3) { \
+ case 2: /* lr.w */ \
+ if (rs2 != 0) \
+ goto illegal_insn; \
+ if (target_read_u ## size(s, &rval, addr)) \
+ goto mmu_exception; \
+ val = (int## size ## _t)rval; \
+ s->load_res = addr; \
+ break; \
+ case 3: /* sc.w */ \
+ if (s->load_res == addr) { \
+ if (target_write_u ## size(s, addr, s->reg[rs2])) \
+ goto mmu_exception; \
+ val = 0; \
+ } else { \
+ val = 1; \
+ } \
+ break; \
+ case 1: /* amiswap.w */ \
+ case 0: /* amoadd.w */ \
+ case 4: /* amoxor.w */ \
+ case 0xc: /* amoand.w */ \
+ case 0x8: /* amoor.w */ \
+ case 0x10: /* amomin.w */ \
+ case 0x14: /* amomax.w */ \
+ case 0x18: /* amominu.w */ \
+ case 0x1c: /* amomaxu.w */ \
+ if (target_read_u ## size(s, &rval, addr)) \
+ goto mmu_exception; \
+ val = (int## size ## _t)rval; \
+ val2 = s->reg[rs2]; \
+ switch(funct3) { \
+ case 1: /* amiswap.w */ \
+ break; \
+ case 0: /* amoadd.w */ \
+ val2 = (int## size ## _t)(val + val2); \
+ break; \
+ case 4: /* amoxor.w */ \
+ val2 = (int## size ## _t)(val ^ val2); \
+ break; \
+ case 0xc: /* amoand.w */ \
+ val2 = (int## size ## _t)(val & val2); \
+ break; \
+ case 0x8: /* amoor.w */ \
+ val2 = (int## size ## _t)(val | val2); \
+ break; \
+ case 0x10: /* amomin.w */ \
+ if ((int## size ## _t)val < (int## size ## _t)val2) \
+ val2 = (int## size ## _t)val; \
+ break; \
+ case 0x14: /* amomax.w */ \
+ if ((int## size ## _t)val > (int## size ## _t)val2) \
+ val2 = (int## size ## _t)val; \
+ break; \
+ case 0x18: /* amominu.w */ \
+ if ((uint## size ## _t)val < (uint## size ## _t)val2) \
+ val2 = (int## size ## _t)val; \
+ break; \
+ case 0x1c: /* amomaxu.w */ \
+ if ((uint## size ## _t)val > (uint## size ## _t)val2) \
+ val2 = (int## size ## _t)val; \
+ break; \
+ default: \
+ goto illegal_insn; \
+ } \
+ if (target_write_u ## size(s, addr, val2)) \
+ goto mmu_exception; \
+ break; \
+ default: \
+ goto illegal_insn; \
+ } \
+ }
+
+ switch(funct3) {
+ case 2:
+ OP_A(32);
+ break;
+#if XLEN >= 64
+ case 3:
+ OP_A(64);
+ break;
+#endif
+#if XLEN >= 128
+ case 4:
+ OP_A(128);
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ if (rd != 0)
+ s->reg[rd] = val;
+ NEXT_INSN;
+#if FLEN > 0
+ /* FPU */
+ case 0x07: /* fp load */
+ if (s->fs == 0)
+ goto illegal_insn;
+ funct3 = (insn >> 12) & 7;
+ imm = (int32_t)insn >> 20;
+ addr = s->reg[rs1] + imm;
+ switch(funct3) {
+ case 2: /* flw */
+ {
+ uint32_t rval;
+ if (target_read_u32(s, &rval, addr))
+ goto mmu_exception;
+ s->fp_reg[rd] = rval | F32_HIGH;
+ }
+ break;
+#if FLEN >= 64
+ case 3: /* fld */
+ {
+ uint64_t rval;
+ if (target_read_u64(s, &rval, addr))
+ goto mmu_exception;
+ s->fp_reg[rd] = rval | F64_HIGH;
+ }
+ break;
+#endif
+#if FLEN >= 128
+ case 4: /* flq */
+ {
+ uint128_t rval;
+ if (target_read_u128(s, &rval, addr))
+ goto mmu_exception;
+ s->fp_reg[rd] = rval;
+ }
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ NEXT_INSN;
+ case 0x27: /* fp store */
+ if (s->fs == 0)
+ goto illegal_insn;
+ funct3 = (insn >> 12) & 7;
+ imm = rd | ((insn >> (25 - 5)) & 0xfe0);
+ imm = (imm << 20) >> 20;
+ addr = s->reg[rs1] + imm;
+ switch(funct3) {
+ case 2: /* fsw */
+ if (target_write_u32(s, addr, s->fp_reg[rs2]))
+ goto mmu_exception;
+ break;
+#if FLEN >= 64
+ case 3: /* fsd */
+ if (target_write_u64(s, addr, s->fp_reg[rs2]))
+ goto mmu_exception;
+ break;
+#endif
+#if FLEN >= 128
+ case 4: /* fsq */
+ if (target_write_u128(s, addr, s->fp_reg[rs2]))
+ goto mmu_exception;
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ NEXT_INSN;
+ case 0x43: /* fmadd */
+ if (s->fs == 0)
+ goto illegal_insn;
+ funct3 = (insn >> 25) & 3;
+ rs3 = insn >> 27;
+ rm = get_insn_rm(s, (insn >> 12) & 7);
+ if (rm < 0)
+ goto illegal_insn;
+ switch(funct3) {
+ case 0:
+ s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1], s->fp_reg[rs2],
+ s->fp_reg[rs3], rm, &s->fflags) | F32_HIGH;
+ break;
+#if FLEN >= 64
+ case 1:
+ s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1], s->fp_reg[rs2],
+ s->fp_reg[rs3], rm, &s->fflags) | F64_HIGH;
+ break;
+#endif
+#if FLEN >= 128
+ case 3:
+ s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1], s->fp_reg[rs2],
+ s->fp_reg[rs3], rm, &s->fflags);
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ NEXT_INSN;
+ case 0x47: /* fmsub */
+ if (s->fs == 0)
+ goto illegal_insn;
+ funct3 = (insn >> 25) & 3;
+ rs3 = insn >> 27;
+ rm = get_insn_rm(s, (insn >> 12) & 7);
+ if (rm < 0)
+ goto illegal_insn;
+ switch(funct3) {
+ case 0:
+ s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ s->fp_reg[rs3] ^ FSIGN_MASK32,
+ rm, &s->fflags) | F32_HIGH;
+ break;
+#if FLEN >= 64
+ case 1:
+ s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ s->fp_reg[rs3] ^ FSIGN_MASK64,
+ rm, &s->fflags) | F64_HIGH;
+ break;
+#endif
+#if FLEN >= 128
+ case 3:
+ s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1],
+ s->fp_reg[rs2],
+ s->fp_reg[rs3] ^ FSIGN_MASK128,
+ rm, &s->fflags);
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ NEXT_INSN;
+ case 0x4b: /* fnmsub */
+ if (s->fs == 0)
+ goto illegal_insn;
+ funct3 = (insn >> 25) & 3;
+ rs3 = insn >> 27;
+ rm = get_insn_rm(s, (insn >> 12) & 7);
+ if (rm < 0)
+ goto illegal_insn;
+ switch(funct3) {
+ case 0:
+ s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1] ^ FSIGN_MASK32,
+ s->fp_reg[rs2],
+ s->fp_reg[rs3],
+ rm, &s->fflags) | F32_HIGH;
+ break;
+#if FLEN >= 64
+ case 1:
+ s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1] ^ FSIGN_MASK64,
+ s->fp_reg[rs2],
+ s->fp_reg[rs3],
+ rm, &s->fflags) | F64_HIGH;
+ break;
+#endif
+#if FLEN >= 128
+ case 3:
+ s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1] ^ FSIGN_MASK128,
+ s->fp_reg[rs2],
+ s->fp_reg[rs3],
+ rm, &s->fflags);
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ NEXT_INSN;
+ case 0x4f: /* fnmadd */
+ if (s->fs == 0)
+ goto illegal_insn;
+ funct3 = (insn >> 25) & 3;
+ rs3 = insn >> 27;
+ rm = get_insn_rm(s, (insn >> 12) & 7);
+ if (rm < 0)
+ goto illegal_insn;
+ switch(funct3) {
+ case 0:
+ s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1] ^ FSIGN_MASK32,
+ s->fp_reg[rs2],
+ s->fp_reg[rs3] ^ FSIGN_MASK32,
+ rm, &s->fflags) | F32_HIGH;
+ break;
+#if FLEN >= 64
+ case 1:
+ s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1] ^ FSIGN_MASK64,
+ s->fp_reg[rs2],
+ s->fp_reg[rs3] ^ FSIGN_MASK64,
+ rm, &s->fflags) | F64_HIGH;
+ break;
+#endif
+#if FLEN >= 128
+ case 3:
+ s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1] ^ FSIGN_MASK128,
+ s->fp_reg[rs2],
+ s->fp_reg[rs3] ^ FSIGN_MASK128,
+ rm, &s->fflags);
+ break;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ s->fs = 3;
+ NEXT_INSN;
+ case 0x53:
+ if (s->fs == 0)
+ goto illegal_insn;
+ imm = insn >> 25;
+ rm = (insn >> 12) & 7;
+ switch(imm) {
+
+#define F_SIZE 32
+#include "riscv_cpu_fp_template.h"
+#if FLEN >= 64
+#define F_SIZE 64
+#include "riscv_cpu_fp_template.h"
+#endif
+#if FLEN >= 128
+#define F_SIZE 128
+#include "riscv_cpu_fp_template.h"
+#endif
+
+ default:
+ goto illegal_insn;
+ }
+ NEXT_INSN;
+#endif
+ default:
+ goto illegal_insn;
+ }
+ /* update PC for next instruction */
+ jump_insn: ;
+ } /* end of main loop */
+ illegal_insn:
+ s->pending_exception = CAUSE_ILLEGAL_INSTRUCTION;
+ s->pending_tval = insn;
+ mmu_exception:
+ exception:
+ s->pc = GET_PC();
+ if (s->pending_exception >= 0) {
+ /* Note: the idea is that one exception counts for one cycle. */
+ s->n_cycles--;
+ raise_exception2(s, s->pending_exception, s->pending_tval);
+ }
+ /* we exit because XLEN may have changed */
+ done_interp:
+the_end:
+ s->insn_counter = GET_INSN_COUNTER();
+#if 0
+ printf("done interp %lx int=%x mstatus=%lx prv=%d\n",
+ (uint64_t)s->insn_counter, s->mip & s->mie, (uint64_t)s->mstatus,
+ s->priv);
+#endif
+}
+
+#undef uintx_t
+#undef intx_t
+#undef XLEN
+#undef OP_A
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_machine.c b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_machine.c
new file mode 100644
index 0000000..a7149fd
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_machine.c
@@ -0,0 +1,1053 @@
+/*
+ * RISCV machine
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "riscv_cpu.h"
+#include "virtio.h"
+#include "machine.h"
+
+/* RISCV machine */
+
+typedef struct RISCVMachine {
+ VirtMachine common;
+ PhysMemoryMap *mem_map;
+ int max_xlen;
+ RISCVCPUState *cpu_state;
+ uint64_t ram_size;
+ /* RTC */
+ BOOL rtc_real_time;
+ uint64_t rtc_start_time;
+ uint64_t timecmp;
+ /* PLIC */
+ uint32_t plic_pending_irq, plic_served_irq;
+ IRQSignal plic_irq[32]; /* IRQ 0 is not used */
+ /* HTIF */
+ uint64_t htif_tohost, htif_fromhost;
+
+ VIRTIODevice *keyboard_dev;
+ VIRTIODevice *mouse_dev;
+
+ int virtio_count;
+} RISCVMachine;
+
+#define LOW_RAM_SIZE 0x00010000 /* 64KB */
+#define RAM_BASE_ADDR 0x80000000
+#define CLINT_BASE_ADDR 0x02000000
+#define CLINT_SIZE 0x000c0000
+#define HTIF_BASE_ADDR 0x40008000
+#define IDE_BASE_ADDR 0x40009000
+#define VIRTIO_BASE_ADDR 0x40010000
+#define VIRTIO_SIZE 0x1000
+#define VIRTIO_IRQ 1
+#define PLIC_BASE_ADDR 0x40100000
+#define PLIC_SIZE 0x00400000
+#define FRAMEBUFFER_BASE_ADDR 0x41000000
+
+#define RTC_FREQ 10000000
+#define RTC_FREQ_DIV 16 /* arbitrary, relative to CPU freq to have a
+ 10 MHz frequency */
+
+static uint64_t rtc_get_real_time(RISCVMachine *s)
+{
+ struct timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return (uint64_t)ts.tv_sec * RTC_FREQ +
+ (ts.tv_nsec / (1000000000 / RTC_FREQ));
+}
+
+static uint64_t rtc_get_time(RISCVMachine *m)
+{
+ uint64_t val;
+ if (m->rtc_real_time) {
+ val = rtc_get_real_time(m) - m->rtc_start_time;
+ } else {
+ val = riscv_cpu_get_cycles(m->cpu_state) / RTC_FREQ_DIV;
+ }
+ // printf("rtc_time=%" PRId64 "\n", val);
+ return val;
+}
+
+static uint32_t htif_read(void *opaque, uint32_t offset,
+ int size_log2)
+{
+ RISCVMachine *s = opaque;
+ uint32_t val;
+
+ assert(size_log2 == 2);
+ switch(offset) {
+ case 0:
+ val = s->htif_tohost;
+ break;
+ case 4:
+ val = s->htif_tohost >> 32;
+ break;
+ case 8:
+ val = s->htif_fromhost;
+ break;
+ case 12:
+ val = s->htif_fromhost >> 32;
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ return val;
+}
+
+static void htif_handle_cmd(RISCVMachine *s)
+{
+ uint32_t device, cmd;
+
+ device = s->htif_tohost >> 56;
+ cmd = (s->htif_tohost >> 48) & 0xff;
+ if (s->htif_tohost == 1) {
+ /* shuthost */
+ printf("\nPower off.\n");
+ exit(0);
+ } else if (device == 1 && cmd == 1) {
+ uint8_t buf[1];
+ buf[0] = s->htif_tohost & 0xff;
+ s->common.console->write_data(s->common.console->opaque, buf, 1);
+ s->htif_tohost = 0;
+ s->htif_fromhost = ((uint64_t)device << 56) | ((uint64_t)cmd << 48);
+ } else if (device == 1 && cmd == 0) {
+ /* request keyboard interrupt */
+ s->htif_tohost = 0;
+ } else {
+ printf("HTIF: unsupported tohost=0x%016" PRIx64 "\n", s->htif_tohost);
+ }
+}
+
+static void htif_write(void *opaque, uint32_t offset, uint32_t val,
+ int size_log2)
+{
+ RISCVMachine *s = opaque;
+
+ assert(size_log2 == 2);
+ switch(offset) {
+ case 0:
+ s->htif_tohost = (s->htif_tohost & ~0xffffffff) | val;
+ break;
+ case 4:
+ s->htif_tohost = (s->htif_tohost & 0xffffffff) | ((uint64_t)val << 32);
+ htif_handle_cmd(s);
+ break;
+ case 8:
+ s->htif_fromhost = (s->htif_fromhost & ~0xffffffff) | val;
+ break;
+ case 12:
+ s->htif_fromhost = (s->htif_fromhost & 0xffffffff) |
+ (uint64_t)val << 32;
+ break;
+ default:
+ break;
+ }
+}
+
+#if 0
+static void htif_poll(RISCVMachine *s)
+{
+ uint8_t buf[1];
+ int ret;
+
+ if (s->htif_fromhost == 0) {
+ ret = s->console->read_data(s->console->opaque, buf, 1);
+ if (ret == 1) {
+ s->htif_fromhost = ((uint64_t)1 << 56) | ((uint64_t)0 << 48) |
+ buf[0];
+ }
+ }
+}
+#endif
+
+static uint32_t clint_read(void *opaque, uint32_t offset, int size_log2)
+{
+ RISCVMachine *m = opaque;
+ uint32_t val;
+
+ assert(size_log2 == 2);
+ switch(offset) {
+ case 0xbff8:
+ val = rtc_get_time(m);
+ break;
+ case 0xbffc:
+ val = rtc_get_time(m) >> 32;
+ break;
+ case 0x4000:
+ val = m->timecmp;
+ break;
+ case 0x4004:
+ val = m->timecmp >> 32;
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ return val;
+}
+
+static void clint_write(void *opaque, uint32_t offset, uint32_t val,
+ int size_log2)
+{
+ RISCVMachine *m = opaque;
+
+ assert(size_log2 == 2);
+ switch(offset) {
+ case 0x4000:
+ m->timecmp = (m->timecmp & ~0xffffffff) | val;
+ riscv_cpu_reset_mip(m->cpu_state, MIP_MTIP);
+ break;
+ case 0x4004:
+ m->timecmp = (m->timecmp & 0xffffffff) | ((uint64_t)val << 32);
+ riscv_cpu_reset_mip(m->cpu_state, MIP_MTIP);
+ break;
+ default:
+ break;
+ }
+}
+
+static void plic_update_mip(RISCVMachine *s)
+{
+ RISCVCPUState *cpu = s->cpu_state;
+ uint32_t mask;
+ mask = s->plic_pending_irq & ~s->plic_served_irq;
+ if (mask) {
+ riscv_cpu_set_mip(cpu, MIP_MEIP | MIP_SEIP);
+ } else {
+ riscv_cpu_reset_mip(cpu, MIP_MEIP | MIP_SEIP);
+ }
+}
+
+#define PLIC_HART_BASE 0x200000
+#define PLIC_HART_SIZE 0x1000
+
+static uint32_t plic_read(void *opaque, uint32_t offset, int size_log2)
+{
+ RISCVMachine *s = opaque;
+ uint32_t val, mask;
+ int i;
+ assert(size_log2 == 2);
+ switch(offset) {
+ case PLIC_HART_BASE:
+ val = 0;
+ break;
+ case PLIC_HART_BASE + 4:
+ mask = s->plic_pending_irq & ~s->plic_served_irq;
+ if (mask != 0) {
+ i = ctz32(mask);
+ s->plic_served_irq |= 1 << i;
+ plic_update_mip(s);
+ val = i + 1;
+ } else {
+ val = 0;
+ }
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ return val;
+}
+
+static void plic_write(void *opaque, uint32_t offset, uint32_t val,
+ int size_log2)
+{
+ RISCVMachine *s = opaque;
+
+ assert(size_log2 == 2);
+ switch(offset) {
+ case PLIC_HART_BASE + 4:
+ val--;
+ if (val < 32) {
+ s->plic_served_irq &= ~(1 << val);
+ plic_update_mip(s);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void plic_set_irq(void *opaque, int irq_num, int state)
+{
+ RISCVMachine *s = opaque;
+ uint32_t mask;
+
+ mask = 1 << (irq_num - 1);
+ if (state)
+ s->plic_pending_irq |= mask;
+ else
+ s->plic_pending_irq &= ~mask;
+ plic_update_mip(s);
+}
+
+static uint8_t *get_ram_ptr(RISCVMachine *s, uint64_t paddr, BOOL is_rw)
+{
+ return phys_mem_get_ram_ptr(s->mem_map, paddr, is_rw);
+}
+
+/* FDT machine description */
+
+#define FDT_MAGIC 0xd00dfeed
+#define FDT_VERSION 17
+
+struct fdt_header {
+ uint32_t magic;
+ uint32_t totalsize;
+ uint32_t off_dt_struct;
+ uint32_t off_dt_strings;
+ uint32_t off_mem_rsvmap;
+ uint32_t version;
+ uint32_t last_comp_version; /* <= 17 */
+ uint32_t boot_cpuid_phys;
+ uint32_t size_dt_strings;
+ uint32_t size_dt_struct;
+};
+
+struct fdt_reserve_entry {
+ uint64_t address;
+ uint64_t size;
+};
+
+#define FDT_BEGIN_NODE 1
+#define FDT_END_NODE 2
+#define FDT_PROP 3
+#define FDT_NOP 4
+#define FDT_END 9
+
+typedef struct {
+ uint32_t *tab;
+ int tab_len;
+ int tab_size;
+ int open_node_count;
+
+ char *string_table;
+ int string_table_len;
+ int string_table_size;
+} FDTState;
+
+static FDTState *fdt_init(void)
+{
+ FDTState *s;
+ s = mallocz(sizeof(*s));
+ return s;
+}
+
+static void fdt_alloc_len(FDTState *s, int len)
+{
+ int new_size;
+ if (unlikely(len > s->tab_size)) {
+ new_size = max_int(len, s->tab_size * 3 / 2);
+ s->tab = realloc(s->tab, new_size * sizeof(uint32_t));
+ s->tab_size = new_size;
+ }
+}
+
+static void fdt_put32(FDTState *s, int v)
+{
+ fdt_alloc_len(s, s->tab_len + 1);
+ s->tab[s->tab_len++] = cpu_to_be32(v);
+}
+
+/* the data is zero padded */
+static void fdt_put_data(FDTState *s, const uint8_t *data, int len)
+{
+ int len1;
+
+ len1 = (len + 3) / 4;
+ fdt_alloc_len(s, s->tab_len + len1);
+ memcpy(s->tab + s->tab_len, data, len);
+ memset((uint8_t *)(s->tab + s->tab_len) + len, 0, -len & 3);
+ s->tab_len += len1;
+}
+
+static void fdt_begin_node(FDTState *s, const char *name)
+{
+ fdt_put32(s, FDT_BEGIN_NODE);
+ fdt_put_data(s, (uint8_t *)name, strlen(name) + 1);
+ s->open_node_count++;
+}
+
+static void fdt_begin_node_num(FDTState *s, const char *name, uint64_t n)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "%s@%" PRIx64, name, n);
+ fdt_begin_node(s, buf);
+}
+
+static void fdt_end_node(FDTState *s)
+{
+ fdt_put32(s, FDT_END_NODE);
+ s->open_node_count--;
+}
+
+static int fdt_get_string_offset(FDTState *s, const char *name)
+{
+ int pos, new_size, name_size, new_len;
+
+ pos = 0;
+ while (pos < s->string_table_len) {
+ if (!strcmp(s->string_table + pos, name))
+ return pos;
+ pos += strlen(s->string_table + pos) + 1;
+ }
+ /* add a new string */
+ name_size = strlen(name) + 1;
+ new_len = s->string_table_len + name_size;
+ if (new_len > s->string_table_size) {
+ new_size = max_int(new_len, s->string_table_size * 3 / 2);
+ s->string_table = realloc(s->string_table, new_size);
+ s->string_table_size = new_size;
+ }
+ pos = s->string_table_len;
+ memcpy(s->string_table + pos, name, name_size);
+ s->string_table_len = new_len;
+ return pos;
+}
+
+static void fdt_prop(FDTState *s, const char *prop_name,
+ const void *data, int data_len)
+{
+ fdt_put32(s, FDT_PROP);
+ fdt_put32(s, data_len);
+ fdt_put32(s, fdt_get_string_offset(s, prop_name));
+ fdt_put_data(s, data, data_len);
+}
+
+static void fdt_prop_tab_u32(FDTState *s, const char *prop_name,
+ uint32_t *tab, int tab_len)
+{
+ int i;
+ fdt_put32(s, FDT_PROP);
+ fdt_put32(s, tab_len * sizeof(uint32_t));
+ fdt_put32(s, fdt_get_string_offset(s, prop_name));
+ for(i = 0; i < tab_len; i++)
+ fdt_put32(s, tab[i]);
+}
+
+static void fdt_prop_u32(FDTState *s, const char *prop_name, uint32_t val)
+{
+ fdt_prop_tab_u32(s, prop_name, &val, 1);
+}
+
+static void fdt_prop_tab_u64(FDTState *s, const char *prop_name,
+ uint64_t v0)
+{
+ uint32_t tab[2];
+ tab[0] = v0 >> 32;
+ tab[1] = v0;
+ fdt_prop_tab_u32(s, prop_name, tab, 2);
+}
+
+static void fdt_prop_tab_u64_2(FDTState *s, const char *prop_name,
+ uint64_t v0, uint64_t v1)
+{
+ uint32_t tab[4];
+ tab[0] = v0 >> 32;
+ tab[1] = v0;
+ tab[2] = v1 >> 32;
+ tab[3] = v1;
+ fdt_prop_tab_u32(s, prop_name, tab, 4);
+}
+
+static void fdt_prop_str(FDTState *s, const char *prop_name,
+ const char *str)
+{
+ fdt_prop(s, prop_name, str, strlen(str) + 1);
+}
+
+/* NULL terminated string list */
+static void fdt_prop_tab_str(FDTState *s, const char *prop_name,
+ ...)
+{
+ va_list ap;
+ int size, str_size;
+ char *ptr, *tab;
+
+ va_start(ap, prop_name);
+ size = 0;
+ for(;;) {
+ ptr = va_arg(ap, char *);
+ if (!ptr)
+ break;
+ str_size = strlen(ptr) + 1;
+ size += str_size;
+ }
+ va_end(ap);
+
+ tab = malloc(size);
+ va_start(ap, prop_name);
+ size = 0;
+ for(;;) {
+ ptr = va_arg(ap, char *);
+ if (!ptr)
+ break;
+ str_size = strlen(ptr) + 1;
+ memcpy(tab + size, ptr, str_size);
+ size += str_size;
+ }
+ va_end(ap);
+
+ fdt_prop(s, prop_name, tab, size);
+ free(tab);
+}
+
+/* write the FDT to 'dst1'. return the FDT size in bytes */
+int fdt_output(FDTState *s, uint8_t *dst)
+{
+ struct fdt_header *h;
+ struct fdt_reserve_entry *re;
+ int dt_struct_size;
+ int dt_strings_size;
+ int pos;
+
+ assert(s->open_node_count == 0);
+
+ fdt_put32(s, FDT_END);
+
+ dt_struct_size = s->tab_len * sizeof(uint32_t);
+ dt_strings_size = s->string_table_len;
+
+ h = (struct fdt_header *)dst;
+ h->magic = cpu_to_be32(FDT_MAGIC);
+ h->version = cpu_to_be32(FDT_VERSION);
+ h->last_comp_version = cpu_to_be32(16);
+ h->boot_cpuid_phys = cpu_to_be32(0);
+ h->size_dt_strings = cpu_to_be32(dt_strings_size);
+ h->size_dt_struct = cpu_to_be32(dt_struct_size);
+
+ pos = sizeof(struct fdt_header);
+
+ h->off_dt_struct = cpu_to_be32(pos);
+ memcpy(dst + pos, s->tab, dt_struct_size);
+ pos += dt_struct_size;
+
+ /* align to 8 */
+ while ((pos & 7) != 0) {
+ dst[pos++] = 0;
+ }
+ h->off_mem_rsvmap = cpu_to_be32(pos);
+ re = (struct fdt_reserve_entry *)(dst + pos);
+ re->address = 0; /* no reserved entry */
+ re->size = 0;
+ pos += sizeof(struct fdt_reserve_entry);
+
+ h->off_dt_strings = cpu_to_be32(pos);
+ memcpy(dst + pos, s->string_table, dt_strings_size);
+ pos += dt_strings_size;
+
+ /* align to 8, just in case */
+ while ((pos & 7) != 0) {
+ dst[pos++] = 0;
+ }
+
+ h->totalsize = cpu_to_be32(pos);
+ return pos;
+}
+
+void fdt_end(FDTState *s)
+{
+ free(s->tab);
+ free(s->string_table);
+ free(s);
+}
+
+static int riscv_build_fdt(RISCVMachine *m, uint8_t *dst,
+ uint64_t kernel_start, uint64_t kernel_size,
+ uint64_t initrd_start, uint64_t initrd_size,
+ const char *cmd_line)
+{
+ FDTState *s;
+ int size, max_xlen, i, cur_phandle, intc_phandle, plic_phandle;
+ char isa_string[128], *q;
+ uint32_t misa;
+ uint32_t tab[4];
+ FBDevice *fb_dev;
+
+ s = fdt_init();
+
+ cur_phandle = 1;
+
+ fdt_begin_node(s, "");
+ fdt_prop_u32(s, "#address-cells", 2);
+ fdt_prop_u32(s, "#size-cells", 2);
+ fdt_prop_str(s, "compatible", "ucbbar,riscvemu-bar_dev");
+ fdt_prop_str(s, "model", "ucbbar,riscvemu-bare");
+
+ /* CPU list */
+ fdt_begin_node(s, "cpus");
+ fdt_prop_u32(s, "#address-cells", 1);
+ fdt_prop_u32(s, "#size-cells", 0);
+ fdt_prop_u32(s, "timebase-frequency", RTC_FREQ);
+
+ /* cpu */
+ fdt_begin_node_num(s, "cpu", 0);
+ fdt_prop_str(s, "device_type", "cpu");
+ fdt_prop_u32(s, "reg", 0);
+ fdt_prop_str(s, "status", "okay");
+ fdt_prop_str(s, "compatible", "riscv");
+
+ max_xlen = m->max_xlen;
+ misa = riscv_cpu_get_misa(m->cpu_state);
+ q = isa_string;
+ q += snprintf(isa_string, sizeof(isa_string), "rv%d", max_xlen);
+ for(i = 0; i < 26; i++) {
+ if (misa & (1 << i))
+ *q++ = 'a' + i;
+ }
+ *q = '\0';
+ fdt_prop_str(s, "riscv,isa", isa_string);
+
+ fdt_prop_str(s, "mmu-type", max_xlen <= 32 ? "riscv,sv32" : "riscv,sv48");
+ fdt_prop_u32(s, "clock-frequency", 2000000000);
+
+ fdt_begin_node(s, "interrupt-controller");
+ fdt_prop_u32(s, "#interrupt-cells", 1);
+ fdt_prop(s, "interrupt-controller", NULL, 0);
+ fdt_prop_str(s, "compatible", "riscv,cpu-intc");
+ intc_phandle = cur_phandle++;
+ fdt_prop_u32(s, "phandle", intc_phandle);
+ fdt_end_node(s); /* interrupt-controller */
+
+ fdt_end_node(s); /* cpu */
+
+ fdt_end_node(s); /* cpus */
+
+ fdt_begin_node_num(s, "memory", RAM_BASE_ADDR);
+ fdt_prop_str(s, "device_type", "memory");
+ tab[0] = (uint64_t)RAM_BASE_ADDR >> 32;
+ tab[1] = RAM_BASE_ADDR;
+ tab[2] = m->ram_size >> 32;
+ tab[3] = m->ram_size;
+ fdt_prop_tab_u32(s, "reg", tab, 4);
+
+ fdt_end_node(s); /* memory */
+
+ fdt_begin_node(s, "htif");
+ fdt_prop_str(s, "compatible", "ucb,htif0");
+ fdt_end_node(s); /* htif */
+
+ fdt_begin_node(s, "soc");
+ fdt_prop_u32(s, "#address-cells", 2);
+ fdt_prop_u32(s, "#size-cells", 2);
+ fdt_prop_tab_str(s, "compatible",
+ "ucbbar,riscvemu-bar-soc", "simple-bus", NULL);
+ fdt_prop(s, "ranges", NULL, 0);
+
+ fdt_begin_node_num(s, "clint", CLINT_BASE_ADDR);
+ fdt_prop_str(s, "compatible", "riscv,clint0");
+
+ tab[0] = intc_phandle;
+ tab[1] = 3; /* M IPI irq */
+ tab[2] = intc_phandle;
+ tab[3] = 7; /* M timer irq */
+ fdt_prop_tab_u32(s, "interrupts-extended", tab, 4);
+
+ fdt_prop_tab_u64_2(s, "reg", CLINT_BASE_ADDR, CLINT_SIZE);
+
+ fdt_end_node(s); /* clint */
+
+ fdt_begin_node_num(s, "plic", PLIC_BASE_ADDR);
+ fdt_prop_u32(s, "#interrupt-cells", 1);
+ fdt_prop(s, "interrupt-controller", NULL, 0);
+ fdt_prop_str(s, "compatible", "riscv,plic0");
+ fdt_prop_u32(s, "riscv,ndev", 31);
+ fdt_prop_tab_u64_2(s, "reg", PLIC_BASE_ADDR, PLIC_SIZE);
+
+ tab[0] = intc_phandle;
+ tab[1] = 9; /* S ext irq */
+ tab[2] = intc_phandle;
+ tab[3] = 11; /* M ext irq */
+ fdt_prop_tab_u32(s, "interrupts-extended", tab, 4);
+
+ plic_phandle = cur_phandle++;
+ fdt_prop_u32(s, "phandle", plic_phandle);
+
+ fdt_end_node(s); /* plic */
+
+ for(i = 0; i < m->virtio_count; i++) {
+ fdt_begin_node_num(s, "virtio", VIRTIO_BASE_ADDR + i * VIRTIO_SIZE);
+ fdt_prop_str(s, "compatible", "virtio,mmio");
+ fdt_prop_tab_u64_2(s, "reg", VIRTIO_BASE_ADDR + i * VIRTIO_SIZE,
+ VIRTIO_SIZE);
+ tab[0] = plic_phandle;
+ tab[1] = VIRTIO_IRQ + i;
+ fdt_prop_tab_u32(s, "interrupts-extended", tab, 2);
+ fdt_end_node(s); /* virtio */
+ }
+
+ fb_dev = m->common.fb_dev;
+ if (fb_dev) {
+ fdt_begin_node_num(s, "framebuffer", FRAMEBUFFER_BASE_ADDR);
+ fdt_prop_str(s, "compatible", "simple-framebuffer");
+ fdt_prop_tab_u64_2(s, "reg", FRAMEBUFFER_BASE_ADDR, fb_dev->fb_size);
+ fdt_prop_u32(s, "width", fb_dev->width);
+ fdt_prop_u32(s, "height", fb_dev->height);
+ fdt_prop_u32(s, "stride", fb_dev->stride);
+ fdt_prop_str(s, "format", "a8r8g8b8");
+ fdt_end_node(s); /* framebuffer */
+ }
+
+ fdt_end_node(s); /* soc */
+
+ fdt_begin_node(s, "chosen");
+ fdt_prop_str(s, "bootargs", cmd_line ? cmd_line : "");
+ if (kernel_size > 0) {
+ fdt_prop_tab_u64(s, "riscv,kernel-start", kernel_start);
+ fdt_prop_tab_u64(s, "riscv,kernel-end", kernel_start + kernel_size);
+ }
+ if (initrd_size > 0) {
+ fdt_prop_tab_u64(s, "linux,initrd-start", initrd_start);
+ fdt_prop_tab_u64(s, "linux,initrd-end", initrd_start + initrd_size);
+ }
+
+
+ fdt_end_node(s); /* chosen */
+
+ fdt_end_node(s); /* / */
+
+ size = fdt_output(s, dst);
+#if 0
+ {
+ FILE *f;
+ f = fopen("/tmp/riscvemu.dtb", "wb");
+ fwrite(dst, 1, size, f);
+ fclose(f);
+ }
+#endif
+ fdt_end(s);
+ return size;
+}
+
+static void copy_bios(RISCVMachine *s, const uint8_t *buf, int buf_len,
+ const uint8_t *kernel_buf, int kernel_buf_len,
+ const uint8_t *initrd_buf, int initrd_buf_len,
+ const char *cmd_line)
+{
+ uint32_t fdt_addr, align, kernel_base, initrd_base;
+ uint8_t *ram_ptr;
+ uint32_t *q;
+
+ if (buf_len > s->ram_size) {
+ vm_error("BIOS too big\n");
+ exit(1);
+ }
+
+ ram_ptr = get_ram_ptr(s, RAM_BASE_ADDR, TRUE);
+ memcpy(ram_ptr, buf, buf_len);
+
+ kernel_base = 0;
+ if (kernel_buf_len > 0) {
+ /* copy the kernel if present */
+ if (s->max_xlen == 32)
+ align = 4 << 20; /* 4 MB page align */
+ else
+ align = 2 << 20; /* 2 MB page align */
+ kernel_base = (buf_len + align - 1) & ~(align - 1);
+ memcpy(ram_ptr + kernel_base, kernel_buf, kernel_buf_len);
+ if (kernel_buf_len + kernel_base > s->ram_size) {
+ vm_error("kernel too big");
+ exit(1);
+ }
+ }
+
+ initrd_base = 0;
+ if (initrd_buf_len > 0) {
+ /* same allocation as QEMU */
+ initrd_base = s->ram_size / 2;
+ if (initrd_base > (128 << 20))
+ initrd_base = 128 << 20;
+ memcpy(ram_ptr + initrd_base, initrd_buf, initrd_buf_len);
+ if (initrd_buf_len + initrd_base > s->ram_size) {
+ vm_error("initrd too big");
+ exit(1);
+ }
+ }
+
+ ram_ptr = get_ram_ptr(s, 0, TRUE);
+
+ fdt_addr = 0x1000 + 8 * 8;
+
+ riscv_build_fdt(s, ram_ptr + fdt_addr,
+ RAM_BASE_ADDR + kernel_base, kernel_buf_len,
+ RAM_BASE_ADDR + initrd_base, initrd_buf_len,
+ cmd_line);
+
+ /* jump_addr = 0x80000000 */
+
+ q = (uint32_t *)(ram_ptr + 0x1000);
+ q[0] = 0x297 + 0x80000000 - 0x1000; /* auipc t0, jump_addr */
+ q[1] = 0x597; /* auipc a1, dtb */
+ q[2] = 0x58593 + ((fdt_addr - 4) << 20); /* addi a1, a1, dtb */
+ q[3] = 0xf1402573; /* csrr a0, mhartid */
+ q[4] = 0x00028067; /* jalr zero, t0, jump_addr */
+}
+
+static void riscv_flush_tlb_write_range(void *opaque, uint8_t *ram_addr,
+ size_t ram_size)
+{
+ RISCVMachine *s = opaque;
+ riscv_cpu_flush_tlb_write_range_ram(s->cpu_state, ram_addr, ram_size);
+}
+
+static void riscv_machine_set_defaults(VirtMachineParams *p)
+{
+}
+
+static VirtMachine *riscv_machine_init(const VirtMachineParams *p)
+{
+ RISCVMachine *s;
+ VIRTIODevice *blk_dev;
+ int irq_num, i, max_xlen, ram_flags;
+ VIRTIOBusDef vbus_s, *vbus = &vbus_s;
+
+
+ if (!strcmp(p->machine_name, "riscv32")) {
+ max_xlen = 32;
+ } else if (!strcmp(p->machine_name, "riscv64")) {
+ max_xlen = 64;
+ } else if (!strcmp(p->machine_name, "riscv128")) {
+ max_xlen = 128;
+ } else {
+ vm_error("unsupported machine: %s\n", p->machine_name);
+ return NULL;
+ }
+
+ s = mallocz(sizeof(*s));
+ s->common.vmc = p->vmc;
+ s->ram_size = p->ram_size;
+ s->max_xlen = max_xlen;
+ s->mem_map = phys_mem_map_init();
+ /* needed to handle the RAM dirty bits */
+ s->mem_map->opaque = s;
+ s->mem_map->flush_tlb_write_range = riscv_flush_tlb_write_range;
+
+ s->cpu_state = riscv_cpu_init(s->mem_map, max_xlen);
+ if (!s->cpu_state) {
+ vm_error("unsupported max_xlen=%d\n", max_xlen);
+ /* XXX: should free resources */
+ return NULL;
+ }
+ /* RAM */
+ ram_flags = 0;
+ cpu_register_ram(s->mem_map, RAM_BASE_ADDR, p->ram_size, ram_flags);
+ cpu_register_ram(s->mem_map, 0x00000000, LOW_RAM_SIZE, 0);
+ s->rtc_real_time = p->rtc_real_time;
+ if (p->rtc_real_time) {
+ s->rtc_start_time = rtc_get_real_time(s);
+ }
+
+ cpu_register_device(s->mem_map, CLINT_BASE_ADDR, CLINT_SIZE, s,
+ clint_read, clint_write, DEVIO_SIZE32);
+ cpu_register_device(s->mem_map, PLIC_BASE_ADDR, PLIC_SIZE, s,
+ plic_read, plic_write, DEVIO_SIZE32);
+ for(i = 1; i < 32; i++) {
+ irq_init(&s->plic_irq[i], plic_set_irq, s, i);
+ }
+
+ cpu_register_device(s->mem_map, HTIF_BASE_ADDR, 16,
+ s, htif_read, htif_write, DEVIO_SIZE32);
+ s->common.console = p->console;
+
+ memset(vbus, 0, sizeof(*vbus));
+ vbus->mem_map = s->mem_map;
+ vbus->addr = VIRTIO_BASE_ADDR;
+ irq_num = VIRTIO_IRQ;
+
+ /* virtio console */
+ if (p->console) {
+ vbus->irq = &s->plic_irq[irq_num];
+ s->common.console_dev = virtio_console_init(vbus, p->console);
+ vbus->addr += VIRTIO_SIZE;
+ irq_num++;
+ s->virtio_count++;
+ }
+
+ /* virtio net device */
+ for(i = 0; i < p->eth_count; i++) {
+ vbus->irq = &s->plic_irq[irq_num];
+ virtio_net_init(vbus, p->tab_eth[i].net);
+ s->common.net = p->tab_eth[i].net;
+ vbus->addr += VIRTIO_SIZE;
+ irq_num++;
+ s->virtio_count++;
+ }
+
+ /* virtio block device */
+ for(i = 0; i < p->drive_count; i++) {
+ vbus->irq = &s->plic_irq[irq_num];
+ blk_dev = virtio_block_init(vbus, p->tab_drive[i].block_dev);
+ (void)blk_dev;
+ vbus->addr += VIRTIO_SIZE;
+ irq_num++;
+ s->virtio_count++;
+ }
+
+ /* virtio filesystem */
+ for(i = 0; i < p->fs_count; i++) {
+ VIRTIODevice *fs_dev;
+ vbus->irq = &s->plic_irq[irq_num];
+ fs_dev = virtio_9p_init(vbus, p->tab_fs[i].fs_dev,
+ p->tab_fs[i].tag);
+ (void)fs_dev;
+ // virtio_set_debug(fs_dev, VIRTIO_DEBUG_9P);
+ vbus->addr += VIRTIO_SIZE;
+ irq_num++;
+ s->virtio_count++;
+ }
+
+ if (p->display_device) {
+ FBDevice *fb_dev;
+ fb_dev = mallocz(sizeof(*fb_dev));
+ s->common.fb_dev = fb_dev;
+ if (!strcmp(p->display_device, "simplefb")) {
+ simplefb_init(s->mem_map,
+ FRAMEBUFFER_BASE_ADDR,
+ fb_dev,
+ p->width, p->height);
+
+ } else {
+ vm_error("unsupported display device: %s\n", p->display_device);
+ exit(1);
+ }
+ }
+
+ if (p->input_device) {
+ if (!strcmp(p->input_device, "virtio")) {
+ vbus->irq = &s->plic_irq[irq_num];
+ s->keyboard_dev = virtio_input_init(vbus,
+ VIRTIO_INPUT_TYPE_KEYBOARD);
+ vbus->addr += VIRTIO_SIZE;
+ irq_num++;
+ s->virtio_count++;
+
+ vbus->irq = &s->plic_irq[irq_num];
+ s->mouse_dev = virtio_input_init(vbus,
+ VIRTIO_INPUT_TYPE_TABLET);
+ vbus->addr += VIRTIO_SIZE;
+ irq_num++;
+ s->virtio_count++;
+ } else {
+ vm_error("unsupported input device: %s\n", p->input_device);
+ exit(1);
+ }
+ }
+
+ if (!p->files[VM_FILE_BIOS].buf) {
+ vm_error("No bios found");
+ }
+
+ copy_bios(s, p->files[VM_FILE_BIOS].buf, p->files[VM_FILE_BIOS].len,
+ p->files[VM_FILE_KERNEL].buf, p->files[VM_FILE_KERNEL].len,
+ p->files[VM_FILE_INITRD].buf, p->files[VM_FILE_INITRD].len,
+ p->cmdline);
+
+ return (VirtMachine *)s;
+}
+
+static void riscv_machine_end(VirtMachine *s1)
+{
+ RISCVMachine *s = (RISCVMachine *)s1;
+ /* XXX: stop all */
+ riscv_cpu_end(s->cpu_state);
+ phys_mem_map_end(s->mem_map);
+ free(s);
+}
+
+/* in ms */
+static int riscv_machine_get_sleep_duration(VirtMachine *s1, int delay)
+{
+ RISCVMachine *m = (RISCVMachine *)s1;
+ RISCVCPUState *s = m->cpu_state;
+ int64_t delay1;
+
+ /* wait for an event: the only asynchronous event is the RTC timer */
+ if (!(riscv_cpu_get_mip(s) & MIP_MTIP)) {
+ delay1 = m->timecmp - rtc_get_time(m);
+ if (delay1 <= 0) {
+ riscv_cpu_set_mip(s, MIP_MTIP);
+ delay = 0;
+ } else {
+ /* convert delay to ms */
+ delay1 = delay1 / (RTC_FREQ / 1000);
+ if (delay1 < delay)
+ delay = delay1;
+ }
+ }
+ if (!riscv_cpu_get_power_down(s))
+ delay = 0;
+ return delay;
+}
+
+static void riscv_machine_interp(VirtMachine *s1, int max_exec_cycle)
+{
+ RISCVMachine *s = (RISCVMachine *)s1;
+ riscv_cpu_interp(s->cpu_state, max_exec_cycle);
+}
+
+static void riscv_vm_send_key_event(VirtMachine *s1, BOOL is_down,
+ uint16_t key_code)
+{
+ RISCVMachine *s = (RISCVMachine *)s1;
+ if (s->keyboard_dev) {
+ virtio_input_send_key_event(s->keyboard_dev, is_down, key_code);
+ }
+}
+
+static BOOL riscv_vm_mouse_is_absolute(VirtMachine *s)
+{
+ return TRUE;
+}
+
+static void riscv_vm_send_mouse_event(VirtMachine *s1, int dx, int dy, int dz,
+ unsigned int buttons)
+{
+ RISCVMachine *s = (RISCVMachine *)s1;
+ if (s->mouse_dev) {
+ virtio_input_send_mouse_event(s->mouse_dev, dx, dy, dz, buttons);
+ }
+}
+
+const VirtMachineClass riscv_machine_class = {
+ "riscv32,riscv64,riscv128",
+ riscv_machine_set_defaults,
+ riscv_machine_init,
+ riscv_machine_end,
+ riscv_machine_get_sleep_duration,
+ riscv_machine_interp,
+ riscv_vm_mouse_is_absolute,
+ riscv_vm_send_mouse_event,
+ riscv_vm_send_key_event,
+};
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/sdl.c b/jslinux-2019-12-21/tinyemu-2019-12-21/sdl.c
new file mode 100644
index 0000000..c2afeba
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/sdl.c
@@ -0,0 +1,275 @@
+/*
+ * SDL display driver
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <SDL/SDL.h>
+
+#include "cutils.h"
+#include "virtio.h"
+#include "machine.h"
+
+#define KEYCODE_MAX 127
+
+static SDL_Surface *screen;
+static SDL_Surface *fb_surface;
+static int screen_width, screen_height, fb_width, fb_height, fb_stride;
+static SDL_Cursor *sdl_cursor_hidden;
+static uint8_t key_pressed[KEYCODE_MAX + 1];
+
+static void sdl_update_fb_surface(FBDevice *fb_dev)
+{
+ if (!fb_surface)
+ goto force_alloc;
+ if (fb_width != fb_dev->width ||
+ fb_height != fb_dev->height ||
+ fb_stride != fb_dev->stride) {
+ force_alloc:
+ if (fb_surface != NULL)
+ SDL_FreeSurface(fb_surface);
+ fb_width = fb_dev->width;
+ fb_height = fb_dev->height;
+ fb_stride = fb_dev->stride;
+ fb_surface = SDL_CreateRGBSurfaceFrom(fb_dev->fb_data,
+ fb_dev->width, fb_dev->height,
+ 32, fb_dev->stride,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff,
+ 0x00000000);
+ if (!fb_surface) {
+ fprintf(stderr, "Could not create SDL framebuffer surface\n");
+ exit(1);
+ }
+ }
+}
+
+static void sdl_update(FBDevice *fb_dev, void *opaque,
+ int x, int y, int w, int h)
+{
+ SDL_Rect r;
+ // printf("sdl_update: %d %d %d %d\n", x, y, w, h);
+ r.x = x;
+ r.y = y;
+ r.w = w;
+ r.h = h;
+ SDL_BlitSurface(fb_surface, &r, screen, &r);
+ SDL_UpdateRect(screen, r.x, r.y, r.w, r.h);
+}
+
+#if defined(_WIN32)
+
+static int sdl_get_keycode(const SDL_KeyboardEvent *ev)
+{
+ return ev->keysym.scancode;
+}
+
+#else
+
+/* we assume Xorg is used with a PC keyboard. Return 0 if no keycode found. */
+static int sdl_get_keycode(const SDL_KeyboardEvent *ev)
+{
+ int keycode;
+ keycode = ev->keysym.scancode;
+ if (keycode < 9) {
+ keycode = 0;
+ } else if (keycode < 127 + 8) {
+ keycode -= 8;
+ } else {
+ keycode = 0;
+ }
+ return keycode;
+}
+
+#endif
+
+/* release all pressed keys */
+static void sdl_reset_keys(VirtMachine *m)
+{
+ int i;
+
+ for(i = 1; i <= KEYCODE_MAX; i++) {
+ if (key_pressed[i]) {
+ vm_send_key_event(m, FALSE, i);
+ key_pressed[i] = FALSE;
+ }
+ }
+}
+
+static void sdl_handle_key_event(const SDL_KeyboardEvent *ev, VirtMachine *m)
+{
+ int keycode, keypress;
+
+ keycode = sdl_get_keycode(ev);
+ if (keycode) {
+ if (keycode == 0x3a || keycode ==0x45) {
+ /* SDL does not generate key up for numlock & caps lock */
+ vm_send_key_event(m, TRUE, keycode);
+ vm_send_key_event(m, FALSE, keycode);
+ } else {
+ keypress = (ev->type == SDL_KEYDOWN);
+ if (keycode <= KEYCODE_MAX)
+ key_pressed[keycode] = keypress;
+ vm_send_key_event(m, keypress, keycode);
+ }
+ } else if (ev->type == SDL_KEYUP) {
+ /* workaround to reset the keyboard state (used when changing
+ desktop with ctrl-alt-x on Linux) */
+ sdl_reset_keys(m);
+ }
+}
+
+static void sdl_send_mouse_event(VirtMachine *m, int x1, int y1,
+ int dz, int state, BOOL is_absolute)
+{
+ int buttons, x, y;
+
+ buttons = 0;
+ if (state & SDL_BUTTON(SDL_BUTTON_LEFT))
+ buttons |= (1 << 0);
+ if (state & SDL_BUTTON(SDL_BUTTON_RIGHT))
+ buttons |= (1 << 1);
+ if (state & SDL_BUTTON(SDL_BUTTON_MIDDLE))
+ buttons |= (1 << 2);
+ if (is_absolute) {
+ x = (x1 * 32768) / screen_width;
+ y = (y1 * 32768) / screen_height;
+ } else {
+ x = x1;
+ y = y1;
+ }
+ vm_send_mouse_event(m, x, y, dz, buttons);
+}
+
+static void sdl_handle_mouse_motion_event(const SDL_Event *ev, VirtMachine *m)
+{
+ BOOL is_absolute = vm_mouse_is_absolute(m);
+ int x, y;
+ if (is_absolute) {
+ x = ev->motion.x;
+ y = ev->motion.y;
+ } else {
+ x = ev->motion.xrel;
+ y = ev->motion.yrel;
+ }
+ sdl_send_mouse_event(m, x, y, 0, ev->motion.state, is_absolute);
+}
+
+static void sdl_handle_mouse_button_event(const SDL_Event *ev, VirtMachine *m)
+{
+ BOOL is_absolute = vm_mouse_is_absolute(m);
+ int state, dz;
+
+ dz = 0;
+ if (ev->type == SDL_MOUSEBUTTONDOWN) {
+ if (ev->button.button == SDL_BUTTON_WHEELUP) {
+ dz = 1;
+ } else if (ev->button.button == SDL_BUTTON_WHEELDOWN) {
+ dz = -1;
+ }
+ }
+
+ state = SDL_GetMouseState(NULL, NULL);
+ /* just in case */
+ if (ev->type == SDL_MOUSEBUTTONDOWN)
+ state |= SDL_BUTTON(ev->button.button);
+ else
+ state &= ~SDL_BUTTON(ev->button.button);
+
+ if (is_absolute) {
+ sdl_send_mouse_event(m, ev->button.x, ev->button.y,
+ dz, state, is_absolute);
+ } else {
+ sdl_send_mouse_event(m, 0, 0, dz, state, is_absolute);
+ }
+}
+
+void sdl_refresh(VirtMachine *m)
+{
+ SDL_Event ev_s, *ev = &ev_s;
+
+ if (!m->fb_dev)
+ return;
+
+ sdl_update_fb_surface(m->fb_dev);
+
+ m->fb_dev->refresh(m->fb_dev, sdl_update, NULL);
+
+ while (SDL_PollEvent(ev)) {
+ switch (ev->type) {
+ case SDL_KEYDOWN:
+ case SDL_KEYUP:
+ sdl_handle_key_event(&ev->key, m);
+ break;
+ case SDL_MOUSEMOTION:
+ sdl_handle_mouse_motion_event(ev, m);
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ case SDL_MOUSEBUTTONUP:
+ sdl_handle_mouse_button_event(ev, m);
+ break;
+ case SDL_QUIT:
+ exit(0);
+ }
+ }
+}
+
+static void sdl_hide_cursor(void)
+{
+ uint8_t data = 0;
+ sdl_cursor_hidden = SDL_CreateCursor(&data, &data, 8, 1, 0, 0);
+ SDL_ShowCursor(1);
+ SDL_SetCursor(sdl_cursor_hidden);
+}
+
+void sdl_init(int width, int height)
+{
+ int flags;
+
+ screen_width = width;
+ screen_height = height;
+
+ if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE)) {
+ fprintf(stderr, "Could not initialize SDL - exiting\n");
+ exit(1);
+ }
+
+ flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
+ screen = SDL_SetVideoMode(width, height, 0, flags);
+ if (!screen || !screen->pixels) {
+ fprintf(stderr, "Could not open SDL display\n");
+ exit(1);
+ }
+
+ SDL_WM_SetCaption("TinyEMU", "TinyEMU");
+
+ sdl_hide_cursor();
+}
+
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.c b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.c
new file mode 100644
index 0000000..97bfbda
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.c
@@ -0,0 +1,341 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include <stdlib.h>
+#include <string.h>
+#include "cutils.h"
+#include "sha256.h"
+
+#define LOAD32H(a, b) a = get_be32(b)
+#define STORE32H(a, b) put_be32(b, a)
+#define STORE64H(a, b) put_be64(b, a)
+#define RORc(x, y) ( ((((uint32_t)(x)&0xFFFFFFFFUL)>>(uint32_t)((y)&31)) | ((uint32_t)(x)<<(uint32_t)(32-((y)&31)))) & 0xFFFFFFFFUL)
+
+#if defined(CONFIG_EMBUE)
+#define LTC_SMALL_CODE
+#endif
+
+/**
+ @file sha256.c
+ LTC_SHA256 by Tom St Denis
+*/
+
+#ifdef LTC_SMALL_CODE
+/* the K array */
+static const uint32_t K[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
+ 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
+ 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
+ 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
+ 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
+ 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
+ 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
+ 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
+ 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
+ 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+#endif
+
+/* Various logical functions */
+#define Ch(x,y,z) (z ^ (x & (y ^ z)))
+#define Maj(x,y,z) (((x | y) & z) | (x & y))
+#define S(x, n) RORc((x),(n))
+#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
+#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
+#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
+#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
+#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
+
+/* compress 512-bits */
+static void sha256_compress(SHA256_CTX *s, unsigned char *buf)
+{
+ uint32_t S[8], W[64], t0, t1;
+#ifdef LTC_SMALL_CODE
+ uint32_t t;
+#endif
+ int i;
+
+ /* copy state into S */
+ for (i = 0; i < 8; i++) {
+ S[i] = s->state[i];
+ }
+
+ /* copy the state into 512-bits into W[0..15] */
+ for (i = 0; i < 16; i++) {
+ LOAD32H(W[i], buf + (4*i));
+ }
+
+ /* fill W[16..63] */
+ for (i = 16; i < 64; i++) {
+ W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
+ }
+
+ /* Compress */
+#ifdef LTC_SMALL_CODE
+#define RND(a,b,c,d,e,f,g,h,i) \
+ t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
+ t1 = Sigma0(a) + Maj(a, b, c); \
+ d += t0; \
+ h = t0 + t1;
+
+ for (i = 0; i < 64; ++i) {
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i);
+ t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
+ S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
+ }
+#else
+#define RND(a,b,c,d,e,f,g,h,i,ki) \
+ t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \
+ t1 = Sigma0(a) + Maj(a, b, c); \
+ d += t0; \
+ h = t0 + t1;
+
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5);
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174);
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da);
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967);
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85);
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070);
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3);
+ RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee);
+ RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f);
+ RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814);
+ RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208);
+ RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa);
+ RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb);
+ RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7);
+ RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2);
+
+#undef RND
+
+#endif
+
+ /* feedback */
+ for (i = 0; i < 8; i++) {
+ s->state[i] = s->state[i] + S[i];
+ }
+}
+
+#ifdef LTC_CLEAN_STACK
+static int sha256_compress(hash_state * md, unsigned char *buf)
+{
+ int err;
+ err = _sha256_compress(md, buf);
+ burn_stack(sizeof(uint32_t) * 74);
+ return err;
+}
+#endif
+
+/**
+ Initialize the hash state
+ @param md The hash state you wish to initialize
+ @return CRYPT_OK if successful
+*/
+void SHA256_Init(SHA256_CTX *s)
+{
+ s->curlen = 0;
+ s->length = 0;
+ s->state[0] = 0x6A09E667UL;
+ s->state[1] = 0xBB67AE85UL;
+ s->state[2] = 0x3C6EF372UL;
+ s->state[3] = 0xA54FF53AUL;
+ s->state[4] = 0x510E527FUL;
+ s->state[5] = 0x9B05688CUL;
+ s->state[6] = 0x1F83D9ABUL;
+ s->state[7] = 0x5BE0CD19UL;
+}
+
+void SHA256_Update(SHA256_CTX *s, const uint8_t *in, unsigned long inlen)
+{
+ unsigned long n;
+
+ if (s->curlen > sizeof(s->buf)) {
+ abort();
+ }
+ if ((s->length + inlen) < s->length) {
+ abort();
+ }
+ while (inlen > 0) {
+ if (s->curlen == 0 && inlen >= 64) {
+ sha256_compress(s, (unsigned char *)in);
+ s->length += 64 * 8;
+ in += 64;
+ inlen -= 64;
+ } else {
+ n = min_int(inlen, 64 - s->curlen);
+ memcpy(s->buf + s->curlen, in, (size_t)n);
+ s->curlen += n;
+ in += n;
+ inlen -= n;
+ if (s->curlen == 64) {
+ sha256_compress(s, s->buf);
+ s->length += 8*64;
+ s->curlen = 0;
+ }
+ }
+ } }
+
+/**
+ Terminate the hash to get the digest
+ @param md The hash state
+ @param out [out] The destination of the hash (32 bytes)
+ @return CRYPT_OK if successful
+*/
+void SHA256_Final(uint8_t *out, SHA256_CTX *s)
+{
+ int i;
+
+ if (s->curlen >= sizeof(s->buf)) {
+ abort();
+ }
+
+
+ /* increase the length of the message */
+ s->length += s->curlen * 8;
+
+ /* append the '1' bit */
+ s->buf[s->curlen++] = (unsigned char)0x80;
+
+ /* if the length is currently above 56 bytes we append zeros
+ * then compress. Then we can fall back to padding zeros and length
+ * encoding like normal.
+ */
+ if (s->curlen > 56) {
+ while (s->curlen < 64) {
+ s->buf[s->curlen++] = (unsigned char)0;
+ }
+ sha256_compress(s, s->buf);
+ s->curlen = 0;
+ }
+
+ /* pad upto 56 bytes of zeroes */
+ while (s->curlen < 56) {
+ s->buf[s->curlen++] = (unsigned char)0;
+ }
+
+ /* store length */
+ STORE64H(s->length, s->buf+56);
+ sha256_compress(s, s->buf);
+
+ /* copy output */
+ for (i = 0; i < 8; i++) {
+ STORE32H(s->state[i], out+(4*i));
+ }
+#ifdef LTC_CLEAN_STACK
+ zeromem(md, sizeof(hash_state));
+#endif
+}
+
+void SHA256(const uint8_t *buf, int buf_len, uint8_t *out)
+{
+ SHA256_CTX ctx;
+
+ SHA256_Init(&ctx);
+ SHA256_Update(&ctx, buf, buf_len);
+ SHA256_Final(out, &ctx);
+}
+
+#if 0
+/**
+ Self-test the hash
+ @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
+*/
+int sha256_test(void)
+{
+ #ifndef LTC_TEST
+ return CRYPT_NOP;
+ #else
+ static const struct {
+ char *msg;
+ unsigned char hash[32];
+ } tests[] = {
+ { "abc",
+ { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
+ 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
+ 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
+ 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad }
+ },
+ { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+ { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
+ 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
+ 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
+ 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 }
+ },
+ };
+
+ int i;
+ unsigned char tmp[32];
+ hash_state md;
+
+ for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
+ sha256_init(&md);
+ sha256_process(&md, (unsigned char*)tests[i].msg, (unsigned long)strlen(tests[i].msg));
+ sha256_done(&md, tmp);
+ if (XMEMCMP(tmp, tests[i].hash, 32) != 0) {
+ return CRYPT_FAIL_TESTVECTOR;
+ }
+ }
+ return CRYPT_OK;
+ #endif
+}
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.h b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.h
new file mode 100644
index 0000000..b43115f
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.h
@@ -0,0 +1,40 @@
+/*
+ * OpenSSL compatible SHA256 header
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef SHA256_H
+#define SHA256_H
+
+#define SHA256_DIGEST_LENGTH 32
+
+typedef struct {
+ uint64_t length;
+ uint32_t state[8], curlen;
+ uint8_t buf[64];
+} SHA256_CTX;
+
+void SHA256_Init(SHA256_CTX *s);
+void SHA256_Update(SHA256_CTX *s, const uint8_t *in, unsigned long inlen);
+void SHA256_Final(uint8_t *out, SHA256_CTX *s);
+void SHA256(const uint8_t *buf, int buf_len, uint8_t *out);
+
+#endif /* SHA256_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/simplefb.c b/jslinux-2019-12-21/tinyemu-2019-12-21/simplefb.c
new file mode 100644
index 0000000..5664cea
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/simplefb.c
@@ -0,0 +1,127 @@
+/*
+ * Simple frame buffer
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "virtio.h"
+#include "machine.h"
+
+//#define DEBUG_VBE
+
+#define FB_ALLOC_ALIGN 65536
+
+struct SimpleFBState {
+ FBDevice *fb_dev;
+ int fb_page_count;
+ PhysMemoryRange *mem_range;
+};
+
+#define MAX_MERGE_DISTANCE 3
+
+void simplefb_refresh(FBDevice *fb_dev,
+ SimpleFBDrawFunc *redraw_func, void *opaque,
+ PhysMemoryRange *mem_range,
+ int fb_page_count)
+{
+ const uint32_t *dirty_bits;
+ uint32_t dirty_val;
+ int y0, y1, page_y0, page_y1, byte_pos, page_index, bit_pos;
+
+ dirty_bits = phys_mem_get_dirty_bits(mem_range);
+
+ page_index = 0;
+ y0 = y1 = 0;
+ while (page_index < fb_page_count) {
+ dirty_val = dirty_bits[page_index >> 5];
+ if (dirty_val != 0) {
+ bit_pos = 0;
+ while (dirty_val != 0) {
+ while (((dirty_val >> bit_pos) & 1) == 0)
+ bit_pos++;
+ dirty_val &= ~(1 << bit_pos);
+
+ byte_pos = (page_index + bit_pos) * DEVRAM_PAGE_SIZE;
+ page_y0 = byte_pos / fb_dev->stride;
+ page_y1 = ((byte_pos + DEVRAM_PAGE_SIZE - 1) / fb_dev->stride) + 1;
+ page_y1 = min_int(page_y1, fb_dev->height);
+ if (y0 == y1) {
+ y0 = page_y0;
+ y1 = page_y1;
+ } else if (page_y0 <= (y1 + MAX_MERGE_DISTANCE)) {
+ /* union with current region */
+ y1 = page_y1;
+ } else {
+ /* flush */
+ redraw_func(fb_dev, opaque,
+ 0, y0, fb_dev->width, y1 - y0);
+ y0 = page_y0;
+ y1 = page_y1;
+ }
+ }
+ }
+ page_index += 32;
+ }
+
+ if (y0 != y1) {
+ redraw_func(fb_dev, opaque,
+ 0, y0, fb_dev->width, y1 - y0);
+ }
+}
+
+static void simplefb_refresh1(FBDevice *fb_dev,
+ SimpleFBDrawFunc *redraw_func, void *opaque)
+{
+ SimpleFBState *s = fb_dev->device_opaque;
+ simplefb_refresh(fb_dev, redraw_func, opaque, s->mem_range,
+ s->fb_page_count);
+}
+
+SimpleFBState *simplefb_init(PhysMemoryMap *map, uint64_t phys_addr,
+ FBDevice *fb_dev, int width, int height)
+{
+ SimpleFBState *s;
+
+ s = mallocz(sizeof(*s));
+ s->fb_dev = fb_dev;
+
+ fb_dev->width = width;
+ fb_dev->height = height;
+ fb_dev->stride = width * 4;
+ fb_dev->fb_size = (height * fb_dev->stride + FB_ALLOC_ALIGN - 1) & ~(FB_ALLOC_ALIGN - 1);
+ s->fb_page_count = fb_dev->fb_size >> DEVRAM_PAGE_SIZE_LOG2;
+
+ s->mem_range = cpu_register_ram(map, phys_addr, fb_dev->fb_size,
+ DEVRAM_FLAG_DIRTY_BITS);
+
+ fb_dev->fb_data = s->mem_range->phys_mem;
+ fb_dev->device_opaque = s;
+ fb_dev->refresh = simplefb_refresh1;
+ return s;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.c
new file mode 100644
index 0000000..3e5f457
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.c
@@ -0,0 +1,314 @@
+/*
+ * QEMU BOOTP/DHCP server
+ *
+ * Copyright (c) 2004 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "slirp.h"
+
+/* XXX: only DHCP is supported */
+
+#define LEASE_TIME (24 * 3600)
+
+static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE };
+
+#ifdef DEBUG
+#define DPRINTF(fmt, ...) \
+do if (slirp_debug & DBG_CALL) { fprintf(dfd, fmt, ## __VA_ARGS__); fflush(dfd); } while (0)
+#else
+#define DPRINTF(fmt, ...) do{}while(0)
+#endif
+
+static BOOTPClient *get_new_addr(Slirp *slirp, struct in_addr *paddr,
+ const uint8_t *macaddr)
+{
+ BOOTPClient *bc;
+ int i;
+
+ for(i = 0; i < NB_BOOTP_CLIENTS; i++) {
+ bc = &slirp->bootp_clients[i];
+ if (!bc->allocated || !memcmp(macaddr, bc->macaddr, 6))
+ goto found;
+ }
+ return NULL;
+ found:
+ bc = &slirp->bootp_clients[i];
+ bc->allocated = 1;
+ paddr->s_addr = slirp->vdhcp_startaddr.s_addr + htonl(i);
+ return bc;
+}
+
+static BOOTPClient *request_addr(Slirp *slirp, const struct in_addr *paddr,
+ const uint8_t *macaddr)
+{
+ uint32_t req_addr = ntohl(paddr->s_addr);
+ uint32_t dhcp_addr = ntohl(slirp->vdhcp_startaddr.s_addr);
+ BOOTPClient *bc;
+
+ if (req_addr >= dhcp_addr &&
+ req_addr < (dhcp_addr + NB_BOOTP_CLIENTS)) {
+ bc = &slirp->bootp_clients[req_addr - dhcp_addr];
+ if (!bc->allocated || !memcmp(macaddr, bc->macaddr, 6)) {
+ bc->allocated = 1;
+ return bc;
+ }
+ }
+ return NULL;
+}
+
+static BOOTPClient *find_addr(Slirp *slirp, struct in_addr *paddr,
+ const uint8_t *macaddr)
+{
+ BOOTPClient *bc;
+ int i;
+
+ for(i = 0; i < NB_BOOTP_CLIENTS; i++) {
+ if (!memcmp(macaddr, slirp->bootp_clients[i].macaddr, 6))
+ goto found;
+ }
+ return NULL;
+ found:
+ bc = &slirp->bootp_clients[i];
+ bc->allocated = 1;
+ paddr->s_addr = slirp->vdhcp_startaddr.s_addr + htonl(i);
+ return bc;
+}
+
+static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type,
+ struct in_addr *preq_addr)
+{
+ const uint8_t *p, *p_end;
+ int len, tag;
+
+ *pmsg_type = 0;
+ preq_addr->s_addr = htonl(0L);
+
+ p = bp->bp_vend;
+ p_end = p + DHCP_OPT_LEN;
+ if (memcmp(p, rfc1533_cookie, 4) != 0)
+ return;
+ p += 4;
+ while (p < p_end) {
+ tag = p[0];
+ if (tag == RFC1533_PAD) {
+ p++;
+ } else if (tag == RFC1533_END) {
+ break;
+ } else {
+ p++;
+ if (p >= p_end)
+ break;
+ len = *p++;
+ DPRINTF("dhcp: tag=%d len=%d\n", tag, len);
+
+ switch(tag) {
+ case RFC2132_MSG_TYPE:
+ if (len >= 1)
+ *pmsg_type = p[0];
+ break;
+ case RFC2132_REQ_ADDR:
+ if (len >= 4) {
+ memcpy(&(preq_addr->s_addr), p, 4);
+ }
+ break;
+ default:
+ break;
+ }
+ p += len;
+ }
+ }
+ if (*pmsg_type == DHCPREQUEST && preq_addr->s_addr == htonl(0L) &&
+ bp->bp_ciaddr.s_addr) {
+ memcpy(&(preq_addr->s_addr), &bp->bp_ciaddr, 4);
+ }
+}
+
+static void bootp_reply(Slirp *slirp, const struct bootp_t *bp)
+{
+ BOOTPClient *bc = NULL;
+ struct mbuf *m;
+ struct bootp_t *rbp;
+ struct sockaddr_in saddr, daddr;
+ struct in_addr preq_addr;
+ int dhcp_msg_type, val;
+ uint8_t *q;
+
+ /* extract exact DHCP msg type */
+ dhcp_decode(bp, &dhcp_msg_type, &preq_addr);
+ DPRINTF("bootp packet op=%d msgtype=%d", bp->bp_op, dhcp_msg_type);
+ if (preq_addr.s_addr != htonl(0L))
+ DPRINTF(" req_addr=%08x\n", ntohl(preq_addr.s_addr));
+ else
+ DPRINTF("\n");
+
+ if (dhcp_msg_type == 0)
+ dhcp_msg_type = DHCPREQUEST; /* Force reply for old BOOTP clients */
+
+ if (dhcp_msg_type != DHCPDISCOVER &&
+ dhcp_msg_type != DHCPREQUEST)
+ return;
+ /* XXX: this is a hack to get the client mac address */
+ memcpy(slirp->client_ethaddr, bp->bp_hwaddr, 6);
+
+ m = m_get(slirp);
+ if (!m) {
+ return;
+ }
+ m->m_data += IF_MAXLINKHDR;
+ rbp = (struct bootp_t *)m->m_data;
+ m->m_data += sizeof(struct udpiphdr);
+ memset(rbp, 0, sizeof(struct bootp_t));
+
+ if (dhcp_msg_type == DHCPDISCOVER) {
+ if (preq_addr.s_addr != htonl(0L)) {
+ bc = request_addr(slirp, &preq_addr, slirp->client_ethaddr);
+ if (bc) {
+ daddr.sin_addr = preq_addr;
+ }
+ }
+ if (!bc) {
+ new_addr:
+ bc = get_new_addr(slirp, &daddr.sin_addr, slirp->client_ethaddr);
+ if (!bc) {
+ DPRINTF("no address left\n");
+ return;
+ }
+ }
+ memcpy(bc->macaddr, slirp->client_ethaddr, 6);
+ } else if (preq_addr.s_addr != htonl(0L)) {
+ bc = request_addr(slirp, &preq_addr, slirp->client_ethaddr);
+ if (bc) {
+ daddr.sin_addr = preq_addr;
+ memcpy(bc->macaddr, slirp->client_ethaddr, 6);
+ } else {
+ daddr.sin_addr.s_addr = 0;
+ }
+ } else {
+ bc = find_addr(slirp, &daddr.sin_addr, bp->bp_hwaddr);
+ if (!bc) {
+ /* if never assigned, behaves as if it was already
+ assigned (windows fix because it remembers its address) */
+ goto new_addr;
+ }
+ }
+
+ saddr.sin_addr = slirp->vhost_addr;
+ saddr.sin_port = htons(BOOTP_SERVER);
+
+ daddr.sin_port = htons(BOOTP_CLIENT);
+
+ rbp->bp_op = BOOTP_REPLY;
+ rbp->bp_xid = bp->bp_xid;
+ rbp->bp_htype = 1;
+ rbp->bp_hlen = 6;
+ memcpy(rbp->bp_hwaddr, bp->bp_hwaddr, 6);
+
+ rbp->bp_yiaddr = daddr.sin_addr; /* Client IP address */
+ rbp->bp_siaddr = saddr.sin_addr; /* Server IP address */
+
+ q = rbp->bp_vend;
+ memcpy(q, rfc1533_cookie, 4);
+ q += 4;
+
+ if (bc) {
+ DPRINTF("%s addr=%08x\n",
+ (dhcp_msg_type == DHCPDISCOVER) ? "offered" : "ack'ed",
+ ntohl(daddr.sin_addr.s_addr));
+
+ if (dhcp_msg_type == DHCPDISCOVER) {
+ *q++ = RFC2132_MSG_TYPE;
+ *q++ = 1;
+ *q++ = DHCPOFFER;
+ } else /* DHCPREQUEST */ {
+ *q++ = RFC2132_MSG_TYPE;
+ *q++ = 1;
+ *q++ = DHCPACK;
+ }
+
+ if (slirp->bootp_filename)
+ snprintf((char *)rbp->bp_file, sizeof(rbp->bp_file), "%s",
+ slirp->bootp_filename);
+
+ *q++ = RFC2132_SRV_ID;
+ *q++ = 4;
+ memcpy(q, &saddr.sin_addr, 4);
+ q += 4;
+
+ *q++ = RFC1533_NETMASK;
+ *q++ = 4;
+ memcpy(q, &slirp->vnetwork_mask, 4);
+ q += 4;
+
+ if (!slirp->restricted) {
+ *q++ = RFC1533_GATEWAY;
+ *q++ = 4;
+ memcpy(q, &saddr.sin_addr, 4);
+ q += 4;
+
+ *q++ = RFC1533_DNS;
+ *q++ = 4;
+ memcpy(q, &slirp->vnameserver_addr, 4);
+ q += 4;
+ }
+
+ *q++ = RFC2132_LEASE_TIME;
+ *q++ = 4;
+ val = htonl(LEASE_TIME);
+ memcpy(q, &val, 4);
+ q += 4;
+
+ if (*slirp->client_hostname) {
+ val = strlen(slirp->client_hostname);
+ *q++ = RFC1533_HOSTNAME;
+ *q++ = val;
+ memcpy(q, slirp->client_hostname, val);
+ q += val;
+ }
+ } else {
+ static const char nak_msg[] = "requested address not available";
+
+ DPRINTF("nak'ed addr=%08x\n", ntohl(preq_addr->s_addr));
+
+ *q++ = RFC2132_MSG_TYPE;
+ *q++ = 1;
+ *q++ = DHCPNAK;
+
+ *q++ = RFC2132_MESSAGE;
+ *q++ = sizeof(nak_msg) - 1;
+ memcpy(q, nak_msg, sizeof(nak_msg) - 1);
+ q += sizeof(nak_msg) - 1;
+ }
+ *q = RFC1533_END;
+
+ daddr.sin_addr.s_addr = 0xffffffffu;
+
+ m->m_len = sizeof(struct bootp_t) -
+ sizeof(struct ip) - sizeof(struct udphdr);
+ udp_output2(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY);
+}
+
+void bootp_input(struct mbuf *m)
+{
+ struct bootp_t *bp = mtod(m, struct bootp_t *);
+
+ if (bp->bp_op == BOOTP_REQUEST) {
+ bootp_reply(m->slirp, bp);
+ }
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.h
new file mode 100644
index 0000000..30c30ab
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.h
@@ -0,0 +1,122 @@
+/* bootp/dhcp defines */
+
+#define BOOTP_SERVER 67
+#define BOOTP_CLIENT 68
+
+#define BOOTP_REQUEST 1
+#define BOOTP_REPLY 2
+
+#define RFC1533_COOKIE 99, 130, 83, 99
+#define RFC1533_PAD 0
+#define RFC1533_NETMASK 1
+#define RFC1533_TIMEOFFSET 2
+#define RFC1533_GATEWAY 3
+#define RFC1533_TIMESERVER 4
+#define RFC1533_IEN116NS 5
+#define RFC1533_DNS 6
+#define RFC1533_LOGSERVER 7
+#define RFC1533_COOKIESERVER 8
+#define RFC1533_LPRSERVER 9
+#define RFC1533_IMPRESSSERVER 10
+#define RFC1533_RESOURCESERVER 11
+#define RFC1533_HOSTNAME 12
+#define RFC1533_BOOTFILESIZE 13
+#define RFC1533_MERITDUMPFILE 14
+#define RFC1533_DOMAINNAME 15
+#define RFC1533_SWAPSERVER 16
+#define RFC1533_ROOTPATH 17
+#define RFC1533_EXTENSIONPATH 18
+#define RFC1533_IPFORWARDING 19
+#define RFC1533_IPSOURCEROUTING 20
+#define RFC1533_IPPOLICYFILTER 21
+#define RFC1533_IPMAXREASSEMBLY 22
+#define RFC1533_IPTTL 23
+#define RFC1533_IPMTU 24
+#define RFC1533_IPMTUPLATEAU 25
+#define RFC1533_INTMTU 26
+#define RFC1533_INTLOCALSUBNETS 27
+#define RFC1533_INTBROADCAST 28
+#define RFC1533_INTICMPDISCOVER 29
+#define RFC1533_INTICMPRESPOND 30
+#define RFC1533_INTROUTEDISCOVER 31
+#define RFC1533_INTROUTESOLICIT 32
+#define RFC1533_INTSTATICROUTES 33
+#define RFC1533_LLTRAILERENCAP 34
+#define RFC1533_LLARPCACHETMO 35
+#define RFC1533_LLETHERNETENCAP 36
+#define RFC1533_TCPTTL 37
+#define RFC1533_TCPKEEPALIVETMO 38
+#define RFC1533_TCPKEEPALIVEGB 39
+#define RFC1533_NISDOMAIN 40
+#define RFC1533_NISSERVER 41
+#define RFC1533_NTPSERVER 42
+#define RFC1533_VENDOR 43
+#define RFC1533_NBNS 44
+#define RFC1533_NBDD 45
+#define RFC1533_NBNT 46
+#define RFC1533_NBSCOPE 47
+#define RFC1533_XFS 48
+#define RFC1533_XDM 49
+
+#define RFC2132_REQ_ADDR 50
+#define RFC2132_LEASE_TIME 51
+#define RFC2132_MSG_TYPE 53
+#define RFC2132_SRV_ID 54
+#define RFC2132_PARAM_LIST 55
+#define RFC2132_MESSAGE 56
+#define RFC2132_MAX_SIZE 57
+#define RFC2132_RENEWAL_TIME 58
+#define RFC2132_REBIND_TIME 59
+
+#define DHCPDISCOVER 1
+#define DHCPOFFER 2
+#define DHCPREQUEST 3
+#define DHCPACK 5
+#define DHCPNAK 6
+
+#define RFC1533_VENDOR_MAJOR 0
+#define RFC1533_VENDOR_MINOR 0
+
+#define RFC1533_VENDOR_MAGIC 128
+#define RFC1533_VENDOR_ADDPARM 129
+#define RFC1533_VENDOR_ETHDEV 130
+#define RFC1533_VENDOR_HOWTO 132
+#define RFC1533_VENDOR_MNUOPTS 160
+#define RFC1533_VENDOR_SELECTION 176
+#define RFC1533_VENDOR_MOTD 184
+#define RFC1533_VENDOR_NUMOFMOTD 8
+#define RFC1533_VENDOR_IMG 192
+#define RFC1533_VENDOR_NUMOFIMG 16
+
+#define RFC1533_END 255
+#define BOOTP_VENDOR_LEN 64
+#define DHCP_OPT_LEN 312
+
+struct bootp_t {
+ struct ip ip;
+ struct udphdr udp;
+ uint8_t bp_op;
+ uint8_t bp_htype;
+ uint8_t bp_hlen;
+ uint8_t bp_hops;
+ uint32_t bp_xid;
+ uint16_t bp_secs;
+ uint16_t unused;
+ struct in_addr bp_ciaddr;
+ struct in_addr bp_yiaddr;
+ struct in_addr bp_siaddr;
+ struct in_addr bp_giaddr;
+ uint8_t bp_hwaddr[16];
+ uint8_t bp_sname[64];
+ uint8_t bp_file[128];
+ uint8_t bp_vend[DHCP_OPT_LEN];
+};
+
+typedef struct {
+ uint16_t allocated;
+ uint8_t macaddr[6];
+} BOOTPClient;
+
+#define NB_BOOTP_CLIENTS 16
+
+void bootp_input(struct mbuf *m);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/cksum.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/cksum.c
new file mode 100644
index 0000000..5aa9060
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/cksum.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 1988, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93
+ * in_cksum.c,v 1.2 1994/08/02 07:48:16 davidg Exp
+ */
+
+#include "slirp.h"
+
+/*
+ * Checksum routine for Internet Protocol family headers (Portable Version).
+ *
+ * This routine is very heavily used in the network
+ * code and should be modified for each CPU to be as fast as possible.
+ *
+ * XXX Since we will never span more than 1 mbuf, we can optimise this
+ */
+
+#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x)
+#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; \
+ (void)ADDCARRY(sum);}
+
+int cksum(struct mbuf *m, int len)
+{
+ register uint16_t *w;
+ register int sum = 0;
+ register int mlen = 0;
+ int byte_swapped = 0;
+
+ union {
+ uint8_t c[2];
+ uint16_t s;
+ } s_util;
+ union {
+ uint16_t s[2];
+ uint32_t l;
+ } l_util;
+
+ if (m->m_len == 0)
+ goto cont;
+ w = mtod(m, uint16_t *);
+
+ mlen = m->m_len;
+
+ if (len < mlen)
+ mlen = len;
+#ifdef DEBUG
+ len -= mlen;
+#endif
+ /*
+ * Force to even boundary.
+ */
+ if ((1 & (long) w) && (mlen > 0)) {
+ REDUCE;
+ sum <<= 8;
+ s_util.c[0] = *(uint8_t *)w;
+ w = (uint16_t *)((int8_t *)w + 1);
+ mlen--;
+ byte_swapped = 1;
+ }
+ /*
+ * Unroll the loop to make overhead from
+ * branches &c small.
+ */
+ while ((mlen -= 32) >= 0) {
+ sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
+ sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
+ sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11];
+ sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15];
+ w += 16;
+ }
+ mlen += 32;
+ while ((mlen -= 8) >= 0) {
+ sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
+ w += 4;
+ }
+ mlen += 8;
+ if (mlen == 0 && byte_swapped == 0)
+ goto cont;
+ REDUCE;
+ while ((mlen -= 2) >= 0) {
+ sum += *w++;
+ }
+
+ if (byte_swapped) {
+ REDUCE;
+ sum <<= 8;
+ if (mlen == -1) {
+ s_util.c[1] = *(uint8_t *)w;
+ sum += s_util.s;
+ mlen = 0;
+ } else
+
+ mlen = -1;
+ } else if (mlen == -1)
+ s_util.c[0] = *(uint8_t *)w;
+
+cont:
+#ifdef DEBUG
+ if (len) {
+ DEBUG_ERROR((dfd, "cksum: out of data\n"));
+ DEBUG_ERROR((dfd, " len = %d\n", len));
+ }
+#endif
+ if (mlen == -1) {
+ /* The last mbuf has odd # of bytes. Follow the
+ standard (the odd byte may be shifted left by 8 bits
+ or not as determined by endian-ness of the machine) */
+ s_util.c[1] = 0;
+ sum += s_util.s;
+ }
+ REDUCE;
+ return (~sum & 0xffff);
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/debug.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/debug.h
new file mode 100644
index 0000000..6cfa61e
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/debug.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+//#define DEBUG 1
+
+#ifdef DEBUG
+
+#define DBG_CALL 0x1
+#define DBG_MISC 0x2
+#define DBG_ERROR 0x4
+
+#define dfd stderr
+
+extern int slirp_debug;
+
+#define DEBUG_CALL(x) if (slirp_debug & DBG_CALL) { fprintf(dfd, "%s...\n", x); fflush(dfd); }
+#define DEBUG_ARG(x, y) if (slirp_debug & DBG_CALL) { fputc(' ', dfd); fprintf(dfd, x, y); fputc('\n', dfd); fflush(dfd); }
+#define DEBUG_ARGS(x) if (slirp_debug & DBG_CALL) { fprintf x ; fflush(dfd); }
+#define DEBUG_MISC(x) if (slirp_debug & DBG_MISC) { fprintf x ; fflush(dfd); }
+#define DEBUG_ERROR(x) if (slirp_debug & DBG_ERROR) {fprintf x ; fflush(dfd); }
+
+#else
+
+#define DEBUG_CALL(x)
+#define DEBUG_ARG(x, y)
+#define DEBUG_ARGS(x)
+#define DEBUG_MISC(x)
+#define DEBUG_ERROR(x)
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.c
new file mode 100644
index 0000000..e6d114a
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.c
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+
+#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm))
+
+static void
+ifs_insque(struct mbuf *ifm, struct mbuf *ifmhead)
+{
+ ifm->ifs_next = ifmhead->ifs_next;
+ ifmhead->ifs_next = ifm;
+ ifm->ifs_prev = ifmhead;
+ ifm->ifs_next->ifs_prev = ifm;
+}
+
+static void
+ifs_remque(struct mbuf *ifm)
+{
+ ifm->ifs_prev->ifs_next = ifm->ifs_next;
+ ifm->ifs_next->ifs_prev = ifm->ifs_prev;
+}
+
+void
+if_init(Slirp *slirp)
+{
+ slirp->if_fastq.ifq_next = slirp->if_fastq.ifq_prev = &slirp->if_fastq;
+ slirp->if_batchq.ifq_next = slirp->if_batchq.ifq_prev = &slirp->if_batchq;
+ slirp->next_m = &slirp->if_batchq;
+}
+
+/*
+ * if_output: Queue packet into an output queue.
+ * There are 2 output queue's, if_fastq and if_batchq.
+ * Each output queue is a doubly linked list of double linked lists
+ * of mbufs, each list belonging to one "session" (socket). This
+ * way, we can output packets fairly by sending one packet from each
+ * session, instead of all the packets from one session, then all packets
+ * from the next session, etc. Packets on the if_fastq get absolute
+ * priority, but if one session hogs the link, it gets "downgraded"
+ * to the batchq until it runs out of packets, then it'll return
+ * to the fastq (eg. if the user does an ls -alR in a telnet session,
+ * it'll temporarily get downgraded to the batchq)
+ */
+void
+if_output(struct socket *so, struct mbuf *ifm)
+{
+ Slirp *slirp = ifm->slirp;
+ struct mbuf *ifq;
+ int on_fastq = 1;
+
+ DEBUG_CALL("if_output");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("ifm = %lx", (long)ifm);
+
+ /*
+ * First remove the mbuf from m_usedlist,
+ * since we're gonna use m_next and m_prev ourselves
+ * XXX Shouldn't need this, gotta change dtom() etc.
+ */
+ if (ifm->m_flags & M_USEDLIST) {
+ remque(ifm);
+ ifm->m_flags &= ~M_USEDLIST;
+ }
+
+ /*
+ * See if there's already a batchq list for this session.
+ * This can include an interactive session, which should go on fastq,
+ * but gets too greedy... hence it'll be downgraded from fastq to batchq.
+ * We mustn't put this packet back on the fastq (or we'll send it out of order)
+ * XXX add cache here?
+ */
+ for (ifq = slirp->if_batchq.ifq_prev; ifq != &slirp->if_batchq;
+ ifq = ifq->ifq_prev) {
+ if (so == ifq->ifq_so) {
+ /* A match! */
+ ifm->ifq_so = so;
+ ifs_insque(ifm, ifq->ifs_prev);
+ goto diddit;
+ }
+ }
+
+ /* No match, check which queue to put it on */
+ if (so && (so->so_iptos & IPTOS_LOWDELAY)) {
+ ifq = slirp->if_fastq.ifq_prev;
+ on_fastq = 1;
+ /*
+ * Check if this packet is a part of the last
+ * packet's session
+ */
+ if (ifq->ifq_so == so) {
+ ifm->ifq_so = so;
+ ifs_insque(ifm, ifq->ifs_prev);
+ goto diddit;
+ }
+ } else
+ ifq = slirp->if_batchq.ifq_prev;
+
+ /* Create a new doubly linked list for this session */
+ ifm->ifq_so = so;
+ ifs_init(ifm);
+ insque(ifm, ifq);
+
+diddit:
+ slirp->if_queued++;
+
+ if (so) {
+ /* Update *_queued */
+ so->so_queued++;
+ so->so_nqueued++;
+ /*
+ * Check if the interactive session should be downgraded to
+ * the batchq. A session is downgraded if it has queued 6
+ * packets without pausing, and at least 3 of those packets
+ * have been sent over the link
+ * (XXX These are arbitrary numbers, probably not optimal..)
+ */
+ if (on_fastq && ((so->so_nqueued >= 6) &&
+ (so->so_nqueued - so->so_queued) >= 3)) {
+
+ /* Remove from current queue... */
+ remque(ifm->ifs_next);
+
+ /* ...And insert in the new. That'll teach ya! */
+ insque(ifm->ifs_next, &slirp->if_batchq);
+ }
+ }
+
+#ifndef FULL_BOLT
+ /*
+ * This prevents us from malloc()ing too many mbufs
+ */
+ if_start(ifm->slirp);
+#endif
+}
+
+/*
+ * Send a packet
+ * We choose a packet based on it's position in the output queues;
+ * If there are packets on the fastq, they are sent FIFO, before
+ * everything else. Otherwise we choose the first packet from the
+ * batchq and send it. the next packet chosen will be from the session
+ * after this one, then the session after that one, and so on.. So,
+ * for example, if there are 3 ftp session's fighting for bandwidth,
+ * one packet will be sent from the first session, then one packet
+ * from the second session, then one packet from the third, then back
+ * to the first, etc. etc.
+ */
+void
+if_start(Slirp *slirp)
+{
+ struct mbuf *ifm, *ifqt;
+
+ DEBUG_CALL("if_start");
+
+ if (slirp->if_queued == 0)
+ return; /* Nothing to do */
+
+ again:
+ /* check if we can really output */
+ if (!slirp_can_output(slirp->opaque))
+ return;
+
+ /*
+ * See which queue to get next packet from
+ * If there's something in the fastq, select it immediately
+ */
+ if (slirp->if_fastq.ifq_next != &slirp->if_fastq) {
+ ifm = slirp->if_fastq.ifq_next;
+ } else {
+ /* Nothing on fastq, see if next_m is valid */
+ if (slirp->next_m != &slirp->if_batchq)
+ ifm = slirp->next_m;
+ else
+ ifm = slirp->if_batchq.ifq_next;
+
+ /* Set which packet to send on next iteration */
+ slirp->next_m = ifm->ifq_next;
+ }
+ /* Remove it from the queue */
+ ifqt = ifm->ifq_prev;
+ remque(ifm);
+ slirp->if_queued--;
+
+ /* If there are more packets for this session, re-queue them */
+ if (ifm->ifs_next != /* ifm->ifs_prev != */ ifm) {
+ insque(ifm->ifs_next, ifqt);
+ ifs_remque(ifm);
+ }
+
+ /* Update so_queued */
+ if (ifm->ifq_so) {
+ if (--ifm->ifq_so->so_queued == 0)
+ /* If there's no more queued, reset nqueued */
+ ifm->ifq_so->so_nqueued = 0;
+ }
+
+ /* Encapsulate the packet for sending */
+ if_encap(slirp, (uint8_t *)ifm->m_data, ifm->m_len);
+
+ m_free(ifm);
+
+ if (slirp->if_queued)
+ goto again;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.h
new file mode 100644
index 0000000..2dac1c7
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#ifndef _IF_H_
+#define _IF_H_
+
+#define IF_COMPRESS 0x01 /* We want compression */
+#define IF_NOCOMPRESS 0x02 /* Do not do compression */
+#define IF_AUTOCOMP 0x04 /* Autodetect (default) */
+#define IF_NOCIDCOMP 0x08 /* CID compression */
+
+#define IF_MTU 1500
+#define IF_MRU 1500
+#define IF_COMP IF_AUTOCOMP /* Flags for compression */
+
+/* 2 for alignment, 14 for ethernet, 40 for TCP/IP */
+#define IF_MAXLINKHDR (2 + 14 + 40)
+
+#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm))
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip.h
new file mode 100644
index 0000000..48ea38e
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip.h
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip.h 8.1 (Berkeley) 6/10/93
+ * ip.h,v 1.3 1994/08/21 05:27:30 paul Exp
+ */
+
+#ifndef _IP_H_
+#define _IP_H_
+
+#ifdef HOST_WORDS_BIGENDIAN
+# ifndef NTOHL
+# define NTOHL(d)
+# endif
+# ifndef NTOHS
+# define NTOHS(d)
+# endif
+# ifndef HTONL
+# define HTONL(d)
+# endif
+# ifndef HTONS
+# define HTONS(d)
+# endif
+#else
+# ifndef NTOHL
+# define NTOHL(d) ((d) = ntohl((d)))
+# endif
+# ifndef NTOHS
+# define NTOHS(d) ((d) = ntohs((uint16_t)(d)))
+# endif
+# ifndef HTONL
+# define HTONL(d) ((d) = htonl((d)))
+# endif
+# ifndef HTONS
+# define HTONS(d) ((d) = htons((uint16_t)(d)))
+# endif
+#endif
+
+typedef uint32_t n_long; /* long as received from the net */
+
+/*
+ * Definitions for internet protocol version 4.
+ * Per RFC 791, September 1981.
+ */
+#define IPVERSION 4
+
+/*
+ * Structure of an internet header, naked of options.
+ */
+struct ip {
+#ifdef HOST_WORDS_BIGENDIAN
+ u_int ip_v:4, /* version */
+ ip_hl:4; /* header length */
+#else
+ u_int ip_hl:4, /* header length */
+ ip_v:4; /* version */
+#endif
+ uint8_t ip_tos; /* type of service */
+ uint16_t ip_len; /* total length */
+ uint16_t ip_id; /* identification */
+ uint16_t ip_off; /* fragment offset field */
+#define IP_DF 0x4000 /* don't fragment flag */
+#define IP_MF 0x2000 /* more fragments flag */
+#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
+ uint8_t ip_ttl; /* time to live */
+ uint8_t ip_p; /* protocol */
+ uint16_t ip_sum; /* checksum */
+ struct in_addr ip_src,ip_dst; /* source and dest address */
+} __attribute__((packed));
+
+#define IP_MAXPACKET 65535 /* maximum packet size */
+
+/*
+ * Definitions for IP type of service (ip_tos)
+ */
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_RELIABILITY 0x04
+
+/*
+ * Definitions for options.
+ */
+#define IPOPT_COPIED(o) ((o)&0x80)
+#define IPOPT_CLASS(o) ((o)&0x60)
+#define IPOPT_NUMBER(o) ((o)&0x1f)
+
+#define IPOPT_CONTROL 0x00
+#define IPOPT_RESERVED1 0x20
+#define IPOPT_DEBMEAS 0x40
+#define IPOPT_RESERVED2 0x60
+
+#define IPOPT_EOL 0 /* end of option list */
+#define IPOPT_NOP 1 /* no operation */
+
+#define IPOPT_RR 7 /* record packet route */
+#define IPOPT_TS 68 /* timestamp */
+#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */
+#define IPOPT_LSRR 131 /* loose source route */
+#define IPOPT_SATID 136 /* satnet id */
+#define IPOPT_SSRR 137 /* strict source route */
+
+/*
+ * Offsets to fields in options other than EOL and NOP.
+ */
+#define IPOPT_OPTVAL 0 /* option ID */
+#define IPOPT_OLEN 1 /* option length */
+#define IPOPT_OFFSET 2 /* offset within option */
+#define IPOPT_MINOFF 4 /* min value of above */
+
+/*
+ * Time stamp option structure.
+ */
+struct ip_timestamp {
+ uint8_t ipt_code; /* IPOPT_TS */
+ uint8_t ipt_len; /* size of structure (variable) */
+ uint8_t ipt_ptr; /* index of current entry */
+#ifdef HOST_WORDS_BIGENDIAN
+ u_int ipt_oflw:4, /* overflow counter */
+ ipt_flg:4; /* flags, see below */
+#else
+ u_int ipt_flg:4, /* flags, see below */
+ ipt_oflw:4; /* overflow counter */
+#endif
+ union ipt_timestamp {
+ n_long ipt_time[1];
+ struct ipt_ta {
+ struct in_addr ipt_addr;
+ n_long ipt_time;
+ } ipt_ta[1];
+ } ipt_timestamp;
+} __attribute__((packed));
+
+/* flag bits for ipt_flg */
+#define IPOPT_TS_TSONLY 0 /* timestamps only */
+#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
+#define IPOPT_TS_PRESPEC 3 /* specified modules only */
+
+/* bits for security (not byte swapped) */
+#define IPOPT_SECUR_UNCLASS 0x0000
+#define IPOPT_SECUR_CONFID 0xf135
+#define IPOPT_SECUR_EFTO 0x789a
+#define IPOPT_SECUR_MMMM 0xbc4d
+#define IPOPT_SECUR_RESTR 0xaf13
+#define IPOPT_SECUR_SECRET 0xd788
+#define IPOPT_SECUR_TOPSECRET 0x6bc5
+
+/*
+ * Internet implementation parameters.
+ */
+#define MAXTTL 255 /* maximum time to live (seconds) */
+#define IPDEFTTL 64 /* default ttl, from RFC 1340 */
+#define IPFRAGTTL 60 /* time to live for frags, slowhz */
+#define IPTTLDEC 1 /* subtracted when forwarding */
+
+#define IP_MSS 576 /* default maximum segment size */
+
+#if SIZEOF_CHAR_P == 4
+struct mbuf_ptr {
+ struct mbuf *mptr;
+ uint32_t dummy;
+} __attribute__((packed));
+#else
+struct mbuf_ptr {
+ struct mbuf *mptr;
+} __attribute__((packed));
+#endif
+struct qlink {
+ void *next, *prev;
+};
+
+/*
+ * Overlay for ip header used by other protocols (tcp, udp).
+ */
+struct ipovly {
+ struct mbuf_ptr ih_mbuf; /* backpointer to mbuf */
+ uint8_t ih_x1; /* (unused) */
+ uint8_t ih_pr; /* protocol */
+ uint16_t ih_len; /* protocol length */
+ struct in_addr ih_src; /* source internet address */
+ struct in_addr ih_dst; /* destination internet address */
+} __attribute__((packed));
+
+/*
+ * Ip reassembly queue structure. Each fragment
+ * being reassembled is attached to one of these structures.
+ * They are timed out after ipq_ttl drops to 0, and may also
+ * be reclaimed if memory becomes tight.
+ * size 28 bytes
+ */
+struct ipq {
+ struct qlink frag_link; /* to ip headers of fragments */
+ struct qlink ip_link; /* to other reass headers */
+ uint8_t ipq_ttl; /* time for reass q to live */
+ uint8_t ipq_p; /* protocol of this fragment */
+ uint16_t ipq_id; /* sequence id for reassembly */
+ struct in_addr ipq_src,ipq_dst;
+} __attribute__((packed));
+
+/*
+ * Ip header, when holding a fragment.
+ *
+ * Note: ipf_link must be at same offset as frag_link above
+ */
+struct ipasfrag {
+ struct qlink ipf_link;
+ struct ip ipf_ip;
+} __attribute__((packed));
+
+#define ipf_off ipf_ip.ip_off
+#define ipf_tos ipf_ip.ip_tos
+#define ipf_len ipf_ip.ip_len
+#define ipf_next ipf_link.next
+#define ipf_prev ipf_link.prev
+
+/*
+ * Structure stored in mbuf in inpcb.ip_options
+ * and passed to ip_output when ip options are in use.
+ * The actual length of the options (including ipopt_dst)
+ * is in m_len.
+ */
+#define MAX_IPOPTLEN 40
+
+struct ipoption {
+ struct in_addr ipopt_dst; /* first-hop dst if source routed */
+ int8_t ipopt_list[MAX_IPOPTLEN]; /* options proper */
+} __attribute__((packed));
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.c
new file mode 100644
index 0000000..751a8e2
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.c
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip_icmp.c 8.2 (Berkeley) 1/4/94
+ * ip_icmp.c,v 1.7 1995/05/30 08:09:42 rgrimes Exp
+ */
+
+#include "slirp.h"
+#include "ip_icmp.h"
+
+/* The message sent when emulating PING */
+/* Be nice and tell them it's just a pseudo-ping packet */
+static const char icmp_ping_msg[] = "This is a pseudo-PING packet used by Slirp to emulate ICMP ECHO-REQUEST packets.\n";
+
+/* list of actions for icmp_error() on RX of an icmp message */
+static const int icmp_flush[19] = {
+/* ECHO REPLY (0) */ 0,
+ 1,
+ 1,
+/* DEST UNREACH (3) */ 1,
+/* SOURCE QUENCH (4)*/ 1,
+/* REDIRECT (5) */ 1,
+ 1,
+ 1,
+/* ECHO (8) */ 0,
+/* ROUTERADVERT (9) */ 1,
+/* ROUTERSOLICIT (10) */ 1,
+/* TIME EXCEEDED (11) */ 1,
+/* PARAMETER PROBLEM (12) */ 1,
+/* TIMESTAMP (13) */ 0,
+/* TIMESTAMP REPLY (14) */ 0,
+/* INFO (15) */ 0,
+/* INFO REPLY (16) */ 0,
+/* ADDR MASK (17) */ 0,
+/* ADDR MASK REPLY (18) */ 0
+};
+
+/*
+ * Process a received ICMP message.
+ */
+void
+icmp_input(struct mbuf *m, int hlen)
+{
+ register struct icmp *icp;
+ register struct ip *ip=mtod(m, struct ip *);
+ int icmplen=ip->ip_len;
+ Slirp *slirp = m->slirp;
+
+ DEBUG_CALL("icmp_input");
+ DEBUG_ARG("m = %lx", (long )m);
+ DEBUG_ARG("m_len = %d", m->m_len);
+
+ /*
+ * Locate icmp structure in mbuf, and check
+ * that its not corrupted and of at least minimum length.
+ */
+ if (icmplen < ICMP_MINLEN) { /* min 8 bytes payload */
+ freeit:
+ m_freem(m);
+ goto end_error;
+ }
+
+ m->m_len -= hlen;
+ m->m_data += hlen;
+ icp = mtod(m, struct icmp *);
+ if (cksum(m, icmplen)) {
+ goto freeit;
+ }
+ m->m_len += hlen;
+ m->m_data -= hlen;
+
+ DEBUG_ARG("icmp_type = %d", icp->icmp_type);
+ switch (icp->icmp_type) {
+ case ICMP_ECHO:
+ icp->icmp_type = ICMP_ECHOREPLY;
+ ip->ip_len += hlen; /* since ip_input subtracts this */
+ if (ip->ip_dst.s_addr == slirp->vhost_addr.s_addr) {
+ icmp_reflect(m);
+ } else {
+ struct socket *so;
+ struct sockaddr_in addr;
+ if ((so = socreate(slirp)) == NULL) goto freeit;
+ if(udp_attach(so) == -1) {
+ DEBUG_MISC((dfd,"icmp_input udp_attach errno = %d-%s\n",
+ errno,strerror(errno)));
+ sofree(so);
+ m_free(m);
+ goto end_error;
+ }
+ so->so_m = m;
+ so->so_faddr = ip->ip_dst;
+ so->so_fport = htons(7);
+ so->so_laddr = ip->ip_src;
+ so->so_lport = htons(9);
+ so->so_iptos = ip->ip_tos;
+ so->so_type = IPPROTO_ICMP;
+ so->so_state = SS_ISFCONNECTED;
+
+ /* Send the packet */
+ addr.sin_family = AF_INET;
+ if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
+ slirp->vnetwork_addr.s_addr) {
+ /* It's an alias */
+ if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) {
+ if (get_dns_addr(&addr.sin_addr) < 0)
+ addr.sin_addr = loopback_addr;
+ } else {
+ addr.sin_addr = loopback_addr;
+ }
+ } else {
+ addr.sin_addr = so->so_faddr;
+ }
+ addr.sin_port = so->so_fport;
+ if(sendto(so->s, icmp_ping_msg, strlen(icmp_ping_msg), 0,
+ (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+ DEBUG_MISC((dfd,"icmp_input udp sendto tx errno = %d-%s\n",
+ errno,strerror(errno)));
+ icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno));
+ udp_detach(so);
+ }
+ } /* if ip->ip_dst.s_addr == alias_addr.s_addr */
+ break;
+ case ICMP_UNREACH:
+ /* XXX? report error? close socket? */
+ case ICMP_TIMXCEED:
+ case ICMP_PARAMPROB:
+ case ICMP_SOURCEQUENCH:
+ case ICMP_TSTAMP:
+ case ICMP_MASKREQ:
+ case ICMP_REDIRECT:
+ m_freem(m);
+ break;
+
+ default:
+ m_freem(m);
+ } /* swith */
+
+end_error:
+ /* m is m_free()'d xor put in a socket xor or given to ip_send */
+ return;
+}
+
+
+/*
+ * Send an ICMP message in response to a situation
+ *
+ * RFC 1122: 3.2.2 MUST send at least the IP header and 8 bytes of header. MAY send more (we do).
+ * MUST NOT change this header information.
+ * MUST NOT reply to a multicast/broadcast IP address.
+ * MUST NOT reply to a multicast/broadcast MAC address.
+ * MUST reply to only the first fragment.
+ */
+/*
+ * Send ICMP_UNREACH back to the source regarding msrc.
+ * mbuf *msrc is used as a template, but is NOT m_free()'d.
+ * It is reported as the bad ip packet. The header should
+ * be fully correct and in host byte order.
+ * ICMP fragmentation is illegal. All machines must accept 576 bytes in one
+ * packet. The maximum payload is 576-20(ip hdr)-8(icmp hdr)=548
+ */
+
+#define ICMP_MAXDATALEN (IP_MSS-28)
+void
+icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize,
+ const char *message)
+{
+ unsigned hlen, shlen, s_ip_len;
+ register struct ip *ip;
+ register struct icmp *icp;
+ register struct mbuf *m;
+
+ DEBUG_CALL("icmp_error");
+ DEBUG_ARG("msrc = %lx", (long )msrc);
+ DEBUG_ARG("msrc_len = %d", msrc->m_len);
+
+ if(type!=ICMP_UNREACH && type!=ICMP_TIMXCEED) goto end_error;
+
+ /* check msrc */
+ if(!msrc) goto end_error;
+ ip = mtod(msrc, struct ip *);
+#ifdef DEBUG
+ { char bufa[20], bufb[20];
+ strcpy(bufa, inet_ntoa(ip->ip_src));
+ strcpy(bufb, inet_ntoa(ip->ip_dst));
+ DEBUG_MISC((dfd, " %.16s to %.16s\n", bufa, bufb));
+ }
+#endif
+ if(ip->ip_off & IP_OFFMASK) goto end_error; /* Only reply to fragment 0 */
+
+ shlen=ip->ip_hl << 2;
+ s_ip_len=ip->ip_len;
+ if(ip->ip_p == IPPROTO_ICMP) {
+ icp = (struct icmp *)((char *)ip + shlen);
+ /*
+ * Assume any unknown ICMP type is an error. This isn't
+ * specified by the RFC, but think about it..
+ */
+ if(icp->icmp_type>18 || icmp_flush[icp->icmp_type]) goto end_error;
+ }
+
+ /* make a copy */
+ m = m_get(msrc->slirp);
+ if (!m) {
+ goto end_error;
+ }
+
+ { int new_m_size;
+ new_m_size=sizeof(struct ip )+ICMP_MINLEN+msrc->m_len+ICMP_MAXDATALEN;
+ if(new_m_size>m->m_size) m_inc(m, new_m_size);
+ }
+ memcpy(m->m_data, msrc->m_data, msrc->m_len);
+ m->m_len = msrc->m_len; /* copy msrc to m */
+
+ /* make the header of the reply packet */
+ ip = mtod(m, struct ip *);
+ hlen= sizeof(struct ip ); /* no options in reply */
+
+ /* fill in icmp */
+ m->m_data += hlen;
+ m->m_len -= hlen;
+
+ icp = mtod(m, struct icmp *);
+
+ if(minsize) s_ip_len=shlen+ICMP_MINLEN; /* return header+8b only */
+ else if(s_ip_len>ICMP_MAXDATALEN) /* maximum size */
+ s_ip_len=ICMP_MAXDATALEN;
+
+ m->m_len=ICMP_MINLEN+s_ip_len; /* 8 bytes ICMP header */
+
+ /* min. size = 8+sizeof(struct ip)+8 */
+
+ icp->icmp_type = type;
+ icp->icmp_code = code;
+ icp->icmp_id = 0;
+ icp->icmp_seq = 0;
+
+ memcpy(&icp->icmp_ip, msrc->m_data, s_ip_len); /* report the ip packet */
+ HTONS(icp->icmp_ip.ip_len);
+ HTONS(icp->icmp_ip.ip_id);
+ HTONS(icp->icmp_ip.ip_off);
+
+#ifdef DEBUG
+ if(message) { /* DEBUG : append message to ICMP packet */
+ int message_len;
+ char *cpnt;
+ message_len=strlen(message);
+ if(message_len>ICMP_MAXDATALEN) message_len=ICMP_MAXDATALEN;
+ cpnt=(char *)m->m_data+m->m_len;
+ memcpy(cpnt, message, message_len);
+ m->m_len+=message_len;
+ }
+#endif
+
+ icp->icmp_cksum = 0;
+ icp->icmp_cksum = cksum(m, m->m_len);
+
+ m->m_data -= hlen;
+ m->m_len += hlen;
+
+ /* fill in ip */
+ ip->ip_hl = hlen >> 2;
+ ip->ip_len = m->m_len;
+
+ ip->ip_tos=((ip->ip_tos & 0x1E) | 0xC0); /* high priority for errors */
+
+ ip->ip_ttl = MAXTTL;
+ ip->ip_p = IPPROTO_ICMP;
+ ip->ip_dst = ip->ip_src; /* ip adresses */
+ ip->ip_src = m->slirp->vhost_addr;
+
+ (void ) ip_output((struct socket *)NULL, m);
+
+end_error:
+ return;
+}
+#undef ICMP_MAXDATALEN
+
+/*
+ * Reflect the ip packet back to the source
+ */
+void
+icmp_reflect(struct mbuf *m)
+{
+ register struct ip *ip = mtod(m, struct ip *);
+ int hlen = ip->ip_hl << 2;
+ int optlen = hlen - sizeof(struct ip );
+ register struct icmp *icp;
+
+ /*
+ * Send an icmp packet back to the ip level,
+ * after supplying a checksum.
+ */
+ m->m_data += hlen;
+ m->m_len -= hlen;
+ icp = mtod(m, struct icmp *);
+
+ icp->icmp_cksum = 0;
+ icp->icmp_cksum = cksum(m, ip->ip_len - hlen);
+
+ m->m_data -= hlen;
+ m->m_len += hlen;
+
+ /* fill in ip */
+ if (optlen > 0) {
+ /*
+ * Strip out original options by copying rest of first
+ * mbuf's data back, and adjust the IP length.
+ */
+ memmove((caddr_t)(ip + 1), (caddr_t)ip + hlen,
+ (unsigned )(m->m_len - hlen));
+ hlen -= optlen;
+ ip->ip_hl = hlen >> 2;
+ ip->ip_len -= optlen;
+ m->m_len -= optlen;
+ }
+
+ ip->ip_ttl = MAXTTL;
+ { /* swap */
+ struct in_addr icmp_dst;
+ icmp_dst = ip->ip_dst;
+ ip->ip_dst = ip->ip_src;
+ ip->ip_src = icmp_dst;
+ }
+
+ (void ) ip_output((struct socket *)NULL, m);
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.h
new file mode 100644
index 0000000..2692822
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.h
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93
+ * ip_icmp.h,v 1.4 1995/05/30 08:09:43 rgrimes Exp
+ */
+
+#ifndef _NETINET_IP_ICMP_H_
+#define _NETINET_IP_ICMP_H_
+
+/*
+ * Interface Control Message Protocol Definitions.
+ * Per RFC 792, September 1981.
+ */
+
+typedef uint32_t n_time;
+
+/*
+ * Structure of an icmp header.
+ */
+struct icmp {
+ u_char icmp_type; /* type of message, see below */
+ u_char icmp_code; /* type sub code */
+ u_short icmp_cksum; /* ones complement cksum of struct */
+ union {
+ u_char ih_pptr; /* ICMP_PARAMPROB */
+ struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
+ struct ih_idseq {
+ u_short icd_id;
+ u_short icd_seq;
+ } ih_idseq;
+ int ih_void;
+
+ /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
+ struct ih_pmtu {
+ u_short ipm_void;
+ u_short ipm_nextmtu;
+ } ih_pmtu;
+ } icmp_hun;
+#define icmp_pptr icmp_hun.ih_pptr
+#define icmp_gwaddr icmp_hun.ih_gwaddr
+#define icmp_id icmp_hun.ih_idseq.icd_id
+#define icmp_seq icmp_hun.ih_idseq.icd_seq
+#define icmp_void icmp_hun.ih_void
+#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
+#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
+ union {
+ struct id_ts {
+ n_time its_otime;
+ n_time its_rtime;
+ n_time its_ttime;
+ } id_ts;
+ struct id_ip {
+ struct ip idi_ip;
+ /* options and then 64 bits of data */
+ } id_ip;
+ uint32_t id_mask;
+ char id_data[1];
+ } icmp_dun;
+#define icmp_otime icmp_dun.id_ts.its_otime
+#define icmp_rtime icmp_dun.id_ts.its_rtime
+#define icmp_ttime icmp_dun.id_ts.its_ttime
+#define icmp_ip icmp_dun.id_ip.idi_ip
+#define icmp_mask icmp_dun.id_mask
+#define icmp_data icmp_dun.id_data
+};
+
+/*
+ * Lower bounds on packet lengths for various types.
+ * For the error advice packets must first insure that the
+ * packet is large enought to contain the returned ip header.
+ * Only then can we do the check to see if 64 bits of packet
+ * data have been returned, since we need to check the returned
+ * ip header length.
+ */
+#define ICMP_MINLEN 8 /* abs minimum */
+#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */
+#define ICMP_MASKLEN 12 /* address mask */
+#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */
+#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
+ /* N.B.: must separately check that ip_hl >= 5 */
+
+/*
+ * Definition of type and code field values.
+ */
+#define ICMP_ECHOREPLY 0 /* echo reply */
+#define ICMP_UNREACH 3 /* dest unreachable, codes: */
+#define ICMP_UNREACH_NET 0 /* bad net */
+#define ICMP_UNREACH_HOST 1 /* bad host */
+#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */
+#define ICMP_UNREACH_PORT 3 /* bad port */
+#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
+#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
+#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
+#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
+#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
+#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */
+#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */
+#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
+#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
+#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */
+#define ICMP_REDIRECT 5 /* shorter route, codes: */
+#define ICMP_REDIRECT_NET 0 /* for network */
+#define ICMP_REDIRECT_HOST 1 /* for host */
+#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
+#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
+#define ICMP_ECHO 8 /* echo service */
+#define ICMP_ROUTERADVERT 9 /* router advertisement */
+#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
+#define ICMP_TIMXCEED 11 /* time exceeded, code: */
+#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */
+#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */
+#define ICMP_PARAMPROB 12 /* ip header bad */
+#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */
+#define ICMP_TSTAMP 13 /* timestamp request */
+#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
+#define ICMP_IREQ 15 /* information request */
+#define ICMP_IREQREPLY 16 /* information reply */
+#define ICMP_MASKREQ 17 /* address mask request */
+#define ICMP_MASKREPLY 18 /* address mask reply */
+
+#define ICMP_MAXTYPE 18
+
+#define ICMP_INFOTYPE(type) \
+ ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
+ (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
+ (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
+ (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
+ (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
+
+void icmp_input(struct mbuf *, int);
+void icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize,
+ const char *message);
+void icmp_reflect(struct mbuf *);
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_input.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_input.c
new file mode 100644
index 0000000..50ab951
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_input.c
@@ -0,0 +1,685 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip_input.c 8.2 (Berkeley) 1/4/94
+ * ip_input.c,v 1.11 1994/11/16 10:17:08 jkh Exp
+ */
+
+/*
+ * Changes and additions relating to SLiRP are
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+#include "ip_icmp.h"
+
+#define container_of(ptr, type, member) ({ \
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+
+static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp);
+static void ip_freef(Slirp *slirp, struct ipq *fp);
+static void ip_enq(register struct ipasfrag *p,
+ register struct ipasfrag *prev);
+static void ip_deq(register struct ipasfrag *p);
+
+/*
+ * IP initialization: fill in IP protocol switch table.
+ * All protocols not implemented in kernel go to raw IP protocol handler.
+ */
+void
+ip_init(Slirp *slirp)
+{
+ slirp->ipq.ip_link.next = slirp->ipq.ip_link.prev = &slirp->ipq.ip_link;
+ udp_init(slirp);
+ tcp_init(slirp);
+}
+
+/*
+ * Ip input routine. Checksum and byte swap header. If fragmented
+ * try to reassemble. Process options. Pass to next level.
+ */
+void
+ip_input(struct mbuf *m)
+{
+ Slirp *slirp = m->slirp;
+ register struct ip *ip;
+ int hlen;
+
+ DEBUG_CALL("ip_input");
+ DEBUG_ARG("m = %lx", (long)m);
+ DEBUG_ARG("m_len = %d", m->m_len);
+
+ if (m->m_len < sizeof (struct ip)) {
+ return;
+ }
+
+ ip = mtod(m, struct ip *);
+
+ if (ip->ip_v != IPVERSION) {
+ goto bad;
+ }
+
+ hlen = ip->ip_hl << 2;
+ if (hlen<sizeof(struct ip ) || hlen>m->m_len) {/* min header length */
+ goto bad; /* or packet too short */
+ }
+
+ /* keep ip header intact for ICMP reply
+ * ip->ip_sum = cksum(m, hlen);
+ * if (ip->ip_sum) {
+ */
+ if(cksum(m,hlen)) {
+ goto bad;
+ }
+
+ /*
+ * Convert fields to host representation.
+ */
+ NTOHS(ip->ip_len);
+ if (ip->ip_len < hlen) {
+ goto bad;
+ }
+ NTOHS(ip->ip_id);
+ NTOHS(ip->ip_off);
+
+ /*
+ * Check that the amount of data in the buffers
+ * is as at least much as the IP header would have us expect.
+ * Trim mbufs if longer than we expect.
+ * Drop packet if shorter than we expect.
+ */
+ if (m->m_len < ip->ip_len) {
+ goto bad;
+ }
+
+ if (slirp->restricted) {
+ if ((ip->ip_dst.s_addr & slirp->vnetwork_mask.s_addr) ==
+ slirp->vnetwork_addr.s_addr) {
+ if (ip->ip_dst.s_addr == 0xffffffff && ip->ip_p != IPPROTO_UDP)
+ goto bad;
+ } else {
+ uint32_t inv_mask = ~slirp->vnetwork_mask.s_addr;
+ struct ex_list *ex_ptr;
+
+ if ((ip->ip_dst.s_addr & inv_mask) == inv_mask) {
+ goto bad;
+ }
+ for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
+ if (ex_ptr->ex_addr.s_addr == ip->ip_dst.s_addr)
+ break;
+
+ if (!ex_ptr)
+ goto bad;
+ }
+ }
+
+ /* Should drop packet if mbuf too long? hmmm... */
+ if (m->m_len > ip->ip_len)
+ m_adj(m, ip->ip_len - m->m_len);
+
+ /* check ip_ttl for a correct ICMP reply */
+ if(ip->ip_ttl==0) {
+ icmp_error(m, ICMP_TIMXCEED,ICMP_TIMXCEED_INTRANS, 0,"ttl");
+ goto bad;
+ }
+
+ /*
+ * If offset or IP_MF are set, must reassemble.
+ * Otherwise, nothing need be done.
+ * (We could look in the reassembly queue to see
+ * if the packet was previously fragmented,
+ * but it's not worth the time; just let them time out.)
+ *
+ * XXX This should fail, don't fragment yet
+ */
+ if (ip->ip_off &~ IP_DF) {
+ register struct ipq *fp;
+ struct qlink *l;
+ /*
+ * Look for queue of fragments
+ * of this datagram.
+ */
+ for (l = slirp->ipq.ip_link.next; l != &slirp->ipq.ip_link;
+ l = l->next) {
+ fp = container_of(l, struct ipq, ip_link);
+ if (ip->ip_id == fp->ipq_id &&
+ ip->ip_src.s_addr == fp->ipq_src.s_addr &&
+ ip->ip_dst.s_addr == fp->ipq_dst.s_addr &&
+ ip->ip_p == fp->ipq_p)
+ goto found;
+ }
+ fp = NULL;
+ found:
+
+ /*
+ * Adjust ip_len to not reflect header,
+ * set ip_mff if more fragments are expected,
+ * convert offset of this to bytes.
+ */
+ ip->ip_len -= hlen;
+ if (ip->ip_off & IP_MF)
+ ip->ip_tos |= 1;
+ else
+ ip->ip_tos &= ~1;
+
+ ip->ip_off <<= 3;
+
+ /*
+ * If datagram marked as having more fragments
+ * or if this is not the first fragment,
+ * attempt reassembly; if it succeeds, proceed.
+ */
+ if (ip->ip_tos & 1 || ip->ip_off) {
+ ip = ip_reass(slirp, ip, fp);
+ if (ip == NULL)
+ return;
+ m = dtom(slirp, ip);
+ } else
+ if (fp)
+ ip_freef(slirp, fp);
+
+ } else
+ ip->ip_len -= hlen;
+
+ /*
+ * Switch out to protocol's input routine.
+ */
+ switch (ip->ip_p) {
+ case IPPROTO_TCP:
+ tcp_input(m, hlen, (struct socket *)NULL);
+ break;
+ case IPPROTO_UDP:
+ udp_input(m, hlen);
+ break;
+ case IPPROTO_ICMP:
+ icmp_input(m, hlen);
+ break;
+ default:
+ m_free(m);
+ }
+ return;
+bad:
+ m_freem(m);
+ return;
+}
+
+#define iptofrag(P) ((struct ipasfrag *)(((char*)(P)) - sizeof(struct qlink)))
+#define fragtoip(P) ((struct ip*)(((char*)(P)) + sizeof(struct qlink)))
+/*
+ * Take incoming datagram fragment and try to
+ * reassemble it into whole datagram. If a chain for
+ * reassembly of this datagram already exists, then it
+ * is given as fp; otherwise have to make a chain.
+ */
+static struct ip *
+ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp)
+{
+ register struct mbuf *m = dtom(slirp, ip);
+ register struct ipasfrag *q;
+ int hlen = ip->ip_hl << 2;
+ int i, next;
+
+ DEBUG_CALL("ip_reass");
+ DEBUG_ARG("ip = %lx", (long)ip);
+ DEBUG_ARG("fp = %lx", (long)fp);
+ DEBUG_ARG("m = %lx", (long)m);
+
+ /*
+ * Presence of header sizes in mbufs
+ * would confuse code below.
+ * Fragment m_data is concatenated.
+ */
+ m->m_data += hlen;
+ m->m_len -= hlen;
+
+ /*
+ * If first fragment to arrive, create a reassembly queue.
+ */
+ if (fp == NULL) {
+ struct mbuf *t = m_get(slirp);
+
+ if (t == NULL) {
+ goto dropfrag;
+ }
+ fp = mtod(t, struct ipq *);
+ insque(&fp->ip_link, &slirp->ipq.ip_link);
+ fp->ipq_ttl = IPFRAGTTL;
+ fp->ipq_p = ip->ip_p;
+ fp->ipq_id = ip->ip_id;
+ fp->frag_link.next = fp->frag_link.prev = &fp->frag_link;
+ fp->ipq_src = ip->ip_src;
+ fp->ipq_dst = ip->ip_dst;
+ q = (struct ipasfrag *)fp;
+ goto insert;
+ }
+
+ /*
+ * Find a segment which begins after this one does.
+ */
+ for (q = fp->frag_link.next; q != (struct ipasfrag *)&fp->frag_link;
+ q = q->ipf_next)
+ if (q->ipf_off > ip->ip_off)
+ break;
+
+ /*
+ * If there is a preceding segment, it may provide some of
+ * our data already. If so, drop the data from the incoming
+ * segment. If it provides all of our data, drop us.
+ */
+ if (q->ipf_prev != &fp->frag_link) {
+ struct ipasfrag *pq = q->ipf_prev;
+ i = pq->ipf_off + pq->ipf_len - ip->ip_off;
+ if (i > 0) {
+ if (i >= ip->ip_len)
+ goto dropfrag;
+ m_adj(dtom(slirp, ip), i);
+ ip->ip_off += i;
+ ip->ip_len -= i;
+ }
+ }
+
+ /*
+ * While we overlap succeeding segments trim them or,
+ * if they are completely covered, dequeue them.
+ */
+ while (q != (struct ipasfrag*)&fp->frag_link &&
+ ip->ip_off + ip->ip_len > q->ipf_off) {
+ i = (ip->ip_off + ip->ip_len) - q->ipf_off;
+ if (i < q->ipf_len) {
+ q->ipf_len -= i;
+ q->ipf_off += i;
+ m_adj(dtom(slirp, q), i);
+ break;
+ }
+ q = q->ipf_next;
+ m_freem(dtom(slirp, q->ipf_prev));
+ ip_deq(q->ipf_prev);
+ }
+
+insert:
+ /*
+ * Stick new segment in its place;
+ * check for complete reassembly.
+ */
+ ip_enq(iptofrag(ip), q->ipf_prev);
+ next = 0;
+ for (q = fp->frag_link.next; q != (struct ipasfrag*)&fp->frag_link;
+ q = q->ipf_next) {
+ if (q->ipf_off != next)
+ return NULL;
+ next += q->ipf_len;
+ }
+ if (((struct ipasfrag *)(q->ipf_prev))->ipf_tos & 1)
+ return NULL;
+
+ /*
+ * Reassembly is complete; concatenate fragments.
+ */
+ q = fp->frag_link.next;
+ m = dtom(slirp, q);
+
+ q = (struct ipasfrag *) q->ipf_next;
+ while (q != (struct ipasfrag*)&fp->frag_link) {
+ struct mbuf *t = dtom(slirp, q);
+ q = (struct ipasfrag *) q->ipf_next;
+ m_cat(m, t);
+ }
+
+ /*
+ * Create header for new ip packet by
+ * modifying header of first packet;
+ * dequeue and discard fragment reassembly header.
+ * Make header visible.
+ */
+ q = fp->frag_link.next;
+
+ /*
+ * If the fragments concatenated to an mbuf that's
+ * bigger than the total size of the fragment, then and
+ * m_ext buffer was alloced. But fp->ipq_next points to
+ * the old buffer (in the mbuf), so we must point ip
+ * into the new buffer.
+ */
+ if (m->m_flags & M_EXT) {
+ int delta = (char *)q - m->m_dat;
+ q = (struct ipasfrag *)(m->m_ext + delta);
+ }
+
+ ip = fragtoip(q);
+ ip->ip_len = next;
+ ip->ip_tos &= ~1;
+ ip->ip_src = fp->ipq_src;
+ ip->ip_dst = fp->ipq_dst;
+ remque(&fp->ip_link);
+ (void) m_free(dtom(slirp, fp));
+ m->m_len += (ip->ip_hl << 2);
+ m->m_data -= (ip->ip_hl << 2);
+
+ return ip;
+
+dropfrag:
+ m_freem(m);
+ return NULL;
+}
+
+/*
+ * Free a fragment reassembly header and all
+ * associated datagrams.
+ */
+static void
+ip_freef(Slirp *slirp, struct ipq *fp)
+{
+ register struct ipasfrag *q, *p;
+
+ for (q = fp->frag_link.next; q != (struct ipasfrag*)&fp->frag_link; q = p) {
+ p = q->ipf_next;
+ ip_deq(q);
+ m_freem(dtom(slirp, q));
+ }
+ remque(&fp->ip_link);
+ (void) m_free(dtom(slirp, fp));
+}
+
+/*
+ * Put an ip fragment on a reassembly chain.
+ * Like insque, but pointers in middle of structure.
+ */
+static void
+ip_enq(register struct ipasfrag *p, register struct ipasfrag *prev)
+{
+ DEBUG_CALL("ip_enq");
+ DEBUG_ARG("prev = %lx", (long)prev);
+ p->ipf_prev = prev;
+ p->ipf_next = prev->ipf_next;
+ ((struct ipasfrag *)(prev->ipf_next))->ipf_prev = p;
+ prev->ipf_next = p;
+}
+
+/*
+ * To ip_enq as remque is to insque.
+ */
+static void
+ip_deq(register struct ipasfrag *p)
+{
+ ((struct ipasfrag *)(p->ipf_prev))->ipf_next = p->ipf_next;
+ ((struct ipasfrag *)(p->ipf_next))->ipf_prev = p->ipf_prev;
+}
+
+/*
+ * IP timer processing;
+ * if a timer expires on a reassembly
+ * queue, discard it.
+ */
+void
+ip_slowtimo(Slirp *slirp)
+{
+ struct qlink *l;
+
+ DEBUG_CALL("ip_slowtimo");
+
+ l = slirp->ipq.ip_link.next;
+
+ if (l == NULL)
+ return;
+
+ while (l != &slirp->ipq.ip_link) {
+ struct ipq *fp = container_of(l, struct ipq, ip_link);
+ l = l->next;
+ if (--fp->ipq_ttl == 0) {
+ ip_freef(slirp, fp);
+ }
+ }
+}
+
+/*
+ * Do option processing on a datagram,
+ * possibly discarding it if bad options are encountered,
+ * or forwarding it if source-routed.
+ * Returns 1 if packet has been forwarded/freed,
+ * 0 if the packet should be processed further.
+ */
+
+#ifdef notdef
+
+int
+ip_dooptions(m)
+ struct mbuf *m;
+{
+ register struct ip *ip = mtod(m, struct ip *);
+ register u_char *cp;
+ register struct ip_timestamp *ipt;
+ register struct in_ifaddr *ia;
+ int opt, optlen, cnt, off, code, type, forward = 0;
+ struct in_addr *sin, dst;
+typedef uint32_t n_time;
+ n_time ntime;
+
+ dst = ip->ip_dst;
+ cp = (u_char *)(ip + 1);
+ cnt = (ip->ip_hl << 2) - sizeof (struct ip);
+ for (; cnt > 0; cnt -= optlen, cp += optlen) {
+ opt = cp[IPOPT_OPTVAL];
+ if (opt == IPOPT_EOL)
+ break;
+ if (opt == IPOPT_NOP)
+ optlen = 1;
+ else {
+ optlen = cp[IPOPT_OLEN];
+ if (optlen <= 0 || optlen > cnt) {
+ code = &cp[IPOPT_OLEN] - (u_char *)ip;
+ goto bad;
+ }
+ }
+ switch (opt) {
+
+ default:
+ break;
+
+ /*
+ * Source routing with record.
+ * Find interface with current destination address.
+ * If none on this machine then drop if strictly routed,
+ * or do nothing if loosely routed.
+ * Record interface address and bring up next address
+ * component. If strictly routed make sure next
+ * address is on directly accessible net.
+ */
+ case IPOPT_LSRR:
+ case IPOPT_SSRR:
+ if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) {
+ code = &cp[IPOPT_OFFSET] - (u_char *)ip;
+ goto bad;
+ }
+ ipaddr.sin_addr = ip->ip_dst;
+ ia = (struct in_ifaddr *)
+ ifa_ifwithaddr((struct sockaddr *)&ipaddr);
+ if (ia == 0) {
+ if (opt == IPOPT_SSRR) {
+ type = ICMP_UNREACH;
+ code = ICMP_UNREACH_SRCFAIL;
+ goto bad;
+ }
+ /*
+ * Loose routing, and not at next destination
+ * yet; nothing to do except forward.
+ */
+ break;
+ }
+ off--; / * 0 origin * /
+ if (off > optlen - sizeof(struct in_addr)) {
+ /*
+ * End of source route. Should be for us.
+ */
+ save_rte(cp, ip->ip_src);
+ break;
+ }
+ /*
+ * locate outgoing interface
+ */
+ bcopy((caddr_t)(cp + off), (caddr_t)&ipaddr.sin_addr,
+ sizeof(ipaddr.sin_addr));
+ if (opt == IPOPT_SSRR) {
+#define INA struct in_ifaddr *
+#define SA struct sockaddr *
+ if ((ia = (INA)ifa_ifwithdstaddr((SA)&ipaddr)) == 0)
+ ia = (INA)ifa_ifwithnet((SA)&ipaddr);
+ } else
+ ia = ip_rtaddr(ipaddr.sin_addr);
+ if (ia == 0) {
+ type = ICMP_UNREACH;
+ code = ICMP_UNREACH_SRCFAIL;
+ goto bad;
+ }
+ ip->ip_dst = ipaddr.sin_addr;
+ bcopy((caddr_t)&(IA_SIN(ia)->sin_addr),
+ (caddr_t)(cp + off), sizeof(struct in_addr));
+ cp[IPOPT_OFFSET] += sizeof(struct in_addr);
+ /*
+ * Let ip_intr's mcast routing check handle mcast pkts
+ */
+ forward = !IN_MULTICAST(ntohl(ip->ip_dst.s_addr));
+ break;
+
+ case IPOPT_RR:
+ if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) {
+ code = &cp[IPOPT_OFFSET] - (u_char *)ip;
+ goto bad;
+ }
+ /*
+ * If no space remains, ignore.
+ */
+ off--; * 0 origin *
+ if (off > optlen - sizeof(struct in_addr))
+ break;
+ bcopy((caddr_t)(&ip->ip_dst), (caddr_t)&ipaddr.sin_addr,
+ sizeof(ipaddr.sin_addr));
+ /*
+ * locate outgoing interface; if we're the destination,
+ * use the incoming interface (should be same).
+ */
+ if ((ia = (INA)ifa_ifwithaddr((SA)&ipaddr)) == 0 &&
+ (ia = ip_rtaddr(ipaddr.sin_addr)) == 0) {
+ type = ICMP_UNREACH;
+ code = ICMP_UNREACH_HOST;
+ goto bad;
+ }
+ bcopy((caddr_t)&(IA_SIN(ia)->sin_addr),
+ (caddr_t)(cp + off), sizeof(struct in_addr));
+ cp[IPOPT_OFFSET] += sizeof(struct in_addr);
+ break;
+
+ case IPOPT_TS:
+ code = cp - (u_char *)ip;
+ ipt = (struct ip_timestamp *)cp;
+ if (ipt->ipt_len < 5)
+ goto bad;
+ if (ipt->ipt_ptr > ipt->ipt_len - sizeof (int32_t)) {
+ if (++ipt->ipt_oflw == 0)
+ goto bad;
+ break;
+ }
+ sin = (struct in_addr *)(cp + ipt->ipt_ptr - 1);
+ switch (ipt->ipt_flg) {
+
+ case IPOPT_TS_TSONLY:
+ break;
+
+ case IPOPT_TS_TSANDADDR:
+ if (ipt->ipt_ptr + sizeof(n_time) +
+ sizeof(struct in_addr) > ipt->ipt_len)
+ goto bad;
+ ipaddr.sin_addr = dst;
+ ia = (INA)ifaof_ i f p foraddr((SA)&ipaddr,
+ m->m_pkthdr.rcvif);
+ if (ia == 0)
+ continue;
+ bcopy((caddr_t)&IA_SIN(ia)->sin_addr,
+ (caddr_t)sin, sizeof(struct in_addr));
+ ipt->ipt_ptr += sizeof(struct in_addr);
+ break;
+
+ case IPOPT_TS_PRESPEC:
+ if (ipt->ipt_ptr + sizeof(n_time) +
+ sizeof(struct in_addr) > ipt->ipt_len)
+ goto bad;
+ bcopy((caddr_t)sin, (caddr_t)&ipaddr.sin_addr,
+ sizeof(struct in_addr));
+ if (ifa_ifwithaddr((SA)&ipaddr) == 0)
+ continue;
+ ipt->ipt_ptr += sizeof(struct in_addr);
+ break;
+
+ default:
+ goto bad;
+ }
+ ntime = iptime();
+ bcopy((caddr_t)&ntime, (caddr_t)cp + ipt->ipt_ptr - 1,
+ sizeof(n_time));
+ ipt->ipt_ptr += sizeof(n_time);
+ }
+ }
+ if (forward) {
+ ip_forward(m, 1);
+ return (1);
+ }
+ return (0);
+bad:
+ icmp_error(m, type, code, 0, 0);
+
+ return (1);
+}
+
+#endif /* notdef */
+
+/*
+ * Strip out IP options, at higher
+ * level protocol in the kernel.
+ * Second argument is buffer to which options
+ * will be moved, and return value is their length.
+ * (XXX) should be deleted; last arg currently ignored.
+ */
+void
+ip_stripoptions(register struct mbuf *m, struct mbuf *mopt)
+{
+ register int i;
+ struct ip *ip = mtod(m, struct ip *);
+ register caddr_t opts;
+ int olen;
+
+ olen = (ip->ip_hl<<2) - sizeof (struct ip);
+ opts = (caddr_t)(ip + 1);
+ i = m->m_len - (sizeof (struct ip) + olen);
+ memcpy(opts, opts + olen, (unsigned)i);
+ m->m_len -= olen;
+
+ ip->ip_hl = sizeof(struct ip) >> 2;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_output.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_output.c
new file mode 100644
index 0000000..657c9af
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_output.c
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip_output.c 8.3 (Berkeley) 1/21/94
+ * ip_output.c,v 1.9 1994/11/16 10:17:10 jkh Exp
+ */
+
+/*
+ * Changes and additions relating to SLiRP are
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+
+/* Number of packets queued before we start sending
+ * (to prevent allocing too many mbufs) */
+#define IF_THRESH 10
+
+/*
+ * IP output. The packet in mbuf chain m contains a skeletal IP
+ * header (with len, off, ttl, proto, tos, src, dst).
+ * The mbuf chain containing the packet will be freed.
+ * The mbuf opt, if present, will not be freed.
+ */
+int
+ip_output(struct socket *so, struct mbuf *m0)
+{
+ Slirp *slirp = m0->slirp;
+ register struct ip *ip;
+ register struct mbuf *m = m0;
+ register int hlen = sizeof(struct ip );
+ int len, off, error = 0;
+
+ DEBUG_CALL("ip_output");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("m0 = %lx", (long)m0);
+
+ ip = mtod(m, struct ip *);
+ /*
+ * Fill in IP header.
+ */
+ ip->ip_v = IPVERSION;
+ ip->ip_off &= IP_DF;
+ ip->ip_id = htons(slirp->ip_id++);
+ ip->ip_hl = hlen >> 2;
+
+ /*
+ * If small enough for interface, can just send directly.
+ */
+ if ((uint16_t)ip->ip_len <= IF_MTU) {
+ ip->ip_len = htons((uint16_t)ip->ip_len);
+ ip->ip_off = htons((uint16_t)ip->ip_off);
+ ip->ip_sum = 0;
+ ip->ip_sum = cksum(m, hlen);
+
+ if_output(so, m);
+ goto done;
+ }
+
+ /*
+ * Too large for interface; fragment if possible.
+ * Must be able to put at least 8 bytes per fragment.
+ */
+ if (ip->ip_off & IP_DF) {
+ error = -1;
+ goto bad;
+ }
+
+ len = (IF_MTU - hlen) &~ 7; /* ip databytes per packet */
+ if (len < 8) {
+ error = -1;
+ goto bad;
+ }
+
+ {
+ int mhlen, firstlen = len;
+ struct mbuf **mnext = &m->m_nextpkt;
+
+ /*
+ * Loop through length of segment after first fragment,
+ * make new header and copy data of each part and link onto chain.
+ */
+ m0 = m;
+ mhlen = sizeof (struct ip);
+ for (off = hlen + len; off < (uint16_t)ip->ip_len; off += len) {
+ register struct ip *mhip;
+ m = m_get(slirp);
+ if (m == NULL) {
+ error = -1;
+ goto sendorfree;
+ }
+ m->m_data += IF_MAXLINKHDR;
+ mhip = mtod(m, struct ip *);
+ *mhip = *ip;
+
+ m->m_len = mhlen;
+ mhip->ip_off = ((off - hlen) >> 3) + (ip->ip_off & ~IP_MF);
+ if (ip->ip_off & IP_MF)
+ mhip->ip_off |= IP_MF;
+ if (off + len >= (uint16_t)ip->ip_len)
+ len = (uint16_t)ip->ip_len - off;
+ else
+ mhip->ip_off |= IP_MF;
+ mhip->ip_len = htons((uint16_t)(len + mhlen));
+
+ if (m_copy(m, m0, off, len) < 0) {
+ error = -1;
+ goto sendorfree;
+ }
+
+ mhip->ip_off = htons((uint16_t)mhip->ip_off);
+ mhip->ip_sum = 0;
+ mhip->ip_sum = cksum(m, mhlen);
+ *mnext = m;
+ mnext = &m->m_nextpkt;
+ }
+ /*
+ * Update first fragment by trimming what's been copied out
+ * and updating header, then send each fragment (in order).
+ */
+ m = m0;
+ m_adj(m, hlen + firstlen - (uint16_t)ip->ip_len);
+ ip->ip_len = htons((uint16_t)m->m_len);
+ ip->ip_off = htons((uint16_t)(ip->ip_off | IP_MF));
+ ip->ip_sum = 0;
+ ip->ip_sum = cksum(m, hlen);
+sendorfree:
+ for (m = m0; m; m = m0) {
+ m0 = m->m_nextpkt;
+ m->m_nextpkt = NULL;
+ if (error == 0)
+ if_output(so, m);
+ else
+ m_freem(m);
+ }
+ }
+
+done:
+ return (error);
+
+bad:
+ m_freem(m0);
+ goto done;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/libslirp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/libslirp.h
new file mode 100644
index 0000000..574852b
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/libslirp.h
@@ -0,0 +1,56 @@
+#ifndef _LIBSLIRP_H
+#define _LIBSLIRP_H
+
+#ifdef CONFIG_SLIRP
+
+#include <netinet/in.h>
+
+struct Slirp;
+typedef struct Slirp Slirp;
+
+int get_dns_addr(struct in_addr *pdns_addr);
+
+Slirp *slirp_init(int restricted, struct in_addr vnetwork,
+ struct in_addr vnetmask, struct in_addr vhost,
+ const char *vhostname, const char *tftp_path,
+ const char *bootfile, struct in_addr vdhcp_start,
+ struct in_addr vnameserver, void *opaque);
+void slirp_cleanup(Slirp *slirp);
+
+void slirp_select_fill(Slirp *slirp, int *pnfds,
+ fd_set *readfds, fd_set *writefds, fd_set *xfds);
+
+void slirp_select_poll(Slirp *slirp,
+ fd_set *readfds, fd_set *writefds, fd_set *xfds,
+ int select_error);
+
+void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
+
+/* you must provide the following functions: */
+int slirp_can_output(void *opaque);
+void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len);
+
+int slirp_add_hostfwd(Slirp *slirp, int is_udp,
+ struct in_addr host_addr, int host_port,
+ struct in_addr guest_addr, int guest_port);
+int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
+ struct in_addr host_addr, int host_port);
+int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
+ struct in_addr *guest_addr, int guest_port);
+
+void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr,
+ int guest_port, const uint8_t *buf, int size);
+size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr,
+ int guest_port);
+int slirp_get_time_ms(void);
+
+#else /* !CONFIG_SLIRP */
+
+static inline void slirp_select_fill(int *pnfds, fd_set *readfds,
+ fd_set *writefds, fd_set *xfds) { }
+
+static inline void slirp_select_poll(fd_set *readfds, fd_set *writefds,
+ fd_set *xfds, int select_error) { }
+#endif /* !CONFIG_SLIRP */
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/main.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/main.h
new file mode 100644
index 0000000..0dd8d81
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/main.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#define TOWRITEMAX 512
+
+extern int slirp_socket;
+extern int slirp_socket_unit;
+extern int slirp_socket_port;
+extern uint32_t slirp_socket_addr;
+extern char *slirp_socket_passwd;
+extern int ctty_closed;
+
+/*
+ * Get the difference in 2 times from updtim()
+ * Allow for wraparound times, "just in case"
+ * x is the greater of the 2 (current time) and y is
+ * what it's being compared against.
+ */
+#define TIME_DIFF(x,y) (x)-(y) < 0 ? ~0-(y)+(x) : (x)-(y)
+
+extern char *slirp_tty;
+extern char *exec_shell;
+extern u_int curtime;
+extern fd_set *global_readfds, *global_writefds, *global_xfds;
+extern struct in_addr loopback_addr;
+extern char *username;
+extern char *socket_path;
+extern int towrite_max;
+extern int ppp_exit;
+extern int tcp_keepintvl;
+
+#define PROTO_SLIP 0x1
+#ifdef USE_PPP
+#define PROTO_PPP 0x2
+#endif
+
+void if_encap(Slirp *slirp, const uint8_t *ip_data, int ip_data_len);
+ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.c
new file mode 100644
index 0000000..6c115ee
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+/*
+ * mbuf's in SLiRP are much simpler than the real mbufs in
+ * FreeBSD. They are fixed size, determined by the MTU,
+ * so that one whole packet can fit. Mbuf's cannot be
+ * chained together. If there's more data than the mbuf
+ * could hold, an external malloced buffer is pointed to
+ * by m_ext (and the data pointers) and M_EXT is set in
+ * the flags
+ */
+
+#include "slirp.h"
+
+#define MBUF_THRESH 30
+
+/*
+ * Find a nice value for msize
+ * XXX if_maxlinkhdr already in mtu
+ */
+#define SLIRP_MSIZE (IF_MTU + IF_MAXLINKHDR + offsetof(struct mbuf, m_dat) + 6)
+
+void
+m_init(Slirp *slirp)
+{
+ slirp->m_freelist.m_next = slirp->m_freelist.m_prev = &slirp->m_freelist;
+ slirp->m_usedlist.m_next = slirp->m_usedlist.m_prev = &slirp->m_usedlist;
+}
+
+/*
+ * Get an mbuf from the free list, if there are none
+ * malloc one
+ *
+ * Because fragmentation can occur if we alloc new mbufs and
+ * free old mbufs, we mark all mbufs above mbuf_thresh as M_DOFREE,
+ * which tells m_free to actually free() it
+ */
+struct mbuf *
+m_get(Slirp *slirp)
+{
+ register struct mbuf *m;
+ int flags = 0;
+
+ DEBUG_CALL("m_get");
+
+ if (slirp->m_freelist.m_next == &slirp->m_freelist) {
+ m = (struct mbuf *)malloc(SLIRP_MSIZE);
+ if (m == NULL) goto end_error;
+ slirp->mbuf_alloced++;
+ if (slirp->mbuf_alloced > MBUF_THRESH)
+ flags = M_DOFREE;
+ m->slirp = slirp;
+ } else {
+ m = slirp->m_freelist.m_next;
+ remque(m);
+ }
+
+ /* Insert it in the used list */
+ insque(m,&slirp->m_usedlist);
+ m->m_flags = (flags | M_USEDLIST);
+
+ /* Initialise it */
+ m->m_size = SLIRP_MSIZE - offsetof(struct mbuf, m_dat);
+ m->m_data = m->m_dat;
+ m->m_len = 0;
+ m->m_nextpkt = NULL;
+ m->m_prevpkt = NULL;
+end_error:
+ DEBUG_ARG("m = %lx", (long )m);
+ return m;
+}
+
+void
+m_free(struct mbuf *m)
+{
+
+ DEBUG_CALL("m_free");
+ DEBUG_ARG("m = %lx", (long )m);
+
+ if(m) {
+ /* Remove from m_usedlist */
+ if (m->m_flags & M_USEDLIST)
+ remque(m);
+
+ /* If it's M_EXT, free() it */
+ if (m->m_flags & M_EXT)
+ free(m->m_ext);
+
+ /*
+ * Either free() it or put it on the free list
+ */
+ if (m->m_flags & M_DOFREE) {
+ m->slirp->mbuf_alloced--;
+ free(m);
+ } else if ((m->m_flags & M_FREELIST) == 0) {
+ insque(m,&m->slirp->m_freelist);
+ m->m_flags = M_FREELIST; /* Clobber other flags */
+ }
+ } /* if(m) */
+}
+
+/*
+ * Copy data from one mbuf to the end of
+ * the other.. if result is too big for one mbuf, malloc()
+ * an M_EXT data segment
+ */
+void
+m_cat(struct mbuf *m, struct mbuf *n)
+{
+ /*
+ * If there's no room, realloc
+ */
+ if (M_FREEROOM(m) < n->m_len)
+ m_inc(m,m->m_size+MINCSIZE);
+
+ memcpy(m->m_data+m->m_len, n->m_data, n->m_len);
+ m->m_len += n->m_len;
+
+ m_free(n);
+}
+
+
+/* make m size bytes large */
+void
+m_inc(struct mbuf *m, int size)
+{
+ int datasize;
+
+ /* some compiles throw up on gotos. This one we can fake. */
+ if(m->m_size>size) return;
+
+ if (m->m_flags & M_EXT) {
+ datasize = m->m_data - m->m_ext;
+ m->m_ext = (char *)realloc(m->m_ext,size);
+ m->m_data = m->m_ext + datasize;
+ } else {
+ char *dat;
+ datasize = m->m_data - m->m_dat;
+ dat = (char *)malloc(size);
+ memcpy(dat, m->m_dat, m->m_size);
+
+ m->m_ext = dat;
+ m->m_data = m->m_ext + datasize;
+ m->m_flags |= M_EXT;
+ }
+
+ m->m_size = size;
+
+}
+
+
+
+void
+m_adj(struct mbuf *m, int len)
+{
+ if (m == NULL)
+ return;
+ if (len >= 0) {
+ /* Trim from head */
+ m->m_data += len;
+ m->m_len -= len;
+ } else {
+ /* Trim from tail */
+ len = -len;
+ m->m_len -= len;
+ }
+}
+
+
+/*
+ * Copy len bytes from m, starting off bytes into n
+ */
+int
+m_copy(struct mbuf *n, struct mbuf *m, int off, int len)
+{
+ if (len > M_FREEROOM(n))
+ return -1;
+
+ memcpy((n->m_data + n->m_len), (m->m_data + off), len);
+ n->m_len += len;
+ return 0;
+}
+
+
+/*
+ * Given a pointer into an mbuf, return the mbuf
+ * XXX This is a kludge, I should eliminate the need for it
+ * Fortunately, it's not used often
+ */
+struct mbuf *
+dtom(Slirp *slirp, void *dat)
+{
+ struct mbuf *m;
+
+ DEBUG_CALL("dtom");
+ DEBUG_ARG("dat = %lx", (long )dat);
+
+ /* bug corrected for M_EXT buffers */
+ for (m = slirp->m_usedlist.m_next; m != &slirp->m_usedlist;
+ m = m->m_next) {
+ if (m->m_flags & M_EXT) {
+ if( (char *)dat>=m->m_ext && (char *)dat<(m->m_ext + m->m_size) )
+ return m;
+ } else {
+ if( (char *)dat >= m->m_dat && (char *)dat<(m->m_dat + m->m_size) )
+ return m;
+ }
+ }
+
+ DEBUG_ERROR((dfd, "dtom failed"));
+
+ return (struct mbuf *)0;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.h
new file mode 100644
index 0000000..97729e2
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)mbuf.h 8.3 (Berkeley) 1/21/94
+ * mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp
+ */
+
+#ifndef _MBUF_H_
+#define _MBUF_H_
+
+#define m_freem m_free
+
+
+#define MINCSIZE 4096 /* Amount to increase mbuf if too small */
+
+/*
+ * Macros for type conversion
+ * mtod(m,t) - convert mbuf pointer to data pointer of correct type
+ */
+#define mtod(m,t) ((t)(m)->m_data)
+
+/* XXX About mbufs for slirp:
+ * Only one mbuf is ever used in a chain, for each "cell" of data.
+ * m_nextpkt points to the next packet, if fragmented.
+ * If the data is too large, the M_EXT is used, and a larger block
+ * is alloced. Therefore, m_free[m] must check for M_EXT and if set
+ * free the m_ext. This is inefficient memory-wise, but who cares.
+ */
+
+/* XXX should union some of these! */
+/* header at beginning of each mbuf: */
+struct m_hdr {
+ struct mbuf *mh_next; /* Linked list of mbufs */
+ struct mbuf *mh_prev;
+ struct mbuf *mh_nextpkt; /* Next packet in queue/record */
+ struct mbuf *mh_prevpkt; /* Flags aren't used in the output queue */
+ int mh_flags; /* Misc flags */
+
+ int mh_size; /* Size of data */
+ struct socket *mh_so;
+
+ caddr_t mh_data; /* Location of data */
+ int mh_len; /* Amount of data in this mbuf */
+};
+
+/*
+ * How much room is in the mbuf, from m_data to the end of the mbuf
+ */
+#define M_ROOM(m) ((m->m_flags & M_EXT)? \
+ (((m)->m_ext + (m)->m_size) - (m)->m_data) \
+ : \
+ (((m)->m_dat + (m)->m_size) - (m)->m_data))
+
+/*
+ * How much free room there is
+ */
+#define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len)
+#define M_TRAILINGSPACE M_FREEROOM
+
+struct mbuf {
+ struct m_hdr m_hdr;
+ Slirp *slirp;
+ union M_dat {
+ char m_dat_[1]; /* ANSI don't like 0 sized arrays */
+ char *m_ext_;
+ } M_dat;
+};
+
+#define m_next m_hdr.mh_next
+#define m_prev m_hdr.mh_prev
+#define m_nextpkt m_hdr.mh_nextpkt
+#define m_prevpkt m_hdr.mh_prevpkt
+#define m_flags m_hdr.mh_flags
+#define m_len m_hdr.mh_len
+#define m_data m_hdr.mh_data
+#define m_size m_hdr.mh_size
+#define m_dat M_dat.m_dat_
+#define m_ext M_dat.m_ext_
+#define m_so m_hdr.mh_so
+
+#define ifq_prev m_prev
+#define ifq_next m_next
+#define ifs_prev m_prevpkt
+#define ifs_next m_nextpkt
+#define ifq_so m_so
+
+#define M_EXT 0x01 /* m_ext points to more (malloced) data */
+#define M_FREELIST 0x02 /* mbuf is on free list */
+#define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */
+#define M_DOFREE 0x08 /* when m_free is called on the mbuf, free()
+ * it rather than putting it on the free list */
+
+void m_init(Slirp *);
+struct mbuf * m_get(Slirp *);
+void m_free(struct mbuf *);
+void m_cat(register struct mbuf *, register struct mbuf *);
+void m_inc(struct mbuf *, int);
+void m_adj(struct mbuf *, int);
+int m_copy(struct mbuf *, struct mbuf *, int, int);
+struct mbuf * dtom(Slirp *, void *);
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.c
new file mode 100644
index 0000000..7a79cdb
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.c
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+
+#ifdef DEBUG
+int slirp_debug = DBG_CALL|DBG_MISC|DBG_ERROR;
+#endif
+
+struct quehead {
+ struct quehead *qh_link;
+ struct quehead *qh_rlink;
+};
+
+inline void
+insque(void *a, void *b)
+{
+ register struct quehead *element = (struct quehead *) a;
+ register struct quehead *head = (struct quehead *) b;
+ element->qh_link = head->qh_link;
+ head->qh_link = (struct quehead *)element;
+ element->qh_rlink = (struct quehead *)head;
+ ((struct quehead *)(element->qh_link))->qh_rlink
+ = (struct quehead *)element;
+}
+
+inline void
+remque(void *a)
+{
+ register struct quehead *element = (struct quehead *) a;
+ ((struct quehead *)(element->qh_link))->qh_rlink = element->qh_rlink;
+ ((struct quehead *)(element->qh_rlink))->qh_link = element->qh_link;
+ element->qh_rlink = NULL;
+}
+
+int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
+ struct in_addr addr, int port)
+{
+ struct ex_list *tmp_ptr;
+
+ /* First, check if the port is "bound" */
+ for (tmp_ptr = *ex_ptr; tmp_ptr; tmp_ptr = tmp_ptr->ex_next) {
+ if (port == tmp_ptr->ex_fport &&
+ addr.s_addr == tmp_ptr->ex_addr.s_addr)
+ return -1;
+ }
+
+ tmp_ptr = *ex_ptr;
+ *ex_ptr = (struct ex_list *)malloc(sizeof(struct ex_list));
+ (*ex_ptr)->ex_fport = port;
+ (*ex_ptr)->ex_addr = addr;
+ (*ex_ptr)->ex_pty = do_pty;
+ (*ex_ptr)->ex_exec = (do_pty == 3) ? exec : strdup(exec);
+ (*ex_ptr)->ex_next = tmp_ptr;
+ return 0;
+}
+
+#ifndef HAVE_STRERROR
+
+/*
+ * For systems with no strerror
+ */
+
+extern int sys_nerr;
+extern char *sys_errlist[];
+
+char *
+strerror(error)
+ int error;
+{
+ if (error < sys_nerr)
+ return sys_errlist[error];
+ else
+ return "Unknown error.";
+}
+
+#endif
+
+int os_socket(int domain, int type, int protocol)
+{
+ return socket(domain, type, protocol);
+}
+
+uint32_t os_get_time_ms(void)
+{
+ struct timespec ts;
+
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return ts.tv_sec * 1000 +
+ (ts.tv_nsec / 1000000);
+}
+
+
+#if 1
+
+int
+fork_exec(struct socket *so, const char *ex, int do_pty)
+{
+ /* not implemented */
+ return 0;
+}
+
+#else
+
+/*
+ * XXX This is ugly
+ * We create and bind a socket, then fork off to another
+ * process, which connects to this socket, after which we
+ * exec the wanted program. If something (strange) happens,
+ * the accept() call could block us forever.
+ *
+ * do_pty = 0 Fork/exec inetd style
+ * do_pty = 1 Fork/exec using slirp.telnetd
+ * do_ptr = 2 Fork/exec using pty
+ */
+int
+fork_exec(struct socket *so, const char *ex, int do_pty)
+{
+ int s;
+ struct sockaddr_in addr;
+ socklen_t addrlen = sizeof(addr);
+ int opt;
+ int master = -1;
+ const char *argv[256];
+ /* don't want to clobber the original */
+ char *bptr;
+ const char *curarg;
+ int c, i, ret;
+
+ DEBUG_CALL("fork_exec");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("ex = %lx", (long)ex);
+ DEBUG_ARG("do_pty = %lx", (long)do_pty);
+
+ if (do_pty == 2) {
+ return 0;
+ } else {
+ addr.sin_family = AF_INET;
+ addr.sin_port = 0;
+ addr.sin_addr.s_addr = INADDR_ANY;
+
+ if ((s = os_socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
+ bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
+ listen(s, 1) < 0) {
+ lprint("Error: inet socket: %s\n", strerror(errno));
+ closesocket(s);
+
+ return 0;
+ }
+ }
+
+ switch(fork()) {
+ case -1:
+ lprint("Error: fork failed: %s\n", strerror(errno));
+ close(s);
+ if (do_pty == 2)
+ close(master);
+ return 0;
+
+ case 0:
+ /* Set the DISPLAY */
+ if (do_pty == 2) {
+ (void) close(master);
+#ifdef TIOCSCTTY /* XXXXX */
+ (void) setsid();
+ ioctl(s, TIOCSCTTY, (char *)NULL);
+#endif
+ } else {
+ getsockname(s, (struct sockaddr *)&addr, &addrlen);
+ close(s);
+ /*
+ * Connect to the socket
+ * XXX If any of these fail, we're in trouble!
+ */
+ s = os_socket(AF_INET, SOCK_STREAM, 0);
+ addr.sin_addr = loopback_addr;
+ do {
+ ret = connect(s, (struct sockaddr *)&addr, addrlen);
+ } while (ret < 0 && errno == EINTR);
+ }
+
+ dup2(s, 0);
+ dup2(s, 1);
+ dup2(s, 2);
+ for (s = getdtablesize() - 1; s >= 3; s--)
+ close(s);
+
+ i = 0;
+ bptr = qemu_strdup(ex); /* No need to free() this */
+ if (do_pty == 1) {
+ /* Setup "slirp.telnetd -x" */
+ argv[i++] = "slirp.telnetd";
+ argv[i++] = "-x";
+ argv[i++] = bptr;
+ } else
+ do {
+ /* Change the string into argv[] */
+ curarg = bptr;
+ while (*bptr != ' ' && *bptr != (char)0)
+ bptr++;
+ c = *bptr;
+ *bptr++ = (char)0;
+ argv[i++] = strdup(curarg);
+ } while (c);
+
+ argv[i] = NULL;
+ execvp(argv[0], (char **)argv);
+
+ /* Ooops, failed, let's tell the user why */
+ fprintf(stderr, "Error: execvp of %s failed: %s\n",
+ argv[0], strerror(errno));
+ close(0); close(1); close(2); /* XXX */
+ exit(1);
+
+ default:
+ if (do_pty == 2) {
+ close(s);
+ so->s = master;
+ } else {
+ /*
+ * XXX this could block us...
+ * XXX Should set a timer here, and if accept() doesn't
+ * return after X seconds, declare it a failure
+ * The only reason this will block forever is if socket()
+ * of connect() fail in the child process
+ */
+ do {
+ so->s = accept(s, (struct sockaddr *)&addr, &addrlen);
+ } while (so->s < 0 && errno == EINTR);
+ closesocket(s);
+ opt = 1;
+ setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int));
+ opt = 1;
+ setsockopt(so->s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));
+ }
+ fd_nonblock(so->s);
+
+ /* Append the telnet options now */
+ if (so->so_m != NULL && do_pty == 1) {
+ sbappend(so, so->so_m);
+ so->so_m = NULL;
+ }
+
+ return 1;
+ }
+}
+#endif
+
+#ifndef HAVE_STRDUP
+char *
+strdup(str)
+ const char *str;
+{
+ char *bptr;
+
+ bptr = (char *)malloc(strlen(str)+1);
+ strcpy(bptr, str);
+
+ return bptr;
+}
+#endif
+
+void lprint(const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+}
+
+/*
+ * Set fd blocking and non-blocking
+ */
+
+void
+fd_nonblock(int fd)
+{
+#ifdef FIONBIO
+#ifdef _WIN32
+ unsigned long opt = 1;
+#else
+ int opt = 1;
+#endif
+
+ ioctlsocket(fd, FIONBIO, &opt);
+#else
+ int opt;
+
+ opt = fcntl(fd, F_GETFL, 0);
+ opt |= O_NONBLOCK;
+ fcntl(fd, F_SETFL, opt);
+#endif
+}
+
+void
+fd_block(int fd)
+{
+#ifdef FIONBIO
+#ifdef _WIN32
+ unsigned long opt = 0;
+#else
+ int opt = 0;
+#endif
+
+ ioctlsocket(fd, FIONBIO, &opt);
+#else
+ int opt;
+
+ opt = fcntl(fd, F_GETFL, 0);
+ opt &= ~O_NONBLOCK;
+ fcntl(fd, F_SETFL, opt);
+#endif
+}
+
+#if 0
+void slirp_connection_info(Slirp *slirp, Monitor *mon)
+{
+ const char * const tcpstates[] = {
+ [TCPS_CLOSED] = "CLOSED",
+ [TCPS_LISTEN] = "LISTEN",
+ [TCPS_SYN_SENT] = "SYN_SENT",
+ [TCPS_SYN_RECEIVED] = "SYN_RCVD",
+ [TCPS_ESTABLISHED] = "ESTABLISHED",
+ [TCPS_CLOSE_WAIT] = "CLOSE_WAIT",
+ [TCPS_FIN_WAIT_1] = "FIN_WAIT_1",
+ [TCPS_CLOSING] = "CLOSING",
+ [TCPS_LAST_ACK] = "LAST_ACK",
+ [TCPS_FIN_WAIT_2] = "FIN_WAIT_2",
+ [TCPS_TIME_WAIT] = "TIME_WAIT",
+ };
+ struct in_addr dst_addr;
+ struct sockaddr_in src;
+ socklen_t src_len;
+ uint16_t dst_port;
+ struct socket *so;
+ const char *state;
+ char buf[20];
+ int n;
+
+ monitor_printf(mon, " Protocol[State] FD Source Address Port "
+ "Dest. Address Port RecvQ SendQ\n");
+
+ for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) {
+ if (so->so_state & SS_HOSTFWD) {
+ state = "HOST_FORWARD";
+ } else if (so->so_tcpcb) {
+ state = tcpstates[so->so_tcpcb->t_state];
+ } else {
+ state = "NONE";
+ }
+ if (so->so_state & (SS_HOSTFWD | SS_INCOMING)) {
+ src_len = sizeof(src);
+ getsockname(so->s, (struct sockaddr *)&src, &src_len);
+ dst_addr = so->so_laddr;
+ dst_port = so->so_lport;
+ } else {
+ src.sin_addr = so->so_laddr;
+ src.sin_port = so->so_lport;
+ dst_addr = so->so_faddr;
+ dst_port = so->so_fport;
+ }
+ n = snprintf(buf, sizeof(buf), " TCP[%s]", state);
+ memset(&buf[n], ' ', 19 - n);
+ buf[19] = 0;
+ monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s,
+ src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
+ ntohs(src.sin_port));
+ monitor_printf(mon, "%15s %5d %5d %5d\n",
+ inet_ntoa(dst_addr), ntohs(dst_port),
+ so->so_rcv.sb_cc, so->so_snd.sb_cc);
+ }
+
+ for (so = slirp->udb.so_next; so != &slirp->udb; so = so->so_next) {
+ if (so->so_state & SS_HOSTFWD) {
+ n = snprintf(buf, sizeof(buf), " UDP[HOST_FORWARD]");
+ src_len = sizeof(src);
+ getsockname(so->s, (struct sockaddr *)&src, &src_len);
+ dst_addr = so->so_laddr;
+ dst_port = so->so_lport;
+ } else {
+ n = snprintf(buf, sizeof(buf), " UDP[%d sec]",
+ (so->so_expire - curtime) / 1000);
+ src.sin_addr = so->so_laddr;
+ src.sin_port = so->so_lport;
+ dst_addr = so->so_faddr;
+ dst_port = so->so_fport;
+ }
+ memset(&buf[n], ' ', 19 - n);
+ buf[19] = 0;
+ monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s,
+ src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
+ ntohs(src.sin_port));
+ monitor_printf(mon, "%15s %5d %5d %5d\n",
+ inet_ntoa(dst_addr), ntohs(dst_port),
+ so->so_rcv.sb_cc, so->so_snd.sb_cc);
+ }
+}
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.h
new file mode 100644
index 0000000..5c307c9
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#ifndef _MISC_H_
+#define _MISC_H_
+
+struct ex_list {
+ int ex_pty; /* Do we want a pty? */
+ struct in_addr ex_addr; /* Server address */
+ int ex_fport; /* Port to telnet to */
+ const char *ex_exec; /* Command line of what to exec */
+ struct ex_list *ex_next;
+};
+
+#ifndef HAVE_STRDUP
+char *strdup(const char *);
+#endif
+
+void do_wait(int);
+
+#define EMU_NONE 0x0
+
+/* TCP emulations */
+#define EMU_CTL 0x1
+#define EMU_FTP 0x2
+#define EMU_KSH 0x3
+#define EMU_IRC 0x4
+#define EMU_REALAUDIO 0x5
+#define EMU_RLOGIN 0x6
+#define EMU_IDENT 0x7
+#define EMU_RSH 0x8
+
+#define EMU_NOCONNECT 0x10 /* Don't connect */
+
+struct tos_t {
+ uint16_t lport;
+ uint16_t fport;
+ uint8_t tos;
+ uint8_t emu;
+};
+
+struct emu_t {
+ uint16_t lport;
+ uint16_t fport;
+ uint8_t tos;
+ uint8_t emu;
+ struct emu_t *next;
+};
+
+extern int x_port, x_server, x_display;
+
+int show_x(char *, struct socket *);
+void redir_x(uint32_t, int, int, int);
+void slirp_insque(void *, void *);
+void slirp_remque(void *);
+int add_exec(struct ex_list **, int, char *, struct in_addr, int);
+int slirp_openpty(int *, int *);
+int fork_exec(struct socket *so, const char *ex, int do_pty);
+void snooze_hup(int);
+void snooze(void);
+void relay(int);
+void add_emu(char *);
+void fd_nonblock(int);
+void fd_block(int);
+int rsh_exec(struct socket *, struct socket *, char *, char *, char *);
+int os_socket(int domain, int type, int protocol);
+uint32_t os_get_time_ms(void);
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.c
new file mode 100644
index 0000000..ac20f21
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+
+static void sbappendsb(struct sbuf *sb, struct mbuf *m);
+
+void
+sbfree(struct sbuf *sb)
+{
+ free(sb->sb_data);
+}
+
+void
+sbdrop(struct sbuf *sb, int num)
+{
+ /*
+ * We can only drop how much we have
+ * This should never succeed
+ */
+ if(num > sb->sb_cc)
+ num = sb->sb_cc;
+ sb->sb_cc -= num;
+ sb->sb_rptr += num;
+ if(sb->sb_rptr >= sb->sb_data + sb->sb_datalen)
+ sb->sb_rptr -= sb->sb_datalen;
+
+}
+
+void
+sbreserve(struct sbuf *sb, int size)
+{
+ if (sb->sb_data) {
+ /* Already alloced, realloc if necessary */
+ if (sb->sb_datalen != size) {
+ sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)realloc(sb->sb_data, size);
+ sb->sb_cc = 0;
+ if (sb->sb_wptr)
+ sb->sb_datalen = size;
+ else
+ sb->sb_datalen = 0;
+ }
+ } else {
+ sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)malloc(size);
+ sb->sb_cc = 0;
+ if (sb->sb_wptr)
+ sb->sb_datalen = size;
+ else
+ sb->sb_datalen = 0;
+ }
+}
+
+/*
+ * Try and write() to the socket, whatever doesn't get written
+ * append to the buffer... for a host with a fast net connection,
+ * this prevents an unnecessary copy of the data
+ * (the socket is non-blocking, so we won't hang)
+ */
+void
+sbappend(struct socket *so, struct mbuf *m)
+{
+ int ret = 0;
+
+ DEBUG_CALL("sbappend");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("m = %lx", (long)m);
+ DEBUG_ARG("m->m_len = %d", m->m_len);
+
+ /* Shouldn't happen, but... e.g. foreign host closes connection */
+ if (m->m_len <= 0) {
+ m_free(m);
+ return;
+ }
+
+ /*
+ * If there is urgent data, call sosendoob
+ * if not all was sent, sowrite will take care of the rest
+ * (The rest of this function is just an optimisation)
+ */
+ if (so->so_urgc) {
+ sbappendsb(&so->so_rcv, m);
+ m_free(m);
+ sosendoob(so);
+ return;
+ }
+
+ /*
+ * We only write if there's nothing in the buffer,
+ * ottherwise it'll arrive out of order, and hence corrupt
+ */
+ if (!so->so_rcv.sb_cc)
+ ret = slirp_send(so, m->m_data, m->m_len, 0);
+
+ if (ret <= 0) {
+ /*
+ * Nothing was written
+ * It's possible that the socket has closed, but
+ * we don't need to check because if it has closed,
+ * it will be detected in the normal way by soread()
+ */
+ sbappendsb(&so->so_rcv, m);
+ } else if (ret != m->m_len) {
+ /*
+ * Something was written, but not everything..
+ * sbappendsb the rest
+ */
+ m->m_len -= ret;
+ m->m_data += ret;
+ sbappendsb(&so->so_rcv, m);
+ } /* else */
+ /* Whatever happened, we free the mbuf */
+ m_free(m);
+}
+
+/*
+ * Copy the data from m into sb
+ * The caller is responsible to make sure there's enough room
+ */
+static void
+sbappendsb(struct sbuf *sb, struct mbuf *m)
+{
+ int len, n, nn;
+
+ len = m->m_len;
+
+ if (sb->sb_wptr < sb->sb_rptr) {
+ n = sb->sb_rptr - sb->sb_wptr;
+ if (n > len) n = len;
+ memcpy(sb->sb_wptr, m->m_data, n);
+ } else {
+ /* Do the right edge first */
+ n = sb->sb_data + sb->sb_datalen - sb->sb_wptr;
+ if (n > len) n = len;
+ memcpy(sb->sb_wptr, m->m_data, n);
+ len -= n;
+ if (len) {
+ /* Now the left edge */
+ nn = sb->sb_rptr - sb->sb_data;
+ if (nn > len) nn = len;
+ memcpy(sb->sb_data,m->m_data+n,nn);
+ n += nn;
+ }
+ }
+
+ sb->sb_cc += n;
+ sb->sb_wptr += n;
+ if (sb->sb_wptr >= sb->sb_data + sb->sb_datalen)
+ sb->sb_wptr -= sb->sb_datalen;
+}
+
+/*
+ * Copy data from sbuf to a normal, straight buffer
+ * Don't update the sbuf rptr, this will be
+ * done in sbdrop when the data is acked
+ */
+void
+sbcopy(struct sbuf *sb, int off, int len, char *to)
+{
+ char *from;
+
+ from = sb->sb_rptr + off;
+ if (from >= sb->sb_data + sb->sb_datalen)
+ from -= sb->sb_datalen;
+
+ if (from < sb->sb_wptr) {
+ if (len > sb->sb_cc) len = sb->sb_cc;
+ memcpy(to,from,len);
+ } else {
+ /* re-use off */
+ off = (sb->sb_data + sb->sb_datalen) - from;
+ if (off > len) off = len;
+ memcpy(to,from,off);
+ len -= off;
+ if (len)
+ memcpy(to+off,sb->sb_data,len);
+ }
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.h
new file mode 100644
index 0000000..4f22e7c
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#ifndef _SBUF_H_
+#define _SBUF_H_
+
+#define sbflush(sb) sbdrop((sb),(sb)->sb_cc)
+#define sbspace(sb) ((sb)->sb_datalen - (sb)->sb_cc)
+
+struct sbuf {
+ u_int sb_cc; /* actual chars in buffer */
+ u_int sb_datalen; /* Length of data */
+ char *sb_wptr; /* write pointer. points to where the next
+ * bytes should be written in the sbuf */
+ char *sb_rptr; /* read pointer. points to where the next
+ * byte should be read from the sbuf */
+ char *sb_data; /* Actual data */
+};
+
+void sbfree(struct sbuf *);
+void sbdrop(struct sbuf *, int);
+void sbreserve(struct sbuf *, int);
+void sbappend(struct socket *, struct mbuf *);
+void sbcopy(struct sbuf *, int, int, char *);
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.c
new file mode 100644
index 0000000..db8c117
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.c
@@ -0,0 +1,828 @@
+/*
+ * libslirp glue
+ *
+ * Copyright (c) 2004-2008 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "slirp.h"
+
+/* host loopback address */
+struct in_addr loopback_addr;
+
+/* emulated hosts use the MAC addr 52:55:IP:IP:IP:IP */
+static const uint8_t special_ethaddr[6] = {
+ 0x52, 0x55, 0x00, 0x00, 0x00, 0x00
+};
+
+static const uint8_t zero_ethaddr[6] = { 0, 0, 0, 0, 0, 0 };
+
+/* XXX: suppress those select globals */
+fd_set *global_readfds, *global_writefds, *global_xfds;
+
+u_int curtime;
+static u_int time_fasttimo, last_slowtimo;
+static int do_slowtimo;
+
+static struct in_addr dns_addr;
+static u_int dns_addr_time;
+
+#ifdef _WIN32
+
+int get_dns_addr(struct in_addr *pdns_addr)
+{
+ FIXED_INFO *FixedInfo=NULL;
+ ULONG BufLen;
+ DWORD ret;
+ IP_ADDR_STRING *pIPAddr;
+ struct in_addr tmp_addr;
+
+ if (dns_addr.s_addr != 0 && (curtime - dns_addr_time) < 1000) {
+ *pdns_addr = dns_addr;
+ return 0;
+ }
+
+ FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, sizeof(FIXED_INFO));
+ BufLen = sizeof(FIXED_INFO);
+
+ if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, &BufLen)) {
+ if (FixedInfo) {
+ GlobalFree(FixedInfo);
+ FixedInfo = NULL;
+ }
+ FixedInfo = GlobalAlloc(GPTR, BufLen);
+ }
+
+ if ((ret = GetNetworkParams(FixedInfo, &BufLen)) != ERROR_SUCCESS) {
+ printf("GetNetworkParams failed. ret = %08x\n", (u_int)ret );
+ if (FixedInfo) {
+ GlobalFree(FixedInfo);
+ FixedInfo = NULL;
+ }
+ return -1;
+ }
+
+ pIPAddr = &(FixedInfo->DnsServerList);
+ inet_aton(pIPAddr->IpAddress.String, &tmp_addr);
+ *pdns_addr = tmp_addr;
+ dns_addr = tmp_addr;
+ dns_addr_time = curtime;
+ if (FixedInfo) {
+ GlobalFree(FixedInfo);
+ FixedInfo = NULL;
+ }
+ return 0;
+}
+
+static void winsock_cleanup(void)
+{
+ WSACleanup();
+}
+
+#else
+
+static struct stat dns_addr_stat;
+
+int get_dns_addr(struct in_addr *pdns_addr)
+{
+ char buff[512];
+ char buff2[257];
+ FILE *f;
+ int found = 0;
+ struct in_addr tmp_addr;
+
+ if (dns_addr.s_addr != 0) {
+ struct stat old_stat;
+ if ((curtime - dns_addr_time) < 1000) {
+ *pdns_addr = dns_addr;
+ return 0;
+ }
+ old_stat = dns_addr_stat;
+ if (stat("/etc/resolv.conf", &dns_addr_stat) != 0)
+ return -1;
+ if ((dns_addr_stat.st_dev == old_stat.st_dev)
+ && (dns_addr_stat.st_ino == old_stat.st_ino)
+ && (dns_addr_stat.st_size == old_stat.st_size)
+ && (dns_addr_stat.st_mtime == old_stat.st_mtime)) {
+ *pdns_addr = dns_addr;
+ return 0;
+ }
+ }
+
+ f = fopen("/etc/resolv.conf", "r");
+ if (!f)
+ return -1;
+
+#ifdef DEBUG
+ lprint("IP address of your DNS(s): ");
+#endif
+ while (fgets(buff, 512, f) != NULL) {
+ if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) {
+ if (!inet_aton(buff2, &tmp_addr))
+ continue;
+ /* If it's the first one, set it to dns_addr */
+ if (!found) {
+ *pdns_addr = tmp_addr;
+ dns_addr = tmp_addr;
+ dns_addr_time = curtime;
+ }
+#ifdef DEBUG
+ else
+ lprint(", ");
+#endif
+ if (++found > 3) {
+#ifdef DEBUG
+ lprint("(more)");
+#endif
+ break;
+ }
+#ifdef DEBUG
+ else
+ lprint("%s", inet_ntoa(tmp_addr));
+#endif
+ }
+ }
+ fclose(f);
+ if (!found)
+ return -1;
+ return 0;
+}
+
+#endif
+
+static void slirp_init_once(void)
+{
+ static int initialized;
+#ifdef _WIN32
+ WSADATA Data;
+#endif
+
+ if (initialized) {
+ return;
+ }
+ initialized = 1;
+
+#ifdef _WIN32
+ WSAStartup(MAKEWORD(2,0), &Data);
+ atexit(winsock_cleanup);
+#endif
+
+ loopback_addr.s_addr = htonl(INADDR_LOOPBACK);
+}
+
+Slirp *slirp_init(int restricted, struct in_addr vnetwork,
+ struct in_addr vnetmask, struct in_addr vhost,
+ const char *vhostname, const char *tftp_path,
+ const char *bootfile, struct in_addr vdhcp_start,
+ struct in_addr vnameserver, void *opaque)
+{
+ Slirp *slirp = mallocz(sizeof(Slirp));
+
+ slirp_init_once();
+
+ slirp->restricted = restricted;
+
+ if_init(slirp);
+ ip_init(slirp);
+
+ /* Initialise mbufs *after* setting the MTU */
+ m_init(slirp);
+
+ slirp->vnetwork_addr = vnetwork;
+ slirp->vnetwork_mask = vnetmask;
+ slirp->vhost_addr = vhost;
+ if (vhostname) {
+ pstrcpy(slirp->client_hostname, sizeof(slirp->client_hostname),
+ vhostname);
+ }
+ if (tftp_path) {
+ slirp->tftp_prefix = strdup(tftp_path);
+ }
+ if (bootfile) {
+ slirp->bootp_filename = strdup(bootfile);
+ }
+ slirp->vdhcp_startaddr = vdhcp_start;
+ slirp->vnameserver_addr = vnameserver;
+
+ slirp->opaque = opaque;
+
+ return slirp;
+}
+
+void slirp_cleanup(Slirp *slirp)
+{
+ free(slirp->tftp_prefix);
+ free(slirp->bootp_filename);
+ free(slirp);
+}
+
+#define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
+#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
+#define UPD_NFDS(x) if (nfds < (x)) nfds = (x)
+
+void slirp_select_fill(Slirp *slirp, int *pnfds,
+ fd_set *readfds, fd_set *writefds, fd_set *xfds)
+{
+ struct socket *so, *so_next;
+ int nfds;
+
+ /* fail safe */
+ global_readfds = NULL;
+ global_writefds = NULL;
+ global_xfds = NULL;
+
+ nfds = *pnfds;
+ /*
+ * First, TCP sockets
+ */
+ do_slowtimo = 0;
+
+ {
+ /*
+ * *_slowtimo needs calling if there are IP fragments
+ * in the fragment queue, or there are TCP connections active
+ */
+ do_slowtimo |= ((slirp->tcb.so_next != &slirp->tcb) ||
+ (&slirp->ipq.ip_link != slirp->ipq.ip_link.next));
+
+ for (so = slirp->tcb.so_next; so != &slirp->tcb;
+ so = so_next) {
+ so_next = so->so_next;
+
+ /*
+ * See if we need a tcp_fasttimo
+ */
+ if (time_fasttimo == 0 && so->so_tcpcb->t_flags & TF_DELACK)
+ time_fasttimo = curtime; /* Flag when we want a fasttimo */
+
+ /*
+ * NOFDREF can include still connecting to local-host,
+ * newly socreated() sockets etc. Don't want to select these.
+ */
+ if (so->so_state & SS_NOFDREF || so->s == -1)
+ continue;
+
+ /*
+ * Set for reading sockets which are accepting
+ */
+ if (so->so_state & SS_FACCEPTCONN) {
+ FD_SET(so->s, readfds);
+ UPD_NFDS(so->s);
+ continue;
+ }
+
+ /*
+ * Set for writing sockets which are connecting
+ */
+ if (so->so_state & SS_ISFCONNECTING) {
+ FD_SET(so->s, writefds);
+ UPD_NFDS(so->s);
+ continue;
+ }
+
+ /*
+ * Set for writing if we are connected, can send more, and
+ * we have something to send
+ */
+ if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) {
+ FD_SET(so->s, writefds);
+ UPD_NFDS(so->s);
+ }
+
+ /*
+ * Set for reading (and urgent data) if we are connected, can
+ * receive more, and we have room for it XXX /2 ?
+ */
+ if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) {
+ FD_SET(so->s, readfds);
+ FD_SET(so->s, xfds);
+ UPD_NFDS(so->s);
+ }
+ }
+
+ /*
+ * UDP sockets
+ */
+ for (so = slirp->udb.so_next; so != &slirp->udb;
+ so = so_next) {
+ so_next = so->so_next;
+
+ /*
+ * See if it's timed out
+ */
+ if (so->so_expire) {
+ if (so->so_expire <= curtime) {
+ udp_detach(so);
+ continue;
+ } else
+ do_slowtimo = 1; /* Let socket expire */
+ }
+
+ /*
+ * When UDP packets are received from over the
+ * link, they're sendto()'d straight away, so
+ * no need for setting for writing
+ * Limit the number of packets queued by this session
+ * to 4. Note that even though we try and limit this
+ * to 4 packets, the session could have more queued
+ * if the packets needed to be fragmented
+ * (XXX <= 4 ?)
+ */
+ if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) {
+ FD_SET(so->s, readfds);
+ UPD_NFDS(so->s);
+ }
+ }
+ }
+
+ *pnfds = nfds;
+}
+
+void slirp_select_poll(Slirp *slirp,
+ fd_set *readfds, fd_set *writefds, fd_set *xfds,
+ int select_error)
+{
+ struct socket *so, *so_next;
+ int ret;
+
+ global_readfds = readfds;
+ global_writefds = writefds;
+ global_xfds = xfds;
+
+ curtime = os_get_time_ms();
+
+ {
+ /*
+ * See if anything has timed out
+ */
+ if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) {
+ tcp_fasttimo(slirp);
+ time_fasttimo = 0;
+ }
+ if (do_slowtimo && ((curtime - last_slowtimo) >= 499)) {
+ ip_slowtimo(slirp);
+ tcp_slowtimo(slirp);
+ last_slowtimo = curtime;
+ }
+
+ /*
+ * Check sockets
+ */
+ if (!select_error) {
+ /*
+ * Check TCP sockets
+ */
+ for (so = slirp->tcb.so_next; so != &slirp->tcb;
+ so = so_next) {
+ so_next = so->so_next;
+
+ /*
+ * FD_ISSET is meaningless on these sockets
+ * (and they can crash the program)
+ */
+ if (so->so_state & SS_NOFDREF || so->s == -1)
+ continue;
+
+ /*
+ * Check for URG data
+ * This will soread as well, so no need to
+ * test for readfds below if this succeeds
+ */
+ if (FD_ISSET(so->s, xfds))
+ sorecvoob(so);
+ /*
+ * Check sockets for reading
+ */
+ else if (FD_ISSET(so->s, readfds)) {
+ /*
+ * Check for incoming connections
+ */
+ if (so->so_state & SS_FACCEPTCONN) {
+ tcp_connect(so);
+ continue;
+ } /* else */
+ ret = soread(so);
+
+ /* Output it if we read something */
+ if (ret > 0)
+ tcp_output(sototcpcb(so));
+ }
+
+ /*
+ * Check sockets for writing
+ */
+ if (FD_ISSET(so->s, writefds)) {
+ /*
+ * Check for non-blocking, still-connecting sockets
+ */
+ if (so->so_state & SS_ISFCONNECTING) {
+ /* Connected */
+ so->so_state &= ~SS_ISFCONNECTING;
+
+ ret = send(so->s, (const void *) &ret, 0, 0);
+ if (ret < 0) {
+ /* XXXXX Must fix, zero bytes is a NOP */
+ if (errno == EAGAIN || errno == EWOULDBLOCK ||
+ errno == EINPROGRESS || errno == ENOTCONN)
+ continue;
+
+ /* else failed */
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF;
+ }
+ /* else so->so_state &= ~SS_ISFCONNECTING; */
+
+ /*
+ * Continue tcp_input
+ */
+ tcp_input((struct mbuf *)NULL, sizeof(struct ip), so);
+ /* continue; */
+ } else
+ ret = sowrite(so);
+ /*
+ * XXXXX If we wrote something (a lot), there
+ * could be a need for a window update.
+ * In the worst case, the remote will send
+ * a window probe to get things going again
+ */
+ }
+
+ /*
+ * Probe a still-connecting, non-blocking socket
+ * to check if it's still alive
+ */
+#ifdef PROBE_CONN
+ if (so->so_state & SS_ISFCONNECTING) {
+ ret = recv(so->s, (char *)&ret, 0,0);
+
+ if (ret < 0) {
+ /* XXX */
+ if (errno == EAGAIN || errno == EWOULDBLOCK ||
+ errno == EINPROGRESS || errno == ENOTCONN)
+ continue; /* Still connecting, continue */
+
+ /* else failed */
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF;
+
+ /* tcp_input will take care of it */
+ } else {
+ ret = send(so->s, &ret, 0,0);
+ if (ret < 0) {
+ /* XXX */
+ if (errno == EAGAIN || errno == EWOULDBLOCK ||
+ errno == EINPROGRESS || errno == ENOTCONN)
+ continue;
+ /* else failed */
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF;
+ } else
+ so->so_state &= ~SS_ISFCONNECTING;
+
+ }
+ tcp_input((struct mbuf *)NULL, sizeof(struct ip),so);
+ } /* SS_ISFCONNECTING */
+#endif
+ }
+
+ /*
+ * Now UDP sockets.
+ * Incoming packets are sent straight away, they're not buffered.
+ * Incoming UDP data isn't buffered either.
+ */
+ for (so = slirp->udb.so_next; so != &slirp->udb;
+ so = so_next) {
+ so_next = so->so_next;
+
+ if (so->s != -1 && FD_ISSET(so->s, readfds)) {
+ sorecvfrom(so);
+ }
+ }
+ }
+
+ /*
+ * See if we can start outputting
+ */
+ if (slirp->if_queued) {
+ if_start(slirp);
+ }
+ }
+
+ /* clear global file descriptor sets.
+ * these reside on the stack in vl.c
+ * so they're unusable if we're not in
+ * slirp_select_fill or slirp_select_poll.
+ */
+ global_readfds = NULL;
+ global_writefds = NULL;
+ global_xfds = NULL;
+}
+
+#define ETH_ALEN 6
+#define ETH_HLEN 14
+
+#define ETH_P_IP 0x0800 /* Internet Protocol packet */
+#define ETH_P_ARP 0x0806 /* Address Resolution packet */
+
+#define ARPOP_REQUEST 1 /* ARP request */
+#define ARPOP_REPLY 2 /* ARP reply */
+
+struct ethhdr
+{
+ unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
+ unsigned char h_source[ETH_ALEN]; /* source ether addr */
+ unsigned short h_proto; /* packet type ID field */
+};
+
+struct arphdr
+{
+ unsigned short ar_hrd; /* format of hardware address */
+ unsigned short ar_pro; /* format of protocol address */
+ unsigned char ar_hln; /* length of hardware address */
+ unsigned char ar_pln; /* length of protocol address */
+ unsigned short ar_op; /* ARP opcode (command) */
+
+ /*
+ * Ethernet looks like this : This bit is variable sized however...
+ */
+ unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */
+ uint32_t ar_sip; /* sender IP address */
+ unsigned char ar_tha[ETH_ALEN]; /* target hardware address */
+ uint32_t ar_tip ; /* target IP address */
+} __attribute__((packed));
+
+static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
+{
+ struct ethhdr *eh = (struct ethhdr *)pkt;
+ struct arphdr *ah = (struct arphdr *)(pkt + ETH_HLEN);
+ uint8_t arp_reply[max(ETH_HLEN + sizeof(struct arphdr), 64)];
+ struct ethhdr *reh = (struct ethhdr *)arp_reply;
+ struct arphdr *rah = (struct arphdr *)(arp_reply + ETH_HLEN);
+ int ar_op;
+ struct ex_list *ex_ptr;
+
+ ar_op = ntohs(ah->ar_op);
+ switch(ar_op) {
+ case ARPOP_REQUEST:
+ if ((ah->ar_tip & slirp->vnetwork_mask.s_addr) ==
+ slirp->vnetwork_addr.s_addr) {
+ if (ah->ar_tip == slirp->vnameserver_addr.s_addr ||
+ ah->ar_tip == slirp->vhost_addr.s_addr)
+ goto arp_ok;
+ for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
+ if (ex_ptr->ex_addr.s_addr == ah->ar_tip)
+ goto arp_ok;
+ }
+ return;
+ arp_ok:
+ memset(arp_reply, 0, sizeof(arp_reply));
+ /* XXX: make an ARP request to have the client address */
+ memcpy(slirp->client_ethaddr, eh->h_source, ETH_ALEN);
+
+ /* ARP request for alias/dns mac address */
+ memcpy(reh->h_dest, pkt + ETH_ALEN, ETH_ALEN);
+ memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 4);
+ memcpy(&reh->h_source[2], &ah->ar_tip, 4);
+ reh->h_proto = htons(ETH_P_ARP);
+
+ rah->ar_hrd = htons(1);
+ rah->ar_pro = htons(ETH_P_IP);
+ rah->ar_hln = ETH_ALEN;
+ rah->ar_pln = 4;
+ rah->ar_op = htons(ARPOP_REPLY);
+ memcpy(rah->ar_sha, reh->h_source, ETH_ALEN);
+ rah->ar_sip = ah->ar_tip;
+ memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
+ rah->ar_tip = ah->ar_sip;
+ slirp_output(slirp->opaque, arp_reply, sizeof(arp_reply));
+ }
+ break;
+ case ARPOP_REPLY:
+ /* reply to request of client mac address ? */
+ if (!memcmp(slirp->client_ethaddr, zero_ethaddr, ETH_ALEN) &&
+ ah->ar_sip == slirp->client_ipaddr.s_addr) {
+ memcpy(slirp->client_ethaddr, ah->ar_sha, ETH_ALEN);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
+{
+ struct mbuf *m;
+ int proto;
+
+ if (pkt_len < ETH_HLEN)
+ return;
+
+ proto = ntohs(*(uint16_t *)(pkt + 12));
+ switch(proto) {
+ case ETH_P_ARP:
+ arp_input(slirp, pkt, pkt_len);
+ break;
+ case ETH_P_IP:
+ m = m_get(slirp);
+ if (!m)
+ return;
+ /* Note: we add to align the IP header */
+ if (M_FREEROOM(m) < pkt_len + 2) {
+ m_inc(m, pkt_len + 2);
+ }
+ m->m_len = pkt_len + 2;
+ memcpy(m->m_data + 2, pkt, pkt_len);
+
+ m->m_data += 2 + ETH_HLEN;
+ m->m_len -= 2 + ETH_HLEN;
+
+ ip_input(m);
+ break;
+ default:
+ break;
+ }
+}
+
+/* output the IP packet to the ethernet device */
+void if_encap(Slirp *slirp, const uint8_t *ip_data, int ip_data_len)
+{
+ uint8_t buf[1600];
+ struct ethhdr *eh = (struct ethhdr *)buf;
+
+ if (ip_data_len + ETH_HLEN > sizeof(buf))
+ return;
+
+ if (!memcmp(slirp->client_ethaddr, zero_ethaddr, ETH_ALEN)) {
+ uint8_t arp_req[ETH_HLEN + sizeof(struct arphdr)];
+ struct ethhdr *reh = (struct ethhdr *)arp_req;
+ struct arphdr *rah = (struct arphdr *)(arp_req + ETH_HLEN);
+ const struct ip *iph = (const struct ip *)ip_data;
+
+ /* If the client addr is not known, there is no point in
+ sending the packet to it. Normally the sender should have
+ done an ARP request to get its MAC address. Here we do it
+ in place of sending the packet and we hope that the sender
+ will retry sending its packet. */
+ memset(reh->h_dest, 0xff, ETH_ALEN);
+ memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 4);
+ memcpy(&reh->h_source[2], &slirp->vhost_addr, 4);
+ reh->h_proto = htons(ETH_P_ARP);
+ rah->ar_hrd = htons(1);
+ rah->ar_pro = htons(ETH_P_IP);
+ rah->ar_hln = ETH_ALEN;
+ rah->ar_pln = 4;
+ rah->ar_op = htons(ARPOP_REQUEST);
+ /* source hw addr */
+ memcpy(rah->ar_sha, special_ethaddr, ETH_ALEN - 4);
+ memcpy(&rah->ar_sha[2], &slirp->vhost_addr, 4);
+ /* source IP */
+ rah->ar_sip = slirp->vhost_addr.s_addr;
+ /* target hw addr (none) */
+ memset(rah->ar_tha, 0, ETH_ALEN);
+ /* target IP */
+ rah->ar_tip = iph->ip_dst.s_addr;
+ slirp->client_ipaddr = iph->ip_dst;
+ slirp_output(slirp->opaque, arp_req, sizeof(arp_req));
+ } else {
+ memcpy(eh->h_dest, slirp->client_ethaddr, ETH_ALEN);
+ memcpy(eh->h_source, special_ethaddr, ETH_ALEN - 4);
+ /* XXX: not correct */
+ memcpy(&eh->h_source[2], &slirp->vhost_addr, 4);
+ eh->h_proto = htons(ETH_P_IP);
+ memcpy(buf + sizeof(struct ethhdr), ip_data, ip_data_len);
+ slirp_output(slirp->opaque, buf, ip_data_len + ETH_HLEN);
+ }
+}
+
+/* Drop host forwarding rule, return 0 if found. */
+int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
+ int host_port)
+{
+ struct socket *so;
+ struct socket *head = (is_udp ? &slirp->udb : &slirp->tcb);
+ struct sockaddr_in addr;
+ int port = htons(host_port);
+ socklen_t addr_len;
+
+ for (so = head->so_next; so != head; so = so->so_next) {
+ addr_len = sizeof(addr);
+ if ((so->so_state & SS_HOSTFWD) &&
+ getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 &&
+ addr.sin_addr.s_addr == host_addr.s_addr &&
+ addr.sin_port == port) {
+ close(so->s);
+ sofree(so);
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
+ int host_port, struct in_addr guest_addr, int guest_port)
+{
+ if (!guest_addr.s_addr) {
+ guest_addr = slirp->vdhcp_startaddr;
+ }
+ if (is_udp) {
+ if (!udp_listen(slirp, host_addr.s_addr, htons(host_port),
+ guest_addr.s_addr, htons(guest_port), SS_HOSTFWD))
+ return -1;
+ } else {
+ if (!tcp_listen(slirp, host_addr.s_addr, htons(host_port),
+ guest_addr.s_addr, htons(guest_port), SS_HOSTFWD))
+ return -1;
+ }
+ return 0;
+}
+
+int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
+ struct in_addr *guest_addr, int guest_port)
+{
+ if (!guest_addr->s_addr) {
+ guest_addr->s_addr = slirp->vnetwork_addr.s_addr |
+ (htonl(0x0204) & ~slirp->vnetwork_mask.s_addr);
+ }
+ if ((guest_addr->s_addr & slirp->vnetwork_mask.s_addr) !=
+ slirp->vnetwork_addr.s_addr ||
+ guest_addr->s_addr == slirp->vhost_addr.s_addr ||
+ guest_addr->s_addr == slirp->vnameserver_addr.s_addr) {
+ return -1;
+ }
+ return add_exec(&slirp->exec_list, do_pty, (char *)args, *guest_addr,
+ htons(guest_port));
+}
+
+ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags)
+{
+#if 0
+ if (so->s == -1 && so->extra) {
+ qemu_chr_write(so->extra, buf, len);
+ return len;
+ }
+#endif
+ return send(so->s, buf, len, flags);
+}
+
+static struct socket *
+slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, int guest_port)
+{
+ struct socket *so;
+
+ for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) {
+ if (so->so_faddr.s_addr == guest_addr.s_addr &&
+ htons(so->so_fport) == guest_port) {
+ return so;
+ }
+ }
+ return NULL;
+}
+
+size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr,
+ int guest_port)
+{
+ struct iovec iov[2];
+ struct socket *so;
+
+ so = slirp_find_ctl_socket(slirp, guest_addr, guest_port);
+
+ if (!so || so->so_state & SS_NOFDREF)
+ return 0;
+
+ if (!CONN_CANFRCV(so) || so->so_snd.sb_cc >= (so->so_snd.sb_datalen/2))
+ return 0;
+
+ return sopreprbuf(so, iov, NULL);
+}
+
+void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr, int guest_port,
+ const uint8_t *buf, int size)
+{
+ int ret;
+ struct socket *so = slirp_find_ctl_socket(slirp, guest_addr, guest_port);
+
+ if (!so)
+ return;
+
+ ret = soreadbuf(so, (const char *)buf, size);
+
+ if (ret > 0)
+ tcp_output(sototcpcb(so));
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.h
new file mode 100644
index 0000000..e2fc655
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.h
@@ -0,0 +1,313 @@
+#ifndef __COMMON_H__
+#define __COMMON_H__
+
+#include <stdlib.h>
+#include "../cutils.h"
+#include "slirp_config.h"
+
+#ifdef _WIN32
+# include <inttypes.h>
+
+typedef char *caddr_t;
+
+# include <windows.h>
+# include <winsock2.h>
+# include <ws2tcpip.h>
+# include <sys/timeb.h>
+# include <iphlpapi.h>
+
+# define EWOULDBLOCK WSAEWOULDBLOCK
+# define EINPROGRESS WSAEINPROGRESS
+# define ENOTCONN WSAENOTCONN
+# define EHOSTUNREACH WSAEHOSTUNREACH
+# define ENETUNREACH WSAENETUNREACH
+# define ECONNREFUSED WSAECONNREFUSED
+#else
+# define ioctlsocket ioctl
+# define closesocket(s) close(s)
+# if !defined(__HAIKU__)
+# define O_BINARY 0
+# endif
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_BITYPES_H
+# include <sys/bitypes.h>
+#endif
+
+#include <sys/time.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+
+#ifndef HAVE_MEMMOVE
+#define memmove(x, y, z) bcopy(y, x, z)
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+
+#ifndef _WIN32
+#include <sys/uio.h>
+#endif
+
+#ifndef _WIN32
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+/* Systems lacking strdup() definition in <string.h>. */
+#if defined(ultrix)
+char *strdup(const char *);
+#endif
+
+/* Systems lacking malloc() definition in <stdlib.h>. */
+#if defined(ultrix) || defined(hcx)
+void *malloc(size_t arg);
+void free(void *ptr);
+#endif
+
+#ifndef HAVE_INET_ATON
+int inet_aton(const char *cp, struct in_addr *ia);
+#endif
+
+#include <fcntl.h>
+#ifndef NO_UNIX_SOCKETS
+#include <sys/un.h>
+#endif
+#include <signal.h>
+#ifdef HAVE_SYS_SIGNAL_H
+# include <sys/signal.h>
+#endif
+#ifndef _WIN32
+#include <sys/socket.h>
+#endif
+
+#if defined(HAVE_SYS_IOCTL_H)
+# include <sys/ioctl.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+
+#ifdef HAVE_SYS_FILIO_H
+# include <sys/filio.h>
+#endif
+
+#ifdef USE_PPP
+#include <ppp/slirppp.h>
+#endif
+
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#include <sys/stat.h>
+
+/* Avoid conflicting with the libc insque() and remque(), which
+ have different prototypes. */
+#define insque slirp_insque
+#define remque slirp_remque
+
+#ifdef HAVE_SYS_STROPTS_H
+#include <sys/stropts.h>
+#endif
+
+#include "debug.h"
+
+#include "libslirp.h"
+#include "ip.h"
+#include "tcp.h"
+#include "tcp_timer.h"
+#include "tcp_var.h"
+#include "tcpip.h"
+#include "udp.h"
+#include "mbuf.h"
+#include "sbuf.h"
+#include "socket.h"
+#include "if.h"
+#include "main.h"
+#include "misc.h"
+#ifdef USE_PPP
+#include "ppp/pppd.h"
+#include "ppp/ppp.h"
+#endif
+
+#include "bootp.h"
+#include "tftp.h"
+
+struct Slirp {
+ /* virtual network configuration */
+ struct in_addr vnetwork_addr;
+ struct in_addr vnetwork_mask;
+ struct in_addr vhost_addr;
+ struct in_addr vdhcp_startaddr;
+ struct in_addr vnameserver_addr;
+
+ /* ARP cache for the guest IP addresses (XXX: allow many entries) */
+ uint8_t client_ethaddr[6];
+
+ struct in_addr client_ipaddr;
+ char client_hostname[33];
+
+ int restricted;
+ struct timeval tt;
+ struct ex_list *exec_list;
+
+ /* mbuf states */
+ struct mbuf m_freelist, m_usedlist;
+ int mbuf_alloced;
+
+ /* if states */
+ int if_queued; /* number of packets queued so far */
+ struct mbuf if_fastq; /* fast queue (for interactive data) */
+ struct mbuf if_batchq; /* queue for non-interactive data */
+ struct mbuf *next_m; /* pointer to next mbuf to output */
+
+ /* ip states */
+ struct ipq ipq; /* ip reass. queue */
+ uint16_t ip_id; /* ip packet ctr, for ids */
+
+ /* bootp/dhcp states */
+ BOOTPClient bootp_clients[NB_BOOTP_CLIENTS];
+ char *bootp_filename;
+
+ /* tcp states */
+ struct socket tcb;
+ struct socket *tcp_last_so;
+ tcp_seq tcp_iss; /* tcp initial send seq # */
+ uint32_t tcp_now; /* for RFC 1323 timestamps */
+
+ /* udp states */
+ struct socket udb;
+ struct socket *udp_last_so;
+
+ /* tftp states */
+ char *tftp_prefix;
+ struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX];
+
+ void *opaque;
+};
+
+extern Slirp *slirp_instance;
+
+#ifndef NULL
+#define NULL (void *)0
+#endif
+
+#ifndef FULL_BOLT
+void if_start(Slirp *);
+#else
+void if_start(struct ttys *);
+#endif
+
+#ifndef HAVE_STRERROR
+ char *strerror(int error);
+#endif
+
+#ifndef HAVE_INDEX
+ char *index(const char *, int);
+#endif
+
+#ifndef HAVE_GETHOSTID
+ long gethostid(void);
+#endif
+
+void lprint(const char *, ...) __attribute__((format(printf, 1, 2)));
+
+#ifndef _WIN32
+#include <netdb.h>
+#endif
+
+#define DEFAULT_BAUD 115200
+
+#define SO_OPTIONS DO_KEEPALIVE
+#define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL)
+
+/* cksum.c */
+int cksum(struct mbuf *m, int len);
+
+/* if.c */
+void if_init(Slirp *);
+void if_output(struct socket *, struct mbuf *);
+
+/* ip_input.c */
+void ip_init(Slirp *);
+void ip_input(struct mbuf *);
+void ip_slowtimo(Slirp *);
+void ip_stripoptions(register struct mbuf *, struct mbuf *);
+
+/* ip_output.c */
+int ip_output(struct socket *, struct mbuf *);
+
+/* tcp_input.c */
+void tcp_input(register struct mbuf *, int, struct socket *);
+int tcp_mss(register struct tcpcb *, u_int);
+
+/* tcp_output.c */
+int tcp_output(register struct tcpcb *);
+void tcp_setpersist(register struct tcpcb *);
+
+/* tcp_subr.c */
+void tcp_init(Slirp *);
+void tcp_template(struct tcpcb *);
+void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int);
+struct tcpcb * tcp_newtcpcb(struct socket *);
+struct tcpcb * tcp_close(register struct tcpcb *);
+void tcp_sockclosed(struct tcpcb *);
+int tcp_fconnect(struct socket *);
+void tcp_connect(struct socket *);
+int tcp_attach(struct socket *);
+uint8_t tcp_tos(struct socket *);
+int tcp_emu(struct socket *, struct mbuf *);
+int tcp_ctl(struct socket *);
+struct tcpcb *tcp_drop(struct tcpcb *tp, int err);
+
+#ifdef USE_PPP
+#define MIN_MRU MINMRU
+#define MAX_MRU MAXMRU
+#else
+#define MIN_MRU 128
+#define MAX_MRU 16384
+#endif
+
+#ifndef _WIN32
+#define min(x,y) ((x) < (y) ? (x) : (y))
+#define max(x,y) ((x) > (y) ? (x) : (y))
+#endif
+
+#ifdef _WIN32
+#undef errno
+#define errno (WSAGetLastError())
+#endif
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp_config.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp_config.h
new file mode 100644
index 0000000..18db45c
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp_config.h
@@ -0,0 +1,188 @@
+/*
+ * User definable configuration options
+ */
+
+/* Define if you want the connection to be probed */
+/* XXX Not working yet, so ignore this for now */
+#undef PROBE_CONN
+
+/* Define to 1 if you want KEEPALIVE timers */
+#define DO_KEEPALIVE 0
+
+/* Define to MAX interfaces you expect to use at once */
+/* MAX_INTERFACES determines the max. TOTAL number of interfaces (SLIP and PPP) */
+/* MAX_PPP_INTERFACES determines max. number of PPP interfaces */
+#define MAX_INTERFACES 1
+#define MAX_PPP_INTERFACES 1
+
+/* Define if you want slirp's socket in /tmp */
+/* XXXXXX Do this in ./configure */
+#undef USE_TMPSOCKET
+
+/* Define if you want slirp to use cfsetXspeed() on the terminal */
+#undef DO_CFSETSPEED
+
+/* Define this if you want slirp to write to the tty as fast as it can */
+/* This should only be set if you are using load-balancing, slirp does a */
+/* pretty good job on single modems already, and seting this will make */
+/* interactive sessions less responsive */
+/* XXXXX Talk about having fast modem as unit 0 */
+#undef FULL_BOLT
+
+/*
+ * Define if you want slirp to use less CPU
+ * You will notice a small lag in interactive sessions, but it's not that bad
+ * Things like Netscape/ftp/etc. are completely unaffected
+ * This is mainly for sysadmins who have many slirp users
+ */
+#undef USE_LOWCPU
+
+/* Define this if your compiler doesn't like prototypes */
+#ifndef __STDC__
+#define NO_PROTOTYPES
+#endif
+
+/*********************************************************/
+/*
+ * Autoconf defined configuration options
+ * You shouldn't need to touch any of these
+ */
+
+/* Ignore this */
+#undef DUMMY_PPP
+
+/* Define if you have unistd.h */
+#define HAVE_UNISTD_H
+
+/* Define if you have stdlib.h */
+#define HAVE_STDLIB_H
+
+/* Define if you have sys/ioctl.h */
+#undef HAVE_SYS_IOCTL_H
+#ifndef _WIN32
+#define HAVE_SYS_IOCTL_H
+#endif
+
+/* Define if you have sys/filio.h */
+#undef HAVE_SYS_FILIO_H
+#ifdef __APPLE__
+#define HAVE_SYS_FILIO_H
+#endif
+
+/* Define if you have strerror */
+#define HAVE_STRERROR
+
+/* Define if you have strdup() */
+#define HAVE_STRDUP
+
+/* Define according to how time.h should be included */
+#define TIME_WITH_SYS_TIME 0
+#undef HAVE_SYS_TIME_H
+
+/* Define if you have sys/bitypes.h */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define if the machine is big endian */
+//#undef HOST_WORDS_BIGENDIAN
+
+/* Define if you have readv */
+#undef HAVE_READV
+
+/* Define if iovec needs to be declared */
+#undef DECLARE_IOVEC
+#ifdef _WIN32
+#define DECLARE_IOVEC
+#endif
+
+/* Define if you have a POSIX.1 sys/wait.h */
+#undef HAVE_SYS_WAIT_H
+
+/* Define if you have sys/select.h */
+#undef HAVE_SYS_SELECT_H
+#ifndef _WIN32
+#define HAVE_SYS_SELECT_H
+#endif
+
+/* Define if you have strings.h */
+#define HAVE_STRING_H
+
+/* Define if you have arpa/inet.h */
+#undef HAVE_ARPA_INET_H
+#ifndef _WIN32
+#define HAVE_ARPA_INET_H
+#endif
+
+/* Define if you have sys/signal.h */
+#undef HAVE_SYS_SIGNAL_H
+
+/* Define if you have sys/stropts.h */
+#undef HAVE_SYS_STROPTS_H
+
+/* Define to whatever your compiler thinks inline should be */
+//#define inline inline
+
+/* Define to whatever your compiler thinks const should be */
+//#define const const
+
+/* Define if your compiler doesn't like prototypes */
+#undef NO_PROTOTYPES
+
+/* Define to sizeof(char) */
+#define SIZEOF_CHAR 1
+
+/* Define to sizeof(short) */
+#define SIZEOF_SHORT 2
+
+/* Define to sizeof(int) */
+#define SIZEOF_INT 4
+
+/* Define to sizeof(char *) */
+#define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
+
+/* Define if you have random() */
+#undef HAVE_RANDOM
+
+/* Define if you have srandom() */
+#undef HAVE_SRANDOM
+
+/* Define if you have inet_aton */
+#undef HAVE_INET_ATON
+#ifndef _WIN32
+#define HAVE_INET_ATON
+#endif
+
+/* Define if you have setenv */
+#undef HAVE_SETENV
+
+/* Define if you have index() */
+#define HAVE_INDEX
+
+/* Define if you have bcmp() */
+#undef HAVE_BCMP
+
+/* Define if you have drand48 */
+#undef HAVE_DRAND48
+
+/* Define if you have memmove */
+#define HAVE_MEMMOVE
+
+/* Define if you have gethostid */
+#define HAVE_GETHOSTID
+
+/* Define if you DON'T have unix-domain sockets */
+#undef NO_UNIX_SOCKETS
+#ifdef _WIN32
+#define NO_UNIX_SOCKETS
+#endif
+
+/* Define if you have revoke() */
+#undef HAVE_REVOKE
+
+/* Define if you have the sysv method of opening pty's (/dev/ptmx, etc.) */
+#undef HAVE_GRANTPT
+
+/* Define if you have fchmod */
+#undef HAVE_FCHMOD
+
+/* Define if you have <sys/type32.h> */
+#undef HAVE_SYS_TYPES32_H
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.c
new file mode 100644
index 0000000..1ba8ae1
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.c
@@ -0,0 +1,722 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+#include "ip_icmp.h"
+
+static void sofcantrcvmore(struct socket *so);
+static void sofcantsendmore(struct socket *so);
+
+struct socket *
+solookup(struct socket *head, struct in_addr laddr, u_int lport,
+ struct in_addr faddr, u_int fport)
+{
+ struct socket *so;
+
+ for (so = head->so_next; so != head; so = so->so_next) {
+ if (so->so_lport == lport &&
+ so->so_laddr.s_addr == laddr.s_addr &&
+ so->so_faddr.s_addr == faddr.s_addr &&
+ so->so_fport == fport)
+ break;
+ }
+
+ if (so == head)
+ return (struct socket *)NULL;
+ return so;
+
+}
+
+/*
+ * Create a new socket, initialise the fields
+ * It is the responsibility of the caller to
+ * insque() it into the correct linked-list
+ */
+struct socket *
+socreate(Slirp *slirp)
+{
+ struct socket *so;
+
+ so = (struct socket *)malloc(sizeof(struct socket));
+ if(so) {
+ memset(so, 0, sizeof(struct socket));
+ so->so_state = SS_NOFDREF;
+ so->s = -1;
+ so->slirp = slirp;
+ }
+ return(so);
+}
+
+/*
+ * remque and free a socket, clobber cache
+ */
+void
+sofree(struct socket *so)
+{
+ Slirp *slirp = so->slirp;
+
+ if (so->so_emu==EMU_RSH && so->extra) {
+ sofree(so->extra);
+ so->extra=NULL;
+ }
+ if (so == slirp->tcp_last_so) {
+ slirp->tcp_last_so = &slirp->tcb;
+ } else if (so == slirp->udp_last_so) {
+ slirp->udp_last_so = &slirp->udb;
+ }
+ m_free(so->so_m);
+
+ if(so->so_next && so->so_prev)
+ remque(so); /* crashes if so is not in a queue */
+
+ free(so);
+}
+
+size_t sopreprbuf(struct socket *so, struct iovec *iov, int *np)
+{
+ int n, lss, total;
+ struct sbuf *sb = &so->so_snd;
+ int len = sb->sb_datalen - sb->sb_cc;
+ int mss = so->so_tcpcb->t_maxseg;
+
+ DEBUG_CALL("sopreprbuf");
+ DEBUG_ARG("so = %lx", (long )so);
+
+ if (len <= 0)
+ return 0;
+
+ iov[0].iov_base = sb->sb_wptr;
+ iov[1].iov_base = NULL;
+ iov[1].iov_len = 0;
+ if (sb->sb_wptr < sb->sb_rptr) {
+ iov[0].iov_len = sb->sb_rptr - sb->sb_wptr;
+ /* Should never succeed, but... */
+ if (iov[0].iov_len > len)
+ iov[0].iov_len = len;
+ if (iov[0].iov_len > mss)
+ iov[0].iov_len -= iov[0].iov_len%mss;
+ n = 1;
+ } else {
+ iov[0].iov_len = (sb->sb_data + sb->sb_datalen) - sb->sb_wptr;
+ /* Should never succeed, but... */
+ if (iov[0].iov_len > len) iov[0].iov_len = len;
+ len -= iov[0].iov_len;
+ if (len) {
+ iov[1].iov_base = sb->sb_data;
+ iov[1].iov_len = sb->sb_rptr - sb->sb_data;
+ if(iov[1].iov_len > len)
+ iov[1].iov_len = len;
+ total = iov[0].iov_len + iov[1].iov_len;
+ if (total > mss) {
+ lss = total%mss;
+ if (iov[1].iov_len > lss) {
+ iov[1].iov_len -= lss;
+ n = 2;
+ } else {
+ lss -= iov[1].iov_len;
+ iov[0].iov_len -= lss;
+ n = 1;
+ }
+ } else
+ n = 2;
+ } else {
+ if (iov[0].iov_len > mss)
+ iov[0].iov_len -= iov[0].iov_len%mss;
+ n = 1;
+ }
+ }
+ if (np)
+ *np = n;
+
+ return iov[0].iov_len + (n - 1) * iov[1].iov_len;
+}
+
+/*
+ * Read from so's socket into sb_snd, updating all relevant sbuf fields
+ * NOTE: This will only be called if it is select()ed for reading, so
+ * a read() of 0 (or less) means it's disconnected
+ */
+int
+soread(struct socket *so)
+{
+ int n, nn;
+ struct sbuf *sb = &so->so_snd;
+ struct iovec iov[2];
+
+ DEBUG_CALL("soread");
+ DEBUG_ARG("so = %lx", (long )so);
+
+ /*
+ * No need to check if there's enough room to read.
+ * soread wouldn't have been called if there weren't
+ */
+ sopreprbuf(so, iov, &n);
+
+#ifdef HAVE_READV
+ nn = readv(so->s, (struct iovec *)iov, n);
+ DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn));
+#else
+ nn = recv(so->s, iov[0].iov_base, iov[0].iov_len,0);
+#endif
+ if (nn <= 0) {
+ if (nn < 0 && (errno == EINTR || errno == EAGAIN))
+ return 0;
+ else {
+ DEBUG_MISC((dfd, " --- soread() disconnected, nn = %d, errno = %d-%s\n", nn, errno,strerror(errno)));
+ sofcantrcvmore(so);
+ tcp_sockclosed(sototcpcb(so));
+ return -1;
+ }
+ }
+
+#ifndef HAVE_READV
+ /*
+ * If there was no error, try and read the second time round
+ * We read again if n = 2 (ie, there's another part of the buffer)
+ * and we read as much as we could in the first read
+ * We don't test for <= 0 this time, because there legitimately
+ * might not be any more data (since the socket is non-blocking),
+ * a close will be detected on next iteration.
+ * A return of -1 wont (shouldn't) happen, since it didn't happen above
+ */
+ if (n == 2 && nn == iov[0].iov_len) {
+ int ret;
+ ret = recv(so->s, iov[1].iov_base, iov[1].iov_len,0);
+ if (ret > 0)
+ nn += ret;
+ }
+
+ DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn));
+#endif
+
+ /* Update fields */
+ sb->sb_cc += nn;
+ sb->sb_wptr += nn;
+ if (sb->sb_wptr >= (sb->sb_data + sb->sb_datalen))
+ sb->sb_wptr -= sb->sb_datalen;
+ return nn;
+}
+
+int soreadbuf(struct socket *so, const char *buf, int size)
+{
+ int n, nn, copy = size;
+ struct sbuf *sb = &so->so_snd;
+ struct iovec iov[2];
+
+ DEBUG_CALL("soreadbuf");
+ DEBUG_ARG("so = %lx", (long )so);
+
+ /*
+ * No need to check if there's enough room to read.
+ * soread wouldn't have been called if there weren't
+ */
+ if (sopreprbuf(so, iov, &n) < size)
+ goto err;
+
+ nn = min(iov[0].iov_len, copy);
+ memcpy(iov[0].iov_base, buf, nn);
+
+ copy -= nn;
+ buf += nn;
+
+ if (copy == 0)
+ goto done;
+
+ memcpy(iov[1].iov_base, buf, copy);
+
+done:
+ /* Update fields */
+ sb->sb_cc += size;
+ sb->sb_wptr += size;
+ if (sb->sb_wptr >= (sb->sb_data + sb->sb_datalen))
+ sb->sb_wptr -= sb->sb_datalen;
+ return size;
+err:
+
+ sofcantrcvmore(so);
+ tcp_sockclosed(sototcpcb(so));
+ fprintf(stderr, "soreadbuf buffer to small");
+ return -1;
+}
+
+/*
+ * Get urgent data
+ *
+ * When the socket is created, we set it SO_OOBINLINE,
+ * so when OOB data arrives, we soread() it and everything
+ * in the send buffer is sent as urgent data
+ */
+void
+sorecvoob(struct socket *so)
+{
+ struct tcpcb *tp = sototcpcb(so);
+
+ DEBUG_CALL("sorecvoob");
+ DEBUG_ARG("so = %lx", (long)so);
+
+ /*
+ * We take a guess at how much urgent data has arrived.
+ * In most situations, when urgent data arrives, the next
+ * read() should get all the urgent data. This guess will
+ * be wrong however if more data arrives just after the
+ * urgent data, or the read() doesn't return all the
+ * urgent data.
+ */
+ soread(so);
+ tp->snd_up = tp->snd_una + so->so_snd.sb_cc;
+ tp->t_force = 1;
+ tcp_output(tp);
+ tp->t_force = 0;
+}
+
+/*
+ * Send urgent data
+ * There's a lot duplicated code here, but...
+ */
+int
+sosendoob(struct socket *so)
+{
+ struct sbuf *sb = &so->so_rcv;
+ char buff[2048]; /* XXX Shouldn't be sending more oob data than this */
+
+ int n, len;
+
+ DEBUG_CALL("sosendoob");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("sb->sb_cc = %d", sb->sb_cc);
+
+ if (so->so_urgc > 2048)
+ so->so_urgc = 2048; /* XXXX */
+
+ if (sb->sb_rptr < sb->sb_wptr) {
+ /* We can send it directly */
+ n = slirp_send(so, sb->sb_rptr, so->so_urgc, (MSG_OOB)); /* |MSG_DONTWAIT)); */
+ so->so_urgc -= n;
+
+ DEBUG_MISC((dfd, " --- sent %d bytes urgent data, %d urgent bytes left\n", n, so->so_urgc));
+ } else {
+ /*
+ * Since there's no sendv or sendtov like writev,
+ * we must copy all data to a linear buffer then
+ * send it all
+ */
+ len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr;
+ if (len > so->so_urgc) len = so->so_urgc;
+ memcpy(buff, sb->sb_rptr, len);
+ so->so_urgc -= len;
+ if (so->so_urgc) {
+ n = sb->sb_wptr - sb->sb_data;
+ if (n > so->so_urgc) n = so->so_urgc;
+ memcpy((buff + len), sb->sb_data, n);
+ so->so_urgc -= n;
+ len += n;
+ }
+ n = slirp_send(so, buff, len, (MSG_OOB)); /* |MSG_DONTWAIT)); */
+#ifdef DEBUG
+ if (n != len)
+ DEBUG_ERROR((dfd, "Didn't send all data urgently XXXXX\n"));
+#endif
+ DEBUG_MISC((dfd, " ---2 sent %d bytes urgent data, %d urgent bytes left\n", n, so->so_urgc));
+ }
+
+ sb->sb_cc -= n;
+ sb->sb_rptr += n;
+ if (sb->sb_rptr >= (sb->sb_data + sb->sb_datalen))
+ sb->sb_rptr -= sb->sb_datalen;
+
+ return n;
+}
+
+/*
+ * Write data from so_rcv to so's socket,
+ * updating all sbuf field as necessary
+ */
+int
+sowrite(struct socket *so)
+{
+ int n,nn;
+ struct sbuf *sb = &so->so_rcv;
+ int len = sb->sb_cc;
+ struct iovec iov[2];
+
+ DEBUG_CALL("sowrite");
+ DEBUG_ARG("so = %lx", (long)so);
+
+ if (so->so_urgc) {
+ sosendoob(so);
+ if (sb->sb_cc == 0)
+ return 0;
+ }
+
+ /*
+ * No need to check if there's something to write,
+ * sowrite wouldn't have been called otherwise
+ */
+
+ iov[0].iov_base = sb->sb_rptr;
+ iov[1].iov_base = NULL;
+ iov[1].iov_len = 0;
+ if (sb->sb_rptr < sb->sb_wptr) {
+ iov[0].iov_len = sb->sb_wptr - sb->sb_rptr;
+ /* Should never succeed, but... */
+ if (iov[0].iov_len > len) iov[0].iov_len = len;
+ n = 1;
+ } else {
+ iov[0].iov_len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr;
+ if (iov[0].iov_len > len) iov[0].iov_len = len;
+ len -= iov[0].iov_len;
+ if (len) {
+ iov[1].iov_base = sb->sb_data;
+ iov[1].iov_len = sb->sb_wptr - sb->sb_data;
+ if (iov[1].iov_len > len) iov[1].iov_len = len;
+ n = 2;
+ } else
+ n = 1;
+ }
+ /* Check if there's urgent data to send, and if so, send it */
+
+#ifdef HAVE_READV
+ nn = writev(so->s, (const struct iovec *)iov, n);
+
+ DEBUG_MISC((dfd, " ... wrote nn = %d bytes\n", nn));
+#else
+ nn = slirp_send(so, iov[0].iov_base, iov[0].iov_len,0);
+#endif
+ /* This should never happen, but people tell me it does *shrug* */
+ if (nn < 0 && (errno == EAGAIN || errno == EINTR))
+ return 0;
+
+ if (nn <= 0) {
+ DEBUG_MISC((dfd, " --- sowrite disconnected, so->so_state = %x, errno = %d\n",
+ so->so_state, errno));
+ sofcantsendmore(so);
+ tcp_sockclosed(sototcpcb(so));
+ return -1;
+ }
+
+#ifndef HAVE_READV
+ if (n == 2 && nn == iov[0].iov_len) {
+ int ret;
+ ret = slirp_send(so, iov[1].iov_base, iov[1].iov_len,0);
+ if (ret > 0)
+ nn += ret;
+ }
+ DEBUG_MISC((dfd, " ... wrote nn = %d bytes\n", nn));
+#endif
+
+ /* Update sbuf */
+ sb->sb_cc -= nn;
+ sb->sb_rptr += nn;
+ if (sb->sb_rptr >= (sb->sb_data + sb->sb_datalen))
+ sb->sb_rptr -= sb->sb_datalen;
+
+ /*
+ * If in DRAIN mode, and there's no more data, set
+ * it CANTSENDMORE
+ */
+ if ((so->so_state & SS_FWDRAIN) && sb->sb_cc == 0)
+ sofcantsendmore(so);
+
+ return nn;
+}
+
+/*
+ * recvfrom() a UDP socket
+ */
+void
+sorecvfrom(struct socket *so)
+{
+ struct sockaddr_in addr;
+ socklen_t addrlen = sizeof(struct sockaddr_in);
+
+ DEBUG_CALL("sorecvfrom");
+ DEBUG_ARG("so = %lx", (long)so);
+
+ if (so->so_type == IPPROTO_ICMP) { /* This is a "ping" reply */
+ char buff[256];
+ int len;
+
+ len = recvfrom(so->s, buff, 256, 0,
+ (struct sockaddr *)&addr, &addrlen);
+ /* XXX Check if reply is "correct"? */
+
+ if(len == -1 || len == 0) {
+ u_char code=ICMP_UNREACH_PORT;
+
+ if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST;
+ else if(errno == ENETUNREACH) code=ICMP_UNREACH_NET;
+
+ DEBUG_MISC((dfd," udp icmp rx errno = %d-%s\n",
+ errno,strerror(errno)));
+ icmp_error(so->so_m, ICMP_UNREACH,code, 0,strerror(errno));
+ } else {
+ icmp_reflect(so->so_m);
+ so->so_m = NULL; /* Don't m_free() it again! */
+ }
+ /* No need for this socket anymore, udp_detach it */
+ udp_detach(so);
+ } else { /* A "normal" UDP packet */
+ struct mbuf *m;
+ int len;
+#ifdef _WIN32
+ unsigned long n;
+#else
+ int n;
+#endif
+
+ m = m_get(so->slirp);
+ if (!m) {
+ return;
+ }
+ m->m_data += IF_MAXLINKHDR;
+
+ /*
+ * XXX Shouldn't FIONREAD packets destined for port 53,
+ * but I don't know the max packet size for DNS lookups
+ */
+ len = M_FREEROOM(m);
+ /* if (so->so_fport != htons(53)) { */
+ ioctlsocket(so->s, FIONREAD, &n);
+
+ if (n > len) {
+ n = (m->m_data - m->m_dat) + m->m_len + n + 1;
+ m_inc(m, n);
+ len = M_FREEROOM(m);
+ }
+ /* } */
+
+ m->m_len = recvfrom(so->s, m->m_data, len, 0,
+ (struct sockaddr *)&addr, &addrlen);
+ DEBUG_MISC((dfd, " did recvfrom %d, errno = %d-%s\n",
+ m->m_len, errno,strerror(errno)));
+ if(m->m_len<0) {
+ u_char code=ICMP_UNREACH_PORT;
+
+ if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST;
+ else if(errno == ENETUNREACH) code=ICMP_UNREACH_NET;
+
+ DEBUG_MISC((dfd," rx error, tx icmp ICMP_UNREACH:%i\n", code));
+ icmp_error(so->so_m, ICMP_UNREACH,code, 0,strerror(errno));
+ m_free(m);
+ } else {
+ /*
+ * Hack: domain name lookup will be used the most for UDP,
+ * and since they'll only be used once there's no need
+ * for the 4 minute (or whatever) timeout... So we time them
+ * out much quicker (10 seconds for now...)
+ */
+ if (so->so_expire) {
+ if (so->so_fport == htons(53))
+ so->so_expire = curtime + SO_EXPIREFAST;
+ else
+ so->so_expire = curtime + SO_EXPIRE;
+ }
+
+ /*
+ * If this packet was destined for CTL_ADDR,
+ * make it look like that's where it came from, done by udp_output
+ */
+ udp_output(so, m, &addr);
+ } /* rx error */
+ } /* if ping packet */
+}
+
+/*
+ * sendto() a socket
+ */
+int
+sosendto(struct socket *so, struct mbuf *m)
+{
+ Slirp *slirp = so->slirp;
+ int ret;
+ struct sockaddr_in addr;
+
+ DEBUG_CALL("sosendto");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("m = %lx", (long)m);
+
+ addr.sin_family = AF_INET;
+ if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
+ slirp->vnetwork_addr.s_addr) {
+ /* It's an alias */
+ if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) {
+ if (get_dns_addr(&addr.sin_addr) < 0)
+ addr.sin_addr = loopback_addr;
+ } else {
+ addr.sin_addr = loopback_addr;
+ }
+ } else
+ addr.sin_addr = so->so_faddr;
+ addr.sin_port = so->so_fport;
+
+ DEBUG_MISC((dfd, " sendto()ing, addr.sin_port=%d, addr.sin_addr.s_addr=%.16s\n", ntohs(addr.sin_port), inet_ntoa(addr.sin_addr)));
+
+ /* Don't care what port we get */
+ ret = sendto(so->s, m->m_data, m->m_len, 0,
+ (struct sockaddr *)&addr, sizeof (struct sockaddr));
+ if (ret < 0)
+ return -1;
+
+ /*
+ * Kill the socket if there's no reply in 4 minutes,
+ * but only if it's an expirable socket
+ */
+ if (so->so_expire)
+ so->so_expire = curtime + SO_EXPIRE;
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_ISFCONNECTED; /* So that it gets select()ed */
+ return 0;
+}
+
+/*
+ * Listen for incoming TCP connections
+ */
+struct socket *
+tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr,
+ u_int lport, int flags)
+{
+ struct sockaddr_in addr;
+ struct socket *so;
+ int s, opt = 1;
+ socklen_t addrlen = sizeof(addr);
+ memset(&addr, 0, addrlen);
+
+ DEBUG_CALL("tcp_listen");
+ DEBUG_ARG("haddr = %x", haddr);
+ DEBUG_ARG("hport = %d", hport);
+ DEBUG_ARG("laddr = %x", laddr);
+ DEBUG_ARG("lport = %d", lport);
+ DEBUG_ARG("flags = %x", flags);
+
+ so = socreate(slirp);
+ if (!so) {
+ return NULL;
+ }
+
+ /* Don't tcp_attach... we don't need so_snd nor so_rcv */
+ if ((so->so_tcpcb = tcp_newtcpcb(so)) == NULL) {
+ free(so);
+ return NULL;
+ }
+ insque(so, &slirp->tcb);
+
+ /*
+ * SS_FACCEPTONCE sockets must time out.
+ */
+ if (flags & SS_FACCEPTONCE)
+ so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2;
+
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= (SS_FACCEPTCONN | flags);
+ so->so_lport = lport; /* Kept in network format */
+ so->so_laddr.s_addr = laddr; /* Ditto */
+
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = haddr;
+ addr.sin_port = hport;
+
+ if (((s = os_socket(AF_INET,SOCK_STREAM,0)) < 0) ||
+ (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)) < 0) ||
+ (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) ||
+ (listen(s,1) < 0)) {
+ int tmperrno = errno; /* Don't clobber the real reason we failed */
+
+ close(s);
+ sofree(so);
+ /* Restore the real errno */
+#ifdef _WIN32
+ WSASetLastError(tmperrno);
+#else
+ errno = tmperrno;
+#endif
+ return NULL;
+ }
+ setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));
+
+ getsockname(s,(struct sockaddr *)&addr,&addrlen);
+ so->so_fport = addr.sin_port;
+ if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
+ so->so_faddr = slirp->vhost_addr;
+ else
+ so->so_faddr = addr.sin_addr;
+
+ so->s = s;
+ return so;
+}
+
+/*
+ * Various session state calls
+ * XXX Should be #define's
+ * The socket state stuff needs work, these often get call 2 or 3
+ * times each when only 1 was needed
+ */
+void
+soisfconnecting(struct socket *so)
+{
+ so->so_state &= ~(SS_NOFDREF|SS_ISFCONNECTED|SS_FCANTRCVMORE|
+ SS_FCANTSENDMORE|SS_FWDRAIN);
+ so->so_state |= SS_ISFCONNECTING; /* Clobber other states */
+}
+
+void
+soisfconnected(struct socket *so)
+{
+ so->so_state &= ~(SS_ISFCONNECTING|SS_FWDRAIN|SS_NOFDREF);
+ so->so_state |= SS_ISFCONNECTED; /* Clobber other states */
+}
+
+static void
+sofcantrcvmore(struct socket *so)
+{
+ if ((so->so_state & SS_NOFDREF) == 0) {
+ shutdown(so->s,0);
+ if(global_writefds) {
+ FD_CLR(so->s,global_writefds);
+ }
+ }
+ so->so_state &= ~(SS_ISFCONNECTING);
+ if (so->so_state & SS_FCANTSENDMORE) {
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF; /* Don't select it */
+ } else {
+ so->so_state |= SS_FCANTRCVMORE;
+ }
+}
+
+static void
+sofcantsendmore(struct socket *so)
+{
+ if ((so->so_state & SS_NOFDREF) == 0) {
+ shutdown(so->s,1); /* send FIN to fhost */
+ if (global_readfds) {
+ FD_CLR(so->s,global_readfds);
+ }
+ if (global_xfds) {
+ FD_CLR(so->s,global_xfds);
+ }
+ }
+ so->so_state &= ~(SS_ISFCONNECTING);
+ if (so->so_state & SS_FCANTRCVMORE) {
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF; /* as above */
+ } else {
+ so->so_state |= SS_FCANTSENDMORE;
+ }
+}
+
+/*
+ * Set write drain mode
+ * Set CANTSENDMORE once all data has been write()n
+ */
+void
+sofwdrain(struct socket *so)
+{
+ if (so->so_rcv.sb_cc)
+ so->so_state |= SS_FWDRAIN;
+ else
+ sofcantsendmore(so);
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.h
new file mode 100644
index 0000000..857b0da
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#ifndef _SLIRP_SOCKET_H_
+#define _SLIRP_SOCKET_H_
+
+#define SO_EXPIRE 240000
+#define SO_EXPIREFAST 10000
+
+/*
+ * Our socket structure
+ */
+
+struct socket {
+ struct socket *so_next,*so_prev; /* For a linked list of sockets */
+
+ int s; /* The actual socket */
+
+ Slirp *slirp; /* managing slirp instance */
+
+ /* XXX union these with not-yet-used sbuf params */
+ struct mbuf *so_m; /* Pointer to the original SYN packet,
+ * for non-blocking connect()'s, and
+ * PING reply's */
+ struct tcpiphdr *so_ti; /* Pointer to the original ti within
+ * so_mconn, for non-blocking connections */
+ int so_urgc;
+ struct in_addr so_faddr; /* foreign host table entry */
+ struct in_addr so_laddr; /* local host table entry */
+ uint16_t so_fport; /* foreign port */
+ uint16_t so_lport; /* local port */
+
+ uint8_t so_iptos; /* Type of service */
+ uint8_t so_emu; /* Is the socket emulated? */
+
+ u_char so_type; /* Type of socket, UDP or TCP */
+ int so_state; /* internal state flags SS_*, below */
+
+ struct tcpcb *so_tcpcb; /* pointer to TCP protocol control block */
+ u_int so_expire; /* When the socket will expire */
+
+ int so_queued; /* Number of packets queued from this socket */
+ int so_nqueued; /* Number of packets queued in a row
+ * Used to determine when to "downgrade" a session
+ * from fastq to batchq */
+
+ struct sbuf so_rcv; /* Receive buffer */
+ struct sbuf so_snd; /* Send buffer */
+ void * extra; /* Extra pointer */
+};
+
+
+/*
+ * Socket state bits. (peer means the host on the Internet,
+ * local host means the host on the other end of the modem)
+ */
+#define SS_NOFDREF 0x001 /* No fd reference */
+
+#define SS_ISFCONNECTING 0x002 /* Socket is connecting to peer (non-blocking connect()'s) */
+#define SS_ISFCONNECTED 0x004 /* Socket is connected to peer */
+#define SS_FCANTRCVMORE 0x008 /* Socket can't receive more from peer (for half-closes) */
+#define SS_FCANTSENDMORE 0x010 /* Socket can't send more to peer (for half-closes) */
+#define SS_FWDRAIN 0x040 /* We received a FIN, drain data and set SS_FCANTSENDMORE */
+
+#define SS_CTL 0x080
+#define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from a host on the internet */
+#define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket will die after one accept */
+
+#define SS_PERSISTENT_MASK 0xf000 /* Unremovable state bits */
+#define SS_HOSTFWD 0x1000 /* Socket describes host->guest forwarding */
+#define SS_INCOMING 0x2000 /* Connection was initiated by a host on the internet */
+
+struct socket * solookup(struct socket *, struct in_addr, u_int, struct in_addr, u_int);
+struct socket * socreate(Slirp *);
+void sofree(struct socket *);
+int soread(struct socket *);
+void sorecvoob(struct socket *);
+int sosendoob(struct socket *);
+int sowrite(struct socket *);
+void sorecvfrom(struct socket *);
+int sosendto(struct socket *, struct mbuf *);
+struct socket * tcp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int,
+ int);
+void soisfconnecting(register struct socket *);
+void soisfconnected(register struct socket *);
+void sofwdrain(struct socket *);
+struct iovec; /* For win32 */
+size_t sopreprbuf(struct socket *so, struct iovec *iov, int *np);
+int soreadbuf(struct socket *so, const char *buf, int size);
+
+#endif /* _SOCKET_H_ */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp.h
new file mode 100644
index 0000000..9d06836
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp.h
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp.h 8.1 (Berkeley) 6/10/93
+ * tcp.h,v 1.3 1994/08/21 05:27:34 paul Exp
+ */
+
+#ifndef _TCP_H_
+#define _TCP_H_
+
+typedef uint32_t tcp_seq;
+
+#define PR_SLOWHZ 2 /* 2 slow timeouts per second (approx) */
+#define PR_FASTHZ 5 /* 5 fast timeouts per second (not important) */
+
+#define TCP_SNDSPACE 8192
+#define TCP_RCVSPACE 8192
+
+/*
+ * TCP header.
+ * Per RFC 793, September, 1981.
+ */
+struct tcphdr {
+ uint16_t th_sport; /* source port */
+ uint16_t th_dport; /* destination port */
+ tcp_seq th_seq; /* sequence number */
+ tcp_seq th_ack; /* acknowledgement number */
+#ifdef HOST_WORDS_BIGENDIAN
+ u_int th_off:4, /* data offset */
+ th_x2:4; /* (unused) */
+#else
+ u_int th_x2:4, /* (unused) */
+ th_off:4; /* data offset */
+#endif
+ uint8_t th_flags;
+#define TH_FIN 0x01
+#define TH_SYN 0x02
+#define TH_RST 0x04
+#define TH_PUSH 0x08
+#define TH_ACK 0x10
+#define TH_URG 0x20
+ uint16_t th_win; /* window */
+ uint16_t th_sum; /* checksum */
+ uint16_t th_urp; /* urgent pointer */
+};
+
+#include "tcp_var.h"
+
+#define TCPOPT_EOL 0
+#define TCPOPT_NOP 1
+#define TCPOPT_MAXSEG 2
+#define TCPOLEN_MAXSEG 4
+#define TCPOPT_WINDOW 3
+#define TCPOLEN_WINDOW 3
+#define TCPOPT_SACK_PERMITTED 4 /* Experimental */
+#define TCPOLEN_SACK_PERMITTED 2
+#define TCPOPT_SACK 5 /* Experimental */
+#define TCPOPT_TIMESTAMP 8
+#define TCPOLEN_TIMESTAMP 10
+#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */
+
+#define TCPOPT_TSTAMP_HDR \
+ (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
+
+/*
+ * Default maximum segment size for TCP.
+ * With an IP MSS of 576, this is 536,
+ * but 512 is probably more convenient.
+ * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)).
+ *
+ * We make this 1460 because we only care about Ethernet in the qemu context.
+ */
+#define TCP_MSS 1460
+
+#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */
+
+#define TCP_MAX_WINSHIFT 14 /* maximum window shift */
+
+/*
+ * User-settable options (used with setsockopt).
+ *
+ * We don't use the system headers on unix because we have conflicting
+ * local structures. We can't avoid the system definitions on Windows,
+ * so we undefine them.
+ */
+#undef TCP_NODELAY
+#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
+#undef TCP_MAXSEG
+
+/*
+ * TCP FSM state definitions.
+ * Per RFC793, September, 1981.
+ */
+
+#define TCP_NSTATES 11
+
+#define TCPS_CLOSED 0 /* closed */
+#define TCPS_LISTEN 1 /* listening for connection */
+#define TCPS_SYN_SENT 2 /* active, have sent syn */
+#define TCPS_SYN_RECEIVED 3 /* have send and received syn */
+/* states < TCPS_ESTABLISHED are those where connections not established */
+#define TCPS_ESTABLISHED 4 /* established */
+#define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */
+/* states > TCPS_CLOSE_WAIT are those where user has closed */
+#define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */
+#define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */
+#define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */
+/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */
+#define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */
+#define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */
+
+#define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED)
+#define TCPS_HAVEESTABLISHED(s) ((s) >= TCPS_ESTABLISHED)
+#define TCPS_HAVERCVDFIN(s) ((s) >= TCPS_TIME_WAIT)
+
+/*
+ * TCP sequence numbers are 32 bit integers operated
+ * on with modular arithmetic. These macros can be
+ * used to compare such integers.
+ */
+#define SEQ_LT(a,b) ((int)((a)-(b)) < 0)
+#define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0)
+#define SEQ_GT(a,b) ((int)((a)-(b)) > 0)
+#define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0)
+
+/*
+ * Macros to initialize tcp sequence numbers for
+ * send and receive from initial send and receive
+ * sequence numbers.
+ */
+#define tcp_rcvseqinit(tp) \
+ (tp)->rcv_adv = (tp)->rcv_nxt = (tp)->irs + 1
+
+#define tcp_sendseqinit(tp) \
+ (tp)->snd_una = (tp)->snd_nxt = (tp)->snd_max = (tp)->snd_up = (tp)->iss
+
+#define TCP_ISSINCR (125*1024) /* increment for tcp_iss each second */
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_input.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_input.c
new file mode 100644
index 0000000..53dbc87
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_input.c
@@ -0,0 +1,1487 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp_input.c 8.5 (Berkeley) 4/10/94
+ * tcp_input.c,v 1.10 1994/10/13 18:36:32 wollman Exp
+ */
+
+/*
+ * Changes and additions relating to SLiRP
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+#include "ip_icmp.h"
+
+#define TCPREXMTTHRESH 3
+
+#define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ)
+
+/* for modulo comparisons of timestamps */
+#define TSTMP_LT(a,b) ((int)((a)-(b)) < 0)
+#define TSTMP_GEQ(a,b) ((int)((a)-(b)) >= 0)
+
+/*
+ * Insert segment ti into reassembly queue of tcp with
+ * control block tp. Return TH_FIN if reassembly now includes
+ * a segment with FIN. The macro form does the common case inline
+ * (segment is the next to be received on an established connection,
+ * and the queue is empty), avoiding linkage into and removal
+ * from the queue and repetition of various conversions.
+ * Set DELACK for segments received in order, but ack immediately
+ * when segments are out of order (so fast retransmit can work).
+ */
+#ifdef TCP_ACK_HACK
+#define TCP_REASS(tp, ti, m, so, flags) {\
+ if ((ti)->ti_seq == (tp)->rcv_nxt && \
+ tcpfrag_list_empty(tp) && \
+ (tp)->t_state == TCPS_ESTABLISHED) {\
+ if (ti->ti_flags & TH_PUSH) \
+ tp->t_flags |= TF_ACKNOW; \
+ else \
+ tp->t_flags |= TF_DELACK; \
+ (tp)->rcv_nxt += (ti)->ti_len; \
+ flags = (ti)->ti_flags & TH_FIN; \
+ if (so->so_emu) { \
+ if (tcp_emu((so),(m))) sbappend((so), (m)); \
+ } else \
+ sbappend((so), (m)); \
+ } else {\
+ (flags) = tcp_reass((tp), (ti), (m)); \
+ tp->t_flags |= TF_ACKNOW; \
+ } \
+}
+#else
+#define TCP_REASS(tp, ti, m, so, flags) { \
+ if ((ti)->ti_seq == (tp)->rcv_nxt && \
+ tcpfrag_list_empty(tp) && \
+ (tp)->t_state == TCPS_ESTABLISHED) { \
+ tp->t_flags |= TF_DELACK; \
+ (tp)->rcv_nxt += (ti)->ti_len; \
+ flags = (ti)->ti_flags & TH_FIN; \
+ if (so->so_emu) { \
+ if (tcp_emu((so),(m))) sbappend(so, (m)); \
+ } else \
+ sbappend((so), (m)); \
+ } else { \
+ (flags) = tcp_reass((tp), (ti), (m)); \
+ tp->t_flags |= TF_ACKNOW; \
+ } \
+}
+#endif
+static void tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt,
+ struct tcpiphdr *ti);
+static void tcp_xmit_timer(register struct tcpcb *tp, int rtt);
+
+static int
+tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
+ struct mbuf *m)
+{
+ register struct tcpiphdr *q;
+ struct socket *so = tp->t_socket;
+ int flags;
+
+ /*
+ * Call with ti==NULL after become established to
+ * force pre-ESTABLISHED data up to user socket.
+ */
+ if (ti == NULL)
+ goto present;
+
+ /*
+ * Find a segment which begins after this one does.
+ */
+ for (q = tcpfrag_list_first(tp); !tcpfrag_list_end(q, tp);
+ q = tcpiphdr_next(q))
+ if (SEQ_GT(q->ti_seq, ti->ti_seq))
+ break;
+
+ /*
+ * If there is a preceding segment, it may provide some of
+ * our data already. If so, drop the data from the incoming
+ * segment. If it provides all of our data, drop us.
+ */
+ if (!tcpfrag_list_end(tcpiphdr_prev(q), tp)) {
+ register int i;
+ q = tcpiphdr_prev(q);
+ /* conversion to int (in i) handles seq wraparound */
+ i = q->ti_seq + q->ti_len - ti->ti_seq;
+ if (i > 0) {
+ if (i >= ti->ti_len) {
+ m_freem(m);
+ /*
+ * Try to present any queued data
+ * at the left window edge to the user.
+ * This is needed after the 3-WHS
+ * completes.
+ */
+ goto present; /* ??? */
+ }
+ m_adj(m, i);
+ ti->ti_len -= i;
+ ti->ti_seq += i;
+ }
+ q = tcpiphdr_next(q);
+ }
+ ti->ti_mbuf = m;
+
+ /*
+ * While we overlap succeeding segments trim them or,
+ * if they are completely covered, dequeue them.
+ */
+ while (!tcpfrag_list_end(q, tp)) {
+ register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq;
+ if (i <= 0)
+ break;
+ if (i < q->ti_len) {
+ q->ti_seq += i;
+ q->ti_len -= i;
+ m_adj(q->ti_mbuf, i);
+ break;
+ }
+ q = tcpiphdr_next(q);
+ m = tcpiphdr_prev(q)->ti_mbuf;
+ remque(tcpiphdr2qlink(tcpiphdr_prev(q)));
+ m_freem(m);
+ }
+
+ /*
+ * Stick new segment in its place.
+ */
+ insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q)));
+
+present:
+ /*
+ * Present data to user, advancing rcv_nxt through
+ * completed sequence space.
+ */
+ if (!TCPS_HAVEESTABLISHED(tp->t_state))
+ return (0);
+ ti = tcpfrag_list_first(tp);
+ if (tcpfrag_list_end(ti, tp) || ti->ti_seq != tp->rcv_nxt)
+ return (0);
+ if (tp->t_state == TCPS_SYN_RECEIVED && ti->ti_len)
+ return (0);
+ do {
+ tp->rcv_nxt += ti->ti_len;
+ flags = ti->ti_flags & TH_FIN;
+ remque(tcpiphdr2qlink(ti));
+ m = ti->ti_mbuf;
+ ti = tcpiphdr_next(ti);
+ if (so->so_state & SS_FCANTSENDMORE)
+ m_freem(m);
+ else {
+ if (so->so_emu) {
+ if (tcp_emu(so,m)) sbappend(so, m);
+ } else
+ sbappend(so, m);
+ }
+ } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt);
+ return (flags);
+}
+
+/*
+ * TCP input routine, follows pages 65-76 of the
+ * protocol specification dated September, 1981 very closely.
+ */
+void
+tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
+{
+ struct ip save_ip, *ip;
+ register struct tcpiphdr *ti;
+ caddr_t optp = NULL;
+ int optlen = 0;
+ int len, tlen, off;
+ register struct tcpcb *tp = NULL;
+ register int tiflags;
+ struct socket *so = NULL;
+ int todrop, acked, ourfinisacked, needoutput = 0;
+ int iss = 0;
+ u_long tiwin;
+ int ret;
+ struct ex_list *ex_ptr;
+ Slirp *slirp;
+
+ DEBUG_CALL("tcp_input");
+ DEBUG_ARGS((dfd," m = %8lx iphlen = %2d inso = %lx\n",
+ (long )m, iphlen, (long )inso ));
+
+ /*
+ * If called with m == 0, then we're continuing the connect
+ */
+ if (m == NULL) {
+ so = inso;
+ slirp = so->slirp;
+
+ /* Re-set a few variables */
+ tp = sototcpcb(so);
+ m = so->so_m;
+ so->so_m = NULL;
+ ti = so->so_ti;
+ tiwin = ti->ti_win;
+ tiflags = ti->ti_flags;
+
+ goto cont_conn;
+ }
+ slirp = m->slirp;
+
+ /*
+ * Get IP and TCP header together in first mbuf.
+ * Note: IP leaves IP header in first mbuf.
+ */
+ ti = mtod(m, struct tcpiphdr *);
+ if (iphlen > sizeof(struct ip )) {
+ ip_stripoptions(m, (struct mbuf *)0);
+ iphlen=sizeof(struct ip );
+ }
+ /* XXX Check if too short */
+
+
+ /*
+ * Save a copy of the IP header in case we want restore it
+ * for sending an ICMP error message in response.
+ */
+ ip=mtod(m, struct ip *);
+ save_ip = *ip;
+ save_ip.ip_len+= iphlen;
+
+ /*
+ * Checksum extended TCP header and data.
+ */
+ tlen = ((struct ip *)ti)->ip_len;
+ tcpiphdr2qlink(ti)->next = tcpiphdr2qlink(ti)->prev = NULL;
+ memset(&ti->ti_i.ih_mbuf, 0 , sizeof(struct mbuf_ptr));
+ ti->ti_x1 = 0;
+ ti->ti_len = htons((uint16_t)tlen);
+ len = sizeof(struct ip ) + tlen;
+ if(cksum(m, len)) {
+ goto drop;
+ }
+
+ /*
+ * Check that TCP offset makes sense,
+ * pull out TCP options and adjust length. XXX
+ */
+ off = ti->ti_off << 2;
+ if (off < sizeof (struct tcphdr) || off > tlen) {
+ goto drop;
+ }
+ tlen -= off;
+ ti->ti_len = tlen;
+ if (off > sizeof (struct tcphdr)) {
+ optlen = off - sizeof (struct tcphdr);
+ optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr);
+ }
+ tiflags = ti->ti_flags;
+
+ /*
+ * Convert TCP protocol specific fields to host format.
+ */
+ NTOHL(ti->ti_seq);
+ NTOHL(ti->ti_ack);
+ NTOHS(ti->ti_win);
+ NTOHS(ti->ti_urp);
+
+ /*
+ * Drop TCP, IP headers and TCP options.
+ */
+ m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+ m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+
+ if (slirp->restricted) {
+ for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
+ if (ex_ptr->ex_fport == ti->ti_dport &&
+ ti->ti_dst.s_addr == ex_ptr->ex_addr.s_addr) {
+ break;
+ }
+ }
+ if (!ex_ptr)
+ goto drop;
+ }
+ /*
+ * Locate pcb for segment.
+ */
+findso:
+ so = slirp->tcp_last_so;
+ if (so->so_fport != ti->ti_dport ||
+ so->so_lport != ti->ti_sport ||
+ so->so_laddr.s_addr != ti->ti_src.s_addr ||
+ so->so_faddr.s_addr != ti->ti_dst.s_addr) {
+ so = solookup(&slirp->tcb, ti->ti_src, ti->ti_sport,
+ ti->ti_dst, ti->ti_dport);
+ if (so)
+ slirp->tcp_last_so = so;
+ }
+
+ /*
+ * If the state is CLOSED (i.e., TCB does not exist) then
+ * all data in the incoming segment is discarded.
+ * If the TCB exists but is in CLOSED state, it is embryonic,
+ * but should either do a listen or a connect soon.
+ *
+ * state == CLOSED means we've done socreate() but haven't
+ * attached it to a protocol yet...
+ *
+ * XXX If a TCB does not exist, and the TH_SYN flag is
+ * the only flag set, then create a session, mark it
+ * as if it was LISTENING, and continue...
+ */
+ if (so == NULL) {
+ if ((tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) != TH_SYN)
+ goto dropwithreset;
+
+ if ((so = socreate(slirp)) == NULL)
+ goto dropwithreset;
+ if (tcp_attach(so) < 0) {
+ free(so); /* Not sofree (if it failed, it's not insqued) */
+ goto dropwithreset;
+ }
+
+ sbreserve(&so->so_snd, TCP_SNDSPACE);
+ sbreserve(&so->so_rcv, TCP_RCVSPACE);
+
+ so->so_laddr = ti->ti_src;
+ so->so_lport = ti->ti_sport;
+ so->so_faddr = ti->ti_dst;
+ so->so_fport = ti->ti_dport;
+
+ if ((so->so_iptos = tcp_tos(so)) == 0)
+ so->so_iptos = ((struct ip *)ti)->ip_tos;
+
+ tp = sototcpcb(so);
+ tp->t_state = TCPS_LISTEN;
+ }
+
+ /*
+ * If this is a still-connecting socket, this probably
+ * a retransmit of the SYN. Whether it's a retransmit SYN
+ * or something else, we nuke it.
+ */
+ if (so->so_state & SS_ISFCONNECTING)
+ goto drop;
+
+ tp = sototcpcb(so);
+
+ /* XXX Should never fail */
+ if (tp == NULL)
+ goto dropwithreset;
+ if (tp->t_state == TCPS_CLOSED)
+ goto drop;
+
+ tiwin = ti->ti_win;
+
+ /*
+ * Segment received on connection.
+ * Reset idle time and keep-alive timer.
+ */
+ tp->t_idle = 0;
+ if (SO_OPTIONS)
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
+ else
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
+
+ /*
+ * Process options if not in LISTEN state,
+ * else do it below (after getting remote address).
+ */
+ if (optp && tp->t_state != TCPS_LISTEN)
+ tcp_dooptions(tp, (u_char *)optp, optlen, ti);
+
+ /*
+ * Header prediction: check for the two common cases
+ * of a uni-directional data xfer. If the packet has
+ * no control flags, is in-sequence, the window didn't
+ * change and we're not retransmitting, it's a
+ * candidate. If the length is zero and the ack moved
+ * forward, we're the sender side of the xfer. Just
+ * free the data acked & wake any higher level process
+ * that was blocked waiting for space. If the length
+ * is non-zero and the ack didn't move, we're the
+ * receiver side. If we're getting packets in-order
+ * (the reassembly queue is empty), add the data to
+ * the socket buffer and note that we need a delayed ack.
+ *
+ * XXX Some of these tests are not needed
+ * eg: the tiwin == tp->snd_wnd prevents many more
+ * predictions.. with no *real* advantage..
+ */
+ if (tp->t_state == TCPS_ESTABLISHED &&
+ (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK &&
+ ti->ti_seq == tp->rcv_nxt &&
+ tiwin && tiwin == tp->snd_wnd &&
+ tp->snd_nxt == tp->snd_max) {
+ if (ti->ti_len == 0) {
+ if (SEQ_GT(ti->ti_ack, tp->snd_una) &&
+ SEQ_LEQ(ti->ti_ack, tp->snd_max) &&
+ tp->snd_cwnd >= tp->snd_wnd) {
+ /*
+ * this is a pure ack for outstanding data.
+ */
+ if (tp->t_rtt &&
+ SEQ_GT(ti->ti_ack, tp->t_rtseq))
+ tcp_xmit_timer(tp, tp->t_rtt);
+ acked = ti->ti_ack - tp->snd_una;
+ sbdrop(&so->so_snd, acked);
+ tp->snd_una = ti->ti_ack;
+ m_freem(m);
+
+ /*
+ * If all outstanding data are acked, stop
+ * retransmit timer, otherwise restart timer
+ * using current (possibly backed-off) value.
+ * If process is waiting for space,
+ * wakeup/selwakeup/signal. If data
+ * are ready to send, let tcp_output
+ * decide between more output or persist.
+ */
+ if (tp->snd_una == tp->snd_max)
+ tp->t_timer[TCPT_REXMT] = 0;
+ else if (tp->t_timer[TCPT_PERSIST] == 0)
+ tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
+
+ /*
+ * This is called because sowwakeup might have
+ * put data into so_snd. Since we don't so sowwakeup,
+ * we don't need this.. XXX???
+ */
+ if (so->so_snd.sb_cc)
+ (void) tcp_output(tp);
+
+ return;
+ }
+ } else if (ti->ti_ack == tp->snd_una &&
+ tcpfrag_list_empty(tp) &&
+ ti->ti_len <= sbspace(&so->so_rcv)) {
+ /*
+ * this is a pure, in-sequence data packet
+ * with nothing on the reassembly queue and
+ * we have enough buffer space to take it.
+ */
+ tp->rcv_nxt += ti->ti_len;
+ /*
+ * Add data to socket buffer.
+ */
+ if (so->so_emu) {
+ if (tcp_emu(so,m)) sbappend(so, m);
+ } else
+ sbappend(so, m);
+
+ /*
+ * If this is a short packet, then ACK now - with Nagel
+ * congestion avoidance sender won't send more until
+ * he gets an ACK.
+ *
+ * It is better to not delay acks at all to maximize
+ * TCP throughput. See RFC 2581.
+ */
+ tp->t_flags |= TF_ACKNOW;
+ tcp_output(tp);
+ return;
+ }
+ } /* header prediction */
+ /*
+ * Calculate amount of space in receive window,
+ * and then do TCP input processing.
+ * Receive window is amount of space in rcv queue,
+ * but not less than advertised window.
+ */
+ { int win;
+ win = sbspace(&so->so_rcv);
+ if (win < 0)
+ win = 0;
+ tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt));
+ }
+
+ switch (tp->t_state) {
+
+ /*
+ * If the state is LISTEN then ignore segment if it contains an RST.
+ * If the segment contains an ACK then it is bad and send a RST.
+ * If it does not contain a SYN then it is not interesting; drop it.
+ * Don't bother responding if the destination was a broadcast.
+ * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial
+ * tp->iss, and send a segment:
+ * <SEQ=ISS><ACK=RCV_NXT><CTL=SYN,ACK>
+ * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss.
+ * Fill in remote peer address fields if not previously specified.
+ * Enter SYN_RECEIVED state, and process any other fields of this
+ * segment in this state.
+ */
+ case TCPS_LISTEN: {
+
+ if (tiflags & TH_RST)
+ goto drop;
+ if (tiflags & TH_ACK)
+ goto dropwithreset;
+ if ((tiflags & TH_SYN) == 0)
+ goto drop;
+
+ /*
+ * This has way too many gotos...
+ * But a bit of spaghetti code never hurt anybody :)
+ */
+
+ /*
+ * If this is destined for the control address, then flag to
+ * tcp_ctl once connected, otherwise connect
+ */
+ if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
+ slirp->vnetwork_addr.s_addr) {
+ if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr &&
+ so->so_faddr.s_addr != slirp->vnameserver_addr.s_addr) {
+ /* May be an add exec */
+ for (ex_ptr = slirp->exec_list; ex_ptr;
+ ex_ptr = ex_ptr->ex_next) {
+ if(ex_ptr->ex_fport == so->so_fport &&
+ so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
+ so->so_state |= SS_CTL;
+ break;
+ }
+ }
+ if (so->so_state & SS_CTL) {
+ goto cont_input;
+ }
+ }
+ /* CTL_ALIAS: Do nothing, tcp_fconnect will be called on it */
+ }
+
+ if (so->so_emu & EMU_NOCONNECT) {
+ so->so_emu &= ~EMU_NOCONNECT;
+ goto cont_input;
+ }
+
+ if((tcp_fconnect(so) == -1) && (errno != EINPROGRESS) && (errno != EWOULDBLOCK)) {
+ u_char code=ICMP_UNREACH_NET;
+ DEBUG_MISC((dfd," tcp fconnect errno = %d-%s\n",
+ errno,strerror(errno)));
+ if(errno == ECONNREFUSED) {
+ /* ACK the SYN, send RST to refuse the connection */
+ tcp_respond(tp, ti, m, ti->ti_seq+1, (tcp_seq)0,
+ TH_RST|TH_ACK);
+ } else {
+ if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST;
+ HTONL(ti->ti_seq); /* restore tcp header */
+ HTONL(ti->ti_ack);
+ HTONS(ti->ti_win);
+ HTONS(ti->ti_urp);
+ m->m_data -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+ m->m_len += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+ *ip=save_ip;
+ icmp_error(m, ICMP_UNREACH,code, 0,strerror(errno));
+ }
+ tcp_close(tp);
+ m_free(m);
+ } else {
+ /*
+ * Haven't connected yet, save the current mbuf
+ * and ti, and return
+ * XXX Some OS's don't tell us whether the connect()
+ * succeeded or not. So we must time it out.
+ */
+ so->so_m = m;
+ so->so_ti = ti;
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
+ tp->t_state = TCPS_SYN_RECEIVED;
+ }
+ return;
+
+ cont_conn:
+ /* m==NULL
+ * Check if the connect succeeded
+ */
+ if (so->so_state & SS_NOFDREF) {
+ tp = tcp_close(tp);
+ goto dropwithreset;
+ }
+ cont_input:
+ tcp_template(tp);
+
+ if (optp)
+ tcp_dooptions(tp, (u_char *)optp, optlen, ti);
+
+ if (iss)
+ tp->iss = iss;
+ else
+ tp->iss = slirp->tcp_iss;
+ slirp->tcp_iss += TCP_ISSINCR/2;
+ tp->irs = ti->ti_seq;
+ tcp_sendseqinit(tp);
+ tcp_rcvseqinit(tp);
+ tp->t_flags |= TF_ACKNOW;
+ tp->t_state = TCPS_SYN_RECEIVED;
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
+ goto trimthenstep6;
+ } /* case TCPS_LISTEN */
+
+ /*
+ * If the state is SYN_SENT:
+ * if seg contains an ACK, but not for our SYN, drop the input.
+ * if seg contains a RST, then drop the connection.
+ * if seg does not contain SYN, then drop it.
+ * Otherwise this is an acceptable SYN segment
+ * initialize tp->rcv_nxt and tp->irs
+ * if seg contains ack then advance tp->snd_una
+ * if SYN has been acked change to ESTABLISHED else SYN_RCVD state
+ * arrange for segment to be acked (eventually)
+ * continue processing rest of data/controls, beginning with URG
+ */
+ case TCPS_SYN_SENT:
+ if ((tiflags & TH_ACK) &&
+ (SEQ_LEQ(ti->ti_ack, tp->iss) ||
+ SEQ_GT(ti->ti_ack, tp->snd_max)))
+ goto dropwithreset;
+
+ if (tiflags & TH_RST) {
+ if (tiflags & TH_ACK) {
+ tcp_drop(tp, 0); /* XXX Check t_softerror! */
+ }
+ goto drop;
+ }
+
+ if ((tiflags & TH_SYN) == 0)
+ goto drop;
+ if (tiflags & TH_ACK) {
+ tp->snd_una = ti->ti_ack;
+ if (SEQ_LT(tp->snd_nxt, tp->snd_una))
+ tp->snd_nxt = tp->snd_una;
+ }
+
+ tp->t_timer[TCPT_REXMT] = 0;
+ tp->irs = ti->ti_seq;
+ tcp_rcvseqinit(tp);
+ tp->t_flags |= TF_ACKNOW;
+ if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss)) {
+ soisfconnected(so);
+ tp->t_state = TCPS_ESTABLISHED;
+
+ (void) tcp_reass(tp, (struct tcpiphdr *)0,
+ (struct mbuf *)0);
+ /*
+ * if we didn't have to retransmit the SYN,
+ * use its rtt as our initial srtt & rtt var.
+ */
+ if (tp->t_rtt)
+ tcp_xmit_timer(tp, tp->t_rtt);
+ } else
+ tp->t_state = TCPS_SYN_RECEIVED;
+
+trimthenstep6:
+ /*
+ * Advance ti->ti_seq to correspond to first data byte.
+ * If data, trim to stay within window,
+ * dropping FIN if necessary.
+ */
+ ti->ti_seq++;
+ if (ti->ti_len > tp->rcv_wnd) {
+ todrop = ti->ti_len - tp->rcv_wnd;
+ m_adj(m, -todrop);
+ ti->ti_len = tp->rcv_wnd;
+ tiflags &= ~TH_FIN;
+ }
+ tp->snd_wl1 = ti->ti_seq - 1;
+ tp->rcv_up = ti->ti_seq;
+ goto step6;
+ } /* switch tp->t_state */
+ /*
+ * States other than LISTEN or SYN_SENT.
+ * Check that at least some bytes of segment are within
+ * receive window. If segment begins before rcv_nxt,
+ * drop leading data (and SYN); if nothing left, just ack.
+ */
+ todrop = tp->rcv_nxt - ti->ti_seq;
+ if (todrop > 0) {
+ if (tiflags & TH_SYN) {
+ tiflags &= ~TH_SYN;
+ ti->ti_seq++;
+ if (ti->ti_urp > 1)
+ ti->ti_urp--;
+ else
+ tiflags &= ~TH_URG;
+ todrop--;
+ }
+ /*
+ * Following if statement from Stevens, vol. 2, p. 960.
+ */
+ if (todrop > ti->ti_len
+ || (todrop == ti->ti_len && (tiflags & TH_FIN) == 0)) {
+ /*
+ * Any valid FIN must be to the left of the window.
+ * At this point the FIN must be a duplicate or out
+ * of sequence; drop it.
+ */
+ tiflags &= ~TH_FIN;
+
+ /*
+ * Send an ACK to resynchronize and drop any data.
+ * But keep on processing for RST or ACK.
+ */
+ tp->t_flags |= TF_ACKNOW;
+ todrop = ti->ti_len;
+ }
+ m_adj(m, todrop);
+ ti->ti_seq += todrop;
+ ti->ti_len -= todrop;
+ if (ti->ti_urp > todrop)
+ ti->ti_urp -= todrop;
+ else {
+ tiflags &= ~TH_URG;
+ ti->ti_urp = 0;
+ }
+ }
+ /*
+ * If new data are received on a connection after the
+ * user processes are gone, then RST the other end.
+ */
+ if ((so->so_state & SS_NOFDREF) &&
+ tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) {
+ tp = tcp_close(tp);
+ goto dropwithreset;
+ }
+
+ /*
+ * If segment ends after window, drop trailing data
+ * (and PUSH and FIN); if nothing left, just ACK.
+ */
+ todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd);
+ if (todrop > 0) {
+ if (todrop >= ti->ti_len) {
+ /*
+ * If a new connection request is received
+ * while in TIME_WAIT, drop the old connection
+ * and start over if the sequence numbers
+ * are above the previous ones.
+ */
+ if (tiflags & TH_SYN &&
+ tp->t_state == TCPS_TIME_WAIT &&
+ SEQ_GT(ti->ti_seq, tp->rcv_nxt)) {
+ iss = tp->rcv_nxt + TCP_ISSINCR;
+ tp = tcp_close(tp);
+ goto findso;
+ }
+ /*
+ * If window is closed can only take segments at
+ * window edge, and have to drop data and PUSH from
+ * incoming segments. Continue processing, but
+ * remember to ack. Otherwise, drop segment
+ * and ack.
+ */
+ if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) {
+ tp->t_flags |= TF_ACKNOW;
+ } else {
+ goto dropafterack;
+ }
+ }
+ m_adj(m, -todrop);
+ ti->ti_len -= todrop;
+ tiflags &= ~(TH_PUSH|TH_FIN);
+ }
+
+ /*
+ * If the RST bit is set examine the state:
+ * SYN_RECEIVED STATE:
+ * If passive open, return to LISTEN state.
+ * If active open, inform user that connection was refused.
+ * ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES:
+ * Inform user that connection was reset, and close tcb.
+ * CLOSING, LAST_ACK, TIME_WAIT STATES
+ * Close the tcb.
+ */
+ if (tiflags&TH_RST) switch (tp->t_state) {
+
+ case TCPS_SYN_RECEIVED:
+ case TCPS_ESTABLISHED:
+ case TCPS_FIN_WAIT_1:
+ case TCPS_FIN_WAIT_2:
+ case TCPS_CLOSE_WAIT:
+ tp->t_state = TCPS_CLOSED;
+ tcp_close(tp);
+ goto drop;
+
+ case TCPS_CLOSING:
+ case TCPS_LAST_ACK:
+ case TCPS_TIME_WAIT:
+ tcp_close(tp);
+ goto drop;
+ }
+
+ /*
+ * If a SYN is in the window, then this is an
+ * error and we send an RST and drop the connection.
+ */
+ if (tiflags & TH_SYN) {
+ tp = tcp_drop(tp,0);
+ goto dropwithreset;
+ }
+
+ /*
+ * If the ACK bit is off we drop the segment and return.
+ */
+ if ((tiflags & TH_ACK) == 0) goto drop;
+
+ /*
+ * Ack processing.
+ */
+ switch (tp->t_state) {
+ /*
+ * In SYN_RECEIVED state if the ack ACKs our SYN then enter
+ * ESTABLISHED state and continue processing, otherwise
+ * send an RST. una<=ack<=max
+ */
+ case TCPS_SYN_RECEIVED:
+
+ if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
+ SEQ_GT(ti->ti_ack, tp->snd_max))
+ goto dropwithreset;
+ tp->t_state = TCPS_ESTABLISHED;
+ /*
+ * The sent SYN is ack'ed with our sequence number +1
+ * The first data byte already in the buffer will get
+ * lost if no correction is made. This is only needed for
+ * SS_CTL since the buffer is empty otherwise.
+ * tp->snd_una++; or:
+ */
+ tp->snd_una=ti->ti_ack;
+ if (so->so_state & SS_CTL) {
+ /* So tcp_ctl reports the right state */
+ ret = tcp_ctl(so);
+ if (ret == 1) {
+ soisfconnected(so);
+ so->so_state &= ~SS_CTL; /* success XXX */
+ } else if (ret == 2) {
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF; /* CTL_CMD */
+ } else {
+ needoutput = 1;
+ tp->t_state = TCPS_FIN_WAIT_1;
+ }
+ } else {
+ soisfconnected(so);
+ }
+
+ (void) tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0);
+ tp->snd_wl1 = ti->ti_seq - 1;
+ /* Avoid ack processing; snd_una==ti_ack => dup ack */
+ goto synrx_to_est;
+ /* fall into ... */
+
+ /*
+ * In ESTABLISHED state: drop duplicate ACKs; ACK out of range
+ * ACKs. If the ack is in the range
+ * tp->snd_una < ti->ti_ack <= tp->snd_max
+ * then advance tp->snd_una to ti->ti_ack and drop
+ * data from the retransmission queue. If this ACK reflects
+ * more up to date window information we update our window information.
+ */
+ case TCPS_ESTABLISHED:
+ case TCPS_FIN_WAIT_1:
+ case TCPS_FIN_WAIT_2:
+ case TCPS_CLOSE_WAIT:
+ case TCPS_CLOSING:
+ case TCPS_LAST_ACK:
+ case TCPS_TIME_WAIT:
+
+ if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) {
+ if (ti->ti_len == 0 && tiwin == tp->snd_wnd) {
+ DEBUG_MISC((dfd," dup ack m = %lx so = %lx \n",
+ (long )m, (long )so));
+ /*
+ * If we have outstanding data (other than
+ * a window probe), this is a completely
+ * duplicate ack (ie, window info didn't
+ * change), the ack is the biggest we've
+ * seen and we've seen exactly our rexmt
+ * threshold of them, assume a packet
+ * has been dropped and retransmit it.
+ * Kludge snd_nxt & the congestion
+ * window so we send only this one
+ * packet.
+ *
+ * We know we're losing at the current
+ * window size so do congestion avoidance
+ * (set ssthresh to half the current window
+ * and pull our congestion window back to
+ * the new ssthresh).
+ *
+ * Dup acks mean that packets have left the
+ * network (they're now cached at the receiver)
+ * so bump cwnd by the amount in the receiver
+ * to keep a constant cwnd packets in the
+ * network.
+ */
+ if (tp->t_timer[TCPT_REXMT] == 0 ||
+ ti->ti_ack != tp->snd_una)
+ tp->t_dupacks = 0;
+ else if (++tp->t_dupacks == TCPREXMTTHRESH) {
+ tcp_seq onxt = tp->snd_nxt;
+ u_int win =
+ min(tp->snd_wnd, tp->snd_cwnd) / 2 /
+ tp->t_maxseg;
+
+ if (win < 2)
+ win = 2;
+ tp->snd_ssthresh = win * tp->t_maxseg;
+ tp->t_timer[TCPT_REXMT] = 0;
+ tp->t_rtt = 0;
+ tp->snd_nxt = ti->ti_ack;
+ tp->snd_cwnd = tp->t_maxseg;
+ (void) tcp_output(tp);
+ tp->snd_cwnd = tp->snd_ssthresh +
+ tp->t_maxseg * tp->t_dupacks;
+ if (SEQ_GT(onxt, tp->snd_nxt))
+ tp->snd_nxt = onxt;
+ goto drop;
+ } else if (tp->t_dupacks > TCPREXMTTHRESH) {
+ tp->snd_cwnd += tp->t_maxseg;
+ (void) tcp_output(tp);
+ goto drop;
+ }
+ } else
+ tp->t_dupacks = 0;
+ break;
+ }
+ synrx_to_est:
+ /*
+ * If the congestion window was inflated to account
+ * for the other side's cached packets, retract it.
+ */
+ if (tp->t_dupacks > TCPREXMTTHRESH &&
+ tp->snd_cwnd > tp->snd_ssthresh)
+ tp->snd_cwnd = tp->snd_ssthresh;
+ tp->t_dupacks = 0;
+ if (SEQ_GT(ti->ti_ack, tp->snd_max)) {
+ goto dropafterack;
+ }
+ acked = ti->ti_ack - tp->snd_una;
+
+ /*
+ * If transmit timer is running and timed sequence
+ * number was acked, update smoothed round trip time.
+ * Since we now have an rtt measurement, cancel the
+ * timer backoff (cf., Phil Karn's retransmit alg.).
+ * Recompute the initial retransmit timer.
+ */
+ if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq))
+ tcp_xmit_timer(tp,tp->t_rtt);
+
+ /*
+ * If all outstanding data is acked, stop retransmit
+ * timer and remember to restart (more output or persist).
+ * If there is more data to be acked, restart retransmit
+ * timer, using current (possibly backed-off) value.
+ */
+ if (ti->ti_ack == tp->snd_max) {
+ tp->t_timer[TCPT_REXMT] = 0;
+ needoutput = 1;
+ } else if (tp->t_timer[TCPT_PERSIST] == 0)
+ tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
+ /*
+ * When new data is acked, open the congestion window.
+ * If the window gives us less than ssthresh packets
+ * in flight, open exponentially (maxseg per packet).
+ * Otherwise open linearly: maxseg per window
+ * (maxseg^2 / cwnd per packet).
+ */
+ {
+ register u_int cw = tp->snd_cwnd;
+ register u_int incr = tp->t_maxseg;
+
+ if (cw > tp->snd_ssthresh)
+ incr = incr * incr / cw;
+ tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<<tp->snd_scale);
+ }
+ if (acked > so->so_snd.sb_cc) {
+ tp->snd_wnd -= so->so_snd.sb_cc;
+ sbdrop(&so->so_snd, (int )so->so_snd.sb_cc);
+ ourfinisacked = 1;
+ } else {
+ sbdrop(&so->so_snd, acked);
+ tp->snd_wnd -= acked;
+ ourfinisacked = 0;
+ }
+ tp->snd_una = ti->ti_ack;
+ if (SEQ_LT(tp->snd_nxt, tp->snd_una))
+ tp->snd_nxt = tp->snd_una;
+
+ switch (tp->t_state) {
+
+ /*
+ * In FIN_WAIT_1 STATE in addition to the processing
+ * for the ESTABLISHED state if our FIN is now acknowledged
+ * then enter FIN_WAIT_2.
+ */
+ case TCPS_FIN_WAIT_1:
+ if (ourfinisacked) {
+ /*
+ * If we can't receive any more
+ * data, then closing user can proceed.
+ * Starting the timer is contrary to the
+ * specification, but if we don't get a FIN
+ * we'll hang forever.
+ */
+ if (so->so_state & SS_FCANTRCVMORE) {
+ tp->t_timer[TCPT_2MSL] = TCP_MAXIDLE;
+ }
+ tp->t_state = TCPS_FIN_WAIT_2;
+ }
+ break;
+
+ /*
+ * In CLOSING STATE in addition to the processing for
+ * the ESTABLISHED state if the ACK acknowledges our FIN
+ * then enter the TIME-WAIT state, otherwise ignore
+ * the segment.
+ */
+ case TCPS_CLOSING:
+ if (ourfinisacked) {
+ tp->t_state = TCPS_TIME_WAIT;
+ tcp_canceltimers(tp);
+ tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+ }
+ break;
+
+ /*
+ * In LAST_ACK, we may still be waiting for data to drain
+ * and/or to be acked, as well as for the ack of our FIN.
+ * If our FIN is now acknowledged, delete the TCB,
+ * enter the closed state and return.
+ */
+ case TCPS_LAST_ACK:
+ if (ourfinisacked) {
+ tcp_close(tp);
+ goto drop;
+ }
+ break;
+
+ /*
+ * In TIME_WAIT state the only thing that should arrive
+ * is a retransmission of the remote FIN. Acknowledge
+ * it and restart the finack timer.
+ */
+ case TCPS_TIME_WAIT:
+ tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+ goto dropafterack;
+ }
+ } /* switch(tp->t_state) */
+
+step6:
+ /*
+ * Update window information.
+ * Don't look at window if no ACK: TAC's send garbage on first SYN.
+ */
+ if ((tiflags & TH_ACK) &&
+ (SEQ_LT(tp->snd_wl1, ti->ti_seq) ||
+ (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) ||
+ (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) {
+ tp->snd_wnd = tiwin;
+ tp->snd_wl1 = ti->ti_seq;
+ tp->snd_wl2 = ti->ti_ack;
+ if (tp->snd_wnd > tp->max_sndwnd)
+ tp->max_sndwnd = tp->snd_wnd;
+ needoutput = 1;
+ }
+
+ /*
+ * Process segments with URG.
+ */
+ if ((tiflags & TH_URG) && ti->ti_urp &&
+ TCPS_HAVERCVDFIN(tp->t_state) == 0) {
+ /*
+ * This is a kludge, but if we receive and accept
+ * random urgent pointers, we'll crash in
+ * soreceive. It's hard to imagine someone
+ * actually wanting to send this much urgent data.
+ */
+ if (ti->ti_urp + so->so_rcv.sb_cc > so->so_rcv.sb_datalen) {
+ ti->ti_urp = 0;
+ tiflags &= ~TH_URG;
+ goto dodata;
+ }
+ /*
+ * If this segment advances the known urgent pointer,
+ * then mark the data stream. This should not happen
+ * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since
+ * a FIN has been received from the remote side.
+ * In these states we ignore the URG.
+ *
+ * According to RFC961 (Assigned Protocols),
+ * the urgent pointer points to the last octet
+ * of urgent data. We continue, however,
+ * to consider it to indicate the first octet
+ * of data past the urgent section as the original
+ * spec states (in one of two places).
+ */
+ if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) {
+ tp->rcv_up = ti->ti_seq + ti->ti_urp;
+ so->so_urgc = so->so_rcv.sb_cc +
+ (tp->rcv_up - tp->rcv_nxt); /* -1; */
+ tp->rcv_up = ti->ti_seq + ti->ti_urp;
+
+ }
+ } else
+ /*
+ * If no out of band data is expected,
+ * pull receive urgent pointer along
+ * with the receive window.
+ */
+ if (SEQ_GT(tp->rcv_nxt, tp->rcv_up))
+ tp->rcv_up = tp->rcv_nxt;
+dodata:
+
+ /*
+ * Process the segment text, merging it into the TCP sequencing queue,
+ * and arranging for acknowledgment of receipt if necessary.
+ * This process logically involves adjusting tp->rcv_wnd as data
+ * is presented to the user (this happens in tcp_usrreq.c,
+ * case PRU_RCVD). If a FIN has already been received on this
+ * connection then we just ignore the text.
+ */
+ if ((ti->ti_len || (tiflags&TH_FIN)) &&
+ TCPS_HAVERCVDFIN(tp->t_state) == 0) {
+ TCP_REASS(tp, ti, m, so, tiflags);
+ } else {
+ m_free(m);
+ tiflags &= ~TH_FIN;
+ }
+
+ /*
+ * If FIN is received ACK the FIN and let the user know
+ * that the connection is closing.
+ */
+ if (tiflags & TH_FIN) {
+ if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
+ /*
+ * If we receive a FIN we can't send more data,
+ * set it SS_FDRAIN
+ * Shutdown the socket if there is no rx data in the
+ * buffer.
+ * soread() is called on completion of shutdown() and
+ * will got to TCPS_LAST_ACK, and use tcp_output()
+ * to send the FIN.
+ */
+ sofwdrain(so);
+
+ tp->t_flags |= TF_ACKNOW;
+ tp->rcv_nxt++;
+ }
+ switch (tp->t_state) {
+
+ /*
+ * In SYN_RECEIVED and ESTABLISHED STATES
+ * enter the CLOSE_WAIT state.
+ */
+ case TCPS_SYN_RECEIVED:
+ case TCPS_ESTABLISHED:
+ if(so->so_emu == EMU_CTL) /* no shutdown on socket */
+ tp->t_state = TCPS_LAST_ACK;
+ else
+ tp->t_state = TCPS_CLOSE_WAIT;
+ break;
+
+ /*
+ * If still in FIN_WAIT_1 STATE FIN has not been acked so
+ * enter the CLOSING state.
+ */
+ case TCPS_FIN_WAIT_1:
+ tp->t_state = TCPS_CLOSING;
+ break;
+
+ /*
+ * In FIN_WAIT_2 state enter the TIME_WAIT state,
+ * starting the time-wait timer, turning off the other
+ * standard timers.
+ */
+ case TCPS_FIN_WAIT_2:
+ tp->t_state = TCPS_TIME_WAIT;
+ tcp_canceltimers(tp);
+ tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+ break;
+
+ /*
+ * In TIME_WAIT state restart the 2 MSL time_wait timer.
+ */
+ case TCPS_TIME_WAIT:
+ tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+ break;
+ }
+ }
+
+ /*
+ * If this is a small packet, then ACK now - with Nagel
+ * congestion avoidance sender won't send more until
+ * he gets an ACK.
+ *
+ * See above.
+ */
+ if (ti->ti_len && (unsigned)ti->ti_len <= 5 &&
+ ((struct tcpiphdr_2 *)ti)->first_char == (char)27) {
+ tp->t_flags |= TF_ACKNOW;
+ }
+
+ /*
+ * Return any desired output.
+ */
+ if (needoutput || (tp->t_flags & TF_ACKNOW)) {
+ (void) tcp_output(tp);
+ }
+ return;
+
+dropafterack:
+ /*
+ * Generate an ACK dropping incoming segment if it occupies
+ * sequence space, where the ACK reflects our state.
+ */
+ if (tiflags & TH_RST)
+ goto drop;
+ m_freem(m);
+ tp->t_flags |= TF_ACKNOW;
+ (void) tcp_output(tp);
+ return;
+
+dropwithreset:
+ /* reuses m if m!=NULL, m_free() unnecessary */
+ if (tiflags & TH_ACK)
+ tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST);
+ else {
+ if (tiflags & TH_SYN) ti->ti_len++;
+ tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0,
+ TH_RST|TH_ACK);
+ }
+
+ return;
+
+drop:
+ /*
+ * Drop space held by incoming segment and return.
+ */
+ m_free(m);
+
+ return;
+}
+
+static void
+tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, struct tcpiphdr *ti)
+{
+ uint16_t mss;
+ int opt, optlen;
+
+ DEBUG_CALL("tcp_dooptions");
+ DEBUG_ARGS((dfd," tp = %lx cnt=%i \n", (long )tp, cnt));
+
+ for (; cnt > 0; cnt -= optlen, cp += optlen) {
+ opt = cp[0];
+ if (opt == TCPOPT_EOL)
+ break;
+ if (opt == TCPOPT_NOP)
+ optlen = 1;
+ else {
+ optlen = cp[1];
+ if (optlen <= 0)
+ break;
+ }
+ switch (opt) {
+
+ default:
+ continue;
+
+ case TCPOPT_MAXSEG:
+ if (optlen != TCPOLEN_MAXSEG)
+ continue;
+ if (!(ti->ti_flags & TH_SYN))
+ continue;
+ memcpy((char *) &mss, (char *) cp + 2, sizeof(mss));
+ NTOHS(mss);
+ (void) tcp_mss(tp, mss); /* sets t_maxseg */
+ break;
+ }
+ }
+}
+
+
+/*
+ * Pull out of band byte out of a segment so
+ * it doesn't appear in the user's data queue.
+ * It is still reflected in the segment length for
+ * sequencing purposes.
+ */
+
+#ifdef notdef
+
+void
+tcp_pulloutofband(so, ti, m)
+ struct socket *so;
+ struct tcpiphdr *ti;
+ register struct mbuf *m;
+{
+ int cnt = ti->ti_urp - 1;
+
+ while (cnt >= 0) {
+ if (m->m_len > cnt) {
+ char *cp = mtod(m, caddr_t) + cnt;
+ struct tcpcb *tp = sototcpcb(so);
+
+ tp->t_iobc = *cp;
+ tp->t_oobflags |= TCPOOB_HAVEDATA;
+ memcpy(sp, cp+1, (unsigned)(m->m_len - cnt - 1));
+ m->m_len--;
+ return;
+ }
+ cnt -= m->m_len;
+ m = m->m_next; /* XXX WRONG! Fix it! */
+ if (m == 0)
+ break;
+ }
+ panic("tcp_pulloutofband");
+}
+
+#endif /* notdef */
+
+/*
+ * Collect new round-trip time estimate
+ * and update averages and current timeout.
+ */
+
+static void
+tcp_xmit_timer(register struct tcpcb *tp, int rtt)
+{
+ register short delta;
+
+ DEBUG_CALL("tcp_xmit_timer");
+ DEBUG_ARG("tp = %lx", (long)tp);
+ DEBUG_ARG("rtt = %d", rtt);
+
+ if (tp->t_srtt != 0) {
+ /*
+ * srtt is stored as fixed point with 3 bits after the
+ * binary point (i.e., scaled by 8). The following magic
+ * is equivalent to the smoothing algorithm in rfc793 with
+ * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed
+ * point). Adjust rtt to origin 0.
+ */
+ delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);
+ if ((tp->t_srtt += delta) <= 0)
+ tp->t_srtt = 1;
+ /*
+ * We accumulate a smoothed rtt variance (actually, a
+ * smoothed mean difference), then set the retransmit
+ * timer to smoothed rtt + 4 times the smoothed variance.
+ * rttvar is stored as fixed point with 2 bits after the
+ * binary point (scaled by 4). The following is
+ * equivalent to rfc793 smoothing with an alpha of .75
+ * (rttvar = rttvar*3/4 + |delta| / 4). This replaces
+ * rfc793's wired-in beta.
+ */
+ if (delta < 0)
+ delta = -delta;
+ delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT);
+ if ((tp->t_rttvar += delta) <= 0)
+ tp->t_rttvar = 1;
+ } else {
+ /*
+ * No rtt measurement yet - use the unsmoothed rtt.
+ * Set the variance to half the rtt (so our first
+ * retransmit happens at 3*rtt).
+ */
+ tp->t_srtt = rtt << TCP_RTT_SHIFT;
+ tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1);
+ }
+ tp->t_rtt = 0;
+ tp->t_rxtshift = 0;
+
+ /*
+ * the retransmit should happen at rtt + 4 * rttvar.
+ * Because of the way we do the smoothing, srtt and rttvar
+ * will each average +1/2 tick of bias. When we compute
+ * the retransmit timer, we want 1/2 tick of rounding and
+ * 1 extra tick because of +-1/2 tick uncertainty in the
+ * firing of the timer. The bias will give us exactly the
+ * 1.5 tick we need. But, because the bias is
+ * statistical, we have to test that we don't drop below
+ * the minimum feasible timer (which is 2 ticks).
+ */
+ TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp),
+ (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
+
+ /*
+ * We received an ack for a packet that wasn't retransmitted;
+ * it is probably safe to discard any error indications we've
+ * received recently. This isn't quite right, but close enough
+ * for now (a route might have failed after we sent a segment,
+ * and the return path might not be symmetrical).
+ */
+ tp->t_softerror = 0;
+}
+
+/*
+ * Determine a reasonable value for maxseg size.
+ * If the route is known, check route for mtu.
+ * If none, use an mss that can be handled on the outgoing
+ * interface without forcing IP to fragment; if bigger than
+ * an mbuf cluster (MCLBYTES), round down to nearest multiple of MCLBYTES
+ * to utilize large mbufs. If no route is found, route has no mtu,
+ * or the destination isn't local, use a default, hopefully conservative
+ * size (usually 512 or the default IP max size, but no more than the mtu
+ * of the interface), as we can't discover anything about intervening
+ * gateways or networks. We also initialize the congestion/slow start
+ * window to be a single segment if the destination isn't local.
+ * While looking at the routing entry, we also initialize other path-dependent
+ * parameters from pre-set or cached values in the routing entry.
+ */
+
+int
+tcp_mss(struct tcpcb *tp, u_int offer)
+{
+ struct socket *so = tp->t_socket;
+ int mss;
+
+ DEBUG_CALL("tcp_mss");
+ DEBUG_ARG("tp = %lx", (long)tp);
+ DEBUG_ARG("offer = %d", offer);
+
+ mss = min(IF_MTU, IF_MRU) - sizeof(struct tcpiphdr);
+ if (offer)
+ mss = min(mss, offer);
+ mss = max(mss, 32);
+ if (mss < tp->t_maxseg || offer != 0)
+ tp->t_maxseg = mss;
+
+ tp->snd_cwnd = mss;
+
+ sbreserve(&so->so_snd, TCP_SNDSPACE + ((TCP_SNDSPACE % mss) ?
+ (mss - (TCP_SNDSPACE % mss)) :
+ 0));
+ sbreserve(&so->so_rcv, TCP_RCVSPACE + ((TCP_RCVSPACE % mss) ?
+ (mss - (TCP_RCVSPACE % mss)) :
+ 0));
+
+ DEBUG_MISC((dfd, " returning mss = %d\n", mss));
+
+ return mss;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_output.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_output.c
new file mode 100644
index 0000000..01725db
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_output.c
@@ -0,0 +1,492 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp_output.c 8.3 (Berkeley) 12/30/93
+ * tcp_output.c,v 1.3 1994/09/15 10:36:55 davidg Exp
+ */
+
+/*
+ * Changes and additions relating to SLiRP
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+
+static const u_char tcp_outflags[TCP_NSTATES] = {
+ TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK,
+ TH_ACK, TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK,
+ TH_FIN|TH_ACK, TH_ACK, TH_ACK,
+};
+
+
+#define MAX_TCPOPTLEN 32 /* max # bytes that go in options */
+
+/*
+ * Tcp output routine: figure out what should be sent and send it.
+ */
+int
+tcp_output(struct tcpcb *tp)
+{
+ register struct socket *so = tp->t_socket;
+ register long len, win;
+ int off, flags, error;
+ register struct mbuf *m;
+ register struct tcpiphdr *ti;
+ u_char opt[MAX_TCPOPTLEN];
+ unsigned optlen, hdrlen;
+ int idle, sendalot;
+
+ DEBUG_CALL("tcp_output");
+ DEBUG_ARG("tp = %lx", (long )tp);
+
+ /*
+ * Determine length of data that should be transmitted,
+ * and flags that will be used.
+ * If there is some data or critical controls (SYN, RST)
+ * to send, then transmit; otherwise, investigate further.
+ */
+ idle = (tp->snd_max == tp->snd_una);
+ if (idle && tp->t_idle >= tp->t_rxtcur)
+ /*
+ * We have been idle for "a while" and no acks are
+ * expected to clock out any data we send --
+ * slow start to get ack "clock" running again.
+ */
+ tp->snd_cwnd = tp->t_maxseg;
+again:
+ sendalot = 0;
+ off = tp->snd_nxt - tp->snd_una;
+ win = min(tp->snd_wnd, tp->snd_cwnd);
+
+ flags = tcp_outflags[tp->t_state];
+
+ DEBUG_MISC((dfd, " --- tcp_output flags = 0x%x\n",flags));
+
+ /*
+ * If in persist timeout with window of 0, send 1 byte.
+ * Otherwise, if window is small but nonzero
+ * and timer expired, we will send what we can
+ * and go to transmit state.
+ */
+ if (tp->t_force) {
+ if (win == 0) {
+ /*
+ * If we still have some data to send, then
+ * clear the FIN bit. Usually this would
+ * happen below when it realizes that we
+ * aren't sending all the data. However,
+ * if we have exactly 1 byte of unset data,
+ * then it won't clear the FIN bit below,
+ * and if we are in persist state, we wind
+ * up sending the packet without recording
+ * that we sent the FIN bit.
+ *
+ * We can't just blindly clear the FIN bit,
+ * because if we don't have any more data
+ * to send then the probe will be the FIN
+ * itself.
+ */
+ if (off < so->so_snd.sb_cc)
+ flags &= ~TH_FIN;
+ win = 1;
+ } else {
+ tp->t_timer[TCPT_PERSIST] = 0;
+ tp->t_rxtshift = 0;
+ }
+ }
+
+ len = min(so->so_snd.sb_cc, win) - off;
+
+ if (len < 0) {
+ /*
+ * If FIN has been sent but not acked,
+ * but we haven't been called to retransmit,
+ * len will be -1. Otherwise, window shrank
+ * after we sent into it. If window shrank to 0,
+ * cancel pending retransmit and pull snd_nxt
+ * back to (closed) window. We will enter persist
+ * state below. If the window didn't close completely,
+ * just wait for an ACK.
+ */
+ len = 0;
+ if (win == 0) {
+ tp->t_timer[TCPT_REXMT] = 0;
+ tp->snd_nxt = tp->snd_una;
+ }
+ }
+
+ if (len > tp->t_maxseg) {
+ len = tp->t_maxseg;
+ sendalot = 1;
+ }
+ if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc))
+ flags &= ~TH_FIN;
+
+ win = sbspace(&so->so_rcv);
+
+ /*
+ * Sender silly window avoidance. If connection is idle
+ * and can send all data, a maximum segment,
+ * at least a maximum default-size segment do it,
+ * or are forced, do it; otherwise don't bother.
+ * If peer's buffer is tiny, then send
+ * when window is at least half open.
+ * If retransmitting (possibly after persist timer forced us
+ * to send into a small window), then must resend.
+ */
+ if (len) {
+ if (len == tp->t_maxseg)
+ goto send;
+ if ((1 || idle || tp->t_flags & TF_NODELAY) &&
+ len + off >= so->so_snd.sb_cc)
+ goto send;
+ if (tp->t_force)
+ goto send;
+ if (len >= tp->max_sndwnd / 2 && tp->max_sndwnd > 0)
+ goto send;
+ if (SEQ_LT(tp->snd_nxt, tp->snd_max))
+ goto send;
+ }
+
+ /*
+ * Compare available window to amount of window
+ * known to peer (as advertised window less
+ * next expected input). If the difference is at least two
+ * max size segments, or at least 50% of the maximum possible
+ * window, then want to send a window update to peer.
+ */
+ if (win > 0) {
+ /*
+ * "adv" is the amount we can increase the window,
+ * taking into account that we are limited by
+ * TCP_MAXWIN << tp->rcv_scale.
+ */
+ long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale) -
+ (tp->rcv_adv - tp->rcv_nxt);
+
+ if (adv >= (long) (2 * tp->t_maxseg))
+ goto send;
+ if (2 * adv >= (long) so->so_rcv.sb_datalen)
+ goto send;
+ }
+
+ /*
+ * Send if we owe peer an ACK.
+ */
+ if (tp->t_flags & TF_ACKNOW)
+ goto send;
+ if (flags & (TH_SYN|TH_RST))
+ goto send;
+ if (SEQ_GT(tp->snd_up, tp->snd_una))
+ goto send;
+ /*
+ * If our state indicates that FIN should be sent
+ * and we have not yet done so, or we're retransmitting the FIN,
+ * then we need to send.
+ */
+ if (flags & TH_FIN &&
+ ((tp->t_flags & TF_SENTFIN) == 0 || tp->snd_nxt == tp->snd_una))
+ goto send;
+
+ /*
+ * TCP window updates are not reliable, rather a polling protocol
+ * using ``persist'' packets is used to insure receipt of window
+ * updates. The three ``states'' for the output side are:
+ * idle not doing retransmits or persists
+ * persisting to move a small or zero window
+ * (re)transmitting and thereby not persisting
+ *
+ * tp->t_timer[TCPT_PERSIST]
+ * is set when we are in persist state.
+ * tp->t_force
+ * is set when we are called to send a persist packet.
+ * tp->t_timer[TCPT_REXMT]
+ * is set when we are retransmitting
+ * The output side is idle when both timers are zero.
+ *
+ * If send window is too small, there is data to transmit, and no
+ * retransmit or persist is pending, then go to persist state.
+ * If nothing happens soon, send when timer expires:
+ * if window is nonzero, transmit what we can,
+ * otherwise force out a byte.
+ */
+ if (so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 &&
+ tp->t_timer[TCPT_PERSIST] == 0) {
+ tp->t_rxtshift = 0;
+ tcp_setpersist(tp);
+ }
+
+ /*
+ * No reason to send a segment, just return.
+ */
+ return (0);
+
+send:
+ /*
+ * Before ESTABLISHED, force sending of initial options
+ * unless TCP set not to do any options.
+ * NOTE: we assume that the IP/TCP header plus TCP options
+ * always fit in a single mbuf, leaving room for a maximum
+ * link header, i.e.
+ * max_linkhdr + sizeof (struct tcpiphdr) + optlen <= MHLEN
+ */
+ optlen = 0;
+ hdrlen = sizeof (struct tcpiphdr);
+ if (flags & TH_SYN) {
+ tp->snd_nxt = tp->iss;
+ if ((tp->t_flags & TF_NOOPT) == 0) {
+ uint16_t mss;
+
+ opt[0] = TCPOPT_MAXSEG;
+ opt[1] = 4;
+ mss = htons((uint16_t) tcp_mss(tp, 0));
+ memcpy((caddr_t)(opt + 2), (caddr_t)&mss, sizeof(mss));
+ optlen = 4;
+ }
+ }
+
+ hdrlen += optlen;
+
+ /*
+ * Adjust data length if insertion of options will
+ * bump the packet length beyond the t_maxseg length.
+ */
+ if (len > tp->t_maxseg - optlen) {
+ len = tp->t_maxseg - optlen;
+ sendalot = 1;
+ }
+
+ /*
+ * Grab a header mbuf, attaching a copy of data to
+ * be transmitted, and initialize the header from
+ * the template for sends on this connection.
+ */
+ if (len) {
+ m = m_get(so->slirp);
+ if (m == NULL) {
+ error = 1;
+ goto out;
+ }
+ m->m_data += IF_MAXLINKHDR;
+ m->m_len = hdrlen;
+
+ sbcopy(&so->so_snd, off, (int) len, mtod(m, caddr_t) + hdrlen);
+ m->m_len += len;
+
+ /*
+ * If we're sending everything we've got, set PUSH.
+ * (This will keep happy those implementations which only
+ * give data to the user when a buffer fills or
+ * a PUSH comes in.)
+ */
+ if (off + len == so->so_snd.sb_cc)
+ flags |= TH_PUSH;
+ } else {
+ m = m_get(so->slirp);
+ if (m == NULL) {
+ error = 1;
+ goto out;
+ }
+ m->m_data += IF_MAXLINKHDR;
+ m->m_len = hdrlen;
+ }
+
+ ti = mtod(m, struct tcpiphdr *);
+
+ memcpy((caddr_t)ti, &tp->t_template, sizeof (struct tcpiphdr));
+
+ /*
+ * Fill in fields, remembering maximum advertised
+ * window for use in delaying messages about window sizes.
+ * If resending a FIN, be sure not to use a new sequence number.
+ */
+ if (flags & TH_FIN && tp->t_flags & TF_SENTFIN &&
+ tp->snd_nxt == tp->snd_max)
+ tp->snd_nxt--;
+ /*
+ * If we are doing retransmissions, then snd_nxt will
+ * not reflect the first unsent octet. For ACK only
+ * packets, we do not want the sequence number of the
+ * retransmitted packet, we want the sequence number
+ * of the next unsent octet. So, if there is no data
+ * (and no SYN or FIN), use snd_max instead of snd_nxt
+ * when filling in ti_seq. But if we are in persist
+ * state, snd_max might reflect one byte beyond the
+ * right edge of the window, so use snd_nxt in that
+ * case, since we know we aren't doing a retransmission.
+ * (retransmit and persist are mutually exclusive...)
+ */
+ if (len || (flags & (TH_SYN|TH_FIN)) || tp->t_timer[TCPT_PERSIST])
+ ti->ti_seq = htonl(tp->snd_nxt);
+ else
+ ti->ti_seq = htonl(tp->snd_max);
+ ti->ti_ack = htonl(tp->rcv_nxt);
+ if (optlen) {
+ memcpy((caddr_t)(ti + 1), (caddr_t)opt, optlen);
+ ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2;
+ }
+ ti->ti_flags = flags;
+ /*
+ * Calculate receive window. Don't shrink window,
+ * but avoid silly window syndrome.
+ */
+ if (win < (long)(so->so_rcv.sb_datalen / 4) && win < (long)tp->t_maxseg)
+ win = 0;
+ if (win > (long)TCP_MAXWIN << tp->rcv_scale)
+ win = (long)TCP_MAXWIN << tp->rcv_scale;
+ if (win < (long)(tp->rcv_adv - tp->rcv_nxt))
+ win = (long)(tp->rcv_adv - tp->rcv_nxt);
+ ti->ti_win = htons((uint16_t) (win>>tp->rcv_scale));
+
+ if (SEQ_GT(tp->snd_up, tp->snd_una)) {
+ ti->ti_urp = htons((uint16_t)(tp->snd_up - ntohl(ti->ti_seq)));
+ ti->ti_flags |= TH_URG;
+ } else
+ /*
+ * If no urgent pointer to send, then we pull
+ * the urgent pointer to the left edge of the send window
+ * so that it doesn't drift into the send window on sequence
+ * number wraparound.
+ */
+ tp->snd_up = tp->snd_una; /* drag it along */
+
+ /*
+ * Put TCP length in extended header, and then
+ * checksum extended header and data.
+ */
+ if (len + optlen)
+ ti->ti_len = htons((uint16_t)(sizeof (struct tcphdr) +
+ optlen + len));
+ ti->ti_sum = cksum(m, (int)(hdrlen + len));
+
+ /*
+ * In transmit state, time the transmission and arrange for
+ * the retransmit. In persist state, just set snd_max.
+ */
+ if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) {
+ tcp_seq startseq = tp->snd_nxt;
+
+ /*
+ * Advance snd_nxt over sequence space of this segment.
+ */
+ if (flags & (TH_SYN|TH_FIN)) {
+ if (flags & TH_SYN)
+ tp->snd_nxt++;
+ if (flags & TH_FIN) {
+ tp->snd_nxt++;
+ tp->t_flags |= TF_SENTFIN;
+ }
+ }
+ tp->snd_nxt += len;
+ if (SEQ_GT(tp->snd_nxt, tp->snd_max)) {
+ tp->snd_max = tp->snd_nxt;
+ /*
+ * Time this transmission if not a retransmission and
+ * not currently timing anything.
+ */
+ if (tp->t_rtt == 0) {
+ tp->t_rtt = 1;
+ tp->t_rtseq = startseq;
+ }
+ }
+
+ /*
+ * Set retransmit timer if not currently set,
+ * and not doing an ack or a keep-alive probe.
+ * Initial value for retransmit timer is smoothed
+ * round-trip time + 2 * round-trip time variance.
+ * Initialize shift counter which is used for backoff
+ * of retransmit time.
+ */
+ if (tp->t_timer[TCPT_REXMT] == 0 &&
+ tp->snd_nxt != tp->snd_una) {
+ tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
+ if (tp->t_timer[TCPT_PERSIST]) {
+ tp->t_timer[TCPT_PERSIST] = 0;
+ tp->t_rxtshift = 0;
+ }
+ }
+ } else
+ if (SEQ_GT(tp->snd_nxt + len, tp->snd_max))
+ tp->snd_max = tp->snd_nxt + len;
+
+ /*
+ * Fill in IP length and desired time to live and
+ * send to IP level. There should be a better way
+ * to handle ttl and tos; we could keep them in
+ * the template, but need a way to checksum without them.
+ */
+ m->m_len = hdrlen + len; /* XXX Needed? m_len should be correct */
+
+ {
+
+ ((struct ip *)ti)->ip_len = m->m_len;
+
+ ((struct ip *)ti)->ip_ttl = IPDEFTTL;
+ ((struct ip *)ti)->ip_tos = so->so_iptos;
+
+ error = ip_output(so, m);
+ }
+ if (error) {
+out:
+ return (error);
+ }
+
+ /*
+ * Data sent (as far as we can tell).
+ * If this advertises a larger window than any other segment,
+ * then remember the size of the advertised window.
+ * Any pending ACK has now been sent.
+ */
+ if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv))
+ tp->rcv_adv = tp->rcv_nxt + win;
+ tp->last_ack_sent = tp->rcv_nxt;
+ tp->t_flags &= ~(TF_ACKNOW|TF_DELACK);
+ if (sendalot)
+ goto again;
+
+ return (0);
+}
+
+void
+tcp_setpersist(struct tcpcb *tp)
+{
+ int t = ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1;
+
+ /*
+ * Start/restart persistence timer.
+ */
+ TCPT_RANGESET(tp->t_timer[TCPT_PERSIST],
+ t * tcp_backoff[tp->t_rxtshift],
+ TCPTV_PERSMIN, TCPTV_PERSMAX);
+ if (tp->t_rxtshift < TCP_MAXRXTSHIFT)
+ tp->t_rxtshift++;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_subr.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_subr.c
new file mode 100644
index 0000000..1557e89
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_subr.c
@@ -0,0 +1,915 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp_subr.c 8.1 (Berkeley) 6/10/93
+ * tcp_subr.c,v 1.5 1994/10/08 22:39:58 phk Exp
+ */
+
+/*
+ * Changes and additions relating to SLiRP
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+
+/* patchable/settable parameters for tcp */
+/* Don't do rfc1323 performance enhancements */
+#define TCP_DO_RFC1323 0
+
+/*
+ * Tcp initialization
+ */
+void
+tcp_init(Slirp *slirp)
+{
+ slirp->tcp_iss = 1; /* wrong */
+ slirp->tcb.so_next = slirp->tcb.so_prev = &slirp->tcb;
+ slirp->tcp_last_so = &slirp->tcb;
+}
+
+/*
+ * Create template to be used to send tcp packets on a connection.
+ * Call after host entry created, fills
+ * in a skeletal tcp/ip header, minimizing the amount of work
+ * necessary when the connection is used.
+ */
+void
+tcp_template(struct tcpcb *tp)
+{
+ struct socket *so = tp->t_socket;
+ register struct tcpiphdr *n = &tp->t_template;
+
+ n->ti_mbuf = NULL;
+ n->ti_x1 = 0;
+ n->ti_pr = IPPROTO_TCP;
+ n->ti_len = htons(sizeof (struct tcpiphdr) - sizeof (struct ip));
+ n->ti_src = so->so_faddr;
+ n->ti_dst = so->so_laddr;
+ n->ti_sport = so->so_fport;
+ n->ti_dport = so->so_lport;
+
+ n->ti_seq = 0;
+ n->ti_ack = 0;
+ n->ti_x2 = 0;
+ n->ti_off = 5;
+ n->ti_flags = 0;
+ n->ti_win = 0;
+ n->ti_sum = 0;
+ n->ti_urp = 0;
+}
+
+/*
+ * Send a single message to the TCP at address specified by
+ * the given TCP/IP header. If m == 0, then we make a copy
+ * of the tcpiphdr at ti and send directly to the addressed host.
+ * This is used to force keep alive messages out using the TCP
+ * template for a connection tp->t_template. If flags are given
+ * then we send a message back to the TCP which originated the
+ * segment ti, and discard the mbuf containing it and any other
+ * attached mbufs.
+ *
+ * In any case the ack and sequence number of the transmitted
+ * segment are as specified by the parameters.
+ */
+void
+tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m,
+ tcp_seq ack, tcp_seq seq, int flags)
+{
+ register int tlen;
+ int win = 0;
+
+ DEBUG_CALL("tcp_respond");
+ DEBUG_ARG("tp = %lx", (long)tp);
+ DEBUG_ARG("ti = %lx", (long)ti);
+ DEBUG_ARG("m = %lx", (long)m);
+ DEBUG_ARG("ack = %u", ack);
+ DEBUG_ARG("seq = %u", seq);
+ DEBUG_ARG("flags = %x", flags);
+
+ if (tp)
+ win = sbspace(&tp->t_socket->so_rcv);
+ if (m == NULL) {
+ if ((m = m_get(tp->t_socket->slirp)) == NULL)
+ return;
+ tlen = 0;
+ m->m_data += IF_MAXLINKHDR;
+ *mtod(m, struct tcpiphdr *) = *ti;
+ ti = mtod(m, struct tcpiphdr *);
+ flags = TH_ACK;
+ } else {
+ /*
+ * ti points into m so the next line is just making
+ * the mbuf point to ti
+ */
+ m->m_data = (caddr_t)ti;
+
+ m->m_len = sizeof (struct tcpiphdr);
+ tlen = 0;
+#define xchg(a,b,type) { type t; t=a; a=b; b=t; }
+ xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, uint32_t);
+ xchg(ti->ti_dport, ti->ti_sport, uint16_t);
+#undef xchg
+ }
+ ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + tlen));
+ tlen += sizeof (struct tcpiphdr);
+ m->m_len = tlen;
+
+ ti->ti_mbuf = NULL;
+ ti->ti_x1 = 0;
+ ti->ti_seq = htonl(seq);
+ ti->ti_ack = htonl(ack);
+ ti->ti_x2 = 0;
+ ti->ti_off = sizeof (struct tcphdr) >> 2;
+ ti->ti_flags = flags;
+ if (tp)
+ ti->ti_win = htons((uint16_t) (win >> tp->rcv_scale));
+ else
+ ti->ti_win = htons((uint16_t)win);
+ ti->ti_urp = 0;
+ ti->ti_sum = 0;
+ ti->ti_sum = cksum(m, tlen);
+ ((struct ip *)ti)->ip_len = tlen;
+
+ if(flags & TH_RST)
+ ((struct ip *)ti)->ip_ttl = MAXTTL;
+ else
+ ((struct ip *)ti)->ip_ttl = IPDEFTTL;
+
+ (void) ip_output((struct socket *)0, m);
+}
+
+/*
+ * Create a new TCP control block, making an
+ * empty reassembly queue and hooking it to the argument
+ * protocol control block.
+ */
+struct tcpcb *
+tcp_newtcpcb(struct socket *so)
+{
+ register struct tcpcb *tp;
+
+ tp = (struct tcpcb *)malloc(sizeof(*tp));
+ if (tp == NULL)
+ return ((struct tcpcb *)0);
+
+ memset((char *) tp, 0, sizeof(struct tcpcb));
+ tp->seg_next = tp->seg_prev = (struct tcpiphdr*)tp;
+ tp->t_maxseg = TCP_MSS;
+
+ tp->t_flags = TCP_DO_RFC1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0;
+ tp->t_socket = so;
+
+ /*
+ * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no
+ * rtt estimate. Set rttvar so that srtt + 2 * rttvar gives
+ * reasonable initial retransmit time.
+ */
+ tp->t_srtt = TCPTV_SRTTBASE;
+ tp->t_rttvar = TCPTV_SRTTDFLT << 2;
+ tp->t_rttmin = TCPTV_MIN;
+
+ TCPT_RANGESET(tp->t_rxtcur,
+ ((TCPTV_SRTTBASE >> 2) + (TCPTV_SRTTDFLT << 2)) >> 1,
+ TCPTV_MIN, TCPTV_REXMTMAX);
+
+ tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT;
+ tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT;
+ tp->t_state = TCPS_CLOSED;
+
+ so->so_tcpcb = tp;
+
+ return (tp);
+}
+
+/*
+ * Drop a TCP connection, reporting
+ * the specified error. If connection is synchronized,
+ * then send a RST to peer.
+ */
+struct tcpcb *tcp_drop(struct tcpcb *tp, int err)
+{
+ DEBUG_CALL("tcp_drop");
+ DEBUG_ARG("tp = %lx", (long)tp);
+ DEBUG_ARG("errno = %d", errno);
+
+ if (TCPS_HAVERCVDSYN(tp->t_state)) {
+ tp->t_state = TCPS_CLOSED;
+ (void) tcp_output(tp);
+ }
+ return (tcp_close(tp));
+}
+
+/*
+ * Close a TCP control block:
+ * discard all space held by the tcp
+ * discard internet protocol block
+ * wake up any sleepers
+ */
+struct tcpcb *
+tcp_close(struct tcpcb *tp)
+{
+ register struct tcpiphdr *t;
+ struct socket *so = tp->t_socket;
+ Slirp *slirp = so->slirp;
+ register struct mbuf *m;
+
+ DEBUG_CALL("tcp_close");
+ DEBUG_ARG("tp = %lx", (long )tp);
+
+ /* free the reassembly queue, if any */
+ t = tcpfrag_list_first(tp);
+ while (!tcpfrag_list_end(t, tp)) {
+ t = tcpiphdr_next(t);
+ m = tcpiphdr_prev(t)->ti_mbuf;
+ remque(tcpiphdr2qlink(tcpiphdr_prev(t)));
+ m_freem(m);
+ }
+ free(tp);
+ so->so_tcpcb = NULL;
+ /* clobber input socket cache if we're closing the cached connection */
+ if (so == slirp->tcp_last_so)
+ slirp->tcp_last_so = &slirp->tcb;
+ closesocket(so->s);
+ sbfree(&so->so_rcv);
+ sbfree(&so->so_snd);
+ sofree(so);
+ return ((struct tcpcb *)0);
+}
+
+/*
+ * TCP protocol interface to socket abstraction.
+ */
+
+/*
+ * User issued close, and wish to trail through shutdown states:
+ * if never received SYN, just forget it. If got a SYN from peer,
+ * but haven't sent FIN, then go to FIN_WAIT_1 state to send peer a FIN.
+ * If already got a FIN from peer, then almost done; go to LAST_ACK
+ * state. In all other cases, have already sent FIN to peer (e.g.
+ * after PRU_SHUTDOWN), and just have to play tedious game waiting
+ * for peer to send FIN or not respond to keep-alives, etc.
+ * We can let the user exit from the close as soon as the FIN is acked.
+ */
+void
+tcp_sockclosed(struct tcpcb *tp)
+{
+
+ DEBUG_CALL("tcp_sockclosed");
+ DEBUG_ARG("tp = %lx", (long)tp);
+
+ switch (tp->t_state) {
+
+ case TCPS_CLOSED:
+ case TCPS_LISTEN:
+ case TCPS_SYN_SENT:
+ tp->t_state = TCPS_CLOSED;
+ tp = tcp_close(tp);
+ break;
+
+ case TCPS_SYN_RECEIVED:
+ case TCPS_ESTABLISHED:
+ tp->t_state = TCPS_FIN_WAIT_1;
+ break;
+
+ case TCPS_CLOSE_WAIT:
+ tp->t_state = TCPS_LAST_ACK;
+ break;
+ }
+ if (tp)
+ tcp_output(tp);
+}
+
+/*
+ * Connect to a host on the Internet
+ * Called by tcp_input
+ * Only do a connect, the tcp fields will be set in tcp_input
+ * return 0 if there's a result of the connect,
+ * else return -1 means we're still connecting
+ * The return value is almost always -1 since the socket is
+ * nonblocking. Connect returns after the SYN is sent, and does
+ * not wait for ACK+SYN.
+ */
+int tcp_fconnect(struct socket *so)
+{
+ Slirp *slirp = so->slirp;
+ int ret=0;
+
+ DEBUG_CALL("tcp_fconnect");
+ DEBUG_ARG("so = %lx", (long )so);
+
+ if( (ret = so->s = os_socket(AF_INET,SOCK_STREAM,0)) >= 0) {
+ int opt, s=so->s;
+ struct sockaddr_in addr;
+
+ fd_nonblock(s);
+ opt = 1;
+ setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(opt ));
+ opt = 1;
+ setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(opt ));
+
+ addr.sin_family = AF_INET;
+ if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
+ slirp->vnetwork_addr.s_addr) {
+ /* It's an alias */
+ if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) {
+ if (get_dns_addr(&addr.sin_addr) < 0)
+ addr.sin_addr = loopback_addr;
+ } else {
+ addr.sin_addr = loopback_addr;
+ }
+ } else
+ addr.sin_addr = so->so_faddr;
+ addr.sin_port = so->so_fport;
+
+ DEBUG_MISC((dfd, " connect()ing, addr.sin_port=%d, "
+ "addr.sin_addr.s_addr=%.16s\n",
+ ntohs(addr.sin_port), inet_ntoa(addr.sin_addr)));
+ /* We don't care what port we get */
+ ret = connect(s,(struct sockaddr *)&addr,sizeof (addr));
+
+ /*
+ * If it's not in progress, it failed, so we just return 0,
+ * without clearing SS_NOFDREF
+ */
+ soisfconnecting(so);
+ }
+
+ return(ret);
+}
+
+/*
+ * Accept the socket and connect to the local-host
+ *
+ * We have a problem. The correct thing to do would be
+ * to first connect to the local-host, and only if the
+ * connection is accepted, then do an accept() here.
+ * But, a) we need to know who's trying to connect
+ * to the socket to be able to SYN the local-host, and
+ * b) we are already connected to the foreign host by
+ * the time it gets to accept(), so... We simply accept
+ * here and SYN the local-host.
+ */
+void
+tcp_connect(struct socket *inso)
+{
+ Slirp *slirp = inso->slirp;
+ struct socket *so;
+ struct sockaddr_in addr;
+ socklen_t addrlen = sizeof(struct sockaddr_in);
+ struct tcpcb *tp;
+ int s, opt;
+
+ DEBUG_CALL("tcp_connect");
+ DEBUG_ARG("inso = %lx", (long)inso);
+
+ /*
+ * If it's an SS_ACCEPTONCE socket, no need to socreate()
+ * another socket, just use the accept() socket.
+ */
+ if (inso->so_state & SS_FACCEPTONCE) {
+ /* FACCEPTONCE already have a tcpcb */
+ so = inso;
+ } else {
+ if ((so = socreate(slirp)) == NULL) {
+ /* If it failed, get rid of the pending connection */
+ closesocket(accept(inso->s,(struct sockaddr *)&addr,&addrlen));
+ return;
+ }
+ if (tcp_attach(so) < 0) {
+ free(so); /* NOT sofree */
+ return;
+ }
+ so->so_laddr = inso->so_laddr;
+ so->so_lport = inso->so_lport;
+ }
+
+ (void) tcp_mss(sototcpcb(so), 0);
+
+ if ((s = accept(inso->s,(struct sockaddr *)&addr,&addrlen)) < 0) {
+ tcp_close(sototcpcb(so)); /* This will sofree() as well */
+ return;
+ }
+ fd_nonblock(s);
+ opt = 1;
+ setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int));
+ opt = 1;
+ setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));
+ opt = 1;
+ setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char *)&opt,sizeof(int));
+
+ so->so_fport = addr.sin_port;
+ so->so_faddr = addr.sin_addr;
+ /* Translate connections from localhost to the real hostname */
+ if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr)
+ so->so_faddr = slirp->vhost_addr;
+
+ /* Close the accept() socket, set right state */
+ if (inso->so_state & SS_FACCEPTONCE) {
+ closesocket(so->s); /* If we only accept once, close the accept() socket */
+ so->so_state = SS_NOFDREF; /* Don't select it yet, even though we have an FD */
+ /* if it's not FACCEPTONCE, it's already NOFDREF */
+ }
+ so->s = s;
+ so->so_state |= SS_INCOMING;
+
+ so->so_iptos = tcp_tos(so);
+ tp = sototcpcb(so);
+
+ tcp_template(tp);
+
+ tp->t_state = TCPS_SYN_SENT;
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
+ tp->iss = slirp->tcp_iss;
+ slirp->tcp_iss += TCP_ISSINCR/2;
+ tcp_sendseqinit(tp);
+ tcp_output(tp);
+}
+
+/*
+ * Attach a TCPCB to a socket.
+ */
+int
+tcp_attach(struct socket *so)
+{
+ if ((so->so_tcpcb = tcp_newtcpcb(so)) == NULL)
+ return -1;
+
+ insque(so, &so->slirp->tcb);
+
+ return 0;
+}
+
+/*
+ * Set the socket's type of service field
+ */
+static const struct tos_t tcptos[] = {
+ {0, 20, IPTOS_THROUGHPUT, 0}, /* ftp data */
+ {21, 21, IPTOS_LOWDELAY, EMU_FTP}, /* ftp control */
+ {0, 23, IPTOS_LOWDELAY, 0}, /* telnet */
+ {0, 80, IPTOS_THROUGHPUT, 0}, /* WWW */
+ {0, 513, IPTOS_LOWDELAY, EMU_RLOGIN|EMU_NOCONNECT}, /* rlogin */
+ {0, 514, IPTOS_LOWDELAY, EMU_RSH|EMU_NOCONNECT}, /* shell */
+ {0, 544, IPTOS_LOWDELAY, EMU_KSH}, /* kshell */
+ {0, 543, IPTOS_LOWDELAY, 0}, /* klogin */
+ {0, 6667, IPTOS_THROUGHPUT, EMU_IRC}, /* IRC */
+ {0, 6668, IPTOS_THROUGHPUT, EMU_IRC}, /* IRC undernet */
+ {0, 7070, IPTOS_LOWDELAY, EMU_REALAUDIO }, /* RealAudio control */
+ {0, 113, IPTOS_LOWDELAY, EMU_IDENT }, /* identd protocol */
+ {0, 0, 0, 0}
+};
+
+static struct emu_t *tcpemu = NULL;
+
+/*
+ * Return TOS according to the above table
+ */
+uint8_t
+tcp_tos(struct socket *so)
+{
+ int i = 0;
+ struct emu_t *emup;
+
+ while(tcptos[i].tos) {
+ if ((tcptos[i].fport && (ntohs(so->so_fport) == tcptos[i].fport)) ||
+ (tcptos[i].lport && (ntohs(so->so_lport) == tcptos[i].lport))) {
+ so->so_emu = tcptos[i].emu;
+ return tcptos[i].tos;
+ }
+ i++;
+ }
+
+ /* Nope, lets see if there's a user-added one */
+ for (emup = tcpemu; emup; emup = emup->next) {
+ if ((emup->fport && (ntohs(so->so_fport) == emup->fport)) ||
+ (emup->lport && (ntohs(so->so_lport) == emup->lport))) {
+ so->so_emu = emup->emu;
+ return emup->tos;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Emulate programs that try and connect to us
+ * This includes ftp (the data connection is
+ * initiated by the server) and IRC (DCC CHAT and
+ * DCC SEND) for now
+ *
+ * NOTE: It's possible to crash SLiRP by sending it
+ * unstandard strings to emulate... if this is a problem,
+ * more checks are needed here
+ *
+ * XXX Assumes the whole command came in one packet
+ *
+ * XXX Some ftp clients will have their TOS set to
+ * LOWDELAY and so Nagel will kick in. Because of this,
+ * we'll get the first letter, followed by the rest, so
+ * we simply scan for ORT instead of PORT...
+ * DCC doesn't have this problem because there's other stuff
+ * in the packet before the DCC command.
+ *
+ * Return 1 if the mbuf m is still valid and should be
+ * sbappend()ed
+ *
+ * NOTE: if you return 0 you MUST m_free() the mbuf!
+ */
+int
+tcp_emu(struct socket *so, struct mbuf *m)
+{
+ Slirp *slirp = so->slirp;
+ u_int n1, n2, n3, n4, n5, n6;
+ char buff[257];
+ uint32_t laddr;
+ u_int lport;
+ char *bptr;
+
+ DEBUG_CALL("tcp_emu");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("m = %lx", (long)m);
+
+ switch(so->so_emu) {
+ int x, i;
+
+ case EMU_IDENT:
+ /*
+ * Identification protocol as per rfc-1413
+ */
+
+ {
+ struct socket *tmpso;
+ struct sockaddr_in addr;
+ socklen_t addrlen = sizeof(struct sockaddr_in);
+ struct sbuf *so_rcv = &so->so_rcv;
+
+ memcpy(so_rcv->sb_wptr, m->m_data, m->m_len);
+ so_rcv->sb_wptr += m->m_len;
+ so_rcv->sb_rptr += m->m_len;
+ m->m_data[m->m_len] = 0; /* NULL terminate */
+ if (strchr(m->m_data, '\r') || strchr(m->m_data, '\n')) {
+ if (sscanf(so_rcv->sb_data, "%u%*[ ,]%u", &n1, &n2) == 2) {
+ HTONS(n1);
+ HTONS(n2);
+ /* n2 is the one on our host */
+ for (tmpso = slirp->tcb.so_next;
+ tmpso != &slirp->tcb;
+ tmpso = tmpso->so_next) {
+ if (tmpso->so_laddr.s_addr == so->so_laddr.s_addr &&
+ tmpso->so_lport == n2 &&
+ tmpso->so_faddr.s_addr == so->so_faddr.s_addr &&
+ tmpso->so_fport == n1) {
+ if (getsockname(tmpso->s,
+ (struct sockaddr *)&addr, &addrlen) == 0)
+ n2 = ntohs(addr.sin_port);
+ break;
+ }
+ }
+ }
+ so_rcv->sb_cc = snprintf(so_rcv->sb_data,
+ so_rcv->sb_datalen,
+ "%d,%d\r\n", n1, n2);
+ so_rcv->sb_rptr = so_rcv->sb_data;
+ so_rcv->sb_wptr = so_rcv->sb_data + so_rcv->sb_cc;
+ }
+ m_free(m);
+ return 0;
+ }
+
+ case EMU_FTP: /* ftp */
+ *(m->m_data+m->m_len) = 0; /* NUL terminate for strstr */
+ if ((bptr = (char *)strstr(m->m_data, "ORT")) != NULL) {
+ /*
+ * Need to emulate the PORT command
+ */
+ x = sscanf(bptr, "ORT %u,%u,%u,%u,%u,%u\r\n%256[^\177]",
+ &n1, &n2, &n3, &n4, &n5, &n6, buff);
+ if (x < 6)
+ return 1;
+
+ laddr = htonl((n1 << 24) | (n2 << 16) | (n3 << 8) | (n4));
+ lport = htons((n5 << 8) | (n6));
+
+ if ((so = tcp_listen(slirp, INADDR_ANY, 0, laddr,
+ lport, SS_FACCEPTONCE)) == NULL) {
+ return 1;
+ }
+ n6 = ntohs(so->so_fport);
+
+ n5 = (n6 >> 8) & 0xff;
+ n6 &= 0xff;
+
+ laddr = ntohl(so->so_faddr.s_addr);
+
+ n1 = ((laddr >> 24) & 0xff);
+ n2 = ((laddr >> 16) & 0xff);
+ n3 = ((laddr >> 8) & 0xff);
+ n4 = (laddr & 0xff);
+
+ m->m_len = bptr - m->m_data; /* Adjust length */
+ m->m_len += snprintf(bptr, m->m_hdr.mh_size - m->m_len,
+ "ORT %d,%d,%d,%d,%d,%d\r\n%s",
+ n1, n2, n3, n4, n5, n6, x==7?buff:"");
+ return 1;
+ } else if ((bptr = (char *)strstr(m->m_data, "27 Entering")) != NULL) {
+ /*
+ * Need to emulate the PASV response
+ */
+ x = sscanf(bptr, "27 Entering Passive Mode (%u,%u,%u,%u,%u,%u)\r\n%256[^\177]",
+ &n1, &n2, &n3, &n4, &n5, &n6, buff);
+ if (x < 6)
+ return 1;
+
+ laddr = htonl((n1 << 24) | (n2 << 16) | (n3 << 8) | (n4));
+ lport = htons((n5 << 8) | (n6));
+
+ if ((so = tcp_listen(slirp, INADDR_ANY, 0, laddr,
+ lport, SS_FACCEPTONCE)) == NULL) {
+ return 1;
+ }
+ n6 = ntohs(so->so_fport);
+
+ n5 = (n6 >> 8) & 0xff;
+ n6 &= 0xff;
+
+ laddr = ntohl(so->so_faddr.s_addr);
+
+ n1 = ((laddr >> 24) & 0xff);
+ n2 = ((laddr >> 16) & 0xff);
+ n3 = ((laddr >> 8) & 0xff);
+ n4 = (laddr & 0xff);
+
+ m->m_len = bptr - m->m_data; /* Adjust length */
+ m->m_len += snprintf(bptr, m->m_hdr.mh_size - m->m_len,
+ "27 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n%s",
+ n1, n2, n3, n4, n5, n6, x==7?buff:"");
+
+ return 1;
+ }
+
+ return 1;
+
+ case EMU_KSH:
+ /*
+ * The kshell (Kerberos rsh) and shell services both pass
+ * a local port port number to carry signals to the server
+ * and stderr to the client. It is passed at the beginning
+ * of the connection as a NUL-terminated decimal ASCII string.
+ */
+ so->so_emu = 0;
+ for (lport = 0, i = 0; i < m->m_len-1; ++i) {
+ if (m->m_data[i] < '0' || m->m_data[i] > '9')
+ return 1; /* invalid number */
+ lport *= 10;
+ lport += m->m_data[i] - '0';
+ }
+ if (m->m_data[m->m_len-1] == '\0' && lport != 0 &&
+ (so = tcp_listen(slirp, INADDR_ANY, 0, so->so_laddr.s_addr,
+ htons(lport), SS_FACCEPTONCE)) != NULL)
+ m->m_len = snprintf(m->m_data, m->m_hdr.mh_size, "%d",
+ ntohs(so->so_fport)) + 1;
+ return 1;
+
+ case EMU_IRC:
+ /*
+ * Need to emulate DCC CHAT, DCC SEND and DCC MOVE
+ */
+ *(m->m_data+m->m_len) = 0; /* NULL terminate the string for strstr */
+ if ((bptr = (char *)strstr(m->m_data, "DCC")) == NULL)
+ return 1;
+
+ /* The %256s is for the broken mIRC */
+ if (sscanf(bptr, "DCC CHAT %256s %u %u", buff, &laddr, &lport) == 3) {
+ if ((so = tcp_listen(slirp, INADDR_ANY, 0,
+ htonl(laddr), htons(lport),
+ SS_FACCEPTONCE)) == NULL) {
+ return 1;
+ }
+ m->m_len = bptr - m->m_data; /* Adjust length */
+ m->m_len += snprintf(bptr, m->m_hdr.mh_size,
+ "DCC CHAT chat %lu %u%c\n",
+ (unsigned long)ntohl(so->so_faddr.s_addr),
+ ntohs(so->so_fport), 1);
+ } else if (sscanf(bptr, "DCC SEND %256s %u %u %u", buff, &laddr, &lport, &n1) == 4) {
+ if ((so = tcp_listen(slirp, INADDR_ANY, 0,
+ htonl(laddr), htons(lport),
+ SS_FACCEPTONCE)) == NULL) {
+ return 1;
+ }
+ m->m_len = bptr - m->m_data; /* Adjust length */
+ m->m_len += snprintf(bptr, m->m_hdr.mh_size,
+ "DCC SEND %s %lu %u %u%c\n", buff,
+ (unsigned long)ntohl(so->so_faddr.s_addr),
+ ntohs(so->so_fport), n1, 1);
+ } else if (sscanf(bptr, "DCC MOVE %256s %u %u %u", buff, &laddr, &lport, &n1) == 4) {
+ if ((so = tcp_listen(slirp, INADDR_ANY, 0,
+ htonl(laddr), htons(lport),
+ SS_FACCEPTONCE)) == NULL) {
+ return 1;
+ }
+ m->m_len = bptr - m->m_data; /* Adjust length */
+ m->m_len += snprintf(bptr, m->m_hdr.mh_size,
+ "DCC MOVE %s %lu %u %u%c\n", buff,
+ (unsigned long)ntohl(so->so_faddr.s_addr),
+ ntohs(so->so_fport), n1, 1);
+ }
+ return 1;
+
+ case EMU_REALAUDIO:
+ /*
+ * RealAudio emulation - JP. We must try to parse the incoming
+ * data and try to find the two characters that contain the
+ * port number. Then we redirect an udp port and replace the
+ * number with the real port we got.
+ *
+ * The 1.0 beta versions of the player are not supported
+ * any more.
+ *
+ * A typical packet for player version 1.0 (release version):
+ *
+ * 0000:50 4E 41 00 05
+ * 0000:00 01 00 02 1B D7 00 00 67 E6 6C DC 63 00 12 50 ........g.l.c..P
+ * 0010:4E 43 4C 49 45 4E 54 20 31 30 31 20 41 4C 50 48 NCLIENT 101 ALPH
+ * 0020:41 6C 00 00 52 00 17 72 61 66 69 6C 65 73 2F 76 Al..R..rafiles/v
+ * 0030:6F 61 2F 65 6E 67 6C 69 73 68 5F 2E 72 61 79 42 oa/english_.rayB
+ *
+ * Now the port number 0x1BD7 is found at offset 0x04 of the
+ * Now the port number 0x1BD7 is found at offset 0x04 of the
+ * second packet. This time we received five bytes first and
+ * then the rest. You never know how many bytes you get.
+ *
+ * A typical packet for player version 2.0 (beta):
+ *
+ * 0000:50 4E 41 00 06 00 02 00 00 00 01 00 02 1B C1 00 PNA.............
+ * 0010:00 67 75 78 F5 63 00 0A 57 69 6E 32 2E 30 2E 30 .gux.c..Win2.0.0
+ * 0020:2E 35 6C 00 00 52 00 1C 72 61 66 69 6C 65 73 2F .5l..R..rafiles/
+ * 0030:77 65 62 73 69 74 65 2F 32 30 72 65 6C 65 61 73 website/20releas
+ * 0040:65 2E 72 61 79 53 00 00 06 36 42 e.rayS...6B
+ *
+ * Port number 0x1BC1 is found at offset 0x0d.
+ *
+ * This is just a horrible switch statement. Variable ra tells
+ * us where we're going.
+ */
+
+ bptr = m->m_data;
+ while (bptr < m->m_data + m->m_len) {
+ u_short p;
+ static int ra = 0;
+ char ra_tbl[4];
+
+ ra_tbl[0] = 0x50;
+ ra_tbl[1] = 0x4e;
+ ra_tbl[2] = 0x41;
+ ra_tbl[3] = 0;
+
+ switch (ra) {
+ case 0:
+ case 2:
+ case 3:
+ if (*bptr++ != ra_tbl[ra]) {
+ ra = 0;
+ continue;
+ }
+ break;
+
+ case 1:
+ /*
+ * We may get 0x50 several times, ignore them
+ */
+ if (*bptr == 0x50) {
+ ra = 1;
+ bptr++;
+ continue;
+ } else if (*bptr++ != ra_tbl[ra]) {
+ ra = 0;
+ continue;
+ }
+ break;
+
+ case 4:
+ /*
+ * skip version number
+ */
+ bptr++;
+ break;
+
+ case 5:
+ /*
+ * The difference between versions 1.0 and
+ * 2.0 is here. For future versions of
+ * the player this may need to be modified.
+ */
+ if (*(bptr + 1) == 0x02)
+ bptr += 8;
+ else
+ bptr += 4;
+ break;
+
+ case 6:
+ /* This is the field containing the port
+ * number that RA-player is listening to.
+ */
+ lport = (((u_char*)bptr)[0] << 8)
+ + ((u_char *)bptr)[1];
+ if (lport < 6970)
+ lport += 256; /* don't know why */
+ if (lport < 6970 || lport > 7170)
+ return 1; /* failed */
+
+ /* try to get udp port between 6970 - 7170 */
+ for (p = 6970; p < 7071; p++) {
+ if (udp_listen(slirp, INADDR_ANY,
+ htons(p),
+ so->so_laddr.s_addr,
+ htons(lport),
+ SS_FACCEPTONCE)) {
+ break;
+ }
+ }
+ if (p == 7071)
+ p = 0;
+ *(u_char *)bptr++ = (p >> 8) & 0xff;
+ *(u_char *)bptr = p & 0xff;
+ ra = 0;
+ return 1; /* port redirected, we're done */
+ break;
+
+ default:
+ ra = 0;
+ }
+ ra++;
+ }
+ return 1;
+
+ default:
+ /* Ooops, not emulated, won't call tcp_emu again */
+ so->so_emu = 0;
+ return 1;
+ }
+}
+
+/*
+ * Do misc. config of SLiRP while its running.
+ * Return 0 if this connections is to be closed, 1 otherwise,
+ * return 2 if this is a command-line connection
+ */
+int tcp_ctl(struct socket *so)
+{
+ Slirp *slirp = so->slirp;
+ struct sbuf *sb = &so->so_snd;
+ struct ex_list *ex_ptr;
+ int do_pty;
+
+ DEBUG_CALL("tcp_ctl");
+ DEBUG_ARG("so = %lx", (long )so);
+
+ if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr) {
+ /* Check if it's pty_exec */
+ for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
+ if (ex_ptr->ex_fport == so->so_fport &&
+ so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
+ if (ex_ptr->ex_pty == 3) {
+ so->s = -1;
+ so->extra = (void *)ex_ptr->ex_exec;
+ return 1;
+ }
+ do_pty = ex_ptr->ex_pty;
+ DEBUG_MISC((dfd, " executing %s \n",ex_ptr->ex_exec));
+ return fork_exec(so, ex_ptr->ex_exec, do_pty);
+ }
+ }
+ }
+ sb->sb_cc =
+ snprintf(sb->sb_wptr, sb->sb_datalen - (sb->sb_wptr - sb->sb_data),
+ "Error: No application configured.\r\n");
+ sb->sb_wptr += sb->sb_cc;
+ return 0;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.c
new file mode 100644
index 0000000..1e6e051
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.c
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp_timer.c 8.1 (Berkeley) 6/10/93
+ * tcp_timer.c,v 1.2 1994/08/02 07:49:10 davidg Exp
+ */
+
+#include "slirp.h"
+
+static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer);
+
+/*
+ * Fast timeout routine for processing delayed acks
+ */
+void
+tcp_fasttimo(Slirp *slirp)
+{
+ register struct socket *so;
+ register struct tcpcb *tp;
+
+ DEBUG_CALL("tcp_fasttimo");
+
+ so = slirp->tcb.so_next;
+ if (so)
+ for (; so != &slirp->tcb; so = so->so_next)
+ if ((tp = (struct tcpcb *)so->so_tcpcb) &&
+ (tp->t_flags & TF_DELACK)) {
+ tp->t_flags &= ~TF_DELACK;
+ tp->t_flags |= TF_ACKNOW;
+ (void) tcp_output(tp);
+ }
+}
+
+/*
+ * Tcp protocol timeout routine called every 500 ms.
+ * Updates the timers in all active tcb's and
+ * causes finite state machine actions if timers expire.
+ */
+void
+tcp_slowtimo(Slirp *slirp)
+{
+ register struct socket *ip, *ipnxt;
+ register struct tcpcb *tp;
+ register int i;
+
+ DEBUG_CALL("tcp_slowtimo");
+
+ /*
+ * Search through tcb's and update active timers.
+ */
+ ip = slirp->tcb.so_next;
+ if (ip == NULL) {
+ return;
+ }
+ for (; ip != &slirp->tcb; ip = ipnxt) {
+ ipnxt = ip->so_next;
+ tp = sototcpcb(ip);
+ if (tp == NULL) {
+ continue;
+ }
+ for (i = 0; i < TCPT_NTIMERS; i++) {
+ if (tp->t_timer[i] && --tp->t_timer[i] == 0) {
+ tcp_timers(tp,i);
+ if (ipnxt->so_prev != ip)
+ goto tpgone;
+ }
+ }
+ tp->t_idle++;
+ if (tp->t_rtt)
+ tp->t_rtt++;
+tpgone:
+ ;
+ }
+ slirp->tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */
+ slirp->tcp_now++; /* for timestamps */
+}
+
+/*
+ * Cancel all timers for TCP tp.
+ */
+void
+tcp_canceltimers(struct tcpcb *tp)
+{
+ register int i;
+
+ for (i = 0; i < TCPT_NTIMERS; i++)
+ tp->t_timer[i] = 0;
+}
+
+const int tcp_backoff[TCP_MAXRXTSHIFT + 1] =
+ { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };
+
+/*
+ * TCP timer processing.
+ */
+static struct tcpcb *
+tcp_timers(register struct tcpcb *tp, int timer)
+{
+ register int rexmt;
+
+ DEBUG_CALL("tcp_timers");
+
+ switch (timer) {
+
+ /*
+ * 2 MSL timeout in shutdown went off. If we're closed but
+ * still waiting for peer to close and connection has been idle
+ * too long, or if 2MSL time is up from TIME_WAIT, delete connection
+ * control block. Otherwise, check again in a bit.
+ */
+ case TCPT_2MSL:
+ if (tp->t_state != TCPS_TIME_WAIT &&
+ tp->t_idle <= TCP_MAXIDLE)
+ tp->t_timer[TCPT_2MSL] = TCPTV_KEEPINTVL;
+ else
+ tp = tcp_close(tp);
+ break;
+
+ /*
+ * Retransmission timer went off. Message has not
+ * been acked within retransmit interval. Back off
+ * to a longer retransmit interval and retransmit one segment.
+ */
+ case TCPT_REXMT:
+
+ /*
+ * XXXXX If a packet has timed out, then remove all the queued
+ * packets for that session.
+ */
+
+ if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) {
+ /*
+ * This is a hack to suit our terminal server here at the uni of canberra
+ * since they have trouble with zeroes... It usually lets them through
+ * unharmed, but under some conditions, it'll eat the zeros. If we
+ * keep retransmitting it, it'll keep eating the zeroes, so we keep
+ * retransmitting, and eventually the connection dies...
+ * (this only happens on incoming data)
+ *
+ * So, if we were gonna drop the connection from too many retransmits,
+ * don't... instead halve the t_maxseg, which might break up the NULLs and
+ * let them through
+ *
+ * *sigh*
+ */
+
+ tp->t_maxseg >>= 1;
+ if (tp->t_maxseg < 32) {
+ /*
+ * We tried our best, now the connection must die!
+ */
+ tp->t_rxtshift = TCP_MAXRXTSHIFT;
+ tp = tcp_drop(tp, tp->t_softerror);
+ /* tp->t_softerror : ETIMEDOUT); */ /* XXX */
+ return (tp); /* XXX */
+ }
+
+ /*
+ * Set rxtshift to 6, which is still at the maximum
+ * backoff time
+ */
+ tp->t_rxtshift = 6;
+ }
+ rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
+ TCPT_RANGESET(tp->t_rxtcur, rexmt,
+ (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
+ tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
+ /*
+ * If losing, let the lower level know and try for
+ * a better route. Also, if we backed off this far,
+ * our srtt estimate is probably bogus. Clobber it
+ * so we'll take the next rtt measurement as our srtt;
+ * move the current srtt into rttvar to keep the current
+ * retransmit times until then.
+ */
+ if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) {
+ tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT);
+ tp->t_srtt = 0;
+ }
+ tp->snd_nxt = tp->snd_una;
+ /*
+ * If timing a segment in this window, stop the timer.
+ */
+ tp->t_rtt = 0;
+ /*
+ * Close the congestion window down to one segment
+ * (we'll open it by one segment for each ack we get).
+ * Since we probably have a window's worth of unacked
+ * data accumulated, this "slow start" keeps us from
+ * dumping all that data as back-to-back packets (which
+ * might overwhelm an intermediate gateway).
+ *
+ * There are two phases to the opening: Initially we
+ * open by one mss on each ack. This makes the window
+ * size increase exponentially with time. If the
+ * window is larger than the path can handle, this
+ * exponential growth results in dropped packet(s)
+ * almost immediately. To get more time between
+ * drops but still "push" the network to take advantage
+ * of improving conditions, we switch from exponential
+ * to linear window opening at some threshold size.
+ * For a threshold, we use half the current window
+ * size, truncated to a multiple of the mss.
+ *
+ * (the minimum cwnd that will give us exponential
+ * growth is 2 mss. We don't allow the threshold
+ * to go below this.)
+ */
+ {
+ u_int win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg;
+ if (win < 2)
+ win = 2;
+ tp->snd_cwnd = tp->t_maxseg;
+ tp->snd_ssthresh = win * tp->t_maxseg;
+ tp->t_dupacks = 0;
+ }
+ (void) tcp_output(tp);
+ break;
+
+ /*
+ * Persistence timer into zero window.
+ * Force a byte to be output, if possible.
+ */
+ case TCPT_PERSIST:
+ tcp_setpersist(tp);
+ tp->t_force = 1;
+ (void) tcp_output(tp);
+ tp->t_force = 0;
+ break;
+
+ /*
+ * Keep-alive timer went off; send something
+ * or drop connection if idle for too long.
+ */
+ case TCPT_KEEP:
+ if (tp->t_state < TCPS_ESTABLISHED)
+ goto dropit;
+
+ if ((SO_OPTIONS) && tp->t_state <= TCPS_CLOSE_WAIT) {
+ if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE)
+ goto dropit;
+ /*
+ * Send a packet designed to force a response
+ * if the peer is up and reachable:
+ * either an ACK if the connection is still alive,
+ * or an RST if the peer has closed the connection
+ * due to timeout or reboot.
+ * Using sequence number tp->snd_una-1
+ * causes the transmitted zero-length segment
+ * to lie outside the receive window;
+ * by the protocol spec, this requires the
+ * correspondent TCP to respond.
+ */
+ tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL,
+ tp->rcv_nxt, tp->snd_una - 1, 0);
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
+ } else
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
+ break;
+
+ dropit:
+ tp = tcp_drop(tp, 0);
+ break;
+ }
+
+ return (tp);
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.h
new file mode 100644
index 0000000..ff17914
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp_timer.h 8.1 (Berkeley) 6/10/93
+ * tcp_timer.h,v 1.4 1994/08/21 05:27:38 paul Exp
+ */
+
+#ifndef _TCP_TIMER_H_
+#define _TCP_TIMER_H_
+
+/*
+ * Definitions of the TCP timers. These timers are counted
+ * down PR_SLOWHZ times a second.
+ */
+#define TCPT_NTIMERS 4
+
+#define TCPT_REXMT 0 /* retransmit */
+#define TCPT_PERSIST 1 /* retransmit persistence */
+#define TCPT_KEEP 2 /* keep alive */
+#define TCPT_2MSL 3 /* 2*msl quiet time timer */
+
+/*
+ * The TCPT_REXMT timer is used to force retransmissions.
+ * The TCP has the TCPT_REXMT timer set whenever segments
+ * have been sent for which ACKs are expected but not yet
+ * received. If an ACK is received which advances tp->snd_una,
+ * then the retransmit timer is cleared (if there are no more
+ * outstanding segments) or reset to the base value (if there
+ * are more ACKs expected). Whenever the retransmit timer goes off,
+ * we retransmit one unacknowledged segment, and do a backoff
+ * on the retransmit timer.
+ *
+ * The TCPT_PERSIST timer is used to keep window size information
+ * flowing even if the window goes shut. If all previous transmissions
+ * have been acknowledged (so that there are no retransmissions in progress),
+ * and the window is too small to bother sending anything, then we start
+ * the TCPT_PERSIST timer. When it expires, if the window is nonzero,
+ * we go to transmit state. Otherwise, at intervals send a single byte
+ * into the peer's window to force him to update our window information.
+ * We do this at most as often as TCPT_PERSMIN time intervals,
+ * but no more frequently than the current estimate of round-trip
+ * packet time. The TCPT_PERSIST timer is cleared whenever we receive
+ * a window update from the peer.
+ *
+ * The TCPT_KEEP timer is used to keep connections alive. If an
+ * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time,
+ * but not yet established, then we drop the connection. Once the connection
+ * is established, if the connection is idle for TCPTV_KEEP_IDLE time
+ * (and keepalives have been enabled on the socket), we begin to probe
+ * the connection. We force the peer to send us a segment by sending:
+ * <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK>
+ * This segment is (deliberately) outside the window, and should elicit
+ * an ack segment in response from the peer. If, despite the TCPT_KEEP
+ * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE
+ * amount of time probing, then we drop the connection.
+ */
+
+/*
+ * Time constants.
+ */
+#define TCPTV_MSL ( 5*PR_SLOWHZ) /* max seg lifetime (hah!) */
+
+#define TCPTV_SRTTBASE 0 /* base roundtrip time;
+ if 0, no idea yet */
+#define TCPTV_SRTTDFLT ( 3*PR_SLOWHZ) /* assumed RTT if no info */
+
+#define TCPTV_PERSMIN ( 5*PR_SLOWHZ) /* retransmit persistence */
+#define TCPTV_PERSMAX ( 60*PR_SLOWHZ) /* maximum persist interval */
+
+#define TCPTV_KEEP_INIT ( 75*PR_SLOWHZ) /* initial connect keep alive */
+#define TCPTV_KEEP_IDLE (120*60*PR_SLOWHZ) /* dflt time before probing */
+#define TCPTV_KEEPINTVL ( 75*PR_SLOWHZ) /* default probe interval */
+#define TCPTV_KEEPCNT 8 /* max probes before drop */
+
+#define TCPTV_MIN ( 1*PR_SLOWHZ) /* minimum allowable value */
+#define TCPTV_REXMTMAX ( 12*PR_SLOWHZ) /* max allowable REXMT value */
+
+#define TCP_LINGERTIME 120 /* linger at most 2 minutes */
+
+#define TCP_MAXRXTSHIFT 12 /* maximum retransmits */
+
+
+/*
+ * Force a time value to be in a certain range.
+ */
+#define TCPT_RANGESET(tv, value, tvmin, tvmax) { \
+ (tv) = (value); \
+ if ((tv) < (tvmin)) \
+ (tv) = (tvmin); \
+ else if ((tv) > (tvmax)) \
+ (tv) = (tvmax); \
+}
+
+extern const int tcp_backoff[];
+
+struct tcpcb;
+
+void tcp_fasttimo(Slirp *);
+void tcp_slowtimo(Slirp *);
+void tcp_canceltimers(struct tcpcb *);
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_var.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_var.h
new file mode 100644
index 0000000..004193f
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_var.h
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1982, 1986, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp_var.h 8.3 (Berkeley) 4/10/94
+ * tcp_var.h,v 1.3 1994/08/21 05:27:39 paul Exp
+ */
+
+#ifndef _TCP_VAR_H_
+#define _TCP_VAR_H_
+
+#include "tcpip.h"
+#include "tcp_timer.h"
+
+/*
+ * Tcp control block, one per tcp; fields:
+ */
+struct tcpcb {
+ struct tcpiphdr *seg_next; /* sequencing queue */
+ struct tcpiphdr *seg_prev;
+ short t_state; /* state of this connection */
+ short t_timer[TCPT_NTIMERS]; /* tcp timers */
+ short t_rxtshift; /* log(2) of rexmt exp. backoff */
+ short t_rxtcur; /* current retransmit value */
+ short t_dupacks; /* consecutive dup acks recd */
+ u_short t_maxseg; /* maximum segment size */
+ char t_force; /* 1 if forcing out a byte */
+ u_short t_flags;
+#define TF_ACKNOW 0x0001 /* ack peer immediately */
+#define TF_DELACK 0x0002 /* ack, but try to delay it */
+#define TF_NODELAY 0x0004 /* don't delay packets to coalesce */
+#define TF_NOOPT 0x0008 /* don't use tcp options */
+#define TF_SENTFIN 0x0010 /* have sent FIN */
+#define TF_REQ_SCALE 0x0020 /* have/will request window scaling */
+#define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */
+#define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */
+#define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */
+#define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */
+
+ struct tcpiphdr t_template; /* static skeletal packet for xmit */
+
+ struct socket *t_socket; /* back pointer to socket */
+/*
+ * The following fields are used as in the protocol specification.
+ * See RFC783, Dec. 1981, page 21.
+ */
+/* send sequence variables */
+ tcp_seq snd_una; /* send unacknowledged */
+ tcp_seq snd_nxt; /* send next */
+ tcp_seq snd_up; /* send urgent pointer */
+ tcp_seq snd_wl1; /* window update seg seq number */
+ tcp_seq snd_wl2; /* window update seg ack number */
+ tcp_seq iss; /* initial send sequence number */
+ uint32_t snd_wnd; /* send window */
+/* receive sequence variables */
+ uint32_t rcv_wnd; /* receive window */
+ tcp_seq rcv_nxt; /* receive next */
+ tcp_seq rcv_up; /* receive urgent pointer */
+ tcp_seq irs; /* initial receive sequence number */
+/*
+ * Additional variables for this implementation.
+ */
+/* receive variables */
+ tcp_seq rcv_adv; /* advertised window */
+/* retransmit variables */
+ tcp_seq snd_max; /* highest sequence number sent;
+ * used to recognize retransmits
+ */
+/* congestion control (for slow start, source quench, retransmit after loss) */
+ uint32_t snd_cwnd; /* congestion-controlled window */
+ uint32_t snd_ssthresh; /* snd_cwnd size threshold for
+ * for slow start exponential to
+ * linear switch
+ */
+/*
+ * transmit timing stuff. See below for scale of srtt and rttvar.
+ * "Variance" is actually smoothed difference.
+ */
+ short t_idle; /* inactivity time */
+ short t_rtt; /* round trip time */
+ tcp_seq t_rtseq; /* sequence number being timed */
+ short t_srtt; /* smoothed round-trip time */
+ short t_rttvar; /* variance in round-trip time */
+ u_short t_rttmin; /* minimum rtt allowed */
+ uint32_t max_sndwnd; /* largest window peer has offered */
+
+/* out-of-band data */
+ char t_oobflags; /* have some */
+ char t_iobc; /* input character */
+#define TCPOOB_HAVEDATA 0x01
+#define TCPOOB_HADDATA 0x02
+ short t_softerror; /* possible error not yet reported */
+
+/* RFC 1323 variables */
+ u_char snd_scale; /* window scaling for send window */
+ u_char rcv_scale; /* window scaling for recv window */
+ u_char request_r_scale; /* pending window scaling */
+ u_char requested_s_scale;
+ uint32_t ts_recent; /* timestamp echo data */
+ uint32_t ts_recent_age; /* when last updated */
+ tcp_seq last_ack_sent;
+
+};
+
+#define sototcpcb(so) ((so)->so_tcpcb)
+
+/*
+ * The smoothed round-trip time and estimated variance
+ * are stored as fixed point numbers scaled by the values below.
+ * For convenience, these scales are also used in smoothing the average
+ * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
+ * With these scales, srtt has 3 bits to the right of the binary point,
+ * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the
+ * binary point, and is smoothed with an ALPHA of 0.75.
+ */
+#define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */
+#define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */
+#define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */
+#define TCP_RTTVAR_SHIFT 2 /* multiplier for rttvar; 2 bits */
+
+/*
+ * The initial retransmission should happen at rtt + 4 * rttvar.
+ * Because of the way we do the smoothing, srtt and rttvar
+ * will each average +1/2 tick of bias. When we compute
+ * the retransmit timer, we want 1/2 tick of rounding and
+ * 1 extra tick because of +-1/2 tick uncertainty in the
+ * firing of the timer. The bias will give us exactly the
+ * 1.5 tick we need. But, because the bias is
+ * statistical, we have to test that we don't drop below
+ * the minimum feasible timer (which is 2 ticks).
+ * This macro assumes that the value of TCP_RTTVAR_SCALE
+ * is the same as the multiplier for rttvar.
+ */
+#define TCP_REXMTVAL(tp) \
+ (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar)
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcpip.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcpip.h
new file mode 100644
index 0000000..7974ce3
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcpip.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcpip.h 8.1 (Berkeley) 6/10/93
+ * tcpip.h,v 1.3 1994/08/21 05:27:40 paul Exp
+ */
+
+#ifndef _TCPIP_H_
+#define _TCPIP_H_
+
+/*
+ * Tcp+ip header, after ip options removed.
+ */
+struct tcpiphdr {
+ struct ipovly ti_i; /* overlaid ip structure */
+ struct tcphdr ti_t; /* tcp header */
+};
+#define ti_mbuf ti_i.ih_mbuf.mptr
+#define ti_x1 ti_i.ih_x1
+#define ti_pr ti_i.ih_pr
+#define ti_len ti_i.ih_len
+#define ti_src ti_i.ih_src
+#define ti_dst ti_i.ih_dst
+#define ti_sport ti_t.th_sport
+#define ti_dport ti_t.th_dport
+#define ti_seq ti_t.th_seq
+#define ti_ack ti_t.th_ack
+#define ti_x2 ti_t.th_x2
+#define ti_off ti_t.th_off
+#define ti_flags ti_t.th_flags
+#define ti_win ti_t.th_win
+#define ti_sum ti_t.th_sum
+#define ti_urp ti_t.th_urp
+
+#define tcpiphdr2qlink(T) ((struct qlink*)(((char*)(T)) - sizeof(struct qlink)))
+#define qlink2tcpiphdr(Q) ((struct tcpiphdr*)(((char*)(Q)) + sizeof(struct qlink)))
+#define tcpiphdr_next(T) qlink2tcpiphdr(tcpiphdr2qlink(T)->next)
+#define tcpiphdr_prev(T) qlink2tcpiphdr(tcpiphdr2qlink(T)->prev)
+#define tcpfrag_list_first(T) qlink2tcpiphdr((T)->seg_next)
+#define tcpfrag_list_end(F, T) (tcpiphdr2qlink(F) == (struct qlink*)(T))
+#define tcpfrag_list_empty(T) ((T)->seg_next == (struct tcpiphdr*)(T))
+
+/*
+ * Just a clean way to get to the first byte
+ * of the packet
+ */
+struct tcpiphdr_2 {
+ struct tcpiphdr dummy;
+ char first_char;
+};
+
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tftp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tftp.h
new file mode 100644
index 0000000..b9f0847
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tftp.h
@@ -0,0 +1,43 @@
+/* tftp defines */
+
+#define TFTP_SESSIONS_MAX 3
+
+#define TFTP_SERVER 69
+
+#define TFTP_RRQ 1
+#define TFTP_WRQ 2
+#define TFTP_DATA 3
+#define TFTP_ACK 4
+#define TFTP_ERROR 5
+#define TFTP_OACK 6
+
+#define TFTP_FILENAME_MAX 512
+
+struct tftp_t {
+ struct ip ip;
+ struct udphdr udp;
+ uint16_t tp_op;
+ union {
+ struct {
+ uint16_t tp_block_nr;
+ uint8_t tp_buf[512];
+ } tp_data;
+ struct {
+ uint16_t tp_error_code;
+ uint8_t tp_msg[512];
+ } tp_error;
+ uint8_t tp_buf[512 + 2];
+ } x;
+};
+
+struct tftp_session {
+ Slirp *slirp;
+ char *filename;
+
+ struct in_addr client_ip;
+ uint16_t client_port;
+
+ int timestamp;
+};
+
+void tftp_input(struct mbuf *m);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.c
new file mode 100644
index 0000000..2d04f12
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.c
@@ -0,0 +1,386 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)udp_usrreq.c 8.4 (Berkeley) 1/21/94
+ * udp_usrreq.c,v 1.4 1994/10/02 17:48:45 phk Exp
+ */
+
+/*
+ * Changes and additions relating to SLiRP
+ * Copyright (c) 1995 Danny Gasparovski.
+ *
+ * Please read the file COPYRIGHT for the
+ * terms and conditions of the copyright.
+ */
+
+#include "slirp.h"
+#include "ip_icmp.h"
+
+static uint8_t udp_tos(struct socket *so);
+
+void
+udp_init(Slirp *slirp)
+{
+ slirp->udb.so_next = slirp->udb.so_prev = &slirp->udb;
+ slirp->udp_last_so = &slirp->udb;
+}
+/* m->m_data points at ip packet header
+ * m->m_len length ip packet
+ * ip->ip_len length data (IPDU)
+ */
+void
+udp_input(register struct mbuf *m, int iphlen)
+{
+ Slirp *slirp = m->slirp;
+ register struct ip *ip;
+ register struct udphdr *uh;
+ int len;
+ struct ip save_ip;
+ struct socket *so;
+
+ DEBUG_CALL("udp_input");
+ DEBUG_ARG("m = %lx", (long)m);
+ DEBUG_ARG("iphlen = %d", iphlen);
+
+ /*
+ * Strip IP options, if any; should skip this,
+ * make available to user, and use on returned packets,
+ * but we don't yet have a way to check the checksum
+ * with options still present.
+ */
+ if(iphlen > sizeof(struct ip)) {
+ ip_stripoptions(m, (struct mbuf *)0);
+ iphlen = sizeof(struct ip);
+ }
+
+ /*
+ * Get IP and UDP header together in first mbuf.
+ */
+ ip = mtod(m, struct ip *);
+ uh = (struct udphdr *)((caddr_t)ip + iphlen);
+
+ /*
+ * Make mbuf data length reflect UDP length.
+ * If not enough data to reflect UDP length, drop.
+ */
+ len = ntohs((uint16_t)uh->uh_ulen);
+
+ if (ip->ip_len != len) {
+ if (len > ip->ip_len) {
+ goto bad;
+ }
+ m_adj(m, len - ip->ip_len);
+ ip->ip_len = len;
+ }
+
+ /*
+ * Save a copy of the IP header in case we want restore it
+ * for sending an ICMP error message in response.
+ */
+ save_ip = *ip;
+ save_ip.ip_len+= iphlen; /* tcp_input subtracts this */
+
+ /*
+ * Checksum extended UDP header and data.
+ */
+ if (uh->uh_sum) {
+ memset(&((struct ipovly *)ip)->ih_mbuf, 0, sizeof(struct mbuf_ptr));
+ ((struct ipovly *)ip)->ih_x1 = 0;
+ ((struct ipovly *)ip)->ih_len = uh->uh_ulen;
+ if(cksum(m, len + sizeof(struct ip))) {
+ goto bad;
+ }
+ }
+
+ /*
+ * handle DHCP/BOOTP
+ */
+ if (ntohs(uh->uh_dport) == BOOTP_SERVER) {
+ bootp_input(m);
+ goto bad;
+ }
+
+ if (slirp->restricted) {
+ goto bad;
+ }
+
+#if 0
+ /*
+ * handle TFTP
+ */
+ if (ntohs(uh->uh_dport) == TFTP_SERVER) {
+ tftp_input(m);
+ goto bad;
+ }
+#endif
+
+ /*
+ * Locate pcb for datagram.
+ */
+ so = slirp->udp_last_so;
+ if (so->so_lport != uh->uh_sport ||
+ so->so_laddr.s_addr != ip->ip_src.s_addr) {
+ struct socket *tmp;
+
+ for (tmp = slirp->udb.so_next; tmp != &slirp->udb;
+ tmp = tmp->so_next) {
+ if (tmp->so_lport == uh->uh_sport &&
+ tmp->so_laddr.s_addr == ip->ip_src.s_addr) {
+ so = tmp;
+ break;
+ }
+ }
+ if (tmp == &slirp->udb) {
+ so = NULL;
+ } else {
+ slirp->udp_last_so = so;
+ }
+ }
+
+ if (so == NULL) {
+ /*
+ * If there's no socket for this packet,
+ * create one
+ */
+ so = socreate(slirp);
+ if (!so) {
+ goto bad;
+ }
+ if(udp_attach(so) == -1) {
+ DEBUG_MISC((dfd," udp_attach errno = %d-%s\n",
+ errno,strerror(errno)));
+ sofree(so);
+ goto bad;
+ }
+
+ /*
+ * Setup fields
+ */
+ so->so_laddr = ip->ip_src;
+ so->so_lport = uh->uh_sport;
+
+ if ((so->so_iptos = udp_tos(so)) == 0)
+ so->so_iptos = ip->ip_tos;
+
+ /*
+ * XXXXX Here, check if it's in udpexec_list,
+ * and if it is, do the fork_exec() etc.
+ */
+ }
+
+ so->so_faddr = ip->ip_dst; /* XXX */
+ so->so_fport = uh->uh_dport; /* XXX */
+
+ iphlen += sizeof(struct udphdr);
+ m->m_len -= iphlen;
+ m->m_data += iphlen;
+
+ /*
+ * Now we sendto() the packet.
+ */
+ if(sosendto(so,m) == -1) {
+ m->m_len += iphlen;
+ m->m_data -= iphlen;
+ *ip=save_ip;
+ DEBUG_MISC((dfd,"udp tx errno = %d-%s\n",errno,strerror(errno)));
+ icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno));
+ }
+
+ m_free(so->so_m); /* used for ICMP if error on sorecvfrom */
+
+ /* restore the orig mbuf packet */
+ m->m_len += iphlen;
+ m->m_data -= iphlen;
+ *ip=save_ip;
+ so->so_m=m; /* ICMP backup */
+
+ return;
+bad:
+ m_freem(m);
+ return;
+}
+
+int udp_output2(struct socket *so, struct mbuf *m,
+ struct sockaddr_in *saddr, struct sockaddr_in *daddr,
+ int iptos)
+{
+ register struct udpiphdr *ui;
+ int error = 0;
+
+ DEBUG_CALL("udp_output");
+ DEBUG_ARG("so = %lx", (long)so);
+ DEBUG_ARG("m = %lx", (long)m);
+ DEBUG_ARG("saddr = %lx", (long)saddr->sin_addr.s_addr);
+ DEBUG_ARG("daddr = %lx", (long)daddr->sin_addr.s_addr);
+
+ /*
+ * Adjust for header
+ */
+ m->m_data -= sizeof(struct udpiphdr);
+ m->m_len += sizeof(struct udpiphdr);
+
+ /*
+ * Fill in mbuf with extended UDP header
+ * and addresses and length put into network format.
+ */
+ ui = mtod(m, struct udpiphdr *);
+ memset(&ui->ui_i.ih_mbuf, 0 , sizeof(struct mbuf_ptr));
+ ui->ui_x1 = 0;
+ ui->ui_pr = IPPROTO_UDP;
+ ui->ui_len = htons(m->m_len - sizeof(struct ip));
+ /* XXXXX Check for from-one-location sockets, or from-any-location sockets */
+ ui->ui_src = saddr->sin_addr;
+ ui->ui_dst = daddr->sin_addr;
+ ui->ui_sport = saddr->sin_port;
+ ui->ui_dport = daddr->sin_port;
+ ui->ui_ulen = ui->ui_len;
+
+ /*
+ * Stuff checksum and output datagram.
+ */
+ ui->ui_sum = 0;
+ if ((ui->ui_sum = cksum(m, m->m_len)) == 0)
+ ui->ui_sum = 0xffff;
+ ((struct ip *)ui)->ip_len = m->m_len;
+
+ ((struct ip *)ui)->ip_ttl = IPDEFTTL;
+ ((struct ip *)ui)->ip_tos = iptos;
+
+ error = ip_output(so, m);
+
+ return (error);
+}
+
+int udp_output(struct socket *so, struct mbuf *m,
+ struct sockaddr_in *addr)
+
+{
+ Slirp *slirp = so->slirp;
+ struct sockaddr_in saddr, daddr;
+
+ saddr = *addr;
+ if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
+ slirp->vnetwork_addr.s_addr) {
+ uint32_t inv_mask = ~slirp->vnetwork_mask.s_addr;
+
+ if ((so->so_faddr.s_addr & inv_mask) == inv_mask) {
+ saddr.sin_addr = slirp->vhost_addr;
+ } else if (addr->sin_addr.s_addr == loopback_addr.s_addr ||
+ so->so_faddr.s_addr != slirp->vhost_addr.s_addr) {
+ saddr.sin_addr = so->so_faddr;
+ }
+ }
+ daddr.sin_addr = so->so_laddr;
+ daddr.sin_port = so->so_lport;
+
+ return udp_output2(so, m, &saddr, &daddr, so->so_iptos);
+}
+
+int
+udp_attach(struct socket *so)
+{
+ if((so->s = os_socket(AF_INET,SOCK_DGRAM,0)) != -1) {
+ so->so_expire = curtime + SO_EXPIRE;
+ insque(so, &so->slirp->udb);
+ }
+ return(so->s);
+}
+
+void
+udp_detach(struct socket *so)
+{
+ closesocket(so->s);
+ sofree(so);
+}
+
+static const struct tos_t udptos[] = {
+ {0, 53, IPTOS_LOWDELAY, 0}, /* DNS */
+ {0, 0, 0, 0}
+};
+
+static uint8_t
+udp_tos(struct socket *so)
+{
+ int i = 0;
+
+ while(udptos[i].tos) {
+ if ((udptos[i].fport && ntohs(so->so_fport) == udptos[i].fport) ||
+ (udptos[i].lport && ntohs(so->so_lport) == udptos[i].lport)) {
+ so->so_emu = udptos[i].emu;
+ return udptos[i].tos;
+ }
+ i++;
+ }
+
+ return 0;
+}
+
+struct socket *
+udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr,
+ u_int lport, int flags)
+{
+ struct sockaddr_in addr;
+ struct socket *so;
+ socklen_t addrlen = sizeof(struct sockaddr_in), opt = 1;
+
+ so = socreate(slirp);
+ if (!so) {
+ return NULL;
+ }
+ so->s = os_socket(AF_INET,SOCK_DGRAM,0);
+ so->so_expire = curtime + SO_EXPIRE;
+ insque(so, &slirp->udb);
+
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = haddr;
+ addr.sin_port = hport;
+
+ if (bind(so->s,(struct sockaddr *)&addr, addrlen) < 0) {
+ udp_detach(so);
+ return NULL;
+ }
+ setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int));
+
+ getsockname(so->s,(struct sockaddr *)&addr,&addrlen);
+ so->so_fport = addr.sin_port;
+ if (addr.sin_addr.s_addr == 0 ||
+ addr.sin_addr.s_addr == loopback_addr.s_addr) {
+ so->so_faddr = slirp->vhost_addr;
+ } else {
+ so->so_faddr = addr.sin_addr;
+ }
+ so->so_lport = lport;
+ so->so_laddr.s_addr = laddr;
+ if (flags != SS_FACCEPTONCE)
+ so->so_expire = 0;
+
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_ISFCONNECTED | flags;
+
+ return so;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.h
new file mode 100644
index 0000000..9b5c3cf
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)udp.h 8.1 (Berkeley) 6/10/93
+ * udp.h,v 1.3 1994/08/21 05:27:41 paul Exp
+ */
+
+#ifndef _UDP_H_
+#define _UDP_H_
+
+#define UDP_TTL 0x60
+#define UDP_UDPDATALEN 16192
+
+/*
+ * Udp protocol header.
+ * Per RFC 768, September, 1981.
+ */
+struct udphdr {
+ uint16_t uh_sport; /* source port */
+ uint16_t uh_dport; /* destination port */
+ int16_t uh_ulen; /* udp length */
+ uint16_t uh_sum; /* udp checksum */
+};
+
+/*
+ * UDP kernel structures and variables.
+ */
+struct udpiphdr {
+ struct ipovly ui_i; /* overlaid ip structure */
+ struct udphdr ui_u; /* udp header */
+};
+#define ui_mbuf ui_i.ih_mbuf.mptr
+#define ui_x1 ui_i.ih_x1
+#define ui_pr ui_i.ih_pr
+#define ui_len ui_i.ih_len
+#define ui_src ui_i.ih_src
+#define ui_dst ui_i.ih_dst
+#define ui_sport ui_u.uh_sport
+#define ui_dport ui_u.uh_dport
+#define ui_ulen ui_u.uh_ulen
+#define ui_sum ui_u.uh_sum
+
+/*
+ * Names for UDP sysctl objects
+ */
+#define UDPCTL_CHECKSUM 1 /* checksum UDP packets */
+#define UDPCTL_MAXID 2
+
+struct mbuf;
+
+void udp_init(Slirp *);
+void udp_input(register struct mbuf *, int);
+int udp_output(struct socket *, struct mbuf *, struct sockaddr_in *);
+int udp_attach(struct socket *);
+void udp_detach(struct socket *);
+struct socket * udp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int,
+ int);
+int udp_output2(struct socket *so, struct mbuf *m,
+ struct sockaddr_in *saddr, struct sockaddr_in *daddr,
+ int iptos);
+#endif
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.c
new file mode 100644
index 0000000..2a1aad0
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.c
@@ -0,0 +1,87 @@
+/*
+ * SoftFP Library
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+
+#include "cutils.h"
+#include "softfp.h"
+
+static inline int clz32(uint32_t a)
+{
+ int r;
+ if (a == 0) {
+ r = 32;
+ } else {
+ r = __builtin_clz(a);
+ }
+ return r;
+}
+
+static inline int clz64(uint64_t a)
+{
+ int r;
+ if (a == 0) {
+ r = 64;
+ } else
+ {
+ r = __builtin_clzll(a);
+ }
+ return r;
+}
+
+#ifdef HAVE_INT128
+static inline int clz128(uint128_t a)
+{
+ int r;
+ if (a == 0) {
+ r = 128;
+ } else
+ {
+ uint64_t ah, al;
+ ah = a >> 64;
+ al = a;
+ if (ah != 0)
+ r = __builtin_clzll(ah);
+ else
+ r = __builtin_clzll(al) + 64;
+ }
+ return r;
+}
+#endif
+
+#define F_SIZE 32
+#include "softfp_template.h"
+
+#define F_SIZE 64
+#include "softfp_template.h"
+
+#ifdef HAVE_INT128
+
+#define F_SIZE 128
+#include "softfp_template.h"
+
+#endif
+
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.h
new file mode 100644
index 0000000..974c7ec
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.h
@@ -0,0 +1,181 @@
+/*
+ * SoftFP Library
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef SOFTFP_H
+#define SOFTFP_H
+
+#include <inttypes.h>
+#include "cutils.h"
+
+typedef enum {
+ RM_RNE, /* Round to Nearest, ties to Even */
+ RM_RTZ, /* Round towards Zero */
+ RM_RDN, /* Round Down */
+ RM_RUP, /* Round Up */
+ RM_RMM, /* Round to Nearest, ties to Max Magnitude */
+} RoundingModeEnum;
+
+#define FFLAG_INVALID_OP (1 << 4)
+#define FFLAG_DIVIDE_ZERO (1 << 3)
+#define FFLAG_OVERFLOW (1 << 2)
+#define FFLAG_UNDERFLOW (1 << 1)
+#define FFLAG_INEXACT (1 << 0)
+
+#define FCLASS_NINF (1 << 0)
+#define FCLASS_NNORMAL (1 << 1)
+#define FCLASS_NSUBNORMAL (1 << 2)
+#define FCLASS_NZERO (1 << 3)
+#define FCLASS_PZERO (1 << 4)
+#define FCLASS_PSUBNORMAL (1 << 5)
+#define FCLASS_PNORMAL (1 << 6)
+#define FCLASS_PINF (1 << 7)
+#define FCLASS_SNAN (1 << 8)
+#define FCLASS_QNAN (1 << 9)
+
+typedef enum {
+ FMINMAX_PROP, /* min(1, qNaN/sNaN) -> qNaN */
+ FMINMAX_IEEE754_2008, /* min(1, qNaN) -> 1, min(1, sNaN) -> qNaN */
+ FMINMAX_IEEE754_201X, /* min(1, qNaN/sNaN) -> 1 */
+} SoftFPMinMaxTypeEnum;
+
+typedef uint32_t sfloat32;
+typedef uint64_t sfloat64;
+#ifdef HAVE_INT128
+typedef uint128_t sfloat128;
+#endif
+
+/* 32 bit floats */
+
+#define FSIGN_MASK32 (1 << 31)
+
+sfloat32 add_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 sub_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 mul_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 div_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 sqrt_sf32(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 fma_sf32(sfloat32 a, sfloat32 b, sfloat32 c, RoundingModeEnum rm, uint32_t *pfflags);
+
+sfloat32 min_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type);
+sfloat32 max_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type);
+int eq_quiet_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags);
+int le_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags);
+int lt_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags);
+uint32_t fclass_sf32(sfloat32 a);
+
+sfloat64 cvt_sf32_sf64(sfloat32 a, uint32_t *pfflags);
+sfloat32 cvt_sf64_sf32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+int32_t cvt_sf32_i32(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint32_t cvt_sf32_u32(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags);
+int64_t cvt_sf32_i64(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint64_t cvt_sf32_u64(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags);
+#ifdef HAVE_INT128
+int128_t cvt_sf32_i128(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint128_t cvt_sf32_u128(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags);
+#endif
+sfloat32 cvt_i32_sf32(int32_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 cvt_u32_sf32(uint32_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 cvt_i64_sf32(int64_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 cvt_u64_sf32(uint64_t a, RoundingModeEnum rm, uint32_t *pfflags);
+#ifdef HAVE_INT128
+sfloat32 cvt_i128_sf32(int128_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat32 cvt_u128_sf32(uint128_t a, RoundingModeEnum rm, uint32_t *pfflags);
+#endif
+
+/* 64 bit floats */
+
+#define FSIGN_MASK64 ((uint64_t)1 << 63)
+
+sfloat64 add_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 sub_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 mul_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 div_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 sqrt_sf64(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 fma_sf64(sfloat64 a, sfloat64 b, sfloat64 c, RoundingModeEnum rm, uint32_t *pfflags);
+
+sfloat64 min_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type);
+sfloat64 max_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type);
+int eq_quiet_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags);
+int le_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags);
+int lt_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags);
+uint32_t fclass_sf64(sfloat64 a);
+
+sfloat64 cvt_sf32_sf64(sfloat32 a, uint32_t *pfflags);
+sfloat32 cvt_sf64_sf32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+int32_t cvt_sf64_i32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint32_t cvt_sf64_u32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+int64_t cvt_sf64_i64(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint64_t cvt_sf64_u64(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+#ifdef HAVE_INT128
+int128_t cvt_sf64_i128(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint128_t cvt_sf64_u128(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags);
+#endif
+sfloat64 cvt_i32_sf64(int32_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 cvt_u32_sf64(uint32_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 cvt_i64_sf64(int64_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 cvt_u64_sf64(uint64_t a, RoundingModeEnum rm, uint32_t *pfflags);
+#ifdef HAVE_INT128
+sfloat64 cvt_i128_sf64(int128_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat64 cvt_u128_sf64(uint128_t a, RoundingModeEnum rm, uint32_t *pfflags);
+#endif
+
+/* 128 bit floats */
+
+#ifdef HAVE_INT128
+
+#define FSIGN_MASK128 ((uint128_t)1 << 127)
+
+sfloat128 add_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 sub_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 mul_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 div_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 sqrt_sf128(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 fma_sf128(sfloat128 a, sfloat128 b, sfloat128 c, RoundingModeEnum rm, uint32_t *pfflags);
+
+sfloat128 min_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type);
+sfloat128 max_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type);
+int eq_quiet_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags);
+int le_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags);
+int lt_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags);
+uint32_t fclass_sf128(sfloat128 a);
+
+sfloat128 cvt_sf32_sf128(sfloat32 a, uint32_t *pfflags);
+sfloat32 cvt_sf128_sf32(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 cvt_sf64_sf128(sfloat64 a, uint32_t *pfflags);
+sfloat64 cvt_sf128_sf64(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+
+int32_t cvt_sf128_i32(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint32_t cvt_sf128_u32(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+int64_t cvt_sf128_i64(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint64_t cvt_sf128_u64(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+int128_t cvt_sf128_i128(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+uint128_t cvt_sf128_u128(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 cvt_i32_sf128(int32_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 cvt_u32_sf128(uint32_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 cvt_i64_sf128(int64_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 cvt_u64_sf128(uint64_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 cvt_i128_sf128(int128_t a, RoundingModeEnum rm, uint32_t *pfflags);
+sfloat128 cvt_u128_sf128(uint128_t a, RoundingModeEnum rm, uint32_t *pfflags);
+
+#endif
+
+#endif /* SOFTFP_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template.h b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template.h
new file mode 100644
index 0000000..88dbf66
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template.h
@@ -0,0 +1,1129 @@
+/*
+ * SoftFP Library
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#if F_SIZE == 32
+#define F_UINT uint32_t
+#define F_ULONG uint64_t
+#define MANT_SIZE 23
+#define EXP_SIZE 8
+#elif F_SIZE == 64
+#define F_UHALF uint32_t
+#define F_UINT uint64_t
+#ifdef HAVE_INT128
+#define F_ULONG uint128_t
+#endif
+#define MANT_SIZE 52
+#define EXP_SIZE 11
+#elif F_SIZE == 128
+#define F_UHALF uint64_t
+#define F_UINT uint128_t
+#define MANT_SIZE 112
+#define EXP_SIZE 15
+#else
+#error unsupported F_SIZE
+#endif
+
+#define EXP_MASK ((1 << EXP_SIZE) - 1)
+#define MANT_MASK (((F_UINT)1 << MANT_SIZE) - 1)
+#define SIGN_MASK ((F_UINT)1 << (F_SIZE - 1))
+#define IMANT_SIZE (F_SIZE - 2) /* internal mantissa size */
+#define RND_SIZE (IMANT_SIZE - MANT_SIZE)
+#define QNAN_MASK ((F_UINT)1 << (MANT_SIZE - 1))
+
+/* quiet NaN */
+#define F_QNAN glue(F_QNAN, F_SIZE)
+#define clz glue(clz, F_SIZE)
+#define pack_sf glue(pack_sf, F_SIZE)
+#define unpack_sf glue(unpack_sf, F_SIZE)
+#define rshift_rnd glue(rshift_rnd, F_SIZE)
+#define round_pack_sf glue(roundpack_sf, F_SIZE)
+#define normalize_sf glue(normalize_sf, F_SIZE)
+#define normalize2_sf glue(normalize2_sf, F_SIZE)
+#define issignan_sf glue(issignan_sf, F_SIZE)
+#define isnan_sf glue(isnan_sf, F_SIZE)
+#define add_sf glue(add_sf, F_SIZE)
+#define mul_sf glue(mul_sf, F_SIZE)
+#define fma_sf glue(fma_sf, F_SIZE)
+#define div_sf glue(div_sf, F_SIZE)
+#define sqrt_sf glue(sqrt_sf, F_SIZE)
+#define normalize_subnormal_sf glue(normalize_subnormal_sf, F_SIZE)
+#define divrem_u glue(divrem_u, F_SIZE)
+#define sqrtrem_u glue(sqrtrem_u, F_SIZE)
+#define mul_u glue(mul_u, F_SIZE)
+#define cvt_sf32_sf glue(cvt_sf32_sf, F_SIZE)
+#define cvt_sf64_sf glue(cvt_sf64_sf, F_SIZE)
+
+static const F_UINT F_QNAN = (((F_UINT)EXP_MASK << MANT_SIZE) | ((F_UINT)1 << (MANT_SIZE - 1)));
+
+static inline F_UINT pack_sf(uint32_t a_sign, uint32_t a_exp, F_UINT a_mant)
+{
+ return ((F_UINT)a_sign << (F_SIZE - 1)) |
+ ((F_UINT)a_exp << MANT_SIZE) |
+ (a_mant & MANT_MASK);
+}
+
+static inline F_UINT unpack_sf(uint32_t *pa_sign, int32_t *pa_exp,
+ F_UINT a)
+{
+ *pa_sign = a >> (F_SIZE - 1);
+ *pa_exp = (a >> MANT_SIZE) & EXP_MASK;
+ return a & MANT_MASK;
+}
+
+static F_UINT rshift_rnd(F_UINT a, int d)
+{
+ F_UINT mask;
+ if (d != 0) {
+ if (d >= F_SIZE) {
+ a = (a != 0);
+ } else {
+ mask = ((F_UINT)1 << d) - 1;
+ a = (a >> d) | ((a & mask) != 0);
+ }
+ }
+ return a;
+}
+
+/* a_mant is considered to have its MSB at F_SIZE - 2 bits */
+static F_UINT round_pack_sf(uint32_t a_sign, int a_exp, F_UINT a_mant,
+ RoundingModeEnum rm, uint32_t *pfflags)
+{
+ int diff;
+ uint32_t addend, rnd_bits;
+
+ switch(rm) {
+ case RM_RNE:
+ case RM_RMM:
+ addend = (1 << (RND_SIZE - 1));
+ break;
+ case RM_RTZ:
+ addend = 0;
+ break;
+ default:
+ case RM_RDN:
+ case RM_RUP:
+ // printf("s=%d rm=%d m=%x\n", a_sign, rm, a_mant);
+ if (a_sign ^ (rm & 1))
+ addend = (1 << RND_SIZE) - 1;
+ else
+ addend = 0;
+ break;
+ }
+
+ /* potentially subnormal */
+ if (a_exp <= 0) {
+ BOOL is_subnormal;
+ /* Note: we set the underflow flag if the rounded result
+ is subnormal and inexact */
+ is_subnormal = (a_exp < 0 ||
+ (a_mant + addend) < ((F_UINT)1 << (F_SIZE - 1)));
+ diff = 1 - a_exp;
+ a_mant = rshift_rnd(a_mant, diff);
+ rnd_bits = a_mant & ((1 << RND_SIZE ) - 1);
+ if (is_subnormal && rnd_bits != 0) {
+ *pfflags |= FFLAG_UNDERFLOW;
+ }
+ a_exp = 1;
+ } else {
+ rnd_bits = a_mant & ((1 << RND_SIZE ) - 1);
+ }
+ if (rnd_bits != 0)
+ *pfflags |= FFLAG_INEXACT;
+ a_mant = (a_mant + addend) >> RND_SIZE;
+ /* half way: select even result */
+ if (rm == RM_RNE && rnd_bits == (1 << (RND_SIZE - 1)))
+ a_mant &= ~1;
+ /* Note the rounding adds at least 1, so this is the maximum
+ value */
+ a_exp += a_mant >> (MANT_SIZE + 1);
+ if (a_mant <= MANT_MASK) {
+ /* denormalized or zero */
+ a_exp = 0;
+ } else if (a_exp >= EXP_MASK) {
+ /* overflow */
+ if (addend == 0) {
+ a_exp = EXP_MASK - 1;
+ a_mant = MANT_MASK;
+ } else {
+ /* infinity */
+ a_exp = EXP_MASK;
+ a_mant = 0;
+ }
+ *pfflags |= FFLAG_OVERFLOW | FFLAG_INEXACT;
+ }
+ return pack_sf(a_sign, a_exp, a_mant);
+}
+
+/* a_mant is considered to have at most F_SIZE - 1 bits */
+static F_UINT normalize_sf(uint32_t a_sign, int a_exp, F_UINT a_mant,
+ RoundingModeEnum rm, uint32_t *pfflags)
+{
+ int shift;
+ shift = clz(a_mant) - (F_SIZE - 1 - IMANT_SIZE);
+ assert(shift >= 0);
+ a_exp -= shift;
+ a_mant <<= shift;
+ return round_pack_sf(a_sign, a_exp, a_mant, rm, pfflags);
+}
+
+/* same as normalize_sf() but with a double word mantissa. a_mant1 is
+ considered to have at most F_SIZE - 1 bits */
+static F_UINT normalize2_sf(uint32_t a_sign, int a_exp, F_UINT a_mant1, F_UINT a_mant0,
+ RoundingModeEnum rm, uint32_t *pfflags)
+{
+ int l, shift;
+ if (a_mant1 == 0) {
+ l = F_SIZE + clz(a_mant0);
+ } else {
+ l = clz(a_mant1);
+ }
+ shift = l - (F_SIZE - 1 - IMANT_SIZE);
+ assert(shift >= 0);
+ a_exp -= shift;
+ if (shift == 0) {
+ a_mant1 |= (a_mant0 != 0);
+ } else if (shift < F_SIZE) {
+ a_mant1 = (a_mant1 << shift) | (a_mant0 >> (F_SIZE - shift));
+ a_mant0 <<= shift;
+ a_mant1 |= (a_mant0 != 0);
+ } else {
+ a_mant1 = a_mant0 << (shift - F_SIZE);
+ }
+ return round_pack_sf(a_sign, a_exp, a_mant1, rm, pfflags);
+}
+
+BOOL issignan_sf(F_UINT a)
+{
+ uint32_t a_exp1;
+ F_UINT a_mant;
+ a_exp1 = (a >> (MANT_SIZE - 1)) & ((1 << (EXP_SIZE + 1)) - 1);
+ a_mant = a & MANT_MASK;
+ return (a_exp1 == (2 * EXP_MASK) && a_mant != 0);
+}
+
+BOOL isnan_sf(F_UINT a)
+{
+ uint32_t a_exp;
+ F_UINT a_mant;
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ a_mant = a & MANT_MASK;
+ return (a_exp == EXP_MASK && a_mant != 0);
+}
+
+
+F_UINT add_sf(F_UINT a, F_UINT b, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ uint32_t a_sign, b_sign, a_exp, b_exp;
+ F_UINT tmp, a_mant, b_mant;
+
+ /* swap so that abs(a) >= abs(b) */
+ if ((a & ~SIGN_MASK) < (b & ~SIGN_MASK)) {
+ tmp = a;
+ a = b;
+ b = tmp;
+ }
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ b_exp = (b >> MANT_SIZE) & EXP_MASK;
+ a_mant = (a & MANT_MASK) << 3;
+ b_mant = (b & MANT_MASK) << 3;
+ if (unlikely(a_exp == EXP_MASK)) {
+ if (a_mant != 0) {
+ /* NaN result */
+ if (!(a_mant & (QNAN_MASK << 3)) || issignan_sf(b))
+ *pfflags |= FFLAG_INVALID_OP;
+ return F_QNAN;
+ } else if (b_exp == EXP_MASK && a_sign != b_sign) {
+ *pfflags |= FFLAG_INVALID_OP;
+ return F_QNAN;
+ } else {
+ /* infinity */
+ return a;
+ }
+ }
+ if (a_exp == 0) {
+ a_exp = 1;
+ } else {
+ a_mant |= (F_UINT)1 << (MANT_SIZE + 3);
+ }
+ if (b_exp == 0) {
+ b_exp = 1;
+ } else {
+ b_mant |= (F_UINT)1 << (MANT_SIZE + 3);
+ }
+ b_mant = rshift_rnd(b_mant, a_exp - b_exp);
+ if (a_sign == b_sign) {
+ /* same signs : add the absolute values */
+ a_mant += b_mant;
+ } else {
+ /* different signs : subtract the absolute values */
+ a_mant -= b_mant;
+ if (a_mant == 0) {
+ /* zero result : the sign needs a specific handling */
+ a_sign = (rm == RM_RDN);
+ }
+ }
+ a_exp += (RND_SIZE - 3);
+ return normalize_sf(a_sign, a_exp, a_mant, rm, pfflags);
+}
+
+F_UINT glue(sub_sf, F_SIZE)(F_UINT a, F_UINT b, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ return add_sf(a, b ^ SIGN_MASK, rm, pfflags);
+}
+
+static inline F_UINT normalize_subnormal_sf(int32_t *pa_exp, F_UINT a_mant)
+{
+ int shift;
+ shift = MANT_SIZE - ((F_SIZE - 1 - clz(a_mant)));
+ *pa_exp = 1 - shift;
+ return a_mant << shift;
+}
+
+#ifdef F_ULONG
+
+static F_UINT mul_u(F_UINT *plow, F_UINT a, F_UINT b)
+{
+ F_ULONG r;
+ r = (F_ULONG)a * (F_ULONG)b;
+ *plow = r;
+ return r >> F_SIZE;
+}
+
+#else
+
+#define FH_SIZE (F_SIZE / 2)
+
+static F_UINT mul_u(F_UINT *plow, F_UINT a, F_UINT b)
+{
+ F_UHALF a0, a1, b0, b1, r0, r1, r2, r3;
+ F_UINT r00, r01, r10, r11, c;
+ a0 = a;
+ a1 = a >> FH_SIZE;
+ b0 = b;
+ b1 = b >> FH_SIZE;
+
+ r00 = (F_UINT)a0 * (F_UINT)b0;
+ r01 = (F_UINT)a0 * (F_UINT)b1;
+ r10 = (F_UINT)a1 * (F_UINT)b0;
+ r11 = (F_UINT)a1 * (F_UINT)b1;
+
+ r0 = r00;
+ c = (r00 >> FH_SIZE) + (F_UHALF)r01 + (F_UHALF)r10;
+ r1 = c;
+ c = (c >> FH_SIZE) + (r01 >> FH_SIZE) + (r10 >> FH_SIZE) + (F_UHALF)r11;
+ r2 = c;
+ r3 = (c >> FH_SIZE) + (r11 >> FH_SIZE);
+
+ *plow = ((F_UINT)r1 << FH_SIZE) | r0;
+ return ((F_UINT)r3 << FH_SIZE) | r2;
+}
+
+#undef FH_SIZE
+
+#endif
+
+F_UINT mul_sf(F_UINT a, F_UINT b, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ uint32_t a_sign, b_sign, r_sign;
+ int32_t a_exp, b_exp, r_exp;
+ F_UINT a_mant, b_mant, r_mant, r_mant_low;
+
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+ r_sign = a_sign ^ b_sign;
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ b_exp = (b >> MANT_SIZE) & EXP_MASK;
+ a_mant = a & MANT_MASK;
+ b_mant = b & MANT_MASK;
+ if (a_exp == EXP_MASK || b_exp == EXP_MASK) {
+ if (isnan_sf(a) || isnan_sf(b)) {
+ if (issignan_sf(a) || issignan_sf(b)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN;
+ } else {
+ /* infinity */
+ if ((a_exp == EXP_MASK && (b_exp == 0 && b_mant == 0)) ||
+ (b_exp == EXP_MASK && (a_exp == 0 && a_mant == 0))) {
+ *pfflags |= FFLAG_INVALID_OP;
+ return F_QNAN;
+ } else {
+ return pack_sf(r_sign, EXP_MASK, 0);
+ }
+ }
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ return pack_sf(r_sign, 0, 0); /* zero */
+ a_mant = normalize_subnormal_sf(&a_exp, a_mant);
+ } else {
+ a_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ if (b_exp == 0) {
+ if (b_mant == 0)
+ return pack_sf(r_sign, 0, 0); /* zero */
+ b_mant = normalize_subnormal_sf(&b_exp, b_mant);
+ } else {
+ b_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ r_exp = a_exp + b_exp - (1 << (EXP_SIZE - 1)) + 2;
+
+ r_mant = mul_u(&r_mant_low,a_mant << RND_SIZE, b_mant << (RND_SIZE + 1));
+ r_mant |= (r_mant_low != 0);
+ return normalize_sf(r_sign, r_exp, r_mant, rm, pfflags);
+}
+
+/* fused multiply and add */
+F_UINT fma_sf(F_UINT a, F_UINT b, F_UINT c, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ uint32_t a_sign, b_sign, c_sign, r_sign;
+ int32_t a_exp, b_exp, c_exp, r_exp, shift;
+ F_UINT a_mant, b_mant, c_mant, r_mant1, r_mant0, c_mant1, c_mant0, mask;
+
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+ c_sign = c >> (F_SIZE - 1);
+ r_sign = a_sign ^ b_sign;
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ b_exp = (b >> MANT_SIZE) & EXP_MASK;
+ c_exp = (c >> MANT_SIZE) & EXP_MASK;
+ a_mant = a & MANT_MASK;
+ b_mant = b & MANT_MASK;
+ c_mant = c & MANT_MASK;
+ if (a_exp == EXP_MASK || b_exp == EXP_MASK || c_exp == EXP_MASK) {
+ if (isnan_sf(a) || isnan_sf(b) || isnan_sf(c)) {
+ if (issignan_sf(a) || issignan_sf(b) || issignan_sf(c)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN;
+ } else {
+ /* infinities */
+ if ((a_exp == EXP_MASK && (b_exp == 0 && b_mant == 0)) ||
+ (b_exp == EXP_MASK && (a_exp == 0 && a_mant == 0)) ||
+ ((a_exp == EXP_MASK || b_exp == EXP_MASK) &&
+ (c_exp == EXP_MASK && r_sign != c_sign))) {
+ *pfflags |= FFLAG_INVALID_OP;
+ return F_QNAN;
+ } else if (c_exp == EXP_MASK) {
+ return pack_sf(c_sign, EXP_MASK, 0);
+ } else {
+ return pack_sf(r_sign, EXP_MASK, 0);
+ }
+ }
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ goto mul_zero;
+ a_mant = normalize_subnormal_sf(&a_exp, a_mant);
+ } else {
+ a_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ if (b_exp == 0) {
+ if (b_mant == 0) {
+ mul_zero:
+ if (c_exp == 0 && c_mant == 0) {
+ if (c_sign != r_sign)
+ r_sign = (rm == RM_RDN);
+ return pack_sf(r_sign, 0, 0);
+ } else {
+ return c;
+ }
+ }
+ b_mant = normalize_subnormal_sf(&b_exp, b_mant);
+ } else {
+ b_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ /* multiply */
+ r_exp = a_exp + b_exp - (1 << (EXP_SIZE - 1)) + 3;
+
+ r_mant1 = mul_u(&r_mant0, a_mant << RND_SIZE, b_mant << RND_SIZE);
+ /* normalize to F_SIZE - 3 */
+ if (r_mant1 < ((F_UINT)1 << (F_SIZE - 3))) {
+ r_mant1 = (r_mant1 << 1) | (r_mant0 >> (F_SIZE - 1));
+ r_mant0 <<= 1;
+ r_exp--;
+ }
+
+ /* add */
+ if (c_exp == 0) {
+ if (c_mant == 0) {
+ /* add zero */
+ r_mant1 |= (r_mant0 != 0);
+ return normalize_sf(r_sign, r_exp, r_mant1, rm, pfflags);
+ }
+ c_mant = normalize_subnormal_sf(&c_exp, c_mant);
+ } else {
+ c_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ c_exp++;
+ c_mant1 = c_mant << (RND_SIZE - 1);
+ c_mant0 = 0;
+
+ // printf("r_s=%d r_exp=%d r_mant=%08x %08x\n", r_sign, r_exp, (uint32_t)r_mant1, (uint32_t)r_mant0);
+ // printf("c_s=%d c_exp=%d c_mant=%08x %08x\n", c_sign, c_exp, (uint32_t)c_mant1, (uint32_t)c_mant0);
+
+ /* ensure that abs(r) >= abs(c) */
+ if (!(r_exp > c_exp || (r_exp == c_exp && r_mant1 >= c_mant1))) {
+ F_UINT tmp;
+ int32_t c_tmp;
+ /* swap */
+ tmp = r_mant1; r_mant1 = c_mant1; c_mant1 = tmp;
+ tmp = r_mant0; r_mant0 = c_mant0; c_mant0 = tmp;
+ c_tmp = r_exp; r_exp = c_exp; c_exp = c_tmp;
+ c_tmp = r_sign; r_sign = c_sign; c_sign = c_tmp;
+ }
+ /* right shift c_mant */
+ shift = r_exp - c_exp;
+ if (shift >= 2 * F_SIZE) {
+ c_mant0 = (c_mant0 | c_mant1) != 0;
+ c_mant1 = 0;
+ } else if (shift >= F_SIZE + 1) {
+ c_mant0 = rshift_rnd(c_mant1, shift - F_SIZE);
+ c_mant1 = 0;
+ } else if (shift == F_SIZE) {
+ c_mant0 = c_mant1 | (c_mant0 != 0);
+ c_mant1 = 0;
+ } else if (shift != 0) {
+ mask = ((F_UINT)1 << shift) - 1;
+ c_mant0 = (c_mant1 << (F_SIZE - shift)) | (c_mant0 >> shift) | ((c_mant0 & mask) != 0);
+ c_mant1 = c_mant1 >> shift;
+ }
+ // printf(" r_mant=%08x %08x\n", (uint32_t)r_mant1, (uint32_t)r_mant0);
+ // printf(" c_mant=%08x %08x\n", (uint32_t)c_mant1, (uint32_t)c_mant0);
+ /* add or subtract */
+ if (r_sign == c_sign) {
+ r_mant0 += c_mant0;
+ r_mant1 += c_mant1 + (r_mant0 < c_mant0);
+ } else {
+ F_UINT tmp;
+ tmp = r_mant0;
+ r_mant0 -= c_mant0;
+ r_mant1 = r_mant1 - c_mant1 - (r_mant0 > tmp);
+ if ((r_mant0 | r_mant1) == 0) {
+ /* zero result : the sign needs a specific handling */
+ r_sign = (rm == RM_RDN);
+ }
+ }
+#if 0
+ // printf(" r1_mant=%08x %08x\n", (uint32_t)r_mant1, (uint32_t)r_mant0);
+ /* normalize */
+ if (r_mant1 == 0) {
+ r_mant1 = r_mant0;
+ r_exp -= F_SIZE;
+ } else {
+ shift = clz(r_mant1) - (F_SIZE - 1 - IMANT_SIZE);
+ if (shift != 0) {
+ r_mant1 = (r_mant1 << shift) | (r_mant0 >> (F_SIZE - shift));
+ r_mant0 <<= shift;
+ r_exp -= shift;
+ }
+ r_mant1 |= (r_mant0 != 0);
+ }
+ return normalize_sf(r_sign, r_exp, r_mant1, rm, pfflags);
+#else
+ return normalize2_sf(r_sign, r_exp, r_mant1, r_mant0, rm, pfflags);
+#endif
+}
+
+#ifdef F_ULONG
+
+static F_UINT divrem_u(F_UINT *pr, F_UINT ah, F_UINT al, F_UINT b)
+{
+ F_ULONG a;
+ a = ((F_ULONG)ah << F_SIZE) | al;
+ *pr = a % b;
+ return a / b;
+}
+
+#else
+
+/* XXX: optimize */
+static F_UINT divrem_u(F_UINT *pr, F_UINT a1, F_UINT a0, F_UINT b)
+{
+ int i, qb, ab;
+
+ assert(a1 < b);
+ for(i = 0; i < F_SIZE; i++) {
+ ab = a1 >> (F_SIZE - 1);
+ a1 = (a1 << 1) | (a0 >> (F_SIZE - 1));
+ if (ab || a1 >= b) {
+ a1 -= b;
+ qb = 1;
+ } else {
+ qb = 0;
+ }
+ a0 = (a0 << 1) | qb;
+ }
+ *pr = a1;
+ return a0;
+}
+
+#endif
+
+F_UINT div_sf(F_UINT a, F_UINT b, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ uint32_t a_sign, b_sign, r_sign;
+ int32_t a_exp, b_exp, r_exp;
+ F_UINT a_mant, b_mant, r_mant, r;
+
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+ r_sign = a_sign ^ b_sign;
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ b_exp = (b >> MANT_SIZE) & EXP_MASK;
+ a_mant = a & MANT_MASK;
+ b_mant = b & MANT_MASK;
+ if (a_exp == EXP_MASK) {
+ if (a_mant != 0 || isnan_sf(b)) {
+ if (issignan_sf(a) || issignan_sf(b)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN;
+ } else if (b_exp == EXP_MASK) {
+ *pfflags |= FFLAG_INVALID_OP;
+ return F_QNAN;
+ } else {
+ return pack_sf(r_sign, EXP_MASK, 0);
+ }
+ } else if (b_exp == EXP_MASK) {
+ if (b_mant != 0) {
+ if (issignan_sf(a) || issignan_sf(b)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN;
+ } else {
+ return pack_sf(r_sign, 0, 0);
+ }
+ }
+
+ if (b_exp == 0) {
+ if (b_mant == 0) {
+ /* zero */
+ if (a_exp == 0 && a_mant == 0) {
+ *pfflags |= FFLAG_INVALID_OP;
+ return F_QNAN;
+ } else {
+ *pfflags |= FFLAG_DIVIDE_ZERO;
+ return pack_sf(r_sign, EXP_MASK, 0);
+ }
+ }
+ b_mant = normalize_subnormal_sf(&b_exp, b_mant);
+ } else {
+ b_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ return pack_sf(r_sign, 0, 0); /* zero */
+ a_mant = normalize_subnormal_sf(&a_exp, a_mant);
+ } else {
+ a_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ r_exp = a_exp - b_exp + (1 << (EXP_SIZE - 1)) - 1;
+ r_mant = divrem_u(&r, a_mant, 0, b_mant << 2);
+ if (r != 0)
+ r_mant |= 1;
+ return normalize_sf(r_sign, r_exp, r_mant, rm, pfflags);
+}
+
+#ifdef F_ULONG
+
+/* compute sqrt(a) with a = ah*2^F_SIZE+al and a < 2^(F_SIZE - 2)
+ return true if not exact square. */
+static int sqrtrem_u(F_UINT *pr, F_UINT ah, F_UINT al)
+{
+ F_ULONG a, u, s;
+ int l, inexact;
+
+ /* 2^l >= a */
+ if (ah != 0) {
+ l = 2 * F_SIZE - clz(ah - 1);
+ } else {
+ if (al == 0) {
+ *pr = 0;
+ return 0;
+ }
+ l = F_SIZE - clz(al - 1);
+ }
+ a = ((F_ULONG)ah << F_SIZE) | al;
+ u = (F_ULONG)1 << ((l + 1) / 2);
+ for(;;) {
+ s = u;
+ u = ((a / s) + s) / 2;
+ if (u >= s)
+ break;
+ }
+ inexact = (a - s * s) != 0;
+ *pr = s;
+ return inexact;
+}
+
+#else
+
+static int sqrtrem_u(F_UINT *pr, F_UINT a1, F_UINT a0)
+{
+ int l, inexact;
+ F_UINT u, s, r, q, sq0, sq1;
+
+ /* 2^l >= a */
+ if (a1 != 0) {
+ l = 2 * F_SIZE - clz(a1 - 1);
+ } else {
+ if (a0 == 0) {
+ *pr = 0;
+ return 0;
+ }
+ l = F_SIZE - clz(a0 - 1);
+ }
+ u = (F_UINT)1 << ((l + 1) / 2);
+ for(;;) {
+ s = u;
+ q = divrem_u(&r, a1, a0, s);
+ u = (q + s) / 2;
+ if (u >= s)
+ break;
+ }
+ sq1 = mul_u(&sq0, s, s);
+ inexact = (sq0 != a0 || sq1 != a1);
+ *pr = s;
+ return inexact;
+}
+
+#endif
+
+F_UINT sqrt_sf(F_UINT a, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ uint32_t a_sign;
+ int32_t a_exp;
+ F_UINT a_mant;
+
+ a_sign = a >> (F_SIZE - 1);
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ a_mant = a & MANT_MASK;
+ if (a_exp == EXP_MASK) {
+ if (a_mant != 0) {
+ if (issignan_sf(a)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN;
+ } else if (a_sign) {
+ goto neg_error;
+ } else {
+ return a; /* +infinity */
+ }
+ }
+ if (a_sign) {
+ if (a_exp == 0 && a_mant == 0)
+ return a; /* -zero */
+ neg_error:
+ *pfflags |= FFLAG_INVALID_OP;
+ return F_QNAN;
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ return pack_sf(0, 0, 0); /* zero */
+ a_mant = normalize_subnormal_sf(&a_exp, a_mant);
+ } else {
+ a_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ a_exp -= EXP_MASK / 2;
+ /* simpler to handle an even exponent */
+ if (a_exp & 1) {
+ a_exp--;
+ a_mant <<= 1;
+ }
+ a_exp = (a_exp >> 1) + EXP_MASK / 2;
+ a_mant <<= (F_SIZE - 4 - MANT_SIZE);
+ if (sqrtrem_u(&a_mant, a_mant, 0))
+ a_mant |= 1;
+ return normalize_sf(a_sign, a_exp, a_mant, rm, pfflags);
+}
+
+/* comparisons */
+
+static F_UINT glue(min_max_nan_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type)
+{
+ if (issignan_sf(a) || issignan_sf(b)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ if (minmax_type == FMINMAX_IEEE754_2008)
+ return F_QNAN;
+ }
+ if (minmax_type == FMINMAX_PROP) {
+ return F_QNAN;
+ } else {
+ if (isnan_sf(a)) {
+ if (isnan_sf(b))
+ return F_QNAN;
+ else
+ return b;
+ } else {
+ return a;
+ }
+ }
+}
+
+F_UINT glue(min_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags,
+ SoftFPMinMaxTypeEnum minmax_type)
+{
+ uint32_t a_sign, b_sign;
+
+ if (isnan_sf(a) || isnan_sf(b)) {
+ return glue(min_max_nan_sf, F_SIZE)(a, b, pfflags, minmax_type);
+ }
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+
+ if (a_sign != b_sign) {
+ if (a_sign)
+ return a;
+ else
+ return b;
+ } else {
+ if ((a < b) ^ a_sign)
+ return a;
+ else
+ return b;
+ }
+}
+
+F_UINT glue(max_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags,
+ SoftFPMinMaxTypeEnum minmax_type)
+{
+ uint32_t a_sign, b_sign;
+
+ if (isnan_sf(a) || isnan_sf(b)) {
+ return glue(min_max_nan_sf, F_SIZE)(a, b, pfflags, minmax_type);
+ }
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+
+ if (a_sign != b_sign) {
+ if (a_sign)
+ return b;
+ else
+ return a;
+ } else {
+ if ((a < b) ^ a_sign)
+ return b;
+ else
+ return a;
+ }
+}
+
+int glue(eq_quiet_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags)
+{
+ if (isnan_sf(a) || isnan_sf(b)) {
+ if (issignan_sf(a) || issignan_sf(b)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return 0;
+ }
+
+ if ((F_UINT)((a | b) << 1) == 0)
+ return 1; /* zero case */
+ return (a == b);
+}
+
+int glue(le_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags)
+{
+ uint32_t a_sign, b_sign;
+
+ if (isnan_sf(a) || isnan_sf(b)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ return 0;
+ }
+
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+ if (a_sign != b_sign) {
+ return (a_sign || ((F_UINT)((a | b) << 1) == 0));
+ } else {
+ if (a_sign) {
+ return (a >= b);
+ } else {
+ return (a <= b);
+ }
+ }
+}
+
+int glue(lt_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags)
+{
+ uint32_t a_sign, b_sign;
+
+ if (isnan_sf(a) || isnan_sf(b)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ return 0;
+ }
+
+ a_sign = a >> (F_SIZE - 1);
+ b_sign = b >> (F_SIZE - 1);
+ if (a_sign != b_sign) {
+ return (a_sign && ((F_UINT)((a | b) << 1) != 0));
+ } else {
+ if (a_sign) {
+ return (a > b);
+ } else {
+ return (a < b);
+ }
+ }
+}
+
+uint32_t glue(fclass_sf, F_SIZE)(F_UINT a)
+{
+ uint32_t a_sign;
+ int32_t a_exp;
+ F_UINT a_mant;
+ uint32_t ret;
+
+ a_sign = a >> (F_SIZE - 1);
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ a_mant = a & MANT_MASK;
+ if (a_exp == EXP_MASK) {
+ if (a_mant != 0) {
+ if (a_mant & QNAN_MASK)
+ ret = FCLASS_QNAN;
+ else
+ ret = FCLASS_SNAN;
+ } else {
+ if (a_sign)
+ ret = FCLASS_NINF;
+ else
+ ret = FCLASS_PINF;
+ }
+ } else if (a_exp == 0) {
+ if (a_mant == 0) {
+ if (a_sign)
+ ret = FCLASS_NZERO;
+ else
+ ret = FCLASS_PZERO;
+ } else {
+ if (a_sign)
+ ret = FCLASS_NSUBNORMAL;
+ else
+ ret = FCLASS_PSUBNORMAL;
+ }
+ } else {
+ if (a_sign)
+ ret = FCLASS_NNORMAL;
+ else
+ ret = FCLASS_PNORMAL;
+ }
+ return ret;
+}
+
+/* conversions between floats */
+
+#if F_SIZE >= 64
+
+F_UINT cvt_sf32_sf(uint32_t a, uint32_t *pfflags)
+{
+ uint32_t a_sign;
+ int32_t a_exp;
+ F_UINT a_mant;
+
+ a_mant = unpack_sf32(&a_sign, &a_exp, a);
+ if (a_exp == 0xff) {
+ if (a_mant != 0) {
+ /* NaN */
+ if (issignan_sf32(a)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN;
+ } else {
+ /* infinity */
+ return pack_sf(a_sign, EXP_MASK, 0);
+ }
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ return pack_sf(a_sign, 0, 0); /* zero */
+ a_mant = normalize_subnormal_sf32(&a_exp, a_mant);
+ }
+ /* convert the exponent value */
+ a_exp = a_exp - 0x7f + (EXP_MASK / 2);
+ /* shift the mantissa */
+ a_mant <<= (MANT_SIZE - 23);
+ /* We assume the target float is large enough to that no
+ normalization is necessary */
+ return pack_sf(a_sign, a_exp, a_mant);
+}
+
+uint32_t glue(glue(cvt_sf, F_SIZE), _sf32)(F_UINT a, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ uint32_t a_sign;
+ int32_t a_exp;
+ F_UINT a_mant;
+
+ a_mant = unpack_sf(&a_sign, &a_exp, a);
+ if (a_exp == EXP_MASK) {
+ if (a_mant != 0) {
+ /* NaN */
+ if (issignan_sf(a)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN32;
+ } else {
+ /* infinity */
+ return pack_sf32(a_sign, 0xff, 0);
+ }
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ return pack_sf32(a_sign, 0, 0); /* zero */
+ normalize_subnormal_sf(&a_exp, a_mant);
+ } else {
+ a_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ /* convert the exponent value */
+ a_exp = a_exp - (EXP_MASK / 2) + 0x7f;
+ /* shift the mantissa */
+ a_mant = rshift_rnd(a_mant, MANT_SIZE - (32 - 2));
+ return normalize_sf32(a_sign, a_exp, a_mant, rm, pfflags);
+}
+
+#endif
+
+#if F_SIZE >= 128
+
+F_UINT cvt_sf64_sf(uint64_t a, uint32_t *pfflags)
+{
+ uint32_t a_sign;
+ int32_t a_exp;
+ F_UINT a_mant;
+
+ a_mant = unpack_sf64(&a_sign, &a_exp, a);
+
+ if (a_exp == 0x7ff) {
+ if (a_mant != 0) {
+ /* NaN */
+ if (issignan_sf64(a)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN;
+ } else {
+ /* infinity */
+ return pack_sf(a_sign, EXP_MASK, 0);
+ }
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ return pack_sf(a_sign, 0, 0); /* zero */
+ a_mant = normalize_subnormal_sf64(&a_exp, a_mant);
+ }
+ /* convert the exponent value */
+ a_exp = a_exp - 0x3ff + (EXP_MASK / 2);
+ /* shift the mantissa */
+ a_mant <<= (MANT_SIZE - 52);
+ return pack_sf(a_sign, a_exp, a_mant);
+}
+
+uint64_t glue(glue(cvt_sf, F_SIZE), _sf64)(F_UINT a, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ uint32_t a_sign;
+ int32_t a_exp;
+ F_UINT a_mant;
+
+ a_mant = unpack_sf(&a_sign, &a_exp, a);
+ if (a_exp == EXP_MASK) {
+ if (a_mant != 0) {
+ /* NaN */
+ if (issignan_sf(a)) {
+ *pfflags |= FFLAG_INVALID_OP;
+ }
+ return F_QNAN64;
+ } else {
+ /* infinity */
+ return pack_sf64(a_sign, 0x7ff, 0);
+ }
+ }
+ if (a_exp == 0) {
+ if (a_mant == 0)
+ return pack_sf64(a_sign, 0, 0); /* zero */
+ normalize_subnormal_sf(&a_exp, a_mant);
+ } else {
+ a_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ /* convert the exponent value */
+ a_exp = a_exp - (EXP_MASK / 2) + 0x3ff;
+ /* shift the mantissa */
+ a_mant = rshift_rnd(a_mant, MANT_SIZE - (64 - 2));
+ return normalize_sf64(a_sign, a_exp, a_mant, rm, pfflags);
+}
+
+#endif
+
+#undef clz
+
+#define ICVT_SIZE 32
+#include "softfp_template_icvt.h"
+
+#define ICVT_SIZE 64
+#include "softfp_template_icvt.h"
+
+#ifdef HAVE_INT128
+#define ICVT_SIZE 128
+#include "softfp_template_icvt.h"
+#endif
+
+#undef F_SIZE
+#undef F_UINT
+#undef F_ULONG
+#undef F_UHALF
+#undef MANT_SIZE
+#undef EXP_SIZE
+#undef EXP_MASK
+#undef MANT_MASK
+#undef SIGN_MASK
+#undef IMANT_SIZE
+#undef RND_SIZE
+#undef QNAN_MASK
+#undef F_QNAN
+
+#undef pack_sf
+#undef unpack_sf
+#undef rshift_rnd
+#undef round_pack_sf
+#undef normalize_sf
+#undef normalize2_sf
+#undef issignan_sf
+#undef isnan_sf
+#undef add_sf
+#undef mul_sf
+#undef fma_sf
+#undef div_sf
+#undef sqrt_sf
+#undef normalize_subnormal_sf
+#undef divrem_u
+#undef sqrtrem_u
+#undef mul_u
+#undef cvt_sf32_sf
+#undef cvt_sf64_sf
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template_icvt.h b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template_icvt.h
new file mode 100644
index 0000000..9360ac1
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template_icvt.h
@@ -0,0 +1,171 @@
+/*
+ * SoftFP Library
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#if ICVT_SIZE == 32
+#define ICVT_UINT uint32_t
+#define ICVT_INT int32_t
+#elif ICVT_SIZE == 64
+#define ICVT_UINT uint64_t
+#define ICVT_INT int64_t
+#elif ICVT_SIZE == 128
+#define ICVT_UINT uint128_t
+#define ICVT_INT int128_t
+#else
+#error unsupported icvt
+#endif
+
+/* conversions between float and integers */
+static ICVT_INT glue(glue(glue(internal_cvt_sf, F_SIZE), _i), ICVT_SIZE)(F_UINT a, RoundingModeEnum rm,
+ uint32_t *pfflags, BOOL is_unsigned)
+{
+ uint32_t a_sign, addend, rnd_bits;
+ int32_t a_exp;
+ F_UINT a_mant;
+ ICVT_UINT r, r_max;
+
+ a_sign = a >> (F_SIZE - 1);
+ a_exp = (a >> MANT_SIZE) & EXP_MASK;
+ a_mant = a & MANT_MASK;
+ if (a_exp == EXP_MASK && a_mant != 0)
+ a_sign = 0; /* NaN is like +infinity */
+ if (a_exp == 0) {
+ a_exp = 1;
+ } else {
+ a_mant |= (F_UINT)1 << MANT_SIZE;
+ }
+ a_mant <<= RND_SIZE;
+ a_exp = a_exp - (EXP_MASK / 2) - MANT_SIZE;
+
+ if (is_unsigned)
+ r_max = (ICVT_UINT)a_sign - 1;
+ else
+ r_max = ((ICVT_UINT)1 << (ICVT_SIZE - 1)) - (ICVT_UINT)(a_sign ^ 1);
+ if (a_exp >= 0) {
+ if (a_exp <= (ICVT_SIZE - 1 - MANT_SIZE)) {
+ r = (ICVT_UINT)(a_mant >> RND_SIZE) << a_exp;
+ if (r > r_max)
+ goto overflow;
+ } else {
+ overflow:
+ *pfflags |= FFLAG_INVALID_OP;
+ return r_max;
+ }
+ } else {
+ a_mant = rshift_rnd(a_mant, -a_exp);
+
+ switch(rm) {
+ case RM_RNE:
+ case RM_RMM:
+ addend = (1 << (RND_SIZE - 1));
+ break;
+ case RM_RTZ:
+ addend = 0;
+ break;
+ default:
+ case RM_RDN:
+ case RM_RUP:
+ if (a_sign ^ (rm & 1))
+ addend = (1 << RND_SIZE) - 1;
+ else
+ addend = 0;
+ break;
+ }
+
+ rnd_bits = a_mant & ((1 << RND_SIZE ) - 1);
+ a_mant = (a_mant + addend) >> RND_SIZE;
+ /* half way: select even result */
+ if (rm == RM_RNE && rnd_bits == (1 << (RND_SIZE - 1)))
+ a_mant &= ~1;
+ if (a_mant > r_max)
+ goto overflow;
+ r = a_mant;
+ if (rnd_bits != 0)
+ *pfflags |= FFLAG_INEXACT;
+ }
+ if (a_sign)
+ r = -r;
+ return r;
+}
+
+ICVT_INT glue(glue(glue(cvt_sf, F_SIZE), _i), ICVT_SIZE)(F_UINT a, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ return glue(glue(glue(internal_cvt_sf, F_SIZE), _i), ICVT_SIZE)(a, rm,
+ pfflags, FALSE);
+}
+
+ICVT_UINT glue(glue(glue(cvt_sf, F_SIZE), _u), ICVT_SIZE)(F_UINT a, RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ return glue(glue(glue(internal_cvt_sf, F_SIZE), _i), ICVT_SIZE) (a, rm,
+ pfflags, TRUE);
+}
+
+/* conversions between float and integers */
+static F_UINT glue(glue(glue(internal_cvt_i, ICVT_SIZE), _sf), F_SIZE)(ICVT_INT a,
+ RoundingModeEnum rm,
+ uint32_t *pfflags,
+ BOOL is_unsigned)
+{
+ uint32_t a_sign;
+ int32_t a_exp;
+ F_UINT a_mant;
+ ICVT_UINT r, mask;
+ int l;
+
+ if (!is_unsigned && a < 0) {
+ a_sign = 1;
+ r = -(ICVT_UINT)a;
+ } else {
+ a_sign = 0;
+ r = a;
+ }
+ a_exp = (EXP_MASK / 2) + F_SIZE - 2;
+ /* need to reduce range before generic float normalization */
+ l = ICVT_SIZE - glue(clz, ICVT_SIZE)(r) - (F_SIZE - 1);
+ if (l > 0) {
+ mask = r & (((ICVT_UINT)1 << l) - 1);
+ r = (r >> l) | ((r & mask) != 0);
+ a_exp += l;
+ }
+ a_mant = r;
+ return normalize_sf(a_sign, a_exp, a_mant, rm, pfflags);
+}
+
+F_UINT glue(glue(glue(cvt_i, ICVT_SIZE), _sf), F_SIZE)(ICVT_INT a,
+ RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ return glue(glue(glue(internal_cvt_i, ICVT_SIZE), _sf), F_SIZE)(a, rm, pfflags, FALSE);
+}
+
+F_UINT glue(glue(glue(cvt_u, ICVT_SIZE), _sf), F_SIZE)(ICVT_UINT a,
+ RoundingModeEnum rm,
+ uint32_t *pfflags)
+{
+ return glue(glue(glue(internal_cvt_i, ICVT_SIZE), _sf), F_SIZE)(a, rm, pfflags, TRUE);
+}
+
+#undef ICVT_SIZE
+#undef ICVT_INT
+#undef ICVT_UINT
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg
new file mode 100755
index 0000000..8c2f617
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg
Binary files differ
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.c b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.c
new file mode 100644
index 0000000..3271290
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.c
@@ -0,0 +1,102 @@
+/*
+ * Disk image splitter
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <string.h>
+#include <ctype.h>
+#include <getopt.h>
+
+int main(int argc, char **argv)
+{
+ int blocksize, ret, i;
+ const char *infilename, *outpath;
+ FILE *f, *fo;
+ char buf1[1024];
+ uint8_t *buf;
+
+ if ((optind + 1) >= argc) {
+ printf("splitimg version " CONFIG_VERSION ", Copyright (c) 2011-2016 Fabrice Bellard\n"
+ "usage: splitimg infile outpath [blocksize]\n"
+ "Create a multi-file disk image for the RISCVEMU HTTP block device\n"
+ "\n"
+ "outpath must be a directory\n"
+ "blocksize is the block size in KB\n");
+ exit(1);
+ }
+
+ infilename = argv[optind++];
+ outpath = argv[optind++];
+ blocksize = 256;
+ if (optind < argc)
+ blocksize = strtol(argv[optind++], NULL, 0);
+
+ blocksize *= 1024;
+
+ buf = malloc(blocksize);
+
+ f = fopen(infilename, "rb");
+ if (!f) {
+ perror(infilename);
+ exit(1);
+ }
+ i = 0;
+ for(;;) {
+ ret = fread(buf, 1, blocksize, f);
+ if (ret < 0) {
+ perror("fread");
+ exit(1);
+ }
+ if (ret == 0)
+ break;
+ if (ret < blocksize) {
+ printf("warning: last block is not full\n");
+ memset(buf + ret, 0, blocksize - ret);
+ }
+ snprintf(buf1, sizeof(buf1), "%s/blk%09u.bin", outpath, i);
+ fo = fopen(buf1, "wb");
+ if (!fo) {
+ perror(buf1);
+ exit(1);
+ }
+ fwrite(buf, 1, blocksize, fo);
+ fclose(fo);
+ i++;
+ }
+ fclose(f);
+ printf("%d blocks\n", i);
+
+ snprintf(buf1, sizeof(buf1), "%s/blk.txt", outpath);
+ fo = fopen(buf1, "wb");
+ if (!fo) {
+ perror(buf1);
+ exit(1);
+ }
+ fprintf(fo, "{\n");
+ fprintf(fo, " block_size: %d,\n", blocksize / 1024);
+ fprintf(fo, " n_block: %d,\n", i);
+ fprintf(fo, "}\n");
+ fclose(fo);
+ return 0;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.d b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.d
new file mode 100644
index 0000000..dddfe8d
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.d
@@ -0,0 +1 @@
+splitimg.o: splitimg.c
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.o b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.o
new file mode 100644
index 0000000..5b15ee4
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.o
Binary files differ
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/temu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/temu.c
new file mode 100644
index 0000000..7c07f3b
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/temu.c
@@ -0,0 +1,835 @@
+/*
+ * TinyEMU
+ *
+ * Copyright (c) 2016-2018 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+#include <getopt.h>
+#ifndef _WIN32
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <linux/if_tun.h>
+#endif
+#include <sys/stat.h>
+#include <signal.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "virtio.h"
+#include "machine.h"
+#ifdef CONFIG_FS_NET
+#include "fs_utils.h"
+#include "fs_wget.h"
+#endif
+#ifdef CONFIG_SLIRP
+#include "slirp/libslirp.h"
+#endif
+
+#ifndef _WIN32
+
+typedef struct {
+ int stdin_fd;
+ int console_esc_state;
+ BOOL resize_pending;
+} STDIODevice;
+
+static struct termios oldtty;
+static int old_fd0_flags;
+static STDIODevice *global_stdio_device;
+
+static void term_exit(void)
+{
+ tcsetattr (0, TCSANOW, &oldtty);
+ fcntl(0, F_SETFL, old_fd0_flags);
+}
+
+static void term_init(BOOL allow_ctrlc)
+{
+ struct termios tty;
+
+ memset(&tty, 0, sizeof(tty));
+ tcgetattr (0, &tty);
+ oldtty = tty;
+ old_fd0_flags = fcntl(0, F_GETFL);
+
+ tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
+ |INLCR|IGNCR|ICRNL|IXON);
+ tty.c_oflag |= OPOST;
+ tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
+ if (!allow_ctrlc)
+ tty.c_lflag &= ~ISIG;
+ tty.c_cflag &= ~(CSIZE|PARENB);
+ tty.c_cflag |= CS8;
+ tty.c_cc[VMIN] = 1;
+ tty.c_cc[VTIME] = 0;
+
+ tcsetattr (0, TCSANOW, &tty);
+
+ atexit(term_exit);
+}
+
+static void console_write(void *opaque, const uint8_t *buf, int len)
+{
+ fwrite(buf, 1, len, stdout);
+ fflush(stdout);
+}
+
+static int console_read(void *opaque, uint8_t *buf, int len)
+{
+ STDIODevice *s = opaque;
+ int ret, i, j;
+ uint8_t ch;
+
+ if (len <= 0)
+ return 0;
+
+ ret = read(s->stdin_fd, buf, len);
+ if (ret < 0)
+ return 0;
+ if (ret == 0) {
+ /* EOF */
+ exit(1);
+ }
+
+ j = 0;
+ for(i = 0; i < ret; i++) {
+ ch = buf[i];
+ if (s->console_esc_state) {
+ s->console_esc_state = 0;
+ switch(ch) {
+ case 'x':
+ printf("Terminated\n");
+ exit(0);
+ case 'h':
+ printf("\n"
+ "C-a h print this help\n"
+ "C-a x exit emulator\n"
+ "C-a C-a send C-a\n"
+ );
+ break;
+ case 1:
+ goto output_char;
+ default:
+ break;
+ }
+ } else {
+ if (ch == 1) {
+ s->console_esc_state = 1;
+ } else {
+ output_char:
+ buf[j++] = ch;
+ }
+ }
+ }
+ return j;
+}
+
+static void term_resize_handler(int sig)
+{
+ if (global_stdio_device)
+ global_stdio_device->resize_pending = TRUE;
+}
+
+static void console_get_size(STDIODevice *s, int *pw, int *ph)
+{
+ struct winsize ws;
+ int width, height;
+ /* default values */
+ width = 80;
+ height = 25;
+ if (ioctl(s->stdin_fd, TIOCGWINSZ, &ws) == 0 &&
+ ws.ws_col >= 4 && ws.ws_row >= 4) {
+ width = ws.ws_col;
+ height = ws.ws_row;
+ }
+ *pw = width;
+ *ph = height;
+}
+
+CharacterDevice *console_init(BOOL allow_ctrlc)
+{
+ CharacterDevice *dev;
+ STDIODevice *s;
+ struct sigaction sig;
+
+ term_init(allow_ctrlc);
+
+ dev = mallocz(sizeof(*dev));
+ s = mallocz(sizeof(*s));
+ s->stdin_fd = 0;
+ /* Note: the glibc does not properly tests the return value of
+ write() in printf, so some messages on stdout may be lost */
+ fcntl(s->stdin_fd, F_SETFL, O_NONBLOCK);
+
+ s->resize_pending = TRUE;
+ global_stdio_device = s;
+
+ /* use a signal to get the host terminal resize events */
+ sig.sa_handler = term_resize_handler;
+ sigemptyset(&sig.sa_mask);
+ sig.sa_flags = 0;
+ sigaction(SIGWINCH, &sig, NULL);
+
+ dev->opaque = s;
+ dev->write_data = console_write;
+ dev->read_data = console_read;
+ return dev;
+}
+
+#endif /* !_WIN32 */
+
+typedef enum {
+ BF_MODE_RO,
+ BF_MODE_RW,
+ BF_MODE_SNAPSHOT,
+} BlockDeviceModeEnum;
+
+#define SECTOR_SIZE 512
+
+typedef struct BlockDeviceFile {
+ FILE *f;
+ int64_t nb_sectors;
+ BlockDeviceModeEnum mode;
+ uint8_t **sector_table;
+} BlockDeviceFile;
+
+static int64_t bf_get_sector_count(BlockDevice *bs)
+{
+ BlockDeviceFile *bf = bs->opaque;
+ return bf->nb_sectors;
+}
+
+//#define DUMP_BLOCK_READ
+
+static int bf_read_async(BlockDevice *bs,
+ uint64_t sector_num, uint8_t *buf, int n,
+ BlockDeviceCompletionFunc *cb, void *opaque)
+{
+ BlockDeviceFile *bf = bs->opaque;
+ // printf("bf_read_async: sector_num=%" PRId64 " n=%d\n", sector_num, n);
+#ifdef DUMP_BLOCK_READ
+ {
+ static FILE *f;
+ if (!f)
+ f = fopen("/tmp/read_sect.txt", "wb");
+ fprintf(f, "%" PRId64 " %d\n", sector_num, n);
+ }
+#endif
+ if (!bf->f)
+ return -1;
+ if (bf->mode == BF_MODE_SNAPSHOT) {
+ int i;
+ for(i = 0; i < n; i++) {
+ if (!bf->sector_table[sector_num]) {
+ fseek(bf->f, sector_num * SECTOR_SIZE, SEEK_SET);
+ fread(buf, 1, SECTOR_SIZE, bf->f);
+ } else {
+ memcpy(buf, bf->sector_table[sector_num], SECTOR_SIZE);
+ }
+ sector_num++;
+ buf += SECTOR_SIZE;
+ }
+ } else {
+ fseek(bf->f, sector_num * SECTOR_SIZE, SEEK_SET);
+ fread(buf, 1, n * SECTOR_SIZE, bf->f);
+ }
+ /* synchronous read */
+ return 0;
+}
+
+static int bf_write_async(BlockDevice *bs,
+ uint64_t sector_num, const uint8_t *buf, int n,
+ BlockDeviceCompletionFunc *cb, void *opaque)
+{
+ BlockDeviceFile *bf = bs->opaque;
+ int ret;
+
+ switch(bf->mode) {
+ case BF_MODE_RO:
+ ret = -1; /* error */
+ break;
+ case BF_MODE_RW:
+ fseek(bf->f, sector_num * SECTOR_SIZE, SEEK_SET);
+ fwrite(buf, 1, n * SECTOR_SIZE, bf->f);
+ ret = 0;
+ break;
+ case BF_MODE_SNAPSHOT:
+ {
+ int i;
+ if ((sector_num + n) > bf->nb_sectors)
+ return -1;
+ for(i = 0; i < n; i++) {
+ if (!bf->sector_table[sector_num]) {
+ bf->sector_table[sector_num] = malloc(SECTOR_SIZE);
+ }
+ memcpy(bf->sector_table[sector_num], buf, SECTOR_SIZE);
+ sector_num++;
+ buf += SECTOR_SIZE;
+ }
+ ret = 0;
+ }
+ break;
+ default:
+ abort();
+ }
+
+ return ret;
+}
+
+static BlockDevice *block_device_init(const char *filename,
+ BlockDeviceModeEnum mode)
+{
+ BlockDevice *bs;
+ BlockDeviceFile *bf;
+ int64_t file_size;
+ FILE *f;
+ const char *mode_str;
+
+ if (mode == BF_MODE_RW) {
+ mode_str = "r+b";
+ } else {
+ mode_str = "rb";
+ }
+
+ f = fopen(filename, mode_str);
+ if (!f) {
+ perror(filename);
+ exit(1);
+ }
+ fseek(f, 0, SEEK_END);
+ file_size = ftello(f);
+
+ bs = mallocz(sizeof(*bs));
+ bf = mallocz(sizeof(*bf));
+
+ bf->mode = mode;
+ bf->nb_sectors = file_size / 512;
+ bf->f = f;
+
+ if (mode == BF_MODE_SNAPSHOT) {
+ bf->sector_table = mallocz(sizeof(bf->sector_table[0]) *
+ bf->nb_sectors);
+ }
+
+ bs->opaque = bf;
+ bs->get_sector_count = bf_get_sector_count;
+ bs->read_async = bf_read_async;
+ bs->write_async = bf_write_async;
+ return bs;
+}
+
+#ifndef _WIN32
+
+typedef struct {
+ int fd;
+ BOOL select_filled;
+} TunState;
+
+static void tun_write_packet(EthernetDevice *net,
+ const uint8_t *buf, int len)
+{
+ TunState *s = net->opaque;
+ write(s->fd, buf, len);
+}
+
+static void tun_select_fill(EthernetDevice *net, int *pfd_max,
+ fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int *pdelay)
+{
+ TunState *s = net->opaque;
+ int net_fd = s->fd;
+
+ s->select_filled = net->device_can_write_packet(net);
+ if (s->select_filled) {
+ FD_SET(net_fd, rfds);
+ *pfd_max = max_int(*pfd_max, net_fd);
+ }
+}
+
+static void tun_select_poll(EthernetDevice *net,
+ fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int select_ret)
+{
+ TunState *s = net->opaque;
+ int net_fd = s->fd;
+ uint8_t buf[2048];
+ int ret;
+
+ if (select_ret <= 0)
+ return;
+ if (s->select_filled && FD_ISSET(net_fd, rfds)) {
+ ret = read(net_fd, buf, sizeof(buf));
+ if (ret > 0)
+ net->device_write_packet(net, buf, ret);
+ }
+
+}
+
+/* configure with:
+# bridge configuration (connect tap0 to bridge interface br0)
+ ip link add br0 type bridge
+ ip tuntap add dev tap0 mode tap [user x] [group x]
+ ip link set tap0 master br0
+ ip link set dev br0 up
+ ip link set dev tap0 up
+
+# NAT configuration (eth1 is the interface connected to internet)
+ ifconfig br0 192.168.3.1
+ echo 1 > /proc/sys/net/ipv4/ip_forward
+ iptables -D FORWARD 1
+ iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
+
+ In the VM:
+ ifconfig eth0 192.168.3.2
+ route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.3.1
+*/
+static EthernetDevice *tun_open(const char *ifname)
+{
+ struct ifreq ifr;
+ int fd, ret;
+ EthernetDevice *net;
+ TunState *s;
+
+ fd = open("/dev/net/tun", O_RDWR);
+ if (fd < 0) {
+ fprintf(stderr, "Error: could not open /dev/net/tun\n");
+ return NULL;
+ }
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
+ pstrcpy(ifr.ifr_name, sizeof(ifr.ifr_name), ifname);
+ ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
+ if (ret != 0) {
+ fprintf(stderr, "Error: could not configure /dev/net/tun\n");
+ close(fd);
+ return NULL;
+ }
+ fcntl(fd, F_SETFL, O_NONBLOCK);
+
+ net = mallocz(sizeof(*net));
+ net->mac_addr[0] = 0x02;
+ net->mac_addr[1] = 0x00;
+ net->mac_addr[2] = 0x00;
+ net->mac_addr[3] = 0x00;
+ net->mac_addr[4] = 0x00;
+ net->mac_addr[5] = 0x01;
+ s = mallocz(sizeof(*s));
+ s->fd = fd;
+ net->opaque = s;
+ net->write_packet = tun_write_packet;
+ net->select_fill = tun_select_fill;
+ net->select_poll = tun_select_poll;
+ return net;
+}
+
+#endif /* !_WIN32 */
+
+#ifdef CONFIG_SLIRP
+
+/*******************************************************/
+/* slirp */
+
+static Slirp *slirp_state;
+
+static void slirp_write_packet(EthernetDevice *net,
+ const uint8_t *buf, int len)
+{
+ Slirp *slirp_state = net->opaque;
+ slirp_input(slirp_state, buf, len);
+}
+
+int slirp_can_output(void *opaque)
+{
+ EthernetDevice *net = opaque;
+ return net->device_can_write_packet(net);
+}
+
+void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
+{
+ EthernetDevice *net = opaque;
+ return net->device_write_packet(net, pkt, pkt_len);
+}
+
+static void slirp_select_fill1(EthernetDevice *net, int *pfd_max,
+ fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int *pdelay)
+{
+ Slirp *slirp_state = net->opaque;
+ slirp_select_fill(slirp_state, pfd_max, rfds, wfds, efds);
+}
+
+static void slirp_select_poll1(EthernetDevice *net,
+ fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int select_ret)
+{
+ Slirp *slirp_state = net->opaque;
+ slirp_select_poll(slirp_state, rfds, wfds, efds, (select_ret <= 0));
+}
+
+static EthernetDevice *slirp_open(void)
+{
+ EthernetDevice *net;
+ struct in_addr net_addr = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
+ struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
+ struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
+ struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
+ struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
+ const char *bootfile = NULL;
+ const char *vhostname = NULL;
+ int restricted = 0;
+
+ if (slirp_state) {
+ fprintf(stderr, "Only a single slirp instance is allowed\n");
+ return NULL;
+ }
+ net = mallocz(sizeof(*net));
+
+ slirp_state = slirp_init(restricted, net_addr, mask, host, vhostname,
+ "", bootfile, dhcp, dns, net);
+
+ net->mac_addr[0] = 0x02;
+ net->mac_addr[1] = 0x00;
+ net->mac_addr[2] = 0x00;
+ net->mac_addr[3] = 0x00;
+ net->mac_addr[4] = 0x00;
+ net->mac_addr[5] = 0x01;
+ net->opaque = slirp_state;
+ net->write_packet = slirp_write_packet;
+ net->select_fill = slirp_select_fill1;
+ net->select_poll = slirp_select_poll1;
+
+ return net;
+}
+
+#endif /* CONFIG_SLIRP */
+
+#define MAX_EXEC_CYCLE 500000
+#define MAX_SLEEP_TIME 10 /* in ms */
+
+void virt_machine_run(VirtMachine *m)
+{
+ fd_set rfds, wfds, efds;
+ int fd_max, ret, delay;
+ struct timeval tv;
+#ifndef _WIN32
+ int stdin_fd;
+#endif
+
+ delay = virt_machine_get_sleep_duration(m, MAX_SLEEP_TIME);
+
+ /* wait for an event */
+ FD_ZERO(&rfds);
+ FD_ZERO(&wfds);
+ FD_ZERO(&efds);
+ fd_max = -1;
+#ifndef _WIN32
+ if (m->console_dev && virtio_console_can_write_data(m->console_dev)) {
+ STDIODevice *s = m->console->opaque;
+ stdin_fd = s->stdin_fd;
+ FD_SET(stdin_fd, &rfds);
+ fd_max = stdin_fd;
+
+ if (s->resize_pending) {
+ int width, height;
+ console_get_size(s, &width, &height);
+ virtio_console_resize_event(m->console_dev, width, height);
+ s->resize_pending = FALSE;
+ }
+ }
+#endif
+ if (m->net) {
+ m->net->select_fill(m->net, &fd_max, &rfds, &wfds, &efds, &delay);
+ }
+#ifdef CONFIG_FS_NET
+ fs_net_set_fdset(&fd_max, &rfds, &wfds, &efds, &delay);
+#endif
+ tv.tv_sec = delay / 1000;
+ tv.tv_usec = (delay % 1000) * 1000;
+ ret = select(fd_max + 1, &rfds, &wfds, &efds, &tv);
+ if (m->net) {
+ m->net->select_poll(m->net, &rfds, &wfds, &efds, ret);
+ }
+ if (ret > 0) {
+#ifndef _WIN32
+ if (m->console_dev && FD_ISSET(stdin_fd, &rfds)) {
+ uint8_t buf[128];
+ int ret, len;
+ len = virtio_console_get_write_len(m->console_dev);
+ len = min_int(len, sizeof(buf));
+ ret = m->console->read_data(m->console->opaque, buf, len);
+ if (ret > 0) {
+ virtio_console_write_data(m->console_dev, buf, ret);
+ }
+ }
+#endif
+ }
+
+#ifdef CONFIG_SDL
+ sdl_refresh(m);
+#endif
+
+ virt_machine_interp(m, MAX_EXEC_CYCLE);
+}
+
+/*******************************************************/
+
+static struct option options[] = {
+ { "help", no_argument, NULL, 'h' },
+ { "ctrlc", no_argument },
+ { "rw", no_argument },
+ { "ro", no_argument },
+ { "append", required_argument },
+ { "no-accel", no_argument },
+ { "build-preload", required_argument },
+ { NULL },
+};
+
+void help(void)
+{
+ printf("temu version " CONFIG_VERSION ", Copyright (c) 2016-2018 Fabrice Bellard\n"
+ "usage: riscvemu [options] config_file\n"
+ "options are:\n"
+ "-m ram_size set the RAM size in MB\n"
+ "-rw allow write access to the disk image (default=snapshot)\n"
+ "-ctrlc the C-c key stops the emulator instead of being sent to the\n"
+ " emulated software\n"
+ "-append cmdline append cmdline to the kernel command line\n"
+ "-no-accel disable VM acceleration (KVM, x86 machine only)\n"
+ "\n"
+ "Console keys:\n"
+ "Press C-a x to exit the emulator, C-a h to get some help.\n");
+ exit(1);
+}
+
+#ifdef CONFIG_FS_NET
+static BOOL net_completed;
+
+static void net_start_cb(void *arg)
+{
+ net_completed = TRUE;
+}
+
+static BOOL net_poll_cb(void *arg)
+{
+ return net_completed;
+}
+
+#endif
+
+int main(int argc, char **argv)
+{
+ VirtMachine *s;
+ const char *path, *cmdline, *build_preload_file;
+ int c, option_index, i, ram_size, accel_enable;
+ BOOL allow_ctrlc;
+ BlockDeviceModeEnum drive_mode;
+ VirtMachineParams p_s, *p = &p_s;
+
+ ram_size = -1;
+ allow_ctrlc = FALSE;
+ (void)allow_ctrlc;
+ drive_mode = BF_MODE_SNAPSHOT;
+ accel_enable = -1;
+ cmdline = NULL;
+ build_preload_file = NULL;
+ for(;;) {
+ c = getopt_long_only(argc, argv, "hm:", options, &option_index);
+ if (c == -1)
+ break;
+ switch(c) {
+ case 0:
+ switch(option_index) {
+ case 1: /* ctrlc */
+ allow_ctrlc = TRUE;
+ break;
+ case 2: /* rw */
+ drive_mode = BF_MODE_RW;
+ break;
+ case 3: /* ro */
+ drive_mode = BF_MODE_RO;
+ break;
+ case 4: /* append */
+ cmdline = optarg;
+ break;
+ case 5: /* no-accel */
+ accel_enable = FALSE;
+ break;
+ case 6: /* build-preload */
+ build_preload_file = optarg;
+ break;
+ default:
+ fprintf(stderr, "unknown option index: %d\n", option_index);
+ exit(1);
+ }
+ break;
+ case 'h':
+ help();
+ break;
+ case 'm':
+ ram_size = strtoul(optarg, NULL, 0);
+ break;
+ default:
+ exit(1);
+ }
+ }
+
+ if (optind >= argc) {
+ help();
+ }
+
+ path = argv[optind++];
+
+ virt_machine_set_defaults(p);
+#ifdef CONFIG_FS_NET
+ fs_wget_init();
+#endif
+ virt_machine_load_config_file(p, path, NULL, NULL);
+#ifdef CONFIG_FS_NET
+ fs_net_event_loop(NULL, NULL);
+#endif
+
+ /* override some config parameters */
+
+ if (ram_size > 0) {
+ p->ram_size = (uint64_t)ram_size << 20;
+ }
+ if (accel_enable != -1)
+ p->accel_enable = accel_enable;
+ if (cmdline) {
+ vm_add_cmdline(p, cmdline);
+ }
+
+ /* open the files & devices */
+ for(i = 0; i < p->drive_count; i++) {
+ BlockDevice *drive;
+ char *fname;
+ fname = get_file_path(p->cfg_filename, p->tab_drive[i].filename);
+#ifdef CONFIG_FS_NET
+ if (is_url(fname)) {
+ net_completed = FALSE;
+ drive = block_device_init_http(fname, 128 * 1024,
+ net_start_cb, NULL);
+ /* wait until the drive is initialized */
+ fs_net_event_loop(net_poll_cb, NULL);
+ } else
+#endif
+ {
+ drive = block_device_init(fname, drive_mode);
+ }
+ free(fname);
+ p->tab_drive[i].block_dev = drive;
+ }
+
+ for(i = 0; i < p->fs_count; i++) {
+ FSDevice *fs;
+ const char *path;
+ path = p->tab_fs[i].filename;
+#ifdef CONFIG_FS_NET
+ if (is_url(path)) {
+ fs = fs_net_init(path, NULL, NULL);
+ if (!fs)
+ exit(1);
+ if (build_preload_file)
+ fs_dump_cache_load(fs, build_preload_file);
+ fs_net_event_loop(NULL, NULL);
+ } else
+#endif
+ {
+#ifdef _WIN32
+ fprintf(stderr, "Filesystem access not supported yet\n");
+ exit(1);
+#else
+ char *fname;
+ fname = get_file_path(p->cfg_filename, path);
+ fs = fs_disk_init(fname);
+ if (!fs) {
+ fprintf(stderr, "%s: must be a directory\n", fname);
+ exit(1);
+ }
+ free(fname);
+#endif
+ }
+ p->tab_fs[i].fs_dev = fs;
+ }
+
+ for(i = 0; i < p->eth_count; i++) {
+#ifdef CONFIG_SLIRP
+ if (!strcmp(p->tab_eth[i].driver, "user")) {
+ p->tab_eth[i].net = slirp_open();
+ if (!p->tab_eth[i].net)
+ exit(1);
+ } else
+#endif
+#ifndef _WIN32
+ if (!strcmp(p->tab_eth[i].driver, "tap")) {
+ p->tab_eth[i].net = tun_open(p->tab_eth[i].ifname);
+ if (!p->tab_eth[i].net)
+ exit(1);
+ } else
+#endif
+ {
+ fprintf(stderr, "Unsupported network driver '%s'\n",
+ p->tab_eth[i].driver);
+ exit(1);
+ }
+ }
+
+#ifdef CONFIG_SDL
+ if (p->display_device) {
+ sdl_init(p->width, p->height);
+ } else
+#endif
+ {
+#ifdef _WIN32
+ fprintf(stderr, "Console not supported yet\n");
+ exit(1);
+#else
+ p->console = console_init(allow_ctrlc);
+#endif
+ }
+ p->rtc_real_time = TRUE;
+
+ s = virt_machine_init(p);
+ if (!s)
+ exit(1);
+
+ virt_machine_free_config(p);
+
+ if (s->net) {
+ s->net->device_set_carrier(s->net, TRUE);
+ }
+
+ for(;;) {
+ virt_machine_run(s);
+ }
+ virt_machine_end(s);
+ return 0;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/vga.c b/jslinux-2019-12-21/tinyemu-2019-12-21/vga.c
new file mode 100644
index 0000000..908a320
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/vga.c
@@ -0,0 +1,804 @@
+/*
+ * Dummy VGA device
+ *
+ * Copyright (c) 2003-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "virtio.h"
+#include "machine.h"
+
+//#define DEBUG_VBE
+
+#define MSR_COLOR_EMULATION 0x01
+#define MSR_PAGE_SELECT 0x20
+
+#define ST01_V_RETRACE 0x08
+#define ST01_DISP_ENABLE 0x01
+
+#define VBE_DISPI_INDEX_ID 0x0
+#define VBE_DISPI_INDEX_XRES 0x1
+#define VBE_DISPI_INDEX_YRES 0x2
+#define VBE_DISPI_INDEX_BPP 0x3
+#define VBE_DISPI_INDEX_ENABLE 0x4
+#define VBE_DISPI_INDEX_BANK 0x5
+#define VBE_DISPI_INDEX_VIRT_WIDTH 0x6
+#define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7
+#define VBE_DISPI_INDEX_X_OFFSET 0x8
+#define VBE_DISPI_INDEX_Y_OFFSET 0x9
+#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa
+#define VBE_DISPI_INDEX_NB 0xb
+
+#define VBE_DISPI_ID0 0xB0C0
+#define VBE_DISPI_ID1 0xB0C1
+#define VBE_DISPI_ID2 0xB0C2
+#define VBE_DISPI_ID3 0xB0C3
+#define VBE_DISPI_ID4 0xB0C4
+#define VBE_DISPI_ID5 0xB0C5
+
+#define VBE_DISPI_DISABLED 0x00
+#define VBE_DISPI_ENABLED 0x01
+#define VBE_DISPI_GETCAPS 0x02
+#define VBE_DISPI_8BIT_DAC 0x20
+#define VBE_DISPI_LFB_ENABLED 0x40
+#define VBE_DISPI_NOCLEARMEM 0x80
+
+#define FB_ALLOC_ALIGN (1 << 20)
+
+#define MAX_TEXT_WIDTH 132
+#define MAX_TEXT_HEIGHT 60
+
+struct VGAState {
+ FBDevice *fb_dev;
+ int fb_page_count;
+ PhysMemoryRange *mem_range;
+ PhysMemoryRange *mem_range2;
+ PCIDevice *pci_dev;
+ PhysMemoryRange *rom_range;
+
+ uint8_t *vga_ram; /* 128K at 0xa0000 */
+
+ uint8_t sr_index;
+ uint8_t sr[8];
+ uint8_t gr_index;
+ uint8_t gr[16];
+ uint8_t ar_index;
+ uint8_t ar[21];
+ int ar_flip_flop;
+ uint8_t cr_index;
+ uint8_t cr[256]; /* CRT registers */
+ uint8_t msr; /* Misc Output Register */
+ uint8_t fcr; /* Feature Control Register */
+ uint8_t st00; /* status 0 */
+ uint8_t st01; /* status 1 */
+ uint8_t dac_state;
+ uint8_t dac_sub_index;
+ uint8_t dac_read_index;
+ uint8_t dac_write_index;
+ uint8_t dac_cache[3]; /* used when writing */
+ uint8_t palette[768];
+
+ /* text mode state */
+ uint32_t last_palette[16];
+ uint16_t last_ch_attr[MAX_TEXT_WIDTH * MAX_TEXT_HEIGHT];
+ uint32_t last_width;
+ uint32_t last_height;
+ uint16_t last_line_offset;
+ uint16_t last_start_addr;
+ uint16_t last_cursor_offset;
+ uint8_t last_cursor_start;
+ uint8_t last_cursor_end;
+
+ /* VBE extension */
+ uint16_t vbe_index;
+ uint16_t vbe_regs[VBE_DISPI_INDEX_NB];
+};
+
+static void vga_draw_glyph8(uint8_t *d, int linesize,
+ const uint8_t *font_ptr, int h,
+ uint32_t fgcol, uint32_t bgcol)
+{
+ uint32_t font_data, xorcol;
+
+ xorcol = bgcol ^ fgcol;
+ do {
+ font_data = font_ptr[0];
+ ((uint32_t *)d)[0] = (-((font_data >> 7)) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[1] = (-((font_data >> 6) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[2] = (-((font_data >> 5) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[3] = (-((font_data >> 4) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[4] = (-((font_data >> 3) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[5] = (-((font_data >> 2) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[6] = (-((font_data >> 1) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[7] = (-((font_data >> 0) & 1) & xorcol) ^ bgcol;
+ font_ptr++;
+ d += linesize;
+ } while (--h);
+}
+
+static void vga_draw_glyph9(uint8_t *d, int linesize,
+ const uint8_t *font_ptr, int h,
+ uint32_t fgcol, uint32_t bgcol,
+ int dup9)
+{
+ uint32_t font_data, xorcol, v;
+
+ xorcol = bgcol ^ fgcol;
+ do {
+ font_data = font_ptr[0];
+ ((uint32_t *)d)[0] = (-((font_data >> 7)) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[1] = (-((font_data >> 6) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[2] = (-((font_data >> 5) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[3] = (-((font_data >> 4) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[4] = (-((font_data >> 3) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[5] = (-((font_data >> 2) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[6] = (-((font_data >> 1) & 1) & xorcol) ^ bgcol;
+ v = (-((font_data >> 0) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[7] = v;
+ if (dup9)
+ ((uint32_t *)d)[8] = v;
+ else
+ ((uint32_t *)d)[8] = bgcol;
+ font_ptr++;
+ d += linesize;
+ } while (--h);
+}
+
+static const uint8_t cursor_glyph[32] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+};
+
+static inline int c6_to_8(int v)
+{
+ int b;
+ v &= 0x3f;
+ b = v & 1;
+ return (v << 2) | (b << 1) | b;
+}
+
+static int update_palette16(VGAState *s, uint32_t *palette)
+{
+ int full_update, i;
+ uint32_t v, col;
+
+ full_update = 0;
+ for(i = 0; i < 16; i++) {
+ v = s->ar[i];
+ if (s->ar[0x10] & 0x80)
+ v = ((s->ar[0x14] & 0xf) << 4) | (v & 0xf);
+ else
+ v = ((s->ar[0x14] & 0xc) << 4) | (v & 0x3f);
+ v = v * 3;
+ col = (c6_to_8(s->palette[v]) << 16) |
+ (c6_to_8(s->palette[v + 1]) << 8) |
+ c6_to_8(s->palette[v + 2]);
+ if (col != palette[i]) {
+ full_update = 1;
+ palette[i] = col;
+ }
+ }
+ return full_update;
+}
+
+/* the text refresh is just for debugging and initial boot message, so
+ it is very incomplete */
+static void vga_text_refresh(VGAState *s,
+ SimpleFBDrawFunc *redraw_func, void *opaque)
+{
+ FBDevice *fb_dev = s->fb_dev;
+ int width, height, cwidth, cheight, cy, cx, x1, y1, width1, height1;
+ int cx_min, cx_max, dup9;
+ uint32_t ch_attr, line_offset, start_addr, ch_addr, ch_addr1, ch, cattr;
+ uint8_t *vga_ram, *font_ptr, *dst;
+ uint32_t fgcol, bgcol, cursor_offset, cursor_start, cursor_end;
+ BOOL full_update;
+
+ full_update = update_palette16(s, s->last_palette);
+
+ vga_ram = s->vga_ram;
+
+ line_offset = s->cr[0x13];
+ line_offset <<= 3;
+ line_offset >>= 1;
+
+ start_addr = s->cr[0x0d] | (s->cr[0x0c] << 8);
+
+ cheight = (s->cr[9] & 0x1f) + 1;
+ cwidth = 8;
+ if (!(s->sr[1] & 0x01))
+ cwidth++;
+
+ width = (s->cr[0x01] + 1);
+ height = s->cr[0x12] |
+ ((s->cr[0x07] & 0x02) << 7) |
+ ((s->cr[0x07] & 0x40) << 3);
+ height = (height + 1) / cheight;
+
+ width1 = width * cwidth;
+ height1 = height * cheight;
+ if (fb_dev->width < width1 || fb_dev->height < height1 ||
+ width > MAX_TEXT_WIDTH || height > MAX_TEXT_HEIGHT)
+ return; /* not enough space */
+ if (s->last_line_offset != line_offset ||
+ s->last_start_addr != start_addr ||
+ s->last_width != width ||
+ s->last_height != height) {
+ s->last_line_offset = line_offset;
+ s->last_start_addr = start_addr;
+ s->last_width = width;
+ s->last_height = height;
+ full_update = TRUE;
+ }
+
+ /* update cursor position */
+ cursor_offset = ((s->cr[0x0e] << 8) | s->cr[0x0f]) - start_addr;
+ cursor_start = s->cr[0xa];
+ cursor_end = s->cr[0xb];
+ if (cursor_offset != s->last_cursor_offset ||
+ cursor_start != s->last_cursor_start ||
+ cursor_end != s->last_cursor_end) {
+ /* force refresh of characters with the cursor */
+ if (s->last_cursor_offset < MAX_TEXT_WIDTH * MAX_TEXT_HEIGHT)
+ s->last_ch_attr[s->last_cursor_offset] = -1;
+ if (cursor_offset < MAX_TEXT_WIDTH * MAX_TEXT_HEIGHT)
+ s->last_ch_attr[cursor_offset] = -1;
+ s->last_cursor_offset = cursor_offset;
+ s->last_cursor_start = cursor_start;
+ s->last_cursor_end = cursor_end;
+ }
+
+ ch_addr1 = 0x18000 + (start_addr * 2);
+ cursor_offset = 0x18000 + (start_addr + cursor_offset) * 2;
+
+ x1 = (fb_dev->width - width1) / 2;
+ y1 = (fb_dev->height - height1) / 2;
+#if 0
+ printf("text refresh %dx%d font=%dx%d start_addr=0x%x line_offset=0x%x\n",
+ width, height, cwidth, cheight, start_addr, line_offset);
+#endif
+ for(cy = 0; cy < height; cy++) {
+ ch_addr = ch_addr1;
+ dst = fb_dev->fb_data + (y1 + cy * cheight) * fb_dev->stride + x1 * 4;
+ cx_min = width;
+ cx_max = -1;
+ for(cx = 0; cx < width; cx++) {
+ ch_attr = *(uint16_t *)(vga_ram + (ch_addr & 0x1fffe));
+ if (full_update || ch_attr != s->last_ch_attr[cy * width + cx]) {
+ s->last_ch_attr[cy * width + cx] = ch_attr;
+ cx_min = min_int(cx_min, cx);
+ cx_max = max_int(cx_max, cx);
+ ch = ch_attr & 0xff;
+ cattr = ch_attr >> 8;
+ font_ptr = vga_ram + 32 * ch;
+ bgcol = s->last_palette[cattr >> 4];
+ fgcol = s->last_palette[cattr & 0x0f];
+ if (cwidth == 8) {
+ vga_draw_glyph8(dst, fb_dev->stride, font_ptr, cheight,
+ fgcol, bgcol);
+ } else {
+ dup9 = 0;
+ if (ch >= 0xb0 && ch <= 0xdf && (s->ar[0x10] & 0x04))
+ dup9 = 1;
+ vga_draw_glyph9(dst, fb_dev->stride, font_ptr, cheight,
+ fgcol, bgcol, dup9);
+ }
+ /* cursor display */
+ if (cursor_offset == ch_addr && !(cursor_start & 0x20)) {
+ int line_start, line_last, h;
+ uint8_t *dst1;
+ line_start = cursor_start & 0x1f;
+ line_last = min_int(cursor_end & 0x1f, cheight - 1);
+
+ if (line_last >= line_start && line_start < cheight) {
+ h = line_last - line_start + 1;
+ dst1 = dst + fb_dev->stride * line_start;
+ if (cwidth == 8) {
+ vga_draw_glyph8(dst1, fb_dev->stride,
+ cursor_glyph,
+ h, fgcol, bgcol);
+ } else {
+ vga_draw_glyph9(dst1, fb_dev->stride,
+ cursor_glyph,
+ h, fgcol, bgcol, 1);
+ }
+ }
+ }
+ }
+ ch_addr += 2;
+ dst += 4 * cwidth;
+ }
+ if (cx_max >= cx_min) {
+ // printf("redraw %d %d %d\n", cy, cx_min, cx_max);
+ redraw_func(fb_dev, opaque,
+ x1 + cx_min * cwidth, y1 + cy * cheight,
+ (cx_max - cx_min + 1) * cwidth, cheight);
+ }
+ ch_addr1 += line_offset;
+ }
+}
+
+static void vga_refresh(FBDevice *fb_dev,
+ SimpleFBDrawFunc *redraw_func, void *opaque)
+{
+ VGAState *s = fb_dev->device_opaque;
+
+ if (!(s->ar_index & 0x20)) {
+ /* blank */
+ } else if (s->gr[0x06] & 1) {
+ /* graphic mode (VBE) */
+ simplefb_refresh(fb_dev, redraw_func, opaque, s->mem_range, s->fb_page_count);
+ } else {
+ /* text mode */
+ vga_text_refresh(s, redraw_func, opaque);
+ }
+}
+
+/* force some bits to zero */
+static const uint8_t sr_mask[8] = {
+ (uint8_t)~0xfc,
+ (uint8_t)~0xc2,
+ (uint8_t)~0xf0,
+ (uint8_t)~0xc0,
+ (uint8_t)~0xf1,
+ (uint8_t)~0xff,
+ (uint8_t)~0xff,
+ (uint8_t)~0x00,
+};
+
+static const uint8_t gr_mask[16] = {
+ (uint8_t)~0xf0, /* 0x00 */
+ (uint8_t)~0xf0, /* 0x01 */
+ (uint8_t)~0xf0, /* 0x02 */
+ (uint8_t)~0xe0, /* 0x03 */
+ (uint8_t)~0xfc, /* 0x04 */
+ (uint8_t)~0x84, /* 0x05 */
+ (uint8_t)~0xf0, /* 0x06 */
+ (uint8_t)~0xf0, /* 0x07 */
+ (uint8_t)~0x00, /* 0x08 */
+ (uint8_t)~0xff, /* 0x09 */
+ (uint8_t)~0xff, /* 0x0a */
+ (uint8_t)~0xff, /* 0x0b */
+ (uint8_t)~0xff, /* 0x0c */
+ (uint8_t)~0xff, /* 0x0d */
+ (uint8_t)~0xff, /* 0x0e */
+ (uint8_t)~0xff, /* 0x0f */
+};
+
+static uint32_t vga_ioport_read(VGAState *s, uint32_t addr)
+{
+ int val, index;
+
+ /* check port range access depending on color/monochrome mode */
+ if ((addr >= 0x3b0 && addr <= 0x3bf && (s->msr & MSR_COLOR_EMULATION)) ||
+ (addr >= 0x3d0 && addr <= 0x3df && !(s->msr & MSR_COLOR_EMULATION))) {
+ val = 0xff;
+ } else {
+ switch(addr) {
+ case 0x3c0:
+ if (s->ar_flip_flop == 0) {
+ val = s->ar_index;
+ } else {
+ val = 0;
+ }
+ break;
+ case 0x3c1:
+ index = s->ar_index & 0x1f;
+ if (index < 21)
+ val = s->ar[index];
+ else
+ val = 0;
+ break;
+ case 0x3c2:
+ val = s->st00;
+ break;
+ case 0x3c4:
+ val = s->sr_index;
+ break;
+ case 0x3c5:
+ val = s->sr[s->sr_index];
+#ifdef DEBUG_VGA_REG
+ printf("vga: read SR%x = 0x%02x\n", s->sr_index, val);
+#endif
+ break;
+ case 0x3c7:
+ val = s->dac_state;
+ break;
+ case 0x3c8:
+ val = s->dac_write_index;
+ break;
+ case 0x3c9:
+ val = s->palette[s->dac_read_index * 3 + s->dac_sub_index];
+ if (++s->dac_sub_index == 3) {
+ s->dac_sub_index = 0;
+ s->dac_read_index++;
+ }
+ break;
+ case 0x3ca:
+ val = s->fcr;
+ break;
+ case 0x3cc:
+ val = s->msr;
+ break;
+ case 0x3ce:
+ val = s->gr_index;
+ break;
+ case 0x3cf:
+ val = s->gr[s->gr_index];
+#ifdef DEBUG_VGA_REG
+ printf("vga: read GR%x = 0x%02x\n", s->gr_index, val);
+#endif
+ break;
+ case 0x3b4:
+ case 0x3d4:
+ val = s->cr_index;
+ break;
+ case 0x3b5:
+ case 0x3d5:
+ val = s->cr[s->cr_index];
+#ifdef DEBUG_VGA_REG
+ printf("vga: read CR%x = 0x%02x\n", s->cr_index, val);
+#endif
+ break;
+ case 0x3ba:
+ case 0x3da:
+ /* just toggle to fool polling */
+ s->st01 ^= ST01_V_RETRACE | ST01_DISP_ENABLE;
+ val = s->st01;
+ s->ar_flip_flop = 0;
+ break;
+ default:
+ val = 0x00;
+ break;
+ }
+ }
+#if defined(DEBUG_VGA)
+ printf("VGA: read addr=0x%04x data=0x%02x\n", addr, val);
+#endif
+ return val;
+}
+
+static void vga_ioport_write(VGAState *s, uint32_t addr, uint32_t val)
+{
+ int index;
+
+ /* check port range access depending on color/monochrome mode */
+ if ((addr >= 0x3b0 && addr <= 0x3bf && (s->msr & MSR_COLOR_EMULATION)) ||
+ (addr >= 0x3d0 && addr <= 0x3df && !(s->msr & MSR_COLOR_EMULATION)))
+ return;
+
+#ifdef DEBUG_VGA
+ printf("VGA: write addr=0x%04x data=0x%02x\n", addr, val);
+#endif
+
+ switch(addr) {
+ case 0x3c0:
+ if (s->ar_flip_flop == 0) {
+ val &= 0x3f;
+ s->ar_index = val;
+ } else {
+ index = s->ar_index & 0x1f;
+ switch(index) {
+ case 0x00 ... 0x0f:
+ s->ar[index] = val & 0x3f;
+ break;
+ case 0x10:
+ s->ar[index] = val & ~0x10;
+ break;
+ case 0x11:
+ s->ar[index] = val;
+ break;
+ case 0x12:
+ s->ar[index] = val & ~0xc0;
+ break;
+ case 0x13:
+ s->ar[index] = val & ~0xf0;
+ break;
+ case 0x14:
+ s->ar[index] = val & ~0xf0;
+ break;
+ default:
+ break;
+ }
+ }
+ s->ar_flip_flop ^= 1;
+ break;
+ case 0x3c2:
+ s->msr = val & ~0x10;
+ break;
+ case 0x3c4:
+ s->sr_index = val & 7;
+ break;
+ case 0x3c5:
+#ifdef DEBUG_VGA_REG
+ printf("vga: write SR%x = 0x%02x\n", s->sr_index, val);
+#endif
+ s->sr[s->sr_index] = val & sr_mask[s->sr_index];
+ break;
+ case 0x3c7:
+ s->dac_read_index = val;
+ s->dac_sub_index = 0;
+ s->dac_state = 3;
+ break;
+ case 0x3c8:
+ s->dac_write_index = val;
+ s->dac_sub_index = 0;
+ s->dac_state = 0;
+ break;
+ case 0x3c9:
+ s->dac_cache[s->dac_sub_index] = val;
+ if (++s->dac_sub_index == 3) {
+ memcpy(&s->palette[s->dac_write_index * 3], s->dac_cache, 3);
+ s->dac_sub_index = 0;
+ s->dac_write_index++;
+ }
+ break;
+ case 0x3ce:
+ s->gr_index = val & 0x0f;
+ break;
+ case 0x3cf:
+#ifdef DEBUG_VGA_REG
+ printf("vga: write GR%x = 0x%02x\n", s->gr_index, val);
+#endif
+ s->gr[s->gr_index] = val & gr_mask[s->gr_index];
+ break;
+ case 0x3b4:
+ case 0x3d4:
+ s->cr_index = val;
+ break;
+ case 0x3b5:
+ case 0x3d5:
+#ifdef DEBUG_VGA_REG
+ printf("vga: write CR%x = 0x%02x\n", s->cr_index, val);
+#endif
+ /* handle CR0-7 protection */
+ if ((s->cr[0x11] & 0x80) && s->cr_index <= 7) {
+ /* can always write bit 4 of CR7 */
+ if (s->cr_index == 7)
+ s->cr[7] = (s->cr[7] & ~0x10) | (val & 0x10);
+ return;
+ }
+ switch(s->cr_index) {
+ case 0x01: /* horizontal display end */
+ case 0x07:
+ case 0x09:
+ case 0x0c:
+ case 0x0d:
+ case 0x12: /* vertical display end */
+ s->cr[s->cr_index] = val;
+ break;
+ default:
+ s->cr[s->cr_index] = val;
+ break;
+ }
+ break;
+ case 0x3ba:
+ case 0x3da:
+ s->fcr = val & 0x10;
+ break;
+ }
+}
+
+#define VGA_IO(base) \
+static uint32_t vga_read_ ## base(void *opaque, uint32_t addr, int size_log2)\
+{\
+ return vga_ioport_read(opaque, base + addr);\
+}\
+static void vga_write_ ## base(void *opaque, uint32_t addr, uint32_t val, int size_log2)\
+{\
+ return vga_ioport_write(opaque, base + addr, val);\
+}
+
+VGA_IO(0x3c0)
+VGA_IO(0x3b4)
+VGA_IO(0x3d4)
+VGA_IO(0x3ba)
+VGA_IO(0x3da)
+
+static void vbe_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ VGAState *s = opaque;
+ FBDevice *fb_dev = s->fb_dev;
+
+ if (offset == 0) {
+ s->vbe_index = val;
+ } else {
+#ifdef DEBUG_VBE
+ printf("VBE write: index=0x%04x val=0x%04x\n", s->vbe_index, val);
+#endif
+ switch(s->vbe_index) {
+ case VBE_DISPI_INDEX_ID:
+ if (val >= VBE_DISPI_ID0 && val <= VBE_DISPI_ID5)
+ s->vbe_regs[s->vbe_index] = val;
+ break;
+ case VBE_DISPI_INDEX_ENABLE:
+ if ((val & VBE_DISPI_ENABLED) &&
+ !(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
+ /* set graphic mode */
+ /* XXX: resolution change not really supported */
+ if (s->vbe_regs[VBE_DISPI_INDEX_XRES] <= 4096 &&
+ s->vbe_regs[VBE_DISPI_INDEX_YRES] <= 4096 &&
+ (s->vbe_regs[VBE_DISPI_INDEX_XRES] * 4 *
+ s->vbe_regs[VBE_DISPI_INDEX_YRES]) <= fb_dev->fb_size) {
+ fb_dev->width = s->vbe_regs[VBE_DISPI_INDEX_XRES];
+ fb_dev->height = s->vbe_regs[VBE_DISPI_INDEX_YRES];
+ fb_dev->stride = fb_dev->width * 4;
+ }
+ s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] =
+ s->vbe_regs[VBE_DISPI_INDEX_XRES];
+ s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] =
+ s->vbe_regs[VBE_DISPI_INDEX_YRES];
+ s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] = 0;
+ s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0;
+ }
+ s->vbe_regs[s->vbe_index] = val;
+ break;
+ case VBE_DISPI_INDEX_XRES:
+ case VBE_DISPI_INDEX_YRES:
+ case VBE_DISPI_INDEX_BPP:
+ case VBE_DISPI_INDEX_BANK:
+ case VBE_DISPI_INDEX_VIRT_WIDTH:
+ case VBE_DISPI_INDEX_VIRT_HEIGHT:
+ case VBE_DISPI_INDEX_X_OFFSET:
+ case VBE_DISPI_INDEX_Y_OFFSET:
+ s->vbe_regs[s->vbe_index] = val;
+ break;
+ }
+ }
+}
+
+static uint32_t vbe_read(void *opaque, uint32_t offset, int size_log2)
+{
+ VGAState *s = opaque;
+ uint32_t val;
+
+ if (offset == 0) {
+ val = s->vbe_index;
+ } else {
+ if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) {
+ switch(s->vbe_index) {
+ case VBE_DISPI_INDEX_XRES:
+ val = s->fb_dev->width;
+ break;
+ case VBE_DISPI_INDEX_YRES:
+ val = s->fb_dev->height;
+ break;
+ case VBE_DISPI_INDEX_BPP:
+ val = 32;
+ break;
+ default:
+ goto read_reg;
+ }
+ } else {
+ read_reg:
+ if (s->vbe_index < VBE_DISPI_INDEX_NB)
+ val = s->vbe_regs[s->vbe_index];
+ else
+ val = 0;
+ }
+#ifdef DEBUG_VBE
+ printf("VBE read: index=0x%04x val=0x%04x\n", s->vbe_index, val);
+#endif
+ }
+ return val;
+}
+
+
+static void simplefb_bar_set(void *opaque, int bar_num,
+ uint32_t addr, BOOL enabled)
+{
+ VGAState *s = opaque;
+ if (bar_num == 0)
+ phys_mem_set_addr(s->mem_range, addr, enabled);
+ else
+ phys_mem_set_addr(s->rom_range, addr, enabled);
+}
+
+VGAState *pci_vga_init(PCIBus *bus, FBDevice *fb_dev,
+ int width, int height,
+ const uint8_t *vga_rom_buf, int vga_rom_size)
+{
+ VGAState *s;
+ PCIDevice *d;
+ uint32_t bar_size;
+ PhysMemoryMap *mem_map, *port_map;
+
+ d = pci_register_device(bus, "VGA", -1, 0x1234, 0x1111, 0x00, 0x0300);
+
+ mem_map = pci_device_get_mem_map(d);
+ port_map = pci_device_get_port_map(d);
+
+ s = mallocz(sizeof(*s));
+ s->fb_dev = fb_dev;
+
+ fb_dev->width = width;
+ fb_dev->height = height;
+ fb_dev->stride = width * 4;
+
+ fb_dev->fb_size = (height * fb_dev->stride + FB_ALLOC_ALIGN - 1) & ~(FB_ALLOC_ALIGN - 1);
+ s->fb_page_count = fb_dev->fb_size >> DEVRAM_PAGE_SIZE_LOG2;
+
+ s->mem_range =
+ cpu_register_ram(mem_map, 0, fb_dev->fb_size,
+ DEVRAM_FLAG_DIRTY_BITS | DEVRAM_FLAG_DISABLED);
+
+ fb_dev->fb_data = s->mem_range->phys_mem;
+
+ s->pci_dev = d;
+ bar_size = 1;
+ while (bar_size < fb_dev->fb_size)
+ bar_size <<= 1;
+ pci_register_bar(d, 0, bar_size, PCI_ADDRESS_SPACE_MEM, s,
+ simplefb_bar_set);
+
+ if (vga_rom_size > 0) {
+ int rom_size;
+ /* align to page size */
+ rom_size = (vga_rom_size + DEVRAM_PAGE_SIZE - 1) & ~(DEVRAM_PAGE_SIZE - 1);
+ s->rom_range = cpu_register_ram(mem_map, 0, rom_size,
+ DEVRAM_FLAG_ROM | DEVRAM_FLAG_DISABLED);
+ memcpy(s->rom_range->phys_mem, vga_rom_buf, vga_rom_size);
+
+ bar_size = 1;
+ while (bar_size < rom_size)
+ bar_size <<= 1;
+ pci_register_bar(d, PCI_ROM_SLOT, bar_size, PCI_ADDRESS_SPACE_MEM, s,
+ simplefb_bar_set);
+ }
+
+ /* VGA memory (for simple text mode no need for callbacks) */
+ s->mem_range2 = cpu_register_ram(mem_map, 0xa0000, 0x20000, 0);
+ s->vga_ram = s->mem_range2->phys_mem;
+
+ /* standard VGA ports */
+
+ cpu_register_device(port_map, 0x3c0, 16, s, vga_read_0x3c0, vga_write_0x3c0,
+ DEVIO_SIZE8);
+ cpu_register_device(port_map, 0x3b4, 2, s, vga_read_0x3b4, vga_write_0x3b4,
+ DEVIO_SIZE8);
+ cpu_register_device(port_map, 0x3d4, 2, s, vga_read_0x3d4, vga_write_0x3d4,
+ DEVIO_SIZE8);
+ cpu_register_device(port_map, 0x3ba, 1, s, vga_read_0x3ba, vga_write_0x3ba,
+ DEVIO_SIZE8);
+ cpu_register_device(port_map, 0x3da, 1, s, vga_read_0x3da, vga_write_0x3da,
+ DEVIO_SIZE8);
+
+ /* VBE extension */
+ cpu_register_device(port_map, 0x1ce, 2, s, vbe_read, vbe_write,
+ DEVIO_SIZE16);
+
+ s->vbe_regs[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID5;
+ s->vbe_regs[VBE_DISPI_INDEX_VIDEO_MEMORY_64K] = fb_dev->fb_size >> 16;
+
+ fb_dev->device_opaque = s;
+ fb_dev->refresh = vga_refresh;
+ return s;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.c b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.c
new file mode 100644
index 0000000..8d07f44
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.c
@@ -0,0 +1,2650 @@
+/*
+ * VIRTIO driver
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdarg.h>
+
+#include "cutils.h"
+#include "list.h"
+#include "virtio.h"
+
+//#define DEBUG_VIRTIO
+
+/* MMIO addresses - from the Linux kernel */
+#define VIRTIO_MMIO_MAGIC_VALUE 0x000
+#define VIRTIO_MMIO_VERSION 0x004
+#define VIRTIO_MMIO_DEVICE_ID 0x008
+#define VIRTIO_MMIO_VENDOR_ID 0x00c
+#define VIRTIO_MMIO_DEVICE_FEATURES 0x010
+#define VIRTIO_MMIO_DEVICE_FEATURES_SEL 0x014
+#define VIRTIO_MMIO_DRIVER_FEATURES 0x020
+#define VIRTIO_MMIO_DRIVER_FEATURES_SEL 0x024
+#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 /* version 1 only */
+#define VIRTIO_MMIO_QUEUE_SEL 0x030
+#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
+#define VIRTIO_MMIO_QUEUE_NUM 0x038
+#define VIRTIO_MMIO_QUEUE_ALIGN 0x03c /* version 1 only */
+#define VIRTIO_MMIO_QUEUE_PFN 0x040 /* version 1 only */
+#define VIRTIO_MMIO_QUEUE_READY 0x044
+#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
+#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
+#define VIRTIO_MMIO_INTERRUPT_ACK 0x064
+#define VIRTIO_MMIO_STATUS 0x070
+#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080
+#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084
+#define VIRTIO_MMIO_QUEUE_AVAIL_LOW 0x090
+#define VIRTIO_MMIO_QUEUE_AVAIL_HIGH 0x094
+#define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0
+#define VIRTIO_MMIO_QUEUE_USED_HIGH 0x0a4
+#define VIRTIO_MMIO_CONFIG_GENERATION 0x0fc
+#define VIRTIO_MMIO_CONFIG 0x100
+
+/* PCI registers */
+#define VIRTIO_PCI_DEVICE_FEATURE_SEL 0x000
+#define VIRTIO_PCI_DEVICE_FEATURE 0x004
+#define VIRTIO_PCI_GUEST_FEATURE_SEL 0x008
+#define VIRTIO_PCI_GUEST_FEATURE 0x00c
+#define VIRTIO_PCI_MSIX_CONFIG 0x010
+#define VIRTIO_PCI_NUM_QUEUES 0x012
+#define VIRTIO_PCI_DEVICE_STATUS 0x014
+#define VIRTIO_PCI_CONFIG_GENERATION 0x015
+#define VIRTIO_PCI_QUEUE_SEL 0x016
+#define VIRTIO_PCI_QUEUE_SIZE 0x018
+#define VIRTIO_PCI_QUEUE_MSIX_VECTOR 0x01a
+#define VIRTIO_PCI_QUEUE_ENABLE 0x01c
+#define VIRTIO_PCI_QUEUE_NOTIFY_OFF 0x01e
+#define VIRTIO_PCI_QUEUE_DESC_LOW 0x020
+#define VIRTIO_PCI_QUEUE_DESC_HIGH 0x024
+#define VIRTIO_PCI_QUEUE_AVAIL_LOW 0x028
+#define VIRTIO_PCI_QUEUE_AVAIL_HIGH 0x02c
+#define VIRTIO_PCI_QUEUE_USED_LOW 0x030
+#define VIRTIO_PCI_QUEUE_USED_HIGH 0x034
+
+#define VIRTIO_PCI_CFG_OFFSET 0x0000
+#define VIRTIO_PCI_ISR_OFFSET 0x1000
+#define VIRTIO_PCI_CONFIG_OFFSET 0x2000
+#define VIRTIO_PCI_NOTIFY_OFFSET 0x3000
+
+#define VIRTIO_PCI_CAP_LEN 16
+
+#define MAX_QUEUE 8
+#define MAX_CONFIG_SPACE_SIZE 256
+#define MAX_QUEUE_NUM 16
+
+typedef struct {
+ uint32_t ready; /* 0 or 1 */
+ uint32_t num;
+ uint16_t last_avail_idx;
+ virtio_phys_addr_t desc_addr;
+ virtio_phys_addr_t avail_addr;
+ virtio_phys_addr_t used_addr;
+ BOOL manual_recv; /* if TRUE, the device_recv() callback is not called */
+} QueueState;
+
+#define VRING_DESC_F_NEXT 1
+#define VRING_DESC_F_WRITE 2
+#define VRING_DESC_F_INDIRECT 4
+
+typedef struct {
+ uint64_t addr;
+ uint32_t len;
+ uint16_t flags; /* VRING_DESC_F_x */
+ uint16_t next;
+} VIRTIODesc;
+
+/* return < 0 to stop the notification (it must be manually restarted
+ later), 0 if OK */
+typedef int VIRTIODeviceRecvFunc(VIRTIODevice *s1, int queue_idx,
+ int desc_idx, int read_size,
+ int write_size);
+
+/* return NULL if no RAM at this address. The mapping is valid for one page */
+typedef uint8_t *VIRTIOGetRAMPtrFunc(VIRTIODevice *s, virtio_phys_addr_t paddr, BOOL is_rw);
+
+struct VIRTIODevice {
+ PhysMemoryMap *mem_map;
+ PhysMemoryRange *mem_range;
+ /* PCI only */
+ PCIDevice *pci_dev;
+ /* MMIO only */
+ IRQSignal *irq;
+ VIRTIOGetRAMPtrFunc *get_ram_ptr;
+ int debug;
+
+ uint32_t int_status;
+ uint32_t status;
+ uint32_t device_features_sel;
+ uint32_t queue_sel; /* currently selected queue */
+ QueueState queue[MAX_QUEUE];
+
+ /* device specific */
+ uint32_t device_id;
+ uint32_t vendor_id;
+ uint32_t device_features;
+ VIRTIODeviceRecvFunc *device_recv;
+ void (*config_write)(VIRTIODevice *s); /* called after the config
+ is written */
+ uint32_t config_space_size; /* in bytes, must be multiple of 4 */
+ uint8_t config_space[MAX_CONFIG_SPACE_SIZE];
+};
+
+static uint32_t virtio_mmio_read(void *opaque, uint32_t offset1, int size_log2);
+static void virtio_mmio_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+static uint32_t virtio_pci_read(void *opaque, uint32_t offset, int size_log2);
+static void virtio_pci_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+
+static void virtio_reset(VIRTIODevice *s)
+{
+ int i;
+
+ s->status = 0;
+ s->queue_sel = 0;
+ s->device_features_sel = 0;
+ s->int_status = 0;
+ for(i = 0; i < MAX_QUEUE; i++) {
+ QueueState *qs = &s->queue[i];
+ qs->ready = 0;
+ qs->num = MAX_QUEUE_NUM;
+ qs->desc_addr = 0;
+ qs->avail_addr = 0;
+ qs->used_addr = 0;
+ qs->last_avail_idx = 0;
+ }
+}
+
+static uint8_t *virtio_pci_get_ram_ptr(VIRTIODevice *s, virtio_phys_addr_t paddr, BOOL is_rw)
+{
+ return pci_device_get_dma_ptr(s->pci_dev, paddr, is_rw);
+}
+
+static uint8_t *virtio_mmio_get_ram_ptr(VIRTIODevice *s, virtio_phys_addr_t paddr, BOOL is_rw)
+{
+ return phys_mem_get_ram_ptr(s->mem_map, paddr, is_rw);
+}
+
+static void virtio_add_pci_capability(VIRTIODevice *s, int cfg_type,
+ int bar, uint32_t offset, uint32_t len,
+ uint32_t mult)
+{
+ uint8_t cap[20];
+ int cap_len;
+ if (cfg_type == 2)
+ cap_len = 20;
+ else
+ cap_len = 16;
+ memset(cap, 0, cap_len);
+ cap[0] = 0x09; /* vendor specific */
+ cap[2] = cap_len; /* set by pci_add_capability() */
+ cap[3] = cfg_type;
+ cap[4] = bar;
+ put_le32(cap + 8, offset);
+ put_le32(cap + 12, len);
+ if (cfg_type == 2)
+ put_le32(cap + 16, mult);
+ pci_add_capability(s->pci_dev, cap, cap_len);
+}
+
+static void virtio_pci_bar_set(void *opaque, int bar_num,
+ uint32_t addr, BOOL enabled)
+{
+ VIRTIODevice *s = opaque;
+ phys_mem_set_addr(s->mem_range, addr, enabled);
+}
+
+static void virtio_init(VIRTIODevice *s, VIRTIOBusDef *bus,
+ uint32_t device_id, int config_space_size,
+ VIRTIODeviceRecvFunc *device_recv)
+{
+ memset(s, 0, sizeof(*s));
+
+ if (bus->pci_bus) {
+ uint16_t pci_device_id, class_id;
+ char name[32];
+ int bar_num;
+
+ switch(device_id) {
+ case 1:
+ pci_device_id = 0x1000; /* net */
+ class_id = 0x0200;
+ break;
+ case 2:
+ pci_device_id = 0x1001; /* block */
+ class_id = 0x0100; /* XXX: check it */
+ break;
+ case 3:
+ pci_device_id = 0x1003; /* console */
+ class_id = 0x0780;
+ break;
+ case 9:
+ pci_device_id = 0x1040 + device_id; /* use new device ID */
+ class_id = 0x2;
+ break;
+ case 18:
+ pci_device_id = 0x1040 + device_id; /* use new device ID */
+ class_id = 0x0980;
+ break;
+ default:
+ abort();
+ }
+ snprintf(name, sizeof(name), "virtio_%04x", pci_device_id);
+ s->pci_dev = pci_register_device(bus->pci_bus, name, -1,
+ 0x1af4, pci_device_id, 0x00,
+ class_id);
+ pci_device_set_config16(s->pci_dev, 0x2c, 0x1af4);
+ pci_device_set_config16(s->pci_dev, 0x2e, device_id);
+ pci_device_set_config8(s->pci_dev, PCI_INTERRUPT_PIN, 1);
+
+ bar_num = 4;
+ virtio_add_pci_capability(s, 1, bar_num,
+ VIRTIO_PCI_CFG_OFFSET, 0x1000, 0); /* common */
+ virtio_add_pci_capability(s, 3, bar_num,
+ VIRTIO_PCI_ISR_OFFSET, 0x1000, 0); /* isr */
+ virtio_add_pci_capability(s, 4, bar_num,
+ VIRTIO_PCI_CONFIG_OFFSET, 0x1000, 0); /* config */
+ virtio_add_pci_capability(s, 2, bar_num,
+ VIRTIO_PCI_NOTIFY_OFFSET, 0x1000, 0); /* notify */
+
+ s->get_ram_ptr = virtio_pci_get_ram_ptr;
+ s->irq = pci_device_get_irq(s->pci_dev, 0);
+ s->mem_map = pci_device_get_mem_map(s->pci_dev);
+ s->mem_range = cpu_register_device(s->mem_map, 0, 0x4000, s,
+ virtio_pci_read, virtio_pci_write,
+ DEVIO_SIZE8 | DEVIO_SIZE16 | DEVIO_SIZE32 | DEVIO_DISABLED);
+ pci_register_bar(s->pci_dev, bar_num, 0x4000, PCI_ADDRESS_SPACE_MEM,
+ s, virtio_pci_bar_set);
+ } else {
+ /* MMIO case */
+ s->mem_map = bus->mem_map;
+ s->irq = bus->irq;
+ s->mem_range = cpu_register_device(s->mem_map, bus->addr, VIRTIO_PAGE_SIZE,
+ s, virtio_mmio_read, virtio_mmio_write,
+ DEVIO_SIZE8 | DEVIO_SIZE16 | DEVIO_SIZE32);
+ s->get_ram_ptr = virtio_mmio_get_ram_ptr;
+ }
+
+ s->device_id = device_id;
+ s->vendor_id = 0xffff;
+ s->config_space_size = config_space_size;
+ s->device_recv = device_recv;
+ virtio_reset(s);
+}
+
+static uint16_t virtio_read16(VIRTIODevice *s, virtio_phys_addr_t addr)
+{
+ uint8_t *ptr;
+ if (addr & 1)
+ return 0; /* unaligned access are not supported */
+ ptr = s->get_ram_ptr(s, addr, FALSE);
+ if (!ptr)
+ return 0;
+ return *(uint16_t *)ptr;
+}
+
+static void virtio_write16(VIRTIODevice *s, virtio_phys_addr_t addr,
+ uint16_t val)
+{
+ uint8_t *ptr;
+ if (addr & 1)
+ return; /* unaligned access are not supported */
+ ptr = s->get_ram_ptr(s, addr, TRUE);
+ if (!ptr)
+ return;
+ *(uint16_t *)ptr = val;
+}
+
+static void virtio_write32(VIRTIODevice *s, virtio_phys_addr_t addr,
+ uint32_t val)
+{
+ uint8_t *ptr;
+ if (addr & 3)
+ return; /* unaligned access are not supported */
+ ptr = s->get_ram_ptr(s, addr, TRUE);
+ if (!ptr)
+ return;
+ *(uint32_t *)ptr = val;
+}
+
+static int virtio_memcpy_from_ram(VIRTIODevice *s, uint8_t *buf,
+ virtio_phys_addr_t addr, int count)
+{
+ uint8_t *ptr;
+ int l;
+
+ while (count > 0) {
+ l = min_int(count, VIRTIO_PAGE_SIZE - (addr & (VIRTIO_PAGE_SIZE - 1)));
+ ptr = s->get_ram_ptr(s, addr, FALSE);
+ if (!ptr)
+ return -1;
+ memcpy(buf, ptr, l);
+ addr += l;
+ buf += l;
+ count -= l;
+ }
+ return 0;
+}
+
+static int virtio_memcpy_to_ram(VIRTIODevice *s, virtio_phys_addr_t addr,
+ const uint8_t *buf, int count)
+{
+ uint8_t *ptr;
+ int l;
+
+ while (count > 0) {
+ l = min_int(count, VIRTIO_PAGE_SIZE - (addr & (VIRTIO_PAGE_SIZE - 1)));
+ ptr = s->get_ram_ptr(s, addr, TRUE);
+ if (!ptr)
+ return -1;
+ memcpy(ptr, buf, l);
+ addr += l;
+ buf += l;
+ count -= l;
+ }
+ return 0;
+}
+
+static int get_desc(VIRTIODevice *s, VIRTIODesc *desc,
+ int queue_idx, int desc_idx)
+{
+ QueueState *qs = &s->queue[queue_idx];
+ return virtio_memcpy_from_ram(s, (void *)desc, qs->desc_addr +
+ desc_idx * sizeof(VIRTIODesc),
+ sizeof(VIRTIODesc));
+}
+
+static int memcpy_to_from_queue(VIRTIODevice *s, uint8_t *buf,
+ int queue_idx, int desc_idx,
+ int offset, int count, BOOL to_queue)
+{
+ VIRTIODesc desc;
+ int l, f_write_flag;
+
+ if (count == 0)
+ return 0;
+
+ get_desc(s, &desc, queue_idx, desc_idx);
+
+ if (to_queue) {
+ f_write_flag = VRING_DESC_F_WRITE;
+ /* find the first write descriptor */
+ for(;;) {
+ if ((desc.flags & VRING_DESC_F_WRITE) == f_write_flag)
+ break;
+ if (!(desc.flags & VRING_DESC_F_NEXT))
+ return -1;
+ desc_idx = desc.next;
+ get_desc(s, &desc, queue_idx, desc_idx);
+ }
+ } else {
+ f_write_flag = 0;
+ }
+
+ /* find the descriptor at offset */
+ for(;;) {
+ if ((desc.flags & VRING_DESC_F_WRITE) != f_write_flag)
+ return -1;
+ if (offset < desc.len)
+ break;
+ if (!(desc.flags & VRING_DESC_F_NEXT))
+ return -1;
+ desc_idx = desc.next;
+ offset -= desc.len;
+ get_desc(s, &desc, queue_idx, desc_idx);
+ }
+
+ for(;;) {
+ l = min_int(count, desc.len - offset);
+ if (to_queue)
+ virtio_memcpy_to_ram(s, desc.addr + offset, buf, l);
+ else
+ virtio_memcpy_from_ram(s, buf, desc.addr + offset, l);
+ count -= l;
+ if (count == 0)
+ break;
+ offset += l;
+ buf += l;
+ if (offset == desc.len) {
+ if (!(desc.flags & VRING_DESC_F_NEXT))
+ return -1;
+ desc_idx = desc.next;
+ get_desc(s, &desc, queue_idx, desc_idx);
+ if ((desc.flags & VRING_DESC_F_WRITE) != f_write_flag)
+ return -1;
+ offset = 0;
+ }
+ }
+ return 0;
+}
+
+static int memcpy_from_queue(VIRTIODevice *s, void *buf,
+ int queue_idx, int desc_idx,
+ int offset, int count)
+{
+ return memcpy_to_from_queue(s, buf, queue_idx, desc_idx, offset, count,
+ FALSE);
+}
+
+static int memcpy_to_queue(VIRTIODevice *s,
+ int queue_idx, int desc_idx,
+ int offset, const void *buf, int count)
+{
+ return memcpy_to_from_queue(s, (void *)buf, queue_idx, desc_idx, offset,
+ count, TRUE);
+}
+
+/* signal that the descriptor has been consumed */
+static void virtio_consume_desc(VIRTIODevice *s,
+ int queue_idx, int desc_idx, int desc_len)
+{
+ QueueState *qs = &s->queue[queue_idx];
+ virtio_phys_addr_t addr;
+ uint32_t index;
+
+ addr = qs->used_addr + 2;
+ index = virtio_read16(s, addr);
+ virtio_write16(s, addr, index + 1);
+
+ addr = qs->used_addr + 4 + (index & (qs->num - 1)) * 8;
+ virtio_write32(s, addr, desc_idx);
+ virtio_write32(s, addr + 4, desc_len);
+
+ s->int_status |= 1;
+ set_irq(s->irq, 1);
+}
+
+static int get_desc_rw_size(VIRTIODevice *s,
+ int *pread_size, int *pwrite_size,
+ int queue_idx, int desc_idx)
+{
+ VIRTIODesc desc;
+ int read_size, write_size;
+
+ read_size = 0;
+ write_size = 0;
+ get_desc(s, &desc, queue_idx, desc_idx);
+
+ for(;;) {
+ if (desc.flags & VRING_DESC_F_WRITE)
+ break;
+ read_size += desc.len;
+ if (!(desc.flags & VRING_DESC_F_NEXT))
+ goto done;
+ desc_idx = desc.next;
+ get_desc(s, &desc, queue_idx, desc_idx);
+ }
+
+ for(;;) {
+ if (!(desc.flags & VRING_DESC_F_WRITE))
+ return -1;
+ write_size += desc.len;
+ if (!(desc.flags & VRING_DESC_F_NEXT))
+ break;
+ desc_idx = desc.next;
+ get_desc(s, &desc, queue_idx, desc_idx);
+ }
+
+ done:
+ *pread_size = read_size;
+ *pwrite_size = write_size;
+ return 0;
+}
+
+/* XXX: test if the queue is ready ? */
+static void queue_notify(VIRTIODevice *s, int queue_idx)
+{
+ QueueState *qs = &s->queue[queue_idx];
+ uint16_t avail_idx;
+ int desc_idx, read_size, write_size;
+
+ if (qs->manual_recv)
+ return;
+
+ avail_idx = virtio_read16(s, qs->avail_addr + 2);
+ while (qs->last_avail_idx != avail_idx) {
+ desc_idx = virtio_read16(s, qs->avail_addr + 4 +
+ (qs->last_avail_idx & (qs->num - 1)) * 2);
+ if (!get_desc_rw_size(s, &read_size, &write_size, queue_idx, desc_idx)) {
+#ifdef DEBUG_VIRTIO
+ if (s->debug & VIRTIO_DEBUG_IO) {
+ printf("queue_notify: idx=%d read_size=%d write_size=%d\n",
+ queue_idx, read_size, write_size);
+ }
+#endif
+ if (s->device_recv(s, queue_idx, desc_idx,
+ read_size, write_size) < 0)
+ break;
+ }
+ qs->last_avail_idx++;
+ }
+}
+
+static uint32_t virtio_config_read(VIRTIODevice *s, uint32_t offset,
+ int size_log2)
+{
+ uint32_t val;
+ switch(size_log2) {
+ case 0:
+ if (offset < s->config_space_size) {
+ val = s->config_space[offset];
+ } else {
+ val = 0;
+ }
+ break;
+ case 1:
+ if (offset < (s->config_space_size - 1)) {
+ val = get_le16(&s->config_space[offset]);
+ } else {
+ val = 0;
+ }
+ break;
+ case 2:
+ if (offset < (s->config_space_size - 3)) {
+ val = get_le32(s->config_space + offset);
+ } else {
+ val = 0;
+ }
+ break;
+ default:
+ abort();
+ }
+ return val;
+}
+
+static void virtio_config_write(VIRTIODevice *s, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ switch(size_log2) {
+ case 0:
+ if (offset < s->config_space_size) {
+ s->config_space[offset] = val;
+ if (s->config_write)
+ s->config_write(s);
+ }
+ break;
+ case 1:
+ if (offset < s->config_space_size - 1) {
+ put_le16(s->config_space + offset, val);
+ if (s->config_write)
+ s->config_write(s);
+ }
+ break;
+ case 2:
+ if (offset < s->config_space_size - 3) {
+ put_le32(s->config_space + offset, val);
+ if (s->config_write)
+ s->config_write(s);
+ }
+ break;
+ }
+}
+
+static uint32_t virtio_mmio_read(void *opaque, uint32_t offset, int size_log2)
+{
+ VIRTIODevice *s = opaque;
+ uint32_t val;
+
+ if (offset >= VIRTIO_MMIO_CONFIG) {
+ return virtio_config_read(s, offset - VIRTIO_MMIO_CONFIG, size_log2);
+ }
+
+ if (size_log2 == 2) {
+ switch(offset) {
+ case VIRTIO_MMIO_MAGIC_VALUE:
+ val = 0x74726976;
+ break;
+ case VIRTIO_MMIO_VERSION:
+ val = 2;
+ break;
+ case VIRTIO_MMIO_DEVICE_ID:
+ val = s->device_id;
+ break;
+ case VIRTIO_MMIO_VENDOR_ID:
+ val = s->vendor_id;
+ break;
+ case VIRTIO_MMIO_DEVICE_FEATURES:
+ switch(s->device_features_sel) {
+ case 0:
+ val = s->device_features;
+ break;
+ case 1:
+ val = 1; /* version 1 */
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ break;
+ case VIRTIO_MMIO_DEVICE_FEATURES_SEL:
+ val = s->device_features_sel;
+ break;
+ case VIRTIO_MMIO_QUEUE_SEL:
+ val = s->queue_sel;
+ break;
+ case VIRTIO_MMIO_QUEUE_NUM_MAX:
+ val = MAX_QUEUE_NUM;
+ break;
+ case VIRTIO_MMIO_QUEUE_NUM:
+ val = s->queue[s->queue_sel].num;
+ break;
+ case VIRTIO_MMIO_QUEUE_DESC_LOW:
+ val = s->queue[s->queue_sel].desc_addr;
+ break;
+ case VIRTIO_MMIO_QUEUE_AVAIL_LOW:
+ val = s->queue[s->queue_sel].avail_addr;
+ break;
+ case VIRTIO_MMIO_QUEUE_USED_LOW:
+ val = s->queue[s->queue_sel].used_addr;
+ break;
+#if VIRTIO_ADDR_BITS == 64
+ case VIRTIO_MMIO_QUEUE_DESC_HIGH:
+ val = s->queue[s->queue_sel].desc_addr >> 32;
+ break;
+ case VIRTIO_MMIO_QUEUE_AVAIL_HIGH:
+ val = s->queue[s->queue_sel].avail_addr >> 32;
+ break;
+ case VIRTIO_MMIO_QUEUE_USED_HIGH:
+ val = s->queue[s->queue_sel].used_addr >> 32;
+ break;
+#endif
+ case VIRTIO_MMIO_QUEUE_READY:
+ val = s->queue[s->queue_sel].ready;
+ break;
+ case VIRTIO_MMIO_INTERRUPT_STATUS:
+ val = s->int_status;
+ break;
+ case VIRTIO_MMIO_STATUS:
+ val = s->status;
+ break;
+ case VIRTIO_MMIO_CONFIG_GENERATION:
+ val = 0;
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ } else {
+ val = 0;
+ }
+#ifdef DEBUG_VIRTIO
+ if (s->debug & VIRTIO_DEBUG_IO) {
+ printf("virto_mmio_read: offset=0x%x val=0x%x size=%d\n",
+ offset, val, 1 << size_log2);
+ }
+#endif
+ return val;
+}
+
+#if VIRTIO_ADDR_BITS == 64
+static void set_low32(virtio_phys_addr_t *paddr, uint32_t val)
+{
+ *paddr = (*paddr & ~(virtio_phys_addr_t)0xffffffff) | val;
+}
+
+static void set_high32(virtio_phys_addr_t *paddr, uint32_t val)
+{
+ *paddr = (*paddr & 0xffffffff) | ((virtio_phys_addr_t)val << 32);
+}
+#else
+static void set_low32(virtio_phys_addr_t *paddr, uint32_t val)
+{
+ *paddr = val;
+}
+#endif
+
+static void virtio_mmio_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ VIRTIODevice *s = opaque;
+
+#ifdef DEBUG_VIRTIO
+ if (s->debug & VIRTIO_DEBUG_IO) {
+ printf("virto_mmio_write: offset=0x%x val=0x%x size=%d\n",
+ offset, val, 1 << size_log2);
+ }
+#endif
+
+ if (offset >= VIRTIO_MMIO_CONFIG) {
+ virtio_config_write(s, offset - VIRTIO_MMIO_CONFIG, val, size_log2);
+ return;
+ }
+
+ if (size_log2 == 2) {
+ switch(offset) {
+ case VIRTIO_MMIO_DEVICE_FEATURES_SEL:
+ s->device_features_sel = val;
+ break;
+ case VIRTIO_MMIO_QUEUE_SEL:
+ if (val < MAX_QUEUE)
+ s->queue_sel = val;
+ break;
+ case VIRTIO_MMIO_QUEUE_NUM:
+ if ((val & (val - 1)) == 0 && val > 0) {
+ s->queue[s->queue_sel].num = val;
+ }
+ break;
+ case VIRTIO_MMIO_QUEUE_DESC_LOW:
+ set_low32(&s->queue[s->queue_sel].desc_addr, val);
+ break;
+ case VIRTIO_MMIO_QUEUE_AVAIL_LOW:
+ set_low32(&s->queue[s->queue_sel].avail_addr, val);
+ break;
+ case VIRTIO_MMIO_QUEUE_USED_LOW:
+ set_low32(&s->queue[s->queue_sel].used_addr, val);
+ break;
+#if VIRTIO_ADDR_BITS == 64
+ case VIRTIO_MMIO_QUEUE_DESC_HIGH:
+ set_high32(&s->queue[s->queue_sel].desc_addr, val);
+ break;
+ case VIRTIO_MMIO_QUEUE_AVAIL_HIGH:
+ set_high32(&s->queue[s->queue_sel].avail_addr, val);
+ break;
+ case VIRTIO_MMIO_QUEUE_USED_HIGH:
+ set_high32(&s->queue[s->queue_sel].used_addr, val);
+ break;
+#endif
+ case VIRTIO_MMIO_STATUS:
+ s->status = val;
+ if (val == 0) {
+ /* reset */
+ set_irq(s->irq, 0);
+ virtio_reset(s);
+ }
+ break;
+ case VIRTIO_MMIO_QUEUE_READY:
+ s->queue[s->queue_sel].ready = val & 1;
+ break;
+ case VIRTIO_MMIO_QUEUE_NOTIFY:
+ if (val < MAX_QUEUE)
+ queue_notify(s, val);
+ break;
+ case VIRTIO_MMIO_INTERRUPT_ACK:
+ s->int_status &= ~val;
+ if (s->int_status == 0) {
+ set_irq(s->irq, 0);
+ }
+ break;
+ }
+ }
+}
+
+static uint32_t virtio_pci_read(void *opaque, uint32_t offset1, int size_log2)
+{
+ VIRTIODevice *s = opaque;
+ uint32_t offset;
+ uint32_t val = 0;
+
+ offset = offset1 & 0xfff;
+ switch(offset1 >> 12) {
+ case VIRTIO_PCI_CFG_OFFSET >> 12:
+ if (size_log2 == 2) {
+ switch(offset) {
+ case VIRTIO_PCI_DEVICE_FEATURE:
+ switch(s->device_features_sel) {
+ case 0:
+ val = s->device_features;
+ break;
+ case 1:
+ val = 1; /* version 1 */
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ break;
+ case VIRTIO_PCI_DEVICE_FEATURE_SEL:
+ val = s->device_features_sel;
+ break;
+ case VIRTIO_PCI_QUEUE_DESC_LOW:
+ val = s->queue[s->queue_sel].desc_addr;
+ break;
+ case VIRTIO_PCI_QUEUE_AVAIL_LOW:
+ val = s->queue[s->queue_sel].avail_addr;
+ break;
+ case VIRTIO_PCI_QUEUE_USED_LOW:
+ val = s->queue[s->queue_sel].used_addr;
+ break;
+#if VIRTIO_ADDR_BITS == 64
+ case VIRTIO_PCI_QUEUE_DESC_HIGH:
+ val = s->queue[s->queue_sel].desc_addr >> 32;
+ break;
+ case VIRTIO_PCI_QUEUE_AVAIL_HIGH:
+ val = s->queue[s->queue_sel].avail_addr >> 32;
+ break;
+ case VIRTIO_PCI_QUEUE_USED_HIGH:
+ val = s->queue[s->queue_sel].used_addr >> 32;
+ break;
+#endif
+ }
+ } else if (size_log2 == 1) {
+ switch(offset) {
+ case VIRTIO_PCI_NUM_QUEUES:
+ val = MAX_QUEUE_NUM;
+ break;
+ case VIRTIO_PCI_QUEUE_SEL:
+ val = s->queue_sel;
+ break;
+ case VIRTIO_PCI_QUEUE_SIZE:
+ val = s->queue[s->queue_sel].num;
+ break;
+ case VIRTIO_PCI_QUEUE_ENABLE:
+ val = s->queue[s->queue_sel].ready;
+ break;
+ case VIRTIO_PCI_QUEUE_NOTIFY_OFF:
+ val = 0;
+ break;
+ }
+ } else if (size_log2 == 0) {
+ switch(offset) {
+ case VIRTIO_PCI_DEVICE_STATUS:
+ val = s->status;
+ break;
+ }
+ }
+ break;
+ case VIRTIO_PCI_ISR_OFFSET >> 12:
+ if (offset == 0 && size_log2 == 0) {
+ val = s->int_status;
+ s->int_status = 0;
+ set_irq(s->irq, 0);
+ }
+ break;
+ case VIRTIO_PCI_CONFIG_OFFSET >> 12:
+ val = virtio_config_read(s, offset, size_log2);
+ break;
+ }
+#ifdef DEBUG_VIRTIO
+ if (s->debug & VIRTIO_DEBUG_IO) {
+ printf("virto_pci_read: offset=0x%x val=0x%x size=%d\n",
+ offset1, val, 1 << size_log2);
+ }
+#endif
+ return val;
+}
+
+static void virtio_pci_write(void *opaque, uint32_t offset1,
+ uint32_t val, int size_log2)
+{
+ VIRTIODevice *s = opaque;
+ uint32_t offset;
+
+#ifdef DEBUG_VIRTIO
+ if (s->debug & VIRTIO_DEBUG_IO) {
+ printf("virto_pci_write: offset=0x%x val=0x%x size=%d\n",
+ offset1, val, 1 << size_log2);
+ }
+#endif
+ offset = offset1 & 0xfff;
+ switch(offset1 >> 12) {
+ case VIRTIO_PCI_CFG_OFFSET >> 12:
+ if (size_log2 == 2) {
+ switch(offset) {
+ case VIRTIO_PCI_DEVICE_FEATURE_SEL:
+ s->device_features_sel = val;
+ break;
+ case VIRTIO_PCI_QUEUE_DESC_LOW:
+ set_low32(&s->queue[s->queue_sel].desc_addr, val);
+ break;
+ case VIRTIO_PCI_QUEUE_AVAIL_LOW:
+ set_low32(&s->queue[s->queue_sel].avail_addr, val);
+ break;
+ case VIRTIO_PCI_QUEUE_USED_LOW:
+ set_low32(&s->queue[s->queue_sel].used_addr, val);
+ break;
+#if VIRTIO_ADDR_BITS == 64
+ case VIRTIO_PCI_QUEUE_DESC_HIGH:
+ set_high32(&s->queue[s->queue_sel].desc_addr, val);
+ break;
+ case VIRTIO_PCI_QUEUE_AVAIL_HIGH:
+ set_high32(&s->queue[s->queue_sel].avail_addr, val);
+ break;
+ case VIRTIO_PCI_QUEUE_USED_HIGH:
+ set_high32(&s->queue[s->queue_sel].used_addr, val);
+ break;
+#endif
+ }
+ } else if (size_log2 == 1) {
+ switch(offset) {
+ case VIRTIO_PCI_QUEUE_SEL:
+ if (val < MAX_QUEUE)
+ s->queue_sel = val;
+ break;
+ case VIRTIO_PCI_QUEUE_SIZE:
+ if ((val & (val - 1)) == 0 && val > 0) {
+ s->queue[s->queue_sel].num = val;
+ }
+ break;
+ case VIRTIO_PCI_QUEUE_ENABLE:
+ s->queue[s->queue_sel].ready = val & 1;
+ break;
+ }
+ } else if (size_log2 == 0) {
+ switch(offset) {
+ case VIRTIO_PCI_DEVICE_STATUS:
+ s->status = val;
+ if (val == 0) {
+ /* reset */
+ set_irq(s->irq, 0);
+ virtio_reset(s);
+ }
+ break;
+ }
+ }
+ break;
+ case VIRTIO_PCI_CONFIG_OFFSET >> 12:
+ virtio_config_write(s, offset, val, size_log2);
+ break;
+ case VIRTIO_PCI_NOTIFY_OFFSET >> 12:
+ if (val < MAX_QUEUE)
+ queue_notify(s, val);
+ break;
+ }
+}
+
+void virtio_set_debug(VIRTIODevice *s, int debug)
+{
+ s->debug = debug;
+}
+
+static void virtio_config_change_notify(VIRTIODevice *s)
+{
+ /* INT_CONFIG interrupt */
+ s->int_status |= 2;
+ set_irq(s->irq, 1);
+}
+
+/*********************************************************************/
+/* block device */
+
+typedef struct {
+ uint32_t type;
+ uint8_t *buf;
+ int write_size;
+ int queue_idx;
+ int desc_idx;
+} BlockRequest;
+
+typedef struct VIRTIOBlockDevice {
+ VIRTIODevice common;
+ BlockDevice *bs;
+
+ BOOL req_in_progress;
+ BlockRequest req; /* request in progress */
+} VIRTIOBlockDevice;
+
+typedef struct {
+ uint32_t type;
+ uint32_t ioprio;
+ uint64_t sector_num;
+} BlockRequestHeader;
+
+#define VIRTIO_BLK_T_IN 0
+#define VIRTIO_BLK_T_OUT 1
+#define VIRTIO_BLK_T_FLUSH 4
+#define VIRTIO_BLK_T_FLUSH_OUT 5
+
+#define VIRTIO_BLK_S_OK 0
+#define VIRTIO_BLK_S_IOERR 1
+#define VIRTIO_BLK_S_UNSUPP 2
+
+#define SECTOR_SIZE 512
+
+static void virtio_block_req_end(VIRTIODevice *s, int ret)
+{
+ VIRTIOBlockDevice *s1 = (VIRTIOBlockDevice *)s;
+ int write_size;
+ int queue_idx = s1->req.queue_idx;
+ int desc_idx = s1->req.desc_idx;
+ uint8_t *buf, buf1[1];
+
+ switch(s1->req.type) {
+ case VIRTIO_BLK_T_IN:
+ write_size = s1->req.write_size;
+ buf = s1->req.buf;
+ if (ret < 0) {
+ buf[write_size - 1] = VIRTIO_BLK_S_IOERR;
+ } else {
+ buf[write_size - 1] = VIRTIO_BLK_S_OK;
+ }
+ memcpy_to_queue(s, queue_idx, desc_idx, 0, buf, write_size);
+ free(buf);
+ virtio_consume_desc(s, queue_idx, desc_idx, write_size);
+ break;
+ case VIRTIO_BLK_T_OUT:
+ if (ret < 0)
+ buf1[0] = VIRTIO_BLK_S_IOERR;
+ else
+ buf1[0] = VIRTIO_BLK_S_OK;
+ memcpy_to_queue(s, queue_idx, desc_idx, 0, buf1, sizeof(buf1));
+ virtio_consume_desc(s, queue_idx, desc_idx, 1);
+ break;
+ default:
+ abort();
+ }
+}
+
+static void virtio_block_req_cb(void *opaque, int ret)
+{
+ VIRTIODevice *s = opaque;
+ VIRTIOBlockDevice *s1 = (VIRTIOBlockDevice *)s;
+
+ virtio_block_req_end(s, ret);
+
+ s1->req_in_progress = FALSE;
+
+ /* handle next requests */
+ queue_notify((VIRTIODevice *)s, s1->req.queue_idx);
+}
+
+/* XXX: handle async I/O */
+static int virtio_block_recv_request(VIRTIODevice *s, int queue_idx,
+ int desc_idx, int read_size,
+ int write_size)
+{
+ VIRTIOBlockDevice *s1 = (VIRTIOBlockDevice *)s;
+ BlockDevice *bs = s1->bs;
+ BlockRequestHeader h;
+ uint8_t *buf;
+ int len, ret;
+
+ if (s1->req_in_progress)
+ return -1;
+
+ if (memcpy_from_queue(s, &h, queue_idx, desc_idx, 0, sizeof(h)) < 0)
+ return 0;
+ s1->req.type = h.type;
+ s1->req.queue_idx = queue_idx;
+ s1->req.desc_idx = desc_idx;
+ switch(h.type) {
+ case VIRTIO_BLK_T_IN:
+ s1->req.buf = malloc(write_size);
+ s1->req.write_size = write_size;
+ ret = bs->read_async(bs, h.sector_num, s1->req.buf,
+ (write_size - 1) / SECTOR_SIZE,
+ virtio_block_req_cb, s);
+ if (ret > 0) {
+ /* asyncronous read */
+ s1->req_in_progress = TRUE;
+ } else {
+ virtio_block_req_end(s, ret);
+ }
+ break;
+ case VIRTIO_BLK_T_OUT:
+ assert(write_size >= 1);
+ len = read_size - sizeof(h);
+ buf = malloc(len);
+ memcpy_from_queue(s, buf, queue_idx, desc_idx, sizeof(h), len);
+ ret = bs->write_async(bs, h.sector_num, buf, len / SECTOR_SIZE,
+ virtio_block_req_cb, s);
+ free(buf);
+ if (ret > 0) {
+ /* asyncronous write */
+ s1->req_in_progress = TRUE;
+ } else {
+ virtio_block_req_end(s, ret);
+ }
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+VIRTIODevice *virtio_block_init(VIRTIOBusDef *bus, BlockDevice *bs)
+{
+ VIRTIOBlockDevice *s;
+ uint64_t nb_sectors;
+
+ s = mallocz(sizeof(*s));
+ virtio_init(&s->common, bus,
+ 2, 8, virtio_block_recv_request);
+ s->bs = bs;
+
+ nb_sectors = bs->get_sector_count(bs);
+ put_le32(s->common.config_space, nb_sectors);
+ put_le32(s->common.config_space + 4, nb_sectors >> 32);
+
+ return (VIRTIODevice *)s;
+}
+
+/*********************************************************************/
+/* network device */
+
+typedef struct VIRTIONetDevice {
+ VIRTIODevice common;
+ EthernetDevice *es;
+ int header_size;
+} VIRTIONetDevice;
+
+typedef struct {
+ uint8_t flags;
+ uint8_t gso_type;
+ uint16_t hdr_len;
+ uint16_t gso_size;
+ uint16_t csum_start;
+ uint16_t csum_offset;
+ uint16_t num_buffers;
+} VIRTIONetHeader;
+
+static int virtio_net_recv_request(VIRTIODevice *s, int queue_idx,
+ int desc_idx, int read_size,
+ int write_size)
+{
+ VIRTIONetDevice *s1 = (VIRTIONetDevice *)s;
+ EthernetDevice *es = s1->es;
+ VIRTIONetHeader h;
+ uint8_t *buf;
+ int len;
+
+ if (queue_idx == 1) {
+ /* send to network */
+ if (memcpy_from_queue(s, &h, queue_idx, desc_idx, 0, s1->header_size) < 0)
+ return 0;
+ len = read_size - s1->header_size;
+ buf = malloc(len);
+ memcpy_from_queue(s, buf, queue_idx, desc_idx, s1->header_size, len);
+ es->write_packet(es, buf, len);
+ free(buf);
+ virtio_consume_desc(s, queue_idx, desc_idx, 0);
+ }
+ return 0;
+}
+
+static BOOL virtio_net_can_write_packet(EthernetDevice *es)
+{
+ VIRTIODevice *s = es->device_opaque;
+ QueueState *qs = &s->queue[0];
+ uint16_t avail_idx;
+
+ if (!qs->ready)
+ return FALSE;
+ avail_idx = virtio_read16(s, qs->avail_addr + 2);
+ return qs->last_avail_idx != avail_idx;
+}
+
+static void virtio_net_write_packet(EthernetDevice *es, const uint8_t *buf, int buf_len)
+{
+ VIRTIODevice *s = es->device_opaque;
+ VIRTIONetDevice *s1 = (VIRTIONetDevice *)s;
+ int queue_idx = 0;
+ QueueState *qs = &s->queue[queue_idx];
+ int desc_idx;
+ VIRTIONetHeader h;
+ int len, read_size, write_size;
+ uint16_t avail_idx;
+
+ if (!qs->ready)
+ return;
+ avail_idx = virtio_read16(s, qs->avail_addr + 2);
+ if (qs->last_avail_idx == avail_idx)
+ return;
+ desc_idx = virtio_read16(s, qs->avail_addr + 4 +
+ (qs->last_avail_idx & (qs->num - 1)) * 2);
+ if (get_desc_rw_size(s, &read_size, &write_size, queue_idx, desc_idx))
+ return;
+ len = s1->header_size + buf_len;
+ if (len > write_size)
+ return;
+ memset(&h, 0, s1->header_size);
+ memcpy_to_queue(s, queue_idx, desc_idx, 0, &h, s1->header_size);
+ memcpy_to_queue(s, queue_idx, desc_idx, s1->header_size, buf, buf_len);
+ virtio_consume_desc(s, queue_idx, desc_idx, len);
+ qs->last_avail_idx++;
+}
+
+static void virtio_net_set_carrier(EthernetDevice *es, BOOL carrier_state)
+{
+#if 0
+ VIRTIODevice *s1 = es->device_opaque;
+ VIRTIONetDevice *s = (VIRTIONetDevice *)s1;
+ int cur_carrier_state;
+
+ // printf("virtio_net_set_carrier: %d\n", carrier_state);
+ cur_carrier_state = s->common.config_space[6] & 1;
+ if (cur_carrier_state != carrier_state) {
+ s->common.config_space[6] = (carrier_state << 0);
+ virtio_config_change_notify(s1);
+ }
+#endif
+}
+
+VIRTIODevice *virtio_net_init(VIRTIOBusDef *bus, EthernetDevice *es)
+{
+ VIRTIONetDevice *s;
+
+ s = mallocz(sizeof(*s));
+ virtio_init(&s->common, bus,
+ 1, 6 + 2, virtio_net_recv_request);
+ /* VIRTIO_NET_F_MAC, VIRTIO_NET_F_STATUS */
+ s->common.device_features = (1 << 5) /* | (1 << 16) */;
+ s->common.queue[0].manual_recv = TRUE;
+ s->es = es;
+ memcpy(s->common.config_space, es->mac_addr, 6);
+ /* status */
+ s->common.config_space[6] = 0;
+ s->common.config_space[7] = 0;
+
+ s->header_size = sizeof(VIRTIONetHeader);
+
+ es->device_opaque = s;
+ es->device_can_write_packet = virtio_net_can_write_packet;
+ es->device_write_packet = virtio_net_write_packet;
+ es->device_set_carrier = virtio_net_set_carrier;
+ return (VIRTIODevice *)s;
+}
+
+/*********************************************************************/
+/* console device */
+
+typedef struct VIRTIOConsoleDevice {
+ VIRTIODevice common;
+ CharacterDevice *cs;
+} VIRTIOConsoleDevice;
+
+static int virtio_console_recv_request(VIRTIODevice *s, int queue_idx,
+ int desc_idx, int read_size,
+ int write_size)
+{
+ VIRTIOConsoleDevice *s1 = (VIRTIOConsoleDevice *)s;
+ CharacterDevice *cs = s1->cs;
+ uint8_t *buf;
+
+ if (queue_idx == 1) {
+ /* send to console */
+ buf = malloc(read_size);
+ memcpy_from_queue(s, buf, queue_idx, desc_idx, 0, read_size);
+ cs->write_data(cs->opaque, buf, read_size);
+ free(buf);
+ virtio_consume_desc(s, queue_idx, desc_idx, 0);
+ }
+ return 0;
+}
+
+BOOL virtio_console_can_write_data(VIRTIODevice *s)
+{
+ QueueState *qs = &s->queue[0];
+ uint16_t avail_idx;
+
+ if (!qs->ready)
+ return FALSE;
+ avail_idx = virtio_read16(s, qs->avail_addr + 2);
+ return qs->last_avail_idx != avail_idx;
+}
+
+int virtio_console_get_write_len(VIRTIODevice *s)
+{
+ int queue_idx = 0;
+ QueueState *qs = &s->queue[queue_idx];
+ int desc_idx;
+ int read_size, write_size;
+ uint16_t avail_idx;
+
+ if (!qs->ready)
+ return 0;
+ avail_idx = virtio_read16(s, qs->avail_addr + 2);
+ if (qs->last_avail_idx == avail_idx)
+ return 0;
+ desc_idx = virtio_read16(s, qs->avail_addr + 4 +
+ (qs->last_avail_idx & (qs->num - 1)) * 2);
+ if (get_desc_rw_size(s, &read_size, &write_size, queue_idx, desc_idx))
+ return 0;
+ return write_size;
+}
+
+int virtio_console_write_data(VIRTIODevice *s, const uint8_t *buf, int buf_len)
+{
+ int queue_idx = 0;
+ QueueState *qs = &s->queue[queue_idx];
+ int desc_idx;
+ uint16_t avail_idx;
+
+ if (!qs->ready)
+ return 0;
+ avail_idx = virtio_read16(s, qs->avail_addr + 2);
+ if (qs->last_avail_idx == avail_idx)
+ return 0;
+ desc_idx = virtio_read16(s, qs->avail_addr + 4 +
+ (qs->last_avail_idx & (qs->num - 1)) * 2);
+ memcpy_to_queue(s, queue_idx, desc_idx, 0, buf, buf_len);
+ virtio_consume_desc(s, queue_idx, desc_idx, buf_len);
+ qs->last_avail_idx++;
+ return buf_len;
+}
+
+/* send a resize event */
+void virtio_console_resize_event(VIRTIODevice *s, int width, int height)
+{
+ /* indicate the console size */
+ put_le16(s->config_space + 0, width);
+ put_le16(s->config_space + 2, height);
+
+ virtio_config_change_notify(s);
+}
+
+VIRTIODevice *virtio_console_init(VIRTIOBusDef *bus, CharacterDevice *cs)
+{
+ VIRTIOConsoleDevice *s;
+
+ s = mallocz(sizeof(*s));
+ virtio_init(&s->common, bus,
+ 3, 4, virtio_console_recv_request);
+ s->common.device_features = (1 << 0); /* VIRTIO_CONSOLE_F_SIZE */
+ s->common.queue[0].manual_recv = TRUE;
+
+ s->cs = cs;
+ return (VIRTIODevice *)s;
+}
+
+/*********************************************************************/
+/* input device */
+
+enum {
+ VIRTIO_INPUT_CFG_UNSET = 0x00,
+ VIRTIO_INPUT_CFG_ID_NAME = 0x01,
+ VIRTIO_INPUT_CFG_ID_SERIAL = 0x02,
+ VIRTIO_INPUT_CFG_ID_DEVIDS = 0x03,
+ VIRTIO_INPUT_CFG_PROP_BITS = 0x10,
+ VIRTIO_INPUT_CFG_EV_BITS = 0x11,
+ VIRTIO_INPUT_CFG_ABS_INFO = 0x12,
+};
+
+#define VIRTIO_INPUT_EV_SYN 0x00
+#define VIRTIO_INPUT_EV_KEY 0x01
+#define VIRTIO_INPUT_EV_REL 0x02
+#define VIRTIO_INPUT_EV_ABS 0x03
+#define VIRTIO_INPUT_EV_REP 0x14
+
+#define BTN_LEFT 0x110
+#define BTN_RIGHT 0x111
+#define BTN_MIDDLE 0x112
+#define BTN_GEAR_DOWN 0x150
+#define BTN_GEAR_UP 0x151
+
+#define REL_X 0x00
+#define REL_Y 0x01
+#define REL_Z 0x02
+#define REL_WHEEL 0x08
+
+#define ABS_X 0x00
+#define ABS_Y 0x01
+#define ABS_Z 0x02
+
+typedef struct VIRTIOInputDevice {
+ VIRTIODevice common;
+ VirtioInputTypeEnum type;
+ uint32_t buttons_state;
+} VIRTIOInputDevice;
+
+static const uint16_t buttons_list[] = {
+ BTN_LEFT, BTN_RIGHT, BTN_MIDDLE
+};
+
+static int virtio_input_recv_request(VIRTIODevice *s, int queue_idx,
+ int desc_idx, int read_size,
+ int write_size)
+{
+ if (queue_idx == 1) {
+ /* led & keyboard updates */
+ // printf("%s: write_size=%d\n", __func__, write_size);
+ virtio_consume_desc(s, queue_idx, desc_idx, 0);
+ }
+ return 0;
+}
+
+/* return < 0 if could not send key event */
+static int virtio_input_queue_event(VIRTIODevice *s,
+ uint16_t type, uint16_t code,
+ uint32_t value)
+{
+ int queue_idx = 0;
+ QueueState *qs = &s->queue[queue_idx];
+ int desc_idx, buf_len;
+ uint16_t avail_idx;
+ uint8_t buf[8];
+
+ if (!qs->ready)
+ return -1;
+
+ put_le16(buf, type);
+ put_le16(buf + 2, code);
+ put_le32(buf + 4, value);
+ buf_len = 8;
+
+ avail_idx = virtio_read16(s, qs->avail_addr + 2);
+ if (qs->last_avail_idx == avail_idx)
+ return -1;
+ desc_idx = virtio_read16(s, qs->avail_addr + 4 +
+ (qs->last_avail_idx & (qs->num - 1)) * 2);
+ // printf("send: queue_idx=%d desc_idx=%d\n", queue_idx, desc_idx);
+ memcpy_to_queue(s, queue_idx, desc_idx, 0, buf, buf_len);
+ virtio_consume_desc(s, queue_idx, desc_idx, buf_len);
+ qs->last_avail_idx++;
+ return 0;
+}
+
+int virtio_input_send_key_event(VIRTIODevice *s, BOOL is_down,
+ uint16_t key_code)
+{
+ VIRTIOInputDevice *s1 = (VIRTIOInputDevice *)s;
+ int ret;
+
+ if (s1->type != VIRTIO_INPUT_TYPE_KEYBOARD)
+ return -1;
+ ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_KEY, key_code, is_down);
+ if (ret)
+ return ret;
+ return virtio_input_queue_event(s, VIRTIO_INPUT_EV_SYN, 0, 0);
+}
+
+/* also used for the tablet */
+int virtio_input_send_mouse_event(VIRTIODevice *s, int dx, int dy, int dz,
+ unsigned int buttons)
+{
+ VIRTIOInputDevice *s1 = (VIRTIOInputDevice *)s;
+ int ret, i, b, last_b;
+
+ if (s1->type != VIRTIO_INPUT_TYPE_MOUSE &&
+ s1->type != VIRTIO_INPUT_TYPE_TABLET)
+ return -1;
+ if (s1->type == VIRTIO_INPUT_TYPE_MOUSE) {
+ ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_REL, REL_X, dx);
+ if (ret != 0)
+ return ret;
+ ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_REL, REL_Y, dy);
+ if (ret != 0)
+ return ret;
+ } else {
+ ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_ABS, ABS_X, dx);
+ if (ret != 0)
+ return ret;
+ ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_ABS, ABS_Y, dy);
+ if (ret != 0)
+ return ret;
+ }
+ if (dz != 0) {
+ ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_REL, REL_WHEEL, dz);
+ if (ret != 0)
+ return ret;
+ }
+
+ if (buttons != s1->buttons_state) {
+ for(i = 0; i < countof(buttons_list); i++) {
+ b = (buttons >> i) & 1;
+ last_b = (s1->buttons_state >> i) & 1;
+ if (b != last_b) {
+ ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_KEY,
+ buttons_list[i], b);
+ if (ret != 0)
+ return ret;
+ }
+ }
+ s1->buttons_state = buttons;
+ }
+
+ return virtio_input_queue_event(s, VIRTIO_INPUT_EV_SYN, 0, 0);
+}
+
+static void set_bit(uint8_t *tab, int k)
+{
+ tab[k >> 3] |= 1 << (k & 7);
+}
+
+static void virtio_input_config_write(VIRTIODevice *s)
+{
+ VIRTIOInputDevice *s1 = (VIRTIOInputDevice *)s;
+ uint8_t *config = s->config_space;
+ int i;
+
+ // printf("config_write: %02x %02x\n", config[0], config[1]);
+ switch(config[0]) {
+ case VIRTIO_INPUT_CFG_UNSET:
+ break;
+ case VIRTIO_INPUT_CFG_ID_NAME:
+ {
+ const char *name;
+ int len;
+ switch(s1->type) {
+ case VIRTIO_INPUT_TYPE_KEYBOARD:
+ name = "virtio_keyboard";
+ break;
+ case VIRTIO_INPUT_TYPE_MOUSE:
+ name = "virtio_mouse";
+ break;
+ case VIRTIO_INPUT_TYPE_TABLET:
+ name = "virtio_tablet";
+ break;
+ default:
+ abort();
+ }
+ len = strlen(name);
+ config[2] = len;
+ memcpy(config + 8, name, len);
+ }
+ break;
+ default:
+ case VIRTIO_INPUT_CFG_ID_SERIAL:
+ case VIRTIO_INPUT_CFG_ID_DEVIDS:
+ case VIRTIO_INPUT_CFG_PROP_BITS:
+ config[2] = 0; /* size of reply */
+ break;
+ case VIRTIO_INPUT_CFG_EV_BITS:
+ config[2] = 0;
+ switch(s1->type) {
+ case VIRTIO_INPUT_TYPE_KEYBOARD:
+ switch(config[1]) {
+ case VIRTIO_INPUT_EV_KEY:
+ config[2] = 128 / 8;
+ memset(config + 8, 0xff, 128 / 8); /* bitmap */
+ break;
+ case VIRTIO_INPUT_EV_REP: /* allow key repetition */
+ config[2] = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+ case VIRTIO_INPUT_TYPE_MOUSE:
+ switch(config[1]) {
+ case VIRTIO_INPUT_EV_KEY:
+ config[2] = 512 / 8;
+ memset(config + 8, 0, 512 / 8); /* bitmap */
+ for(i = 0; i < countof(buttons_list); i++)
+ set_bit(config + 8, buttons_list[i]);
+ break;
+ case VIRTIO_INPUT_EV_REL:
+ config[2] = 2;
+ config[8] = 0;
+ config[9] = 0;
+ set_bit(config + 8, REL_X);
+ set_bit(config + 8, REL_Y);
+ set_bit(config + 8, REL_WHEEL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case VIRTIO_INPUT_TYPE_TABLET:
+ switch(config[1]) {
+ case VIRTIO_INPUT_EV_KEY:
+ config[2] = 512 / 8;
+ memset(config + 8, 0, 512 / 8); /* bitmap */
+ for(i = 0; i < countof(buttons_list); i++)
+ set_bit(config + 8, buttons_list[i]);
+ break;
+ case VIRTIO_INPUT_EV_REL:
+ config[2] = 2;
+ config[8] = 0;
+ config[9] = 0;
+ set_bit(config + 8, REL_WHEEL);
+ break;
+ case VIRTIO_INPUT_EV_ABS:
+ config[2] = 1;
+ config[8] = 0;
+ set_bit(config + 8, ABS_X);
+ set_bit(config + 8, ABS_Y);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ abort();
+ }
+ break;
+ case VIRTIO_INPUT_CFG_ABS_INFO:
+ if (s1->type == VIRTIO_INPUT_TYPE_TABLET && config[1] <= 1) {
+ /* for ABS_X and ABS_Y */
+ config[2] = 5 * 4;
+ put_le32(config + 8, 0); /* min */
+ put_le32(config + 12, VIRTIO_INPUT_ABS_SCALE - 1) ; /* max */
+ put_le32(config + 16, 0); /* fuzz */
+ put_le32(config + 20, 0); /* flat */
+ put_le32(config + 24, 0); /* res */
+ }
+ break;
+ }
+}
+
+VIRTIODevice *virtio_input_init(VIRTIOBusDef *bus, VirtioInputTypeEnum type)
+{
+ VIRTIOInputDevice *s;
+
+ s = mallocz(sizeof(*s));
+ virtio_init(&s->common, bus,
+ 18, 256, virtio_input_recv_request);
+ s->common.queue[0].manual_recv = TRUE;
+ s->common.device_features = 0;
+ s->common.config_write = virtio_input_config_write;
+ s->type = type;
+ return (VIRTIODevice *)s;
+}
+
+/*********************************************************************/
+/* 9p filesystem device */
+
+typedef struct {
+ struct list_head link;
+ uint32_t fid;
+ FSFile *fd;
+} FIDDesc;
+
+typedef struct VIRTIO9PDevice {
+ VIRTIODevice common;
+ FSDevice *fs;
+ int msize; /* maximum message size */
+ struct list_head fid_list; /* list of FIDDesc */
+ BOOL req_in_progress;
+} VIRTIO9PDevice;
+
+static FIDDesc *fid_find1(VIRTIO9PDevice *s, uint32_t fid)
+{
+ struct list_head *el;
+ FIDDesc *f;
+
+ list_for_each(el, &s->fid_list) {
+ f = list_entry(el, FIDDesc, link);
+ if (f->fid == fid)
+ return f;
+ }
+ return NULL;
+}
+
+static FSFile *fid_find(VIRTIO9PDevice *s, uint32_t fid)
+{
+ FIDDesc *f;
+
+ f = fid_find1(s, fid);
+ if (!f)
+ return NULL;
+ return f->fd;
+}
+
+static void fid_delete(VIRTIO9PDevice *s, uint32_t fid)
+{
+ FIDDesc *f;
+
+ f = fid_find1(s, fid);
+ if (f) {
+ s->fs->fs_delete(s->fs, f->fd);
+ list_del(&f->link);
+ free(f);
+ }
+}
+
+static void fid_set(VIRTIO9PDevice *s, uint32_t fid, FSFile *fd)
+{
+ FIDDesc *f;
+
+ f = fid_find1(s, fid);
+ if (f) {
+ s->fs->fs_delete(s->fs, f->fd);
+ f->fd = fd;
+ } else {
+ f = malloc(sizeof(*f));
+ f->fid = fid;
+ f->fd = fd;
+ list_add(&f->link, &s->fid_list);
+ }
+}
+
+#ifdef DEBUG_VIRTIO
+
+typedef struct {
+ uint8_t tag;
+ const char *name;
+} Virtio9POPName;
+
+static const Virtio9POPName virtio_9p_op_names[] = {
+ { 8, "statfs" },
+ { 12, "lopen" },
+ { 14, "lcreate" },
+ { 16, "symlink" },
+ { 18, "mknod" },
+ { 22, "readlink" },
+ { 24, "getattr" },
+ { 26, "setattr" },
+ { 30, "xattrwalk" },
+ { 40, "readdir" },
+ { 50, "fsync" },
+ { 52, "lock" },
+ { 54, "getlock" },
+ { 70, "link" },
+ { 72, "mkdir" },
+ { 74, "renameat" },
+ { 76, "unlinkat" },
+ { 100, "version" },
+ { 104, "attach" },
+ { 108, "flush" },
+ { 110, "walk" },
+ { 116, "read" },
+ { 118, "write" },
+ { 120, "clunk" },
+ { 0, NULL },
+};
+
+static const char *get_9p_op_name(int tag)
+{
+ const Virtio9POPName *p;
+ for(p = virtio_9p_op_names; p->name != NULL; p++) {
+ if (p->tag == tag)
+ return p->name;
+ }
+ return NULL;
+}
+
+#endif /* DEBUG_VIRTIO */
+
+static int marshall(VIRTIO9PDevice *s,
+ uint8_t *buf1, int max_len, const char *fmt, ...)
+{
+ va_list ap;
+ int c;
+ uint32_t val;
+ uint64_t val64;
+ uint8_t *buf, *buf_end;
+
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" ->");
+#endif
+ va_start(ap, fmt);
+ buf = buf1;
+ buf_end = buf1 + max_len;
+ for(;;) {
+ c = *fmt++;
+ if (c == '\0')
+ break;
+ switch(c) {
+ case 'b':
+ assert(buf + 1 <= buf_end);
+ val = va_arg(ap, int);
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" b=%d", val);
+#endif
+ buf[0] = val;
+ buf += 1;
+ break;
+ case 'h':
+ assert(buf + 2 <= buf_end);
+ val = va_arg(ap, int);
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" h=%d", val);
+#endif
+ put_le16(buf, val);
+ buf += 2;
+ break;
+ case 'w':
+ assert(buf + 4 <= buf_end);
+ val = va_arg(ap, int);
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" w=%d", val);
+#endif
+ put_le32(buf, val);
+ buf += 4;
+ break;
+ case 'd':
+ assert(buf + 8 <= buf_end);
+ val64 = va_arg(ap, uint64_t);
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" d=%" PRId64, val64);
+#endif
+ put_le64(buf, val64);
+ buf += 8;
+ break;
+ case 's':
+ {
+ char *str;
+ int len;
+ str = va_arg(ap, char *);
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" s=\"%s\"", str);
+#endif
+ len = strlen(str);
+ assert(len <= 65535);
+ assert(buf + 2 + len <= buf_end);
+ put_le16(buf, len);
+ buf += 2;
+ memcpy(buf, str, len);
+ buf += len;
+ }
+ break;
+ case 'Q':
+ {
+ FSQID *qid;
+ assert(buf + 13 <= buf_end);
+ qid = va_arg(ap, FSQID *);
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" Q=%d:%d:%" PRIu64, qid->type, qid->version, qid->path);
+#endif
+ buf[0] = qid->type;
+ put_le32(buf + 1, qid->version);
+ put_le64(buf + 5, qid->path);
+ buf += 13;
+ }
+ break;
+ default:
+ abort();
+ }
+ }
+ va_end(ap);
+ return buf - buf1;
+}
+
+/* return < 0 if error */
+/* XXX: free allocated strings in case of error */
+static int unmarshall(VIRTIO9PDevice *s, int queue_idx,
+ int desc_idx, int *poffset, const char *fmt, ...)
+{
+ VIRTIODevice *s1 = (VIRTIODevice *)s;
+ va_list ap;
+ int offset, c;
+ uint8_t buf[16];
+
+ offset = *poffset;
+ va_start(ap, fmt);
+ for(;;) {
+ c = *fmt++;
+ if (c == '\0')
+ break;
+ switch(c) {
+ case 'b':
+ {
+ uint8_t *ptr;
+ if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 1))
+ return -1;
+ ptr = va_arg(ap, uint8_t *);
+ *ptr = buf[0];
+ offset += 1;
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" b=%d", *ptr);
+#endif
+ }
+ break;
+ case 'h':
+ {
+ uint16_t *ptr;
+ if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 2))
+ return -1;
+ ptr = va_arg(ap, uint16_t *);
+ *ptr = get_le16(buf);
+ offset += 2;
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" h=%d", *ptr);
+#endif
+ }
+ break;
+ case 'w':
+ {
+ uint32_t *ptr;
+ if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 4))
+ return -1;
+ ptr = va_arg(ap, uint32_t *);
+ *ptr = get_le32(buf);
+ offset += 4;
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" w=%d", *ptr);
+#endif
+ }
+ break;
+ case 'd':
+ {
+ uint64_t *ptr;
+ if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 8))
+ return -1;
+ ptr = va_arg(ap, uint64_t *);
+ *ptr = get_le64(buf);
+ offset += 8;
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" d=%" PRId64, *ptr);
+#endif
+ }
+ break;
+ case 's':
+ {
+ char *str, **ptr;
+ int len;
+
+ if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 2))
+ return -1;
+ len = get_le16(buf);
+ offset += 2;
+ str = malloc(len + 1);
+ if (memcpy_from_queue(s1, str, queue_idx, desc_idx, offset, len))
+ return -1;
+ str[len] = '\0';
+ offset += len;
+ ptr = va_arg(ap, char **);
+ *ptr = str;
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P)
+ printf(" s=\"%s\"", *ptr);
+#endif
+ }
+ break;
+ default:
+ abort();
+ }
+ }
+ va_end(ap);
+ *poffset = offset;
+ return 0;
+}
+
+static void virtio_9p_send_reply(VIRTIO9PDevice *s, int queue_idx,
+ int desc_idx, uint8_t id, uint16_t tag,
+ uint8_t *buf, int buf_len)
+{
+ uint8_t *buf1;
+ int len;
+
+#ifdef DEBUG_VIRTIO
+ if (s->common.debug & VIRTIO_DEBUG_9P) {
+ if (id == 6)
+ printf(" (error)");
+ printf("\n");
+ }
+#endif
+ len = buf_len + 7;
+ buf1 = malloc(len);
+ put_le32(buf1, len);
+ buf1[4] = id + 1;
+ put_le16(buf1 + 5, tag);
+ memcpy(buf1 + 7, buf, buf_len);
+ memcpy_to_queue((VIRTIODevice *)s, queue_idx, desc_idx, 0, buf1, len);
+ virtio_consume_desc((VIRTIODevice *)s, queue_idx, desc_idx, len);
+ free(buf1);
+}
+
+static void virtio_9p_send_error(VIRTIO9PDevice *s, int queue_idx,
+ int desc_idx, uint16_t tag, uint32_t error)
+{
+ uint8_t buf[4];
+ int buf_len;
+
+ buf_len = marshall(s, buf, sizeof(buf), "w", -error);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, 6, tag, buf, buf_len);
+}
+
+typedef struct {
+ VIRTIO9PDevice *dev;
+ int queue_idx;
+ int desc_idx;
+ uint16_t tag;
+} P9OpenInfo;
+
+static void virtio_9p_open_reply(FSDevice *fs, FSQID *qid, int err,
+ P9OpenInfo *oi)
+{
+ VIRTIO9PDevice *s = oi->dev;
+ uint8_t buf[32];
+ int buf_len;
+
+ if (err < 0) {
+ virtio_9p_send_error(s, oi->queue_idx, oi->desc_idx, oi->tag, err);
+ } else {
+ buf_len = marshall(s, buf, sizeof(buf),
+ "Qw", qid, s->msize - 24);
+ virtio_9p_send_reply(s, oi->queue_idx, oi->desc_idx, 12, oi->tag,
+ buf, buf_len);
+ }
+ free(oi);
+}
+
+static void virtio_9p_open_cb(FSDevice *fs, FSQID *qid, int err,
+ void *opaque)
+{
+ P9OpenInfo *oi = opaque;
+ VIRTIO9PDevice *s = oi->dev;
+ int queue_idx = oi->queue_idx;
+
+ virtio_9p_open_reply(fs, qid, err, oi);
+
+ s->req_in_progress = FALSE;
+
+ /* handle next requests */
+ queue_notify((VIRTIODevice *)s, queue_idx);
+}
+
+static int virtio_9p_recv_request(VIRTIODevice *s1, int queue_idx,
+ int desc_idx, int read_size,
+ int write_size)
+{
+ VIRTIO9PDevice *s = (VIRTIO9PDevice *)s1;
+ int offset, header_len;
+ uint8_t id;
+ uint16_t tag;
+ uint8_t buf[1024];
+ int buf_len, err;
+ FSDevice *fs = s->fs;
+
+ if (queue_idx != 0)
+ return 0;
+
+ if (s->req_in_progress)
+ return -1;
+
+ offset = 0;
+ header_len = 4 + 1 + 2;
+ if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, header_len)) {
+ tag = 0;
+ goto protocol_error;
+ }
+ //size = get_le32(buf);
+ id = buf[4];
+ tag = get_le16(buf + 5);
+ offset += header_len;
+
+#ifdef DEBUG_VIRTIO
+ if (s1->debug & VIRTIO_DEBUG_9P) {
+ const char *name;
+ name = get_9p_op_name(id);
+ printf("9p: op=");
+ if (name)
+ printf("%s", name);
+ else
+ printf("%d", id);
+ }
+#endif
+ /* Note: same subset as JOR1K */
+ switch(id) {
+ case 8: /* statfs */
+ {
+ FSStatFS st;
+
+ fs->fs_statfs(fs, &st);
+ buf_len = marshall(s, buf, sizeof(buf),
+ "wwddddddw",
+ 0,
+ st.f_bsize,
+ st.f_blocks,
+ st.f_bfree,
+ st.f_bavail,
+ st.f_files,
+ st.f_ffree,
+ 0, /* id */
+ 256 /* max filename length */
+ );
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 12: /* lopen */
+ {
+ uint32_t fid, flags;
+ FSFile *f;
+ FSQID qid;
+ P9OpenInfo *oi;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "ww", &fid, &flags))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ oi = malloc(sizeof(*oi));
+ oi->dev = s;
+ oi->queue_idx = queue_idx;
+ oi->desc_idx = desc_idx;
+ oi->tag = tag;
+ err = fs->fs_open(fs, &qid, f, flags, virtio_9p_open_cb, oi);
+ if (err <= 0) {
+ virtio_9p_open_reply(fs, &qid, err, oi);
+ } else {
+ s->req_in_progress = TRUE;
+ }
+ }
+ break;
+ case 14: /* lcreate */
+ {
+ uint32_t fid, flags, mode, gid;
+ char *name;
+ FSFile *f;
+ FSQID qid;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wswww", &fid, &name, &flags, &mode, &gid))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f) {
+ err = -P9_EPROTO;
+ } else {
+ err = fs->fs_create(fs, &qid, f, name, flags, mode, gid);
+ }
+ free(name);
+ if (err)
+ goto error;
+ buf_len = marshall(s, buf, sizeof(buf),
+ "Qw", &qid, s->msize - 24);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 16: /* symlink */
+ {
+ uint32_t fid, gid;
+ char *name, *symgt;
+ FSFile *f;
+ FSQID qid;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wssw", &fid, &name, &symgt, &gid))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f) {
+ err = -P9_EPROTO;
+ } else {
+ err = fs->fs_symlink(fs, &qid, f, name, symgt, gid);
+ }
+ free(name);
+ free(symgt);
+ if (err)
+ goto error;
+ buf_len = marshall(s, buf, sizeof(buf),
+ "Q", &qid);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 18: /* mknod */
+ {
+ uint32_t fid, mode, major, minor, gid;
+ char *name;
+ FSFile *f;
+ FSQID qid;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wswwww", &fid, &name, &mode, &major, &minor, &gid))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f) {
+ err = -P9_EPROTO;
+ } else {
+ err = fs->fs_mknod(fs, &qid, f, name, mode, major, minor, gid);
+ }
+ free(name);
+ if (err)
+ goto error;
+ buf_len = marshall(s, buf, sizeof(buf),
+ "Q", &qid);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 22: /* readlink */
+ {
+ uint32_t fid;
+ char buf1[1024];
+ FSFile *f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "w", &fid))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f) {
+ err = -P9_EPROTO;
+ } else {
+ err = fs->fs_readlink(fs, buf1, sizeof(buf1), f);
+ }
+ if (err)
+ goto error;
+ buf_len = marshall(s, buf, sizeof(buf), "s", buf1);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 24: /* getattr */
+ {
+ uint32_t fid;
+ uint64_t mask;
+ FSFile *f;
+ FSStat st;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wd", &fid, &mask))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ err = fs->fs_stat(fs, f, &st);
+ if (err)
+ goto error;
+
+ buf_len = marshall(s, buf, sizeof(buf),
+ "dQwwwddddddddddddddd",
+ mask, &st.qid,
+ st.st_mode, st.st_uid, st.st_gid,
+ st.st_nlink, st.st_rdev, st.st_size,
+ st.st_blksize, st.st_blocks,
+ st.st_atime_sec, (uint64_t)st.st_atime_nsec,
+ st.st_mtime_sec, (uint64_t)st.st_mtime_nsec,
+ st.st_ctime_sec, (uint64_t)st.st_ctime_nsec,
+ (uint64_t)0, (uint64_t)0,
+ (uint64_t)0, (uint64_t)0);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 26: /* setattr */
+ {
+ uint32_t fid, mask, mode, uid, gid;
+ uint64_t size, atime_sec, atime_nsec, mtime_sec, mtime_nsec;
+ FSFile *f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wwwwwddddd", &fid, &mask, &mode, &uid, &gid,
+ &size, &atime_sec, &atime_nsec,
+ &mtime_sec, &mtime_nsec))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ err = fs->fs_setattr(fs, f, mask, mode, uid, gid, size, atime_sec,
+ atime_nsec, mtime_sec, mtime_nsec);
+ if (err)
+ goto error;
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0);
+ }
+ break;
+ case 30: /* xattrwalk */
+ {
+ /* not supported yet */
+ err = -P9_ENOTSUP;
+ goto error;
+ }
+ break;
+ case 40: /* readdir */
+ {
+ uint32_t fid, count;
+ uint64_t offs;
+ uint8_t *buf;
+ int n;
+ FSFile *f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wdw", &fid, &offs, &count))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ buf = malloc(count + 4);
+ n = fs->fs_readdir(fs, f, offs, buf + 4, count);
+ if (n < 0) {
+ err = n;
+ goto error;
+ }
+ put_le32(buf, n);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, n + 4);
+ free(buf);
+ }
+ break;
+ case 50: /* fsync */
+ {
+ uint32_t fid;
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "w", &fid))
+ goto protocol_error;
+ /* ignored */
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0);
+ }
+ break;
+ case 52: /* lock */
+ {
+ uint32_t fid;
+ FSFile *f;
+ FSLock lock;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wbwddws", &fid, &lock.type, &lock.flags,
+ &lock.start, &lock.length,
+ &lock.proc_id, &lock.client_id))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ err = -P9_EPROTO;
+ else
+ err = fs->fs_lock(fs, f, &lock);
+ free(lock.client_id);
+ if (err < 0)
+ goto error;
+ buf_len = marshall(s, buf, sizeof(buf), "b", err);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 54: /* getlock */
+ {
+ uint32_t fid;
+ FSFile *f;
+ FSLock lock;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wbddws", &fid, &lock.type,
+ &lock.start, &lock.length,
+ &lock.proc_id, &lock.client_id))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ err = -P9_EPROTO;
+ else
+ err = fs->fs_getlock(fs, f, &lock);
+ if (err < 0) {
+ free(lock.client_id);
+ goto error;
+ }
+ buf_len = marshall(s, buf, sizeof(buf), "bddws",
+ &lock.type,
+ &lock.start, &lock.length,
+ &lock.proc_id, &lock.client_id);
+ free(lock.client_id);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 70: /* link */
+ {
+ uint32_t dfid, fid;
+ char *name;
+ FSFile *f, *df;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wws", &dfid, &fid, &name))
+ goto protocol_error;
+ df = fid_find(s, dfid);
+ f = fid_find(s, fid);
+ if (!df || !f) {
+ err = -P9_EPROTO;
+ } else {
+ err = fs->fs_link(fs, df, f, name);
+ }
+ free(name);
+ if (err)
+ goto error;
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0);
+ }
+ break;
+ case 72: /* mkdir */
+ {
+ uint32_t fid, mode, gid;
+ char *name;
+ FSFile *f;
+ FSQID qid;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wsww", &fid, &name, &mode, &gid))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ err = fs->fs_mkdir(fs, &qid, f, name, mode, gid);
+ if (err != 0)
+ goto error;
+ buf_len = marshall(s, buf, sizeof(buf), "Q", &qid);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 74: /* renameat */
+ {
+ uint32_t fid, new_fid;
+ char *name, *new_name;
+ FSFile *f, *new_f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wsws", &fid, &name, &new_fid, &new_name))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ new_f = fid_find(s, new_fid);
+ if (!f || !new_f) {
+ err = -P9_EPROTO;
+ } else {
+ err = fs->fs_renameat(fs, f, name, new_f, new_name);
+ }
+ free(name);
+ free(new_name);
+ if (err != 0)
+ goto error;
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0);
+ }
+ break;
+ case 76: /* unlinkat */
+ {
+ uint32_t fid, flags;
+ char *name;
+ FSFile *f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wsw", &fid, &name, &flags))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f) {
+ err = -P9_EPROTO;
+ } else {
+ err = fs->fs_unlinkat(fs, f, name);
+ }
+ free(name);
+ if (err != 0)
+ goto error;
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0);
+ }
+ break;
+ case 100: /* version */
+ {
+ uint32_t msize;
+ char *version;
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "ws", &msize, &version))
+ goto protocol_error;
+ s->msize = msize;
+ // printf("version: msize=%d version=%s\n", msize, version);
+ free(version);
+ buf_len = marshall(s, buf, sizeof(buf), "ws", s->msize, "9P2000.L");
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 104: /* attach */
+ {
+ uint32_t fid, afid, uid;
+ char *uname, *aname;
+ FSQID qid;
+ FSFile *f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wwssw", &fid, &afid, &uname, &aname, &uid))
+ goto protocol_error;
+ err = fs->fs_attach(fs, &f, &qid, uid, uname, aname);
+ if (err != 0)
+ goto error;
+ fid_set(s, fid, f);
+ free(uname);
+ free(aname);
+ buf_len = marshall(s, buf, sizeof(buf), "Q", &qid);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 108: /* flush */
+ {
+ uint16_t oldtag;
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "h", &oldtag))
+ goto protocol_error;
+ /* ignored */
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0);
+ }
+ break;
+ case 110: /* walk */
+ {
+ uint32_t fid, newfid;
+ uint16_t nwname;
+ FSQID *qids;
+ char **names;
+ FSFile *f;
+ int i;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wwh", &fid, &newfid, &nwname))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ names = mallocz(sizeof(names[0]) * nwname);
+ qids = malloc(sizeof(qids[0]) * nwname);
+ for(i = 0; i < nwname; i++) {
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "s", &names[i])) {
+ err = -P9_EPROTO;
+ goto walk_done;
+ }
+ }
+ err = fs->fs_walk(fs, &f, qids, f, nwname, names);
+ walk_done:
+ for(i = 0; i < nwname; i++) {
+ free(names[i]);
+ }
+ free(names);
+ if (err < 0) {
+ free(qids);
+ goto error;
+ }
+ buf_len = marshall(s, buf, sizeof(buf), "h", err);
+ for(i = 0; i < err; i++) {
+ buf_len += marshall(s, buf + buf_len, sizeof(buf) - buf_len,
+ "Q", &qids[i]);
+ }
+ free(qids);
+ fid_set(s, newfid, f);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 116: /* read */
+ {
+ uint32_t fid, count;
+ uint64_t offs;
+ uint8_t *buf;
+ int n;
+ FSFile *f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wdw", &fid, &offs, &count))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ buf = malloc(count + 4);
+ n = fs->fs_read(fs, f, offs, buf + 4, count);
+ if (n < 0) {
+ err = n;
+ free(buf);
+ goto error;
+ }
+ put_le32(buf, n);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, n + 4);
+ free(buf);
+ }
+ break;
+ case 118: /* write */
+ {
+ uint32_t fid, count;
+ uint64_t offs;
+ uint8_t *buf1;
+ int n;
+ FSFile *f;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "wdw", &fid, &offs, &count))
+ goto protocol_error;
+ f = fid_find(s, fid);
+ if (!f)
+ goto fid_not_found;
+ buf1 = malloc(count);
+ if (memcpy_from_queue(s1, buf1, queue_idx, desc_idx, offset,
+ count)) {
+ free(buf1);
+ goto protocol_error;
+ }
+ n = fs->fs_write(fs, f, offs, buf1, count);
+ free(buf1);
+ if (n < 0) {
+ err = n;
+ goto error;
+ }
+ buf_len = marshall(s, buf, sizeof(buf), "w", n);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len);
+ }
+ break;
+ case 120: /* clunk */
+ {
+ uint32_t fid;
+
+ if (unmarshall(s, queue_idx, desc_idx, &offset,
+ "w", &fid))
+ goto protocol_error;
+ fid_delete(s, fid);
+ virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0);
+ }
+ break;
+ default:
+ printf("9p: unsupported operation id=%d\n", id);
+ goto protocol_error;
+ }
+ return 0;
+ error:
+ virtio_9p_send_error(s, queue_idx, desc_idx, tag, err);
+ return 0;
+ protocol_error:
+ fid_not_found:
+ err = -P9_EPROTO;
+ goto error;
+}
+
+VIRTIODevice *virtio_9p_init(VIRTIOBusDef *bus, FSDevice *fs,
+ const char *mount_tag)
+
+{
+ VIRTIO9PDevice *s;
+ int len;
+ uint8_t *cfg;
+
+ len = strlen(mount_tag);
+ s = mallocz(sizeof(*s));
+ virtio_init(&s->common, bus,
+ 9, 2 + len, virtio_9p_recv_request);
+ s->common.device_features = 1 << 0;
+
+ /* set the mount tag */
+ cfg = s->common.config_space;
+ cfg[0] = len;
+ cfg[1] = len >> 8;
+ memcpy(cfg + 2, mount_tag, len);
+
+ s->fs = fs;
+ s->msize = 8192;
+ init_list_head(&s->fid_list);
+
+ return (VIRTIODevice *)s;
+}
+
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.h b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.h
new file mode 100644
index 0000000..d53c8c4
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.h
@@ -0,0 +1,146 @@
+/*
+ * VIRTIO driver
+ *
+ * Copyright (c) 2016 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef VIRTIO_H
+#define VIRTIO_H
+
+#include <sys/select.h>
+
+#include "iomem.h"
+#include "pci.h"
+
+#define VIRTIO_PAGE_SIZE 4096
+
+#if defined(EMSCRIPTEN)
+#define VIRTIO_ADDR_BITS 32
+#else
+#define VIRTIO_ADDR_BITS 64
+#endif
+
+#if VIRTIO_ADDR_BITS == 64
+typedef uint64_t virtio_phys_addr_t;
+#else
+typedef uint32_t virtio_phys_addr_t;
+#endif
+
+typedef struct {
+ /* PCI only: */
+ PCIBus *pci_bus;
+ /* MMIO only: */
+ PhysMemoryMap *mem_map;
+ uint64_t addr;
+ IRQSignal *irq;
+} VIRTIOBusDef;
+
+typedef struct VIRTIODevice VIRTIODevice;
+
+#define VIRTIO_DEBUG_IO (1 << 0)
+#define VIRTIO_DEBUG_9P (1 << 1)
+
+void virtio_set_debug(VIRTIODevice *s, int debug_flags);
+
+/* block device */
+
+typedef void BlockDeviceCompletionFunc(void *opaque, int ret);
+
+typedef struct BlockDevice BlockDevice;
+
+struct BlockDevice {
+ int64_t (*get_sector_count)(BlockDevice *bs);
+ int (*read_async)(BlockDevice *bs,
+ uint64_t sector_num, uint8_t *buf, int n,
+ BlockDeviceCompletionFunc *cb, void *opaque);
+ int (*write_async)(BlockDevice *bs,
+ uint64_t sector_num, const uint8_t *buf, int n,
+ BlockDeviceCompletionFunc *cb, void *opaque);
+ void *opaque;
+};
+
+VIRTIODevice *virtio_block_init(VIRTIOBusDef *bus, BlockDevice *bs);
+
+/* network device */
+
+typedef struct EthernetDevice EthernetDevice;
+
+struct EthernetDevice {
+ uint8_t mac_addr[6]; /* mac address of the interface */
+ void (*write_packet)(EthernetDevice *net,
+ const uint8_t *buf, int len);
+ void *opaque;
+#if !defined(EMSCRIPTEN)
+ void (*select_fill)(EthernetDevice *net, int *pfd_max,
+ fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int *pdelay);
+ void (*select_poll)(EthernetDevice *net,
+ fd_set *rfds, fd_set *wfds, fd_set *efds,
+ int select_ret);
+#endif
+ /* the following is set by the device */
+ void *device_opaque;
+ BOOL (*device_can_write_packet)(EthernetDevice *net);
+ void (*device_write_packet)(EthernetDevice *net,
+ const uint8_t *buf, int len);
+ void (*device_set_carrier)(EthernetDevice *net, BOOL carrier_state);
+};
+
+VIRTIODevice *virtio_net_init(VIRTIOBusDef *bus, EthernetDevice *es);
+
+/* console device */
+
+typedef struct {
+ void *opaque;
+ void (*write_data)(void *opaque, const uint8_t *buf, int len);
+ int (*read_data)(void *opaque, uint8_t *buf, int len);
+} CharacterDevice;
+
+VIRTIODevice *virtio_console_init(VIRTIOBusDef *bus, CharacterDevice *cs);
+BOOL virtio_console_can_write_data(VIRTIODevice *s);
+int virtio_console_get_write_len(VIRTIODevice *s);
+int virtio_console_write_data(VIRTIODevice *s, const uint8_t *buf, int buf_len);
+void virtio_console_resize_event(VIRTIODevice *s, int width, int height);
+
+/* input device */
+
+typedef enum {
+ VIRTIO_INPUT_TYPE_KEYBOARD,
+ VIRTIO_INPUT_TYPE_MOUSE,
+ VIRTIO_INPUT_TYPE_TABLET,
+} VirtioInputTypeEnum;
+
+#define VIRTIO_INPUT_ABS_SCALE 32768
+
+int virtio_input_send_key_event(VIRTIODevice *s, BOOL is_down,
+ uint16_t key_code);
+int virtio_input_send_mouse_event(VIRTIODevice *s, int dx, int dy, int dz,
+ unsigned int buttons);
+
+VIRTIODevice *virtio_input_init(VIRTIOBusDef *bus, VirtioInputTypeEnum type);
+
+/* 9p filesystem device */
+
+#include "fs.h"
+
+VIRTIODevice *virtio_9p_init(VIRTIOBusDef *bus, FSDevice *fs,
+ const char *mount_tag);
+
+#endif /* VIRTIO_H */
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/vmmouse.c b/jslinux-2019-12-21/tinyemu-2019-12-21/vmmouse.c
new file mode 100644
index 0000000..927e510
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/vmmouse.c
@@ -0,0 +1,162 @@
+/*
+ * VM mouse emulation
+ *
+ * Copyright (c) 2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "ps2.h"
+
+#define VMPORT_MAGIC 0x564D5868
+
+#define REG_EAX 0
+#define REG_EBX 1
+#define REG_ECX 2
+#define REG_EDX 3
+#define REG_ESI 4
+#define REG_EDI 5
+
+#define FIFO_SIZE (4 * 16)
+
+struct VMMouseState {
+ PS2MouseState *ps2_mouse;
+ int fifo_count, fifo_rindex, fifo_windex;
+ BOOL enabled;
+ BOOL absolute;
+ uint32_t fifo_buf[FIFO_SIZE];
+};
+
+static void put_queue(VMMouseState *s, uint32_t val)
+{
+ if (s->fifo_count >= FIFO_SIZE)
+ return;
+ s->fifo_buf[s->fifo_windex] = val;
+ if (++s->fifo_windex == FIFO_SIZE)
+ s->fifo_windex = 0;
+ s->fifo_count++;
+}
+
+static void read_data(VMMouseState *s, uint32_t *regs, int size)
+{
+ int i;
+ if (size > 6 || size > s->fifo_count) {
+ // printf("vmmouse: read error req=%d count=%d\n", size, s->fifo_count);
+ s->enabled = FALSE;
+ return;
+ }
+ for(i = 0; i < size; i++) {
+ regs[i] = s->fifo_buf[s->fifo_rindex];
+ if (++s->fifo_rindex == FIFO_SIZE)
+ s->fifo_rindex = 0;
+ }
+ s->fifo_count -= size;
+}
+
+void vmmouse_send_mouse_event(VMMouseState *s, int x, int y, int dz,
+ int buttons)
+{
+ int state;
+
+ if (!s->enabled) {
+ ps2_mouse_event(s->ps2_mouse, x, y, dz, buttons);
+ return;
+ }
+
+ if ((s->fifo_count + 4) > FIFO_SIZE)
+ return;
+
+ state = 0;
+ if (buttons & 1)
+ state |= 0x20;
+ if (buttons & 2)
+ state |= 0x10;
+ if (buttons & 4)
+ state |= 0x08;
+ if (s->absolute) {
+ /* range = 0 ... 65535 */
+ x *= 2;
+ y *= 2;
+ }
+
+ put_queue(s, state);
+ put_queue(s, x);
+ put_queue(s, y);
+ put_queue(s, -dz);
+
+ /* send PS/2 mouse event */
+ ps2_mouse_event(s->ps2_mouse, 1, 0, 0, 0);
+}
+
+void vmmouse_handler(VMMouseState *s, uint32_t *regs)
+{
+ uint32_t cmd;
+
+ cmd = regs[REG_ECX] & 0xff;
+ switch(cmd) {
+ case 10: /* get version */
+ regs[REG_EBX] = VMPORT_MAGIC;
+ break;
+ case 39: /* VMMOUSE_DATA */
+ read_data(s, regs, regs[REG_EBX]);
+ break;
+ case 40: /* VMMOUSE_STATUS */
+ regs[REG_EAX] = ((s->enabled ? 0 : 0xffff) << 16) | s->fifo_count;
+ break;
+ case 41: /* VMMOUSE_COMMAND */
+ switch(regs[REG_EBX]) {
+ case 0x45414552: /* read id */
+ if (s->fifo_count < FIFO_SIZE) {
+ put_queue(s, 0x3442554a);
+ s->enabled = TRUE;
+ }
+ break;
+ case 0x000000f5: /* disable */
+ s->enabled = FALSE;
+ break;
+ case 0x4c455252: /* set relative */
+ s->absolute = 0;
+ break;
+ case 0x53424152: /* set absolute */
+ s->absolute = 1;
+ break;
+ }
+ break;
+ }
+}
+
+BOOL vmmouse_is_absolute(VMMouseState *s)
+{
+ return s->absolute;
+}
+
+VMMouseState *vmmouse_init(PS2MouseState *ps2_mouse)
+{
+ VMMouseState *s;
+ s = mallocz(sizeof(*s));
+ s->ps2_mouse = ps2_mouse;
+ return s;
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.c
new file mode 100644
index 0000000..e599ab8
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.c
@@ -0,0 +1,96 @@
+/*
+ * x86 CPU emulator stub
+ *
+ * Copyright (c) 2011-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "cutils.h"
+#include "x86_cpu.h"
+
+X86CPUState *x86_cpu_init(PhysMemoryMap *mem_map)
+{
+ fprintf(stderr, "x86 emulator is not supported\n");
+ exit(1);
+}
+
+void x86_cpu_end(X86CPUState *s)
+{
+}
+
+void x86_cpu_interp(X86CPUState *s, int max_cycles1)
+{
+}
+
+void x86_cpu_set_irq(X86CPUState *s, BOOL set)
+{
+}
+
+void x86_cpu_set_reg(X86CPUState *s, int reg, uint32_t val)
+{
+}
+
+uint32_t x86_cpu_get_reg(X86CPUState *s, int reg)
+{
+ return 0;
+}
+
+void x86_cpu_set_seg(X86CPUState *s, int seg, const X86CPUSeg *sd)
+{
+}
+
+void x86_cpu_set_get_hard_intno(X86CPUState *s,
+ int (*get_hard_intno)(void *opaque),
+ void *opaque)
+{
+}
+
+void x86_cpu_set_get_tsc(X86CPUState *s,
+ uint64_t (*get_tsc)(void *opaque),
+ void *opaque)
+{
+}
+
+void x86_cpu_set_port_io(X86CPUState *s,
+ DeviceReadFunc *port_read, DeviceWriteFunc *port_write,
+ void *opaque)
+{
+}
+
+int64_t x86_cpu_get_cycles(X86CPUState *s)
+{
+ return 0;
+}
+
+BOOL x86_cpu_get_power_down(X86CPUState *s)
+{
+ return FALSE;
+}
+
+void x86_cpu_flush_tlb_write_range_ram(X86CPUState *s,
+ uint8_t *ram_ptr, size_t ram_size)
+{
+}
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.h b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.h
new file mode 100644
index 0000000..254f7f5
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.h
@@ -0,0 +1,70 @@
+/*
+ * x86 CPU emulator
+ *
+ * Copyright (c) 2011-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "iomem.h"
+
+typedef struct X86CPUState X86CPUState;
+
+/* get_reg/set_reg additional constants */
+#define X86_CPU_REG_EIP 8
+#define X86_CPU_REG_CR0 9
+#define X86_CPU_REG_CR2 10
+
+#define X86_CPU_SEG_ES 0
+#define X86_CPU_SEG_CS 1
+#define X86_CPU_SEG_SS 2
+#define X86_CPU_SEG_DS 3
+#define X86_CPU_SEG_FS 4
+#define X86_CPU_SEG_GS 5
+#define X86_CPU_SEG_LDT 6
+#define X86_CPU_SEG_TR 7
+#define X86_CPU_SEG_GDT 8
+#define X86_CPU_SEG_IDT 9
+
+typedef struct {
+ uint16_t sel;
+ uint16_t flags;
+ uint32_t base;
+ uint32_t limit;
+} X86CPUSeg;
+
+X86CPUState *x86_cpu_init(PhysMemoryMap *mem_map);
+void x86_cpu_end(X86CPUState *s);
+void x86_cpu_interp(X86CPUState *s, int max_cycles1);
+void x86_cpu_set_irq(X86CPUState *s, BOOL set);
+void x86_cpu_set_reg(X86CPUState *s, int reg, uint32_t val);
+uint32_t x86_cpu_get_reg(X86CPUState *s, int reg);
+void x86_cpu_set_seg(X86CPUState *s, int seg, const X86CPUSeg *sd);
+void x86_cpu_set_get_hard_intno(X86CPUState *s,
+ int (*get_hard_intno)(void *opaque),
+ void *opaque);
+void x86_cpu_set_get_tsc(X86CPUState *s,
+ uint64_t (*get_tsc)(void *opaque),
+ void *opaque);
+void x86_cpu_set_port_io(X86CPUState *s,
+ DeviceReadFunc *port_read, DeviceWriteFunc *port_write,
+ void *opaque);
+int64_t x86_cpu_get_cycles(X86CPUState *s);
+BOOL x86_cpu_get_power_down(X86CPUState *s);
+void x86_cpu_flush_tlb_write_range_ram(X86CPUState *s,
+ uint8_t *ram_ptr, size_t ram_size);
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/x86_machine.c b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_machine.c
new file mode 100644
index 0000000..db8f6bb
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_machine.c
@@ -0,0 +1,2569 @@
+/*
+ * PC emulator
+ *
+ * Copyright (c) 2011-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include "cutils.h"
+#include "iomem.h"
+#include "virtio.h"
+#include "x86_cpu.h"
+#include "machine.h"
+#include "pci.h"
+#include "ide.h"
+#include "ps2.h"
+
+#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__))
+#define USE_KVM
+#endif
+
+#ifdef USE_KVM
+#include <linux/kvm.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <signal.h>
+#include <sys/time.h>
+#endif
+
+//#define DEBUG_BIOS
+//#define DUMP_IOPORT
+
+/***********************************************************/
+/* cmos emulation */
+
+//#define DEBUG_CMOS
+
+#define RTC_SECONDS 0
+#define RTC_SECONDS_ALARM 1
+#define RTC_MINUTES 2
+#define RTC_MINUTES_ALARM 3
+#define RTC_HOURS 4
+#define RTC_HOURS_ALARM 5
+#define RTC_ALARM_DONT_CARE 0xC0
+
+#define RTC_DAY_OF_WEEK 6
+#define RTC_DAY_OF_MONTH 7
+#define RTC_MONTH 8
+#define RTC_YEAR 9
+
+#define RTC_REG_A 10
+#define RTC_REG_B 11
+#define RTC_REG_C 12
+#define RTC_REG_D 13
+
+#define REG_A_UIP 0x80
+
+#define REG_B_SET 0x80
+#define REG_B_PIE 0x40
+#define REG_B_AIE 0x20
+#define REG_B_UIE 0x10
+
+typedef struct {
+ uint8_t cmos_index;
+ uint8_t cmos_data[128];
+ IRQSignal *irq;
+ BOOL use_local_time;
+ /* used for the periodic irq */
+ uint32_t irq_timeout;
+ uint32_t irq_period;
+} CMOSState;
+
+static void cmos_write(void *opaque, uint32_t offset,
+ uint32_t data, int size_log2);
+static uint32_t cmos_read(void *opaque, uint32_t offset, int size_log2);
+
+static int to_bcd(CMOSState *s, unsigned int a)
+{
+ if (s->cmos_data[RTC_REG_B] & 0x04) {
+ return a;
+ } else {
+ return ((a / 10) << 4) | (a % 10);
+ }
+}
+
+static void cmos_update_time(CMOSState *s, BOOL set_century)
+{
+ struct timeval tv;
+ struct tm tm;
+ time_t ti;
+ int val;
+
+ gettimeofday(&tv, NULL);
+ ti = tv.tv_sec;
+ if (s->use_local_time) {
+ localtime_r(&ti, &tm);
+ } else {
+ gmtime_r(&ti, &tm);
+ }
+
+ s->cmos_data[RTC_SECONDS] = to_bcd(s, tm.tm_sec);
+ s->cmos_data[RTC_MINUTES] = to_bcd(s, tm.tm_min);
+ if (s->cmos_data[RTC_REG_B] & 0x02) {
+ s->cmos_data[RTC_HOURS] = to_bcd(s, tm.tm_hour);
+ } else {
+ s->cmos_data[RTC_HOURS] = to_bcd(s, tm.tm_hour % 12);
+ if (tm.tm_hour >= 12)
+ s->cmos_data[RTC_HOURS] |= 0x80;
+ }
+ s->cmos_data[RTC_DAY_OF_WEEK] = to_bcd(s, tm.tm_wday);
+ s->cmos_data[RTC_DAY_OF_MONTH] = to_bcd(s, tm.tm_mday);
+ s->cmos_data[RTC_MONTH] = to_bcd(s, tm.tm_mon + 1);
+ s->cmos_data[RTC_YEAR] = to_bcd(s, tm.tm_year % 100);
+
+ if (set_century) {
+ /* not set by the hardware, but easier to do it here */
+ val = to_bcd(s, (tm.tm_year / 100) + 19);
+ s->cmos_data[0x32] = val;
+ s->cmos_data[0x37] = val;
+ }
+
+ /* update in progress flag: 8/32768 seconds after change */
+ if (tv.tv_usec < 244) {
+ s->cmos_data[RTC_REG_A] |= REG_A_UIP;
+ } else {
+ s->cmos_data[RTC_REG_A] &= ~REG_A_UIP;
+ }
+}
+
+CMOSState *cmos_init(PhysMemoryMap *port_map, int addr,
+ IRQSignal *irq, BOOL use_local_time)
+{
+ CMOSState *s;
+
+ s = mallocz(sizeof(*s));
+ s->use_local_time = use_local_time;
+
+ s->cmos_index = 0;
+
+ s->cmos_data[RTC_REG_A] = 0x26;
+ s->cmos_data[RTC_REG_B] = 0x02;
+ s->cmos_data[RTC_REG_C] = 0x00;
+ s->cmos_data[RTC_REG_D] = 0x80;
+
+ cmos_update_time(s, TRUE);
+
+ s->irq = irq;
+
+ cpu_register_device(port_map, addr, 2, s, cmos_read, cmos_write,
+ DEVIO_SIZE8);
+ return s;
+}
+
+#define CMOS_FREQ 32768
+
+static uint32_t cmos_get_timer(CMOSState *s)
+{
+ struct timespec ts;
+
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return (uint32_t)ts.tv_sec * CMOS_FREQ +
+ ((uint64_t)ts.tv_nsec * CMOS_FREQ / 1000000000);
+}
+
+static void cmos_update_timer(CMOSState *s)
+{
+ int period_code;
+
+ period_code = s->cmos_data[RTC_REG_A] & 0x0f;
+ if ((s->cmos_data[RTC_REG_B] & REG_B_PIE) &&
+ period_code != 0) {
+ if (period_code <= 2)
+ period_code += 7;
+ s->irq_period = 1 << (period_code - 1);
+ s->irq_timeout = (cmos_get_timer(s) + s->irq_period) &
+ ~(s->irq_period - 1);
+ }
+}
+
+/* XXX: could return a delay, but we don't need high precision
+ (Windows 2000 uses it for delay calibration) */
+static void cmos_update_irq(CMOSState *s)
+{
+ uint32_t d;
+ if (s->cmos_data[RTC_REG_B] & REG_B_PIE) {
+ d = cmos_get_timer(s) - s->irq_timeout;
+ if ((int32_t)d >= 0) {
+ /* this is not what the real RTC does. Here we sent the IRQ
+ immediately */
+ s->cmos_data[RTC_REG_C] |= 0xc0;
+ set_irq(s->irq, 1);
+ /* update for the next irq */
+ s->irq_timeout += s->irq_period;
+ }
+ }
+}
+
+static void cmos_write(void *opaque, uint32_t offset,
+ uint32_t data, int size_log2)
+{
+ CMOSState *s = opaque;
+
+ if (offset == 0) {
+ s->cmos_index = data & 0x7f;
+ } else {
+#ifdef DEBUG_CMOS
+ printf("cmos_write: reg=0x%02x val=0x%02x\n", s->cmos_index, data);
+#endif
+ switch(s->cmos_index) {
+ case RTC_REG_A:
+ s->cmos_data[RTC_REG_A] = (data & ~REG_A_UIP) |
+ (s->cmos_data[RTC_REG_A] & REG_A_UIP);
+ cmos_update_timer(s);
+ break;
+ case RTC_REG_B:
+ s->cmos_data[s->cmos_index] = data;
+ cmos_update_timer(s);
+ break;
+ default:
+ s->cmos_data[s->cmos_index] = data;
+ break;
+ }
+ }
+}
+
+static uint32_t cmos_read(void *opaque, uint32_t offset, int size_log2)
+{
+ CMOSState *s = opaque;
+ int ret;
+
+ if (offset == 0) {
+ return 0xff;
+ } else {
+ switch(s->cmos_index) {
+ case RTC_SECONDS:
+ case RTC_MINUTES:
+ case RTC_HOURS:
+ case RTC_DAY_OF_WEEK:
+ case RTC_DAY_OF_MONTH:
+ case RTC_MONTH:
+ case RTC_YEAR:
+ case RTC_REG_A:
+ cmos_update_time(s, FALSE);
+ ret = s->cmos_data[s->cmos_index];
+ break;
+ case RTC_REG_C:
+ ret = s->cmos_data[s->cmos_index];
+ s->cmos_data[RTC_REG_C] = 0x00;
+ set_irq(s->irq, 0);
+ break;
+ default:
+ ret = s->cmos_data[s->cmos_index];
+ }
+#ifdef DEBUG_CMOS
+ printf("cmos_read: reg=0x%02x val=0x%02x\n", s->cmos_index, ret);
+#endif
+ return ret;
+ }
+}
+
+/***********************************************************/
+/* 8259 pic emulation */
+
+//#define DEBUG_PIC
+
+typedef void PICUpdateIRQFunc(void *opaque);
+
+typedef struct {
+ uint8_t last_irr; /* edge detection */
+ uint8_t irr; /* interrupt request register */
+ uint8_t imr; /* interrupt mask register */
+ uint8_t isr; /* interrupt service register */
+ uint8_t priority_add; /* used to compute irq priority */
+ uint8_t irq_base;
+ uint8_t read_reg_select;
+ uint8_t special_mask;
+ uint8_t init_state;
+ uint8_t auto_eoi;
+ uint8_t rotate_on_autoeoi;
+ uint8_t init4; /* true if 4 byte init */
+ uint8_t elcr; /* PIIX edge/trigger selection*/
+ uint8_t elcr_mask;
+ PICUpdateIRQFunc *update_irq;
+ void *opaque;
+} PICState;
+
+static void pic_reset(PICState *s);
+static void pic_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+static uint32_t pic_read(void *opaque, uint32_t offset, int size_log2);
+static void pic_elcr_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+static uint32_t pic_elcr_read(void *opaque, uint32_t offset, int size_log2);
+
+PICState *pic_init(PhysMemoryMap *port_map, int port, int elcr_port,
+ int elcr_mask,
+ PICUpdateIRQFunc *update_irq, void *opaque)
+{
+ PICState *s;
+
+ s = mallocz(sizeof(*s));
+ s->elcr_mask = elcr_mask;
+ s->update_irq = update_irq;
+ s->opaque = opaque;
+ cpu_register_device(port_map, port, 2, s,
+ pic_read, pic_write, DEVIO_SIZE8);
+ cpu_register_device(port_map, elcr_port, 1, s,
+ pic_elcr_read, pic_elcr_write, DEVIO_SIZE8);
+ pic_reset(s);
+ return s;
+}
+
+static void pic_reset(PICState *s)
+{
+ /* all 8 bit registers */
+ s->last_irr = 0; /* edge detection */
+ s->irr = 0; /* interrupt request register */
+ s->imr = 0; /* interrupt mask register */
+ s->isr = 0; /* interrupt service register */
+ s->priority_add = 0; /* used to compute irq priority */
+ s->irq_base = 0;
+ s->read_reg_select = 0;
+ s->special_mask = 0;
+ s->init_state = 0;
+ s->auto_eoi = 0;
+ s->rotate_on_autoeoi = 0;
+ s->init4 = 0; /* true if 4 byte init */
+}
+
+/* set irq level. If an edge is detected, then the IRR is set to 1 */
+static void pic_set_irq1(PICState *s, int irq, int level)
+{
+ int mask;
+ mask = 1 << irq;
+ if (s->elcr & mask) {
+ /* level triggered */
+ if (level) {
+ s->irr |= mask;
+ s->last_irr |= mask;
+ } else {
+ s->irr &= ~mask;
+ s->last_irr &= ~mask;
+ }
+ } else {
+ /* edge triggered */
+ if (level) {
+ if ((s->last_irr & mask) == 0)
+ s->irr |= mask;
+ s->last_irr |= mask;
+ } else {
+ s->last_irr &= ~mask;
+ }
+ }
+}
+
+static int pic_get_priority(PICState *s, int mask)
+{
+ int priority;
+ if (mask == 0)
+ return -1;
+ priority = 7;
+ while ((mask & (1 << ((priority + s->priority_add) & 7))) == 0)
+ priority--;
+ return priority;
+}
+
+/* return the pic wanted interrupt. return -1 if none */
+static int pic_get_irq(PICState *s)
+{
+ int mask, cur_priority, priority;
+
+ mask = s->irr & ~s->imr;
+ priority = pic_get_priority(s, mask);
+ if (priority < 0)
+ return -1;
+ /* compute current priority */
+ cur_priority = pic_get_priority(s, s->isr);
+ if (priority > cur_priority) {
+ /* higher priority found: an irq should be generated */
+ return priority;
+ } else {
+ return -1;
+ }
+}
+
+/* acknowledge interrupt 'irq' */
+static void pic_intack(PICState *s, int irq)
+{
+ if (s->auto_eoi) {
+ if (s->rotate_on_autoeoi)
+ s->priority_add = (irq + 1) & 7;
+ } else {
+ s->isr |= (1 << irq);
+ }
+ /* We don't clear a level sensitive interrupt here */
+ if (!(s->elcr & (1 << irq)))
+ s->irr &= ~(1 << irq);
+}
+
+static void pic_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ PICState *s = opaque;
+ int priority, addr;
+
+ addr = offset & 1;
+#ifdef DEBUG_PIC
+ console.log("pic_write: addr=" + toHex2(addr) + " val=" + toHex2(val));
+#endif
+ if (addr == 0) {
+ if (val & 0x10) {
+ /* init */
+ pic_reset(s);
+ s->init_state = 1;
+ s->init4 = val & 1;
+ if (val & 0x02)
+ abort(); /* "single mode not supported" */
+ if (val & 0x08)
+ abort(); /* "level sensitive irq not supported" */
+ } else if (val & 0x08) {
+ if (val & 0x02)
+ s->read_reg_select = val & 1;
+ if (val & 0x40)
+ s->special_mask = (val >> 5) & 1;
+ } else {
+ switch(val) {
+ case 0x00:
+ case 0x80:
+ s->rotate_on_autoeoi = val >> 7;
+ break;
+ case 0x20: /* end of interrupt */
+ case 0xa0:
+ priority = pic_get_priority(s, s->isr);
+ if (priority >= 0) {
+ s->isr &= ~(1 << ((priority + s->priority_add) & 7));
+ }
+ if (val == 0xa0)
+ s->priority_add = (s->priority_add + 1) & 7;
+ break;
+ case 0x60:
+ case 0x61:
+ case 0x62:
+ case 0x63:
+ case 0x64:
+ case 0x65:
+ case 0x66:
+ case 0x67:
+ priority = val & 7;
+ s->isr &= ~(1 << priority);
+ break;
+ case 0xc0:
+ case 0xc1:
+ case 0xc2:
+ case 0xc3:
+ case 0xc4:
+ case 0xc5:
+ case 0xc6:
+ case 0xc7:
+ s->priority_add = (val + 1) & 7;
+ break;
+ case 0xe0:
+ case 0xe1:
+ case 0xe2:
+ case 0xe3:
+ case 0xe4:
+ case 0xe5:
+ case 0xe6:
+ case 0xe7:
+ priority = val & 7;
+ s->isr &= ~(1 << priority);
+ s->priority_add = (priority + 1) & 7;
+ break;
+ }
+ }
+ } else {
+ switch(s->init_state) {
+ case 0:
+ /* normal mode */
+ s->imr = val;
+ s->update_irq(s->opaque);
+ break;
+ case 1:
+ s->irq_base = val & 0xf8;
+ s->init_state = 2;
+ break;
+ case 2:
+ if (s->init4) {
+ s->init_state = 3;
+ } else {
+ s->init_state = 0;
+ }
+ break;
+ case 3:
+ s->auto_eoi = (val >> 1) & 1;
+ s->init_state = 0;
+ break;
+ }
+ }
+}
+
+static uint32_t pic_read(void *opaque, uint32_t offset, int size_log2)
+{
+ PICState *s = opaque;
+ int addr, ret;
+
+ addr = offset & 1;
+ if (addr == 0) {
+ if (s->read_reg_select)
+ ret = s->isr;
+ else
+ ret = s->irr;
+ } else {
+ ret = s->imr;
+ }
+#ifdef DEBUG_PIC
+ console.log("pic_read: addr=" + toHex2(addr1) + " val=" + toHex2(ret));
+#endif
+ return ret;
+}
+
+static void pic_elcr_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ PICState *s = opaque;
+ s->elcr = val & s->elcr_mask;
+}
+
+static uint32_t pic_elcr_read(void *opaque, uint32_t offset, int size_log2)
+{
+ PICState *s = opaque;
+ return s->elcr;
+}
+
+typedef struct {
+ PICState *pics[2];
+ int irq_requested;
+ void (*cpu_set_irq)(void *opaque, int level);
+ void *opaque;
+#if defined(DEBUG_PIC)
+ uint8_t irq_level[16];
+#endif
+ IRQSignal *irqs;
+} PIC2State;
+
+static void pic2_update_irq(void *opaque);
+static void pic2_set_irq(void *opaque, int irq, int level);
+
+PIC2State *pic2_init(PhysMemoryMap *port_map, uint32_t addr0, uint32_t addr1,
+ uint32_t elcr_addr0, uint32_t elcr_addr1,
+ void (*cpu_set_irq)(void *opaque, int level),
+ void *opaque, IRQSignal *irqs)
+{
+ PIC2State *s;
+ int i;
+
+ s = mallocz(sizeof(*s));
+
+ for(i = 0; i < 16; i++) {
+ irq_init(&irqs[i], pic2_set_irq, s, i);
+ }
+ s->cpu_set_irq = cpu_set_irq;
+ s->opaque = opaque;
+ s->pics[0] = pic_init(port_map, addr0, elcr_addr0, 0xf8, pic2_update_irq, s);
+ s->pics[1] = pic_init(port_map, addr1, elcr_addr1, 0xde, pic2_update_irq, s);
+ s->irq_requested = 0;
+ return s;
+}
+
+void pic2_set_elcr(PIC2State *s, const uint8_t *elcr)
+{
+ int i;
+ for(i = 0; i < 2; i++) {
+ s->pics[i]->elcr = elcr[i] & s->pics[i]->elcr_mask;
+ }
+}
+
+/* raise irq to CPU if necessary. must be called every time the active
+ irq may change */
+static void pic2_update_irq(void *opaque)
+{
+ PIC2State *s = opaque;
+ int irq2, irq;
+
+ /* first look at slave pic */
+ irq2 = pic_get_irq(s->pics[1]);
+ if (irq2 >= 0) {
+ /* if irq request by slave pic, signal master PIC */
+ pic_set_irq1(s->pics[0], 2, 1);
+ pic_set_irq1(s->pics[0], 2, 0);
+ }
+ /* look at requested irq */
+ irq = pic_get_irq(s->pics[0]);
+#if 0
+ console.log("irr=" + toHex2(s->pics[0].irr) + " imr=" + toHex2(s->pics[0].imr) + " isr=" + toHex2(s->pics[0].isr) + " irq="+ irq);
+#endif
+ if (irq >= 0) {
+ /* raise IRQ request on the CPU */
+ s->cpu_set_irq(s->opaque, 1);
+ } else {
+ /* lower irq */
+ s->cpu_set_irq(s->opaque, 0);
+ }
+}
+
+static void pic2_set_irq(void *opaque, int irq, int level)
+{
+ PIC2State *s = opaque;
+#if defined(DEBUG_PIC)
+ if (irq != 0 && level != s->irq_level[irq]) {
+ console.log("pic_set_irq: irq=" + irq + " level=" + level);
+ s->irq_level[irq] = level;
+ }
+#endif
+ pic_set_irq1(s->pics[irq >> 3], irq & 7, level);
+ pic2_update_irq(s);
+}
+
+/* called from the CPU to get the hardware interrupt number */
+static int pic2_get_hard_intno(PIC2State *s)
+{
+ int irq, irq2, intno;
+
+ irq = pic_get_irq(s->pics[0]);
+ if (irq >= 0) {
+ pic_intack(s->pics[0], irq);
+ if (irq == 2) {
+ irq2 = pic_get_irq(s->pics[1]);
+ if (irq2 >= 0) {
+ pic_intack(s->pics[1], irq2);
+ } else {
+ /* spurious IRQ on slave controller */
+ irq2 = 7;
+ }
+ intno = s->pics[1]->irq_base + irq2;
+ irq = irq2 + 8;
+ } else {
+ intno = s->pics[0]->irq_base + irq;
+ }
+ } else {
+ /* spurious IRQ on host controller */
+ irq = 7;
+ intno = s->pics[0]->irq_base + irq;
+ }
+ pic2_update_irq(s);
+
+#if defined(DEBUG_PIC)
+ if (irq != 0 && irq != 14)
+ printf("pic_interrupt: irq=%d\n", irq);
+#endif
+ return intno;
+}
+
+/***********************************************************/
+/* 8253 PIT emulation */
+
+#define PIT_FREQ 1193182
+
+#define RW_STATE_LSB 0
+#define RW_STATE_MSB 1
+#define RW_STATE_WORD0 2
+#define RW_STATE_WORD1 3
+#define RW_STATE_LATCHED_WORD0 4
+#define RW_STATE_LATCHED_WORD1 5
+
+//#define DEBUG_PIT
+
+typedef int64_t PITGetTicksFunc(void *opaque);
+
+typedef struct PITState PITState;
+
+typedef struct {
+ PITState *pit_state;
+ uint32_t count;
+ uint32_t latched_count;
+ uint8_t rw_state;
+ uint8_t mode;
+ uint8_t bcd;
+ uint8_t gate;
+ int64_t count_load_time;
+ int64_t last_irq_time;
+} PITChannel;
+
+struct PITState {
+ PITChannel pit_channels[3];
+ uint8_t speaker_data_on;
+ PITGetTicksFunc *get_ticks;
+ IRQSignal *irq;
+ void *opaque;
+};
+
+static void pit_load_count(PITChannel *pc, int val);
+static void pit_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+static uint32_t pit_read(void *opaque, uint32_t offset, int size_log2);
+static void speaker_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+static uint32_t speaker_read(void *opaque, uint32_t offset, int size_log2);
+
+PITState *pit_init(PhysMemoryMap *port_map, int addr0, int addr1,
+ IRQSignal *irq,
+ PITGetTicksFunc *get_ticks, void *opaque)
+{
+ PITState *s;
+ PITChannel *pc;
+ int i;
+
+ s = mallocz(sizeof(*s));
+
+ s->irq = irq;
+ s->get_ticks = get_ticks;
+ s->opaque = opaque;
+
+ for(i = 0; i < 3; i++) {
+ pc = &s->pit_channels[i];
+ pc->pit_state = s;
+ pc->mode = 3;
+ pc->gate = (i != 2) >> 0;
+ pit_load_count(pc, 0);
+ }
+ s->speaker_data_on = 0;
+
+ cpu_register_device(port_map, addr0, 4, s, pit_read, pit_write,
+ DEVIO_SIZE8);
+
+ cpu_register_device(port_map, addr1, 1, s, speaker_read, speaker_write,
+ DEVIO_SIZE8);
+ return s;
+}
+
+/* unit = PIT frequency */
+static int64_t pit_get_time(PITChannel *pc)
+{
+ PITState *s = pc->pit_state;
+ return s->get_ticks(s->opaque);
+}
+
+static uint32_t pit_get_count(PITChannel *pc)
+{
+ uint32_t counter;
+ uint64_t d;
+
+ d = pit_get_time(pc) - pc->count_load_time;
+ switch(pc->mode) {
+ case 0:
+ case 1:
+ case 4:
+ case 5:
+ counter = (pc->count - d) & 0xffff;
+ break;
+ default:
+ counter = pc->count - (d % pc->count);
+ break;
+ }
+ return counter;
+}
+
+/* get pit output bit */
+static int pit_get_out(PITChannel *pc)
+{
+ int out;
+ int64_t d;
+
+ d = pit_get_time(pc) - pc->count_load_time;
+ switch(pc->mode) {
+ default:
+ case 0:
+ out = (d >= pc->count) >> 0;
+ break;
+ case 1:
+ out = (d < pc->count) >> 0;
+ break;
+ case 2:
+ /* mode used by Linux */
+ if ((d % pc->count) == 0 && d != 0)
+ out = 1;
+ else
+ out = 0;
+ break;
+ case 3:
+ out = ((d % pc->count) < (pc->count >> 1)) >> 0;
+ break;
+ case 4:
+ case 5:
+ out = (d == pc->count) >> 0;
+ break;
+ }
+ return out;
+}
+
+static void pit_load_count(PITChannel *s, int val)
+{
+ if (val == 0)
+ val = 0x10000;
+ s->count_load_time = pit_get_time(s);
+ s->last_irq_time = 0;
+ s->count = val;
+}
+
+static void pit_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ PITState *pit = opaque;
+ int channel, access, addr;
+ PITChannel *s;
+
+ addr = offset & 3;
+#ifdef DEBUG_PIT
+ printf("pit_write: off=%d val=0x%02x\n", addr, val);
+#endif
+ if (addr == 3) {
+ channel = val >> 6;
+ if (channel == 3)
+ return;
+ s = &pit->pit_channels[channel];
+ access = (val >> 4) & 3;
+ switch(access) {
+ case 0:
+ s->latched_count = pit_get_count(s);
+ s->rw_state = RW_STATE_LATCHED_WORD0;
+ break;
+ default:
+ s->mode = (val >> 1) & 7;
+ s->bcd = val & 1;
+ s->rw_state = access - 1 + RW_STATE_LSB;
+ break;
+ }
+ } else {
+ s = &pit->pit_channels[addr];
+ switch(s->rw_state) {
+ case RW_STATE_LSB:
+ pit_load_count(s, val);
+ break;
+ case RW_STATE_MSB:
+ pit_load_count(s, val << 8);
+ break;
+ case RW_STATE_WORD0:
+ case RW_STATE_WORD1:
+ if (s->rw_state & 1) {
+ pit_load_count(s, (s->latched_count & 0xff) | (val << 8));
+ } else {
+ s->latched_count = val;
+ }
+ s->rw_state ^= 1;
+ break;
+ }
+ }
+}
+
+static uint32_t pit_read(void *opaque, uint32_t offset, int size_log2)
+{
+ PITState *pit = opaque;
+ PITChannel *s;
+ int ret, count, addr;
+
+ addr = offset & 3;
+ if (addr == 3)
+ return 0xff;
+
+ s = &pit->pit_channels[addr];
+ switch(s->rw_state) {
+ case RW_STATE_LSB:
+ case RW_STATE_MSB:
+ case RW_STATE_WORD0:
+ case RW_STATE_WORD1:
+ count = pit_get_count(s);
+ if (s->rw_state & 1)
+ ret = (count >> 8) & 0xff;
+ else
+ ret = count & 0xff;
+ if (s->rw_state & 2)
+ s->rw_state ^= 1;
+ break;
+ default:
+ case RW_STATE_LATCHED_WORD0:
+ case RW_STATE_LATCHED_WORD1:
+ if (s->rw_state & 1)
+ ret = s->latched_count >> 8;
+ else
+ ret = s->latched_count & 0xff;
+ s->rw_state ^= 1;
+ break;
+ }
+#ifdef DEBUG_PIT
+ printf("pit_read: off=%d val=0x%02x\n", addr, ret);
+#endif
+ return ret;
+}
+
+static void speaker_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ PITState *pit = opaque;
+ pit->speaker_data_on = (val >> 1) & 1;
+ pit->pit_channels[2].gate = val & 1;
+}
+
+static uint32_t speaker_read(void *opaque, uint32_t offset, int size_log2)
+{
+ PITState *pit = opaque;
+ PITChannel *s;
+ int out, val;
+
+ s = &pit->pit_channels[2];
+ out = pit_get_out(s);
+ val = (pit->speaker_data_on << 1) | s->gate | (out << 5);
+#ifdef DEBUG_PIT
+ // console.log("speaker_read: addr=" + toHex2(addr) + " val=" + toHex2(val));
+#endif
+ return val;
+}
+
+/* set the IRQ if necessary and return the delay in ms until the next
+ IRQ. Note: The code does not handle all the PIT configurations. */
+static int pit_update_irq(PITState *pit)
+{
+ PITChannel *s;
+ int64_t d, delay;
+
+ s = &pit->pit_channels[0];
+
+ delay = PIT_FREQ; /* could be infinity delay */
+
+ d = pit_get_time(s) - s->count_load_time;
+ switch(s->mode) {
+ default:
+ case 0:
+ case 1:
+ case 4:
+ case 5:
+ if (s->last_irq_time == 0) {
+ delay = s->count - d;
+ if (delay <= 0) {
+ set_irq(pit->irq, 1);
+ set_irq(pit->irq, 0);
+ s->last_irq_time = d;
+ }
+ }
+ break;
+ case 2: /* mode used by Linux */
+ case 3:
+ delay = s->last_irq_time + s->count - d;
+ if (delay <= 0) {
+ set_irq(pit->irq, 1);
+ set_irq(pit->irq, 0);
+ s->last_irq_time += s->count;
+ }
+ break;
+ }
+
+ if (delay <= 0)
+ return 0;
+ else
+ return delay / (PIT_FREQ / 1000);
+}
+
+/***********************************************************/
+/* serial port emulation */
+
+#define UART_LCR_DLAB 0x80 /* Divisor latch access bit */
+
+#define UART_IER_MSI 0x08 /* Enable Modem status interrupt */
+#define UART_IER_RLSI 0x04 /* Enable receiver line status interrupt */
+#define UART_IER_THRI 0x02 /* Enable Transmitter holding register int. */
+#define UART_IER_RDI 0x01 /* Enable receiver data interrupt */
+
+#define UART_IIR_NO_INT 0x01 /* No interrupts pending */
+#define UART_IIR_ID 0x06 /* Mask for the interrupt ID */
+
+#define UART_IIR_MSI 0x00 /* Modem status interrupt */
+#define UART_IIR_THRI 0x02 /* Transmitter holding register empty */
+#define UART_IIR_RDI 0x04 /* Receiver data interrupt */
+#define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */
+#define UART_IIR_FE 0xC0 /* Fifo enabled */
+
+#define UART_LSR_TEMT 0x40 /* Transmitter empty */
+#define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */
+#define UART_LSR_BI 0x10 /* Break interrupt indicator */
+#define UART_LSR_FE 0x08 /* Frame error indicator */
+#define UART_LSR_PE 0x04 /* Parity error indicator */
+#define UART_LSR_OE 0x02 /* Overrun error indicator */
+#define UART_LSR_DR 0x01 /* Receiver data ready */
+
+#define UART_FCR_XFR 0x04 /* XMIT Fifo Reset */
+#define UART_FCR_RFR 0x02 /* RCVR Fifo Reset */
+#define UART_FCR_FE 0x01 /* FIFO Enable */
+
+#define UART_FIFO_LENGTH 16 /* 16550A Fifo Length */
+
+typedef struct {
+ uint8_t divider;
+ uint8_t rbr; /* receive register */
+ uint8_t ier;
+ uint8_t iir; /* read only */
+ uint8_t lcr;
+ uint8_t mcr;
+ uint8_t lsr; /* read only */
+ uint8_t msr;
+ uint8_t scr;
+ uint8_t fcr;
+ IRQSignal *irq;
+ void (*write_func)(void *opaque, const uint8_t *buf, int buf_len);
+ void *opaque;
+} SerialState;
+
+static void serial_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2);
+static uint32_t serial_read(void *opaque, uint32_t offset, int size_log2);
+
+SerialState *serial_init(PhysMemoryMap *port_map, int addr,
+ IRQSignal *irq,
+ void (*write_func)(void *opaque, const uint8_t *buf, int buf_len), void *opaque)
+{
+ SerialState *s;
+ s = mallocz(sizeof(*s));
+
+ /* all 8 bit registers */
+ s->divider = 0;
+ s->rbr = 0; /* receive register */
+ s->ier = 0;
+ s->iir = UART_IIR_NO_INT; /* read only */
+ s->lcr = 0;
+ s->mcr = 0;
+ s->lsr = UART_LSR_TEMT | UART_LSR_THRE; /* read only */
+ s->msr = 0;
+ s->scr = 0;
+ s->fcr = 0;
+
+ s->irq = irq;
+ s->write_func = write_func;
+ s->opaque = opaque;
+
+ cpu_register_device(port_map, addr, 8, s, serial_read, serial_write,
+ DEVIO_SIZE8);
+ return s;
+}
+
+static void serial_update_irq(SerialState *s)
+{
+ if ((s->lsr & UART_LSR_DR) && (s->ier & UART_IER_RDI)) {
+ s->iir = UART_IIR_RDI;
+ } else if ((s->lsr & UART_LSR_THRE) && (s->ier & UART_IER_THRI)) {
+ s->iir = UART_IIR_THRI;
+ } else {
+ s->iir = UART_IIR_NO_INT;
+ }
+ if (s->iir != UART_IIR_NO_INT) {
+ set_irq(s->irq, 1);
+ } else {
+ set_irq(s->irq, 0);
+ }
+}
+
+#if 0
+/* send remainining chars in fifo */
+Serial.prototype.write_tx_fifo = function()
+{
+ if (s->tx_fifo != "") {
+ s->write_func(s->tx_fifo);
+ s->tx_fifo = "";
+
+ s->lsr |= UART_LSR_THRE;
+ s->lsr |= UART_LSR_TEMT;
+ s->update_irq();
+ }
+}
+#endif
+
+static void serial_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+ SerialState *s = opaque;
+ int addr;
+
+ addr = offset & 7;
+ switch(addr) {
+ default:
+ case 0:
+ if (s->lcr & UART_LCR_DLAB) {
+ s->divider = (s->divider & 0xff00) | val;
+ } else {
+#if 0
+ if (s->fcr & UART_FCR_FE) {
+ s->tx_fifo += String.fromCharCode(val);
+ s->lsr &= ~UART_LSR_THRE;
+ serial_update_irq(s);
+ if (s->tx_fifo.length >= UART_FIFO_LENGTH) {
+ /* write to the terminal */
+ s->write_tx_fifo();
+ }
+ } else
+#endif
+ {
+ uint8_t ch;
+ s->lsr &= ~UART_LSR_THRE;
+ serial_update_irq(s);
+
+ /* write to the terminal */
+ ch = val;
+ s->write_func(s->opaque, &ch, 1);
+ s->lsr |= UART_LSR_THRE;
+ s->lsr |= UART_LSR_TEMT;
+ serial_update_irq(s);
+ }
+ }
+ break;
+ case 1:
+ if (s->lcr & UART_LCR_DLAB) {
+ s->divider = (s->divider & 0x00ff) | (val << 8);
+ } else {
+ s->ier = val;
+ serial_update_irq(s);
+ }
+ break;
+ case 2:
+#if 0
+ if ((s->fcr ^ val) & UART_FCR_FE) {
+ /* clear fifos */
+ val |= UART_FCR_XFR | UART_FCR_RFR;
+ }
+ if (val & UART_FCR_XFR)
+ s->tx_fifo = "";
+ if (val & UART_FCR_RFR)
+ s->rx_fifo = "";
+ s->fcr = val & UART_FCR_FE;
+#endif
+ break;
+ case 3:
+ s->lcr = val;
+ break;
+ case 4:
+ s->mcr = val;
+ break;
+ case 5:
+ break;
+ case 6:
+ s->msr = val;
+ break;
+ case 7:
+ s->scr = val;
+ break;
+ }
+}
+
+static uint32_t serial_read(void *opaque, uint32_t offset, int size_log2)
+{
+ SerialState *s = opaque;
+ int ret, addr;
+
+ addr = offset & 7;
+ switch(addr) {
+ default:
+ case 0:
+ if (s->lcr & UART_LCR_DLAB) {
+ ret = s->divider & 0xff;
+ } else {
+ ret = s->rbr;
+ s->lsr &= ~(UART_LSR_DR | UART_LSR_BI);
+ serial_update_irq(s);
+#if 0
+ /* try to receive next chars */
+ s->send_char_from_fifo();
+#endif
+ }
+ break;
+ case 1:
+ if (s->lcr & UART_LCR_DLAB) {
+ ret = (s->divider >> 8) & 0xff;
+ } else {
+ ret = s->ier;
+ }
+ break;
+ case 2:
+ ret = s->iir;
+ if (s->fcr & UART_FCR_FE)
+ ret |= UART_IIR_FE;
+ break;
+ case 3:
+ ret = s->lcr;
+ break;
+ case 4:
+ ret = s->mcr;
+ break;
+ case 5:
+ ret = s->lsr;
+ break;
+ case 6:
+ ret = s->msr;
+ break;
+ case 7:
+ ret = s->scr;
+ break;
+ }
+ return ret;
+}
+
+void serial_send_break(SerialState *s)
+{
+ s->rbr = 0;
+ s->lsr |= UART_LSR_BI | UART_LSR_DR;
+ serial_update_irq(s);
+}
+
+#if 0
+static void serial_send_char(SerialState *s, int ch)
+{
+ s->rbr = ch;
+ s->lsr |= UART_LSR_DR;
+ serial_update_irq(s);
+}
+
+Serial.prototype.send_char_from_fifo = function()
+{
+ var fifo;
+
+ fifo = s->rx_fifo;
+ if (fifo != "" && !(s->lsr & UART_LSR_DR)) {
+ s->send_char(fifo.charCodeAt(0));
+ s->rx_fifo = fifo.substr(1, fifo.length - 1);
+ }
+}
+
+/* queue the string in the UART receive fifo and send it ASAP */
+Serial.prototype.send_chars = function(str)
+{
+ s->rx_fifo += str;
+ s->send_char_from_fifo();
+}
+
+#endif
+
+#ifdef DEBUG_BIOS
+static void bios_debug_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+#ifdef EMSCRIPTEN
+ static char line_buf[256];
+ static int line_buf_index;
+ line_buf[line_buf_index++] = val;
+ if (val == '\n' || line_buf_index >= sizeof(line_buf) - 1) {
+ line_buf[line_buf_index] = '\0';
+ printf("%s", line_buf);
+ line_buf_index = 0;
+ }
+#else
+ putchar(val & 0xff);
+#endif
+}
+
+static uint32_t bios_debug_read(void *opaque, uint32_t offset, int size_log2)
+{
+ return 0;
+}
+#endif
+
+typedef struct PCMachine {
+ VirtMachine common;
+ uint64_t ram_size;
+ PhysMemoryMap *mem_map;
+ PhysMemoryMap *port_map;
+
+ X86CPUState *cpu_state;
+ PIC2State *pic_state;
+ IRQSignal pic_irq[16];
+ PITState *pit_state;
+ I440FXState *i440fx_state;
+ CMOSState *cmos_state;
+ SerialState *serial_state;
+
+ /* input */
+ VIRTIODevice *keyboard_dev;
+ VIRTIODevice *mouse_dev;
+ KBDState *kbd_state;
+ PS2MouseState *ps2_mouse;
+ VMMouseState *vm_mouse;
+ PS2KbdState *ps2_kbd;
+
+#ifdef USE_KVM
+ BOOL kvm_enabled;
+ int kvm_fd;
+ int vm_fd;
+ int vcpu_fd;
+ int kvm_run_size;
+ struct kvm_run *kvm_run;
+#endif
+} PCMachine;
+
+static void copy_kernel(PCMachine *s, const uint8_t *buf, int buf_len,
+ const char *cmd_line);
+
+static void port80_write(void *opaque, uint32_t offset,
+ uint32_t val64, int size_log2)
+{
+}
+
+static uint32_t port80_read(void *opaque, uint32_t offset, int size_log2)
+{
+ return 0xff;
+}
+
+static void port92_write(void *opaque, uint32_t offset,
+ uint32_t val, int size_log2)
+{
+}
+
+static uint32_t port92_read(void *opaque, uint32_t offset, int size_log2)
+{
+ int a20 = 1; /* A20=0 is not supported */
+ return a20 << 1;
+}
+
+#define VMPORT_MAGIC 0x564D5868
+#define REG_EAX 0
+#define REG_EBX 1
+#define REG_ECX 2
+#define REG_EDX 3
+#define REG_ESI 4
+#define REG_EDI 5
+
+static uint32_t vmport_read(void *opaque, uint32_t addr, int size_log2)
+{
+ PCMachine *s = opaque;
+ uint32_t regs[6];
+
+#ifdef USE_KVM
+ if (s->kvm_enabled) {
+ struct kvm_regs r;
+
+ ioctl(s->vcpu_fd, KVM_GET_REGS, &r);
+ regs[REG_EAX] = r.rax;
+ regs[REG_EBX] = r.rbx;
+ regs[REG_ECX] = r.rcx;
+ regs[REG_EDX] = r.rdx;
+ regs[REG_ESI] = r.rsi;
+ regs[REG_EDI] = r.rdi;
+
+ if (regs[REG_EAX] == VMPORT_MAGIC) {
+
+ vmmouse_handler(s->vm_mouse, regs);
+
+ /* Note: in 64 bits the high parts are reset to zero
+ in all cases. */
+ r.rax = regs[REG_EAX];
+ r.rbx = regs[REG_EBX];
+ r.rcx = regs[REG_ECX];
+ r.rdx = regs[REG_EDX];
+ r.rsi = regs[REG_ESI];
+ r.rdi = regs[REG_EDI];
+ ioctl(s->vcpu_fd, KVM_SET_REGS, &r);
+ }
+ } else
+#endif
+ {
+ regs[REG_EAX] = x86_cpu_get_reg(s->cpu_state, 0);
+ regs[REG_EBX] = x86_cpu_get_reg(s->cpu_state, 3);
+ regs[REG_ECX] = x86_cpu_get_reg(s->cpu_state, 1);
+ regs[REG_EDX] = x86_cpu_get_reg(s->cpu_state, 2);
+ regs[REG_ESI] = x86_cpu_get_reg(s->cpu_state, 6);
+ regs[REG_EDI] = x86_cpu_get_reg(s->cpu_state, 7);
+
+ if (regs[REG_EAX] == VMPORT_MAGIC) {
+ vmmouse_handler(s->vm_mouse, regs);
+
+ x86_cpu_set_reg(s->cpu_state, 0, regs[REG_EAX]);
+ x86_cpu_set_reg(s->cpu_state, 3, regs[REG_EBX]);
+ x86_cpu_set_reg(s->cpu_state, 1, regs[REG_ECX]);
+ x86_cpu_set_reg(s->cpu_state, 2, regs[REG_EDX]);
+ x86_cpu_set_reg(s->cpu_state, 6, regs[REG_ESI]);
+ x86_cpu_set_reg(s->cpu_state, 7, regs[REG_EDI]);
+ }
+ }
+ return regs[REG_EAX];
+}
+
+static void vmport_write(void *opaque, uint32_t addr, uint32_t val,
+ int size_log2)
+{
+}
+
+static void pic_set_irq_cb(void *opaque, int level)
+{
+ PCMachine *s = opaque;
+ x86_cpu_set_irq(s->cpu_state, level);
+}
+
+static void serial_write_cb(void *opaque, const uint8_t *buf, int buf_len)
+{
+ PCMachine *s = opaque;
+ if (s->common.console) {
+ s->common.console->write_data(s->common.console->opaque, buf, buf_len);
+ }
+}
+
+static int get_hard_intno_cb(void *opaque)
+{
+ PCMachine *s = opaque;
+ return pic2_get_hard_intno(s->pic_state);
+}
+
+static int64_t pit_get_ticks_cb(void *opaque)
+{
+ struct timespec ts;
+
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return (uint64_t)ts.tv_sec * PIT_FREQ +
+ ((uint64_t)ts.tv_nsec * PIT_FREQ / 1000000000);
+}
+
+#define FRAMEBUFFER_BASE_ADDR 0xf0400000
+
+static uint8_t *get_ram_ptr(PCMachine *s, uint64_t paddr)
+{
+ PhysMemoryRange *pr;
+ pr = get_phys_mem_range(s->mem_map, paddr);
+ if (!pr || !pr->is_ram)
+ return NULL;
+ return pr->phys_mem + (uintptr_t)(paddr - pr->addr);
+}
+
+#ifdef DUMP_IOPORT
+static BOOL dump_port(int port)
+{
+ return !((port >= 0x1f0 && port <= 0x1f7) ||
+ (port >= 0x20 && port <= 0x21) ||
+ (port >= 0xa0 && port <= 0xa1));
+}
+#endif
+
+static void st_port(void *opaque, uint32_t port, uint32_t val, int size_log2)
+{
+ PCMachine *s = opaque;
+ PhysMemoryRange *pr;
+#ifdef DUMP_IOPORT
+ if (dump_port(port))
+ printf("write port=0x%x val=0x%x s=%d\n", port, val, 1 << size_log2);
+#endif
+ pr = get_phys_mem_range(s->port_map, port);
+ if (!pr) {
+ return;
+ }
+ port -= pr->addr;
+ if ((pr->devio_flags >> size_log2) & 1) {
+ pr->write_func(pr->opaque, port, (uint32_t)val, size_log2);
+ } else if (size_log2 == 1 && (pr->devio_flags & DEVIO_SIZE8)) {
+ pr->write_func(pr->opaque, port, val & 0xff, 0);
+ pr->write_func(pr->opaque, port + 1, (val >> 8) & 0xff, 0);
+ }
+}
+
+static uint32_t ld_port(void *opaque, uint32_t port1, int size_log2)
+{
+ PCMachine *s = opaque;
+ PhysMemoryRange *pr;
+ uint32_t val, port;
+
+ port = port1;
+ pr = get_phys_mem_range(s->port_map, port);
+ if (!pr) {
+ val = -1;
+ } else {
+ port -= pr->addr;
+ if ((pr->devio_flags >> size_log2) & 1) {
+ val = pr->read_func(pr->opaque, port, size_log2);
+ } else if (size_log2 == 1 && (pr->devio_flags & DEVIO_SIZE8)) {
+ val = pr->read_func(pr->opaque, port, 0) & 0xff;
+ val |= (pr->read_func(pr->opaque, port + 1, 0) & 0xff) << 8;
+ } else {
+ val = -1;
+ }
+ }
+#ifdef DUMP_IOPORT
+ if (dump_port(port1))
+ printf("read port=0x%x val=0x%x s=%d\n", port1, val, 1 << size_log2);
+#endif
+ return val;
+}
+
+static void pc_machine_set_defaults(VirtMachineParams *p)
+{
+ p->accel_enable = TRUE;
+}
+
+#ifdef USE_KVM
+
+static void sigalrm_handler(int sig)
+{
+}
+
+#define CPUID_APIC (1 << 9)
+#define CPUID_ACPI (1 << 22)
+
+static void kvm_set_cpuid(PCMachine *s)
+{
+ struct kvm_cpuid2 *kvm_cpuid;
+ int n_ent_max, i;
+ struct kvm_cpuid_entry2 *ent;
+
+ n_ent_max = 128;
+ kvm_cpuid = mallocz(sizeof(struct kvm_cpuid2) + n_ent_max * sizeof(kvm_cpuid->entries[0]));
+
+ kvm_cpuid->nent = n_ent_max;
+ if (ioctl(s->kvm_fd, KVM_GET_SUPPORTED_CPUID, kvm_cpuid) < 0) {
+ perror("KVM_GET_SUPPORTED_CPUID");
+ exit(1);
+ }
+
+ for(i = 0; i < kvm_cpuid->nent; i++) {
+ ent = &kvm_cpuid->entries[i];
+ /* remove the APIC & ACPI to be in sync with the emulator */
+ if (ent->function == 1 || ent->function == 0x80000001) {
+ ent->edx &= ~(CPUID_APIC | CPUID_ACPI);
+ }
+ }
+
+ if (ioctl(s->vcpu_fd, KVM_SET_CPUID2, kvm_cpuid) < 0) {
+ perror("KVM_SET_CPUID2");
+ exit(1);
+ }
+ free(kvm_cpuid);
+}
+
+/* XXX: should check overlapping mappings */
+static void kvm_map_ram(PhysMemoryMap *mem_map, PhysMemoryRange *pr)
+{
+ PCMachine *s = mem_map->opaque;
+ struct kvm_userspace_memory_region region;
+ int flags;
+
+ region.slot = pr - mem_map->phys_mem_range;
+ flags = 0;
+ if (pr->devram_flags & DEVRAM_FLAG_ROM)
+ flags |= KVM_MEM_READONLY;
+ if (pr->devram_flags & DEVRAM_FLAG_DIRTY_BITS)
+ flags |= KVM_MEM_LOG_DIRTY_PAGES;
+ region.flags = flags;
+ region.guest_phys_addr = pr->addr;
+ region.memory_size = pr->size;
+#if 0
+ printf("map slot %d: %08lx %08lx\n",
+ region.slot, pr->addr, pr->size);
+#endif
+ region.userspace_addr = (uintptr_t)pr->phys_mem;
+ if (ioctl(s->vm_fd, KVM_SET_USER_MEMORY_REGION, &region) < 0) {
+ perror("KVM_SET_USER_MEMORY_REGION");
+ exit(1);
+ }
+}
+
+/* XXX: just for one region */
+static PhysMemoryRange *kvm_register_ram(PhysMemoryMap *mem_map, uint64_t addr,
+ uint64_t size, int devram_flags)
+{
+ PhysMemoryRange *pr;
+ uint8_t *phys_mem;
+
+ pr = register_ram_entry(mem_map, addr, size, devram_flags);
+
+ phys_mem = mmap(NULL, size, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+ if (!phys_mem)
+ return NULL;
+ pr->phys_mem = phys_mem;
+ if (devram_flags & DEVRAM_FLAG_DIRTY_BITS) {
+ int n_pages = size >> 12;
+ pr->dirty_bits_size = ((n_pages + 63) / 64) * 8;
+ pr->dirty_bits = mallocz(pr->dirty_bits_size);
+ }
+
+ if (pr->size != 0) {
+ kvm_map_ram(mem_map, pr);
+ }
+ return pr;
+}
+
+static void kvm_set_ram_addr(PhysMemoryMap *mem_map,
+ PhysMemoryRange *pr, uint64_t addr, BOOL enabled)
+{
+ if (enabled) {
+ if (pr->size == 0 || addr != pr->addr) {
+ /* move or create the region */
+ pr->size = pr->org_size;
+ pr->addr = addr;
+ kvm_map_ram(mem_map, pr);
+ }
+ } else {
+ if (pr->size != 0) {
+ pr->addr = 0;
+ pr->size = 0;
+ /* map a zero size region to disable */
+ kvm_map_ram(mem_map, pr);
+ }
+ }
+}
+
+static const uint32_t *kvm_get_dirty_bits(PhysMemoryMap *mem_map,
+ PhysMemoryRange *pr)
+{
+ PCMachine *s = mem_map->opaque;
+ struct kvm_dirty_log dlog;
+
+ if (pr->size == 0) {
+ /* not mapped: we assume no modification was made */
+ memset(pr->dirty_bits, 0, pr->dirty_bits_size);
+ } else {
+ dlog.slot = pr - mem_map->phys_mem_range;
+ dlog.dirty_bitmap = pr->dirty_bits;
+ if (ioctl(s->vm_fd, KVM_GET_DIRTY_LOG, &dlog) < 0) {
+ perror("KVM_GET_DIRTY_LOG");
+ exit(1);
+ }
+ }
+ return pr->dirty_bits;
+}
+
+static void kvm_free_ram(PhysMemoryMap *mem_map, PhysMemoryRange *pr)
+{
+ /* XXX: do it */
+ munmap(pr->phys_mem, pr->org_size);
+ free(pr->dirty_bits);
+}
+
+static void kvm_pic_set_irq(void *opaque, int irq_num, int level)
+{
+ PCMachine *s = opaque;
+ struct kvm_irq_level irq_level;
+ irq_level.irq = irq_num;
+ irq_level.level = level;
+ if (ioctl(s->vm_fd, KVM_IRQ_LINE, &irq_level) < 0) {
+ perror("KVM_IRQ_LINE");
+ exit(1);
+ }
+}
+
+static void kvm_init(PCMachine *s)
+{
+ int ret, i;
+ struct sigaction act;
+ struct kvm_pit_config pit_config;
+ uint64_t base_addr;
+
+ s->kvm_enabled = FALSE;
+ s->kvm_fd = open("/dev/kvm", O_RDWR);
+ if (s->kvm_fd < 0) {
+ fprintf(stderr, "KVM not available\n");
+ return;
+ }
+ ret = ioctl(s->kvm_fd, KVM_GET_API_VERSION, 0);
+ if (ret < 0) {
+ perror("KVM_GET_API_VERSION");
+ exit(1);
+ }
+ if (ret != 12) {
+ fprintf(stderr, "Unsupported KVM version\n");
+ close(s->kvm_fd);
+ s->kvm_fd = -1;
+ return;
+ }
+ s->vm_fd = ioctl(s->kvm_fd, KVM_CREATE_VM, 0);
+ if (s->vm_fd < 0) {
+ perror("KVM_CREATE_VM");
+ exit(1);
+ }
+
+ /* just before the BIOS */
+ base_addr = 0xfffbc000;
+ if (ioctl(s->vm_fd, KVM_SET_IDENTITY_MAP_ADDR, &base_addr) < 0) {
+ perror("KVM_SET_IDENTITY_MAP_ADDR");
+ exit(1);
+ }
+
+ if (ioctl(s->vm_fd, KVM_SET_TSS_ADDR, (long)(base_addr + 0x1000)) < 0) {
+ perror("KVM_SET_TSS_ADDR");
+ exit(1);
+ }
+
+ if (ioctl(s->vm_fd, KVM_CREATE_IRQCHIP, 0) < 0) {
+ perror("KVM_CREATE_IRQCHIP");
+ exit(1);
+ }
+
+ memset(&pit_config, 0, sizeof(pit_config));
+ pit_config.flags = KVM_PIT_SPEAKER_DUMMY;
+ if (ioctl(s->vm_fd, KVM_CREATE_PIT2, &pit_config)) {
+ perror("KVM_CREATE_PIT2");
+ exit(1);
+ }
+
+ s->vcpu_fd = ioctl(s->vm_fd, KVM_CREATE_VCPU, 0);
+ if (s->vcpu_fd < 0) {
+ perror("KVM_CREATE_VCPU");
+ exit(1);
+ }
+
+ kvm_set_cpuid(s);
+
+ /* map the kvm_run structure */
+ s->kvm_run_size = ioctl(s->kvm_fd, KVM_GET_VCPU_MMAP_SIZE, NULL);
+ if (s->kvm_run_size < 0) {
+ perror("KVM_GET_VCPU_MMAP_SIZE");
+ exit(1);
+ }
+
+ s->kvm_run = mmap(NULL, s->kvm_run_size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, s->vcpu_fd, 0);
+ if (!s->kvm_run) {
+ perror("mmap kvm_run");
+ exit(1);
+ }
+
+ for(i = 0; i < 16; i++) {
+ irq_init(&s->pic_irq[i], kvm_pic_set_irq, s, i);
+ }
+
+ act.sa_handler = sigalrm_handler;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(SIGALRM, &act, NULL);
+
+ s->kvm_enabled = TRUE;
+
+ s->mem_map->register_ram = kvm_register_ram;
+ s->mem_map->free_ram = kvm_free_ram;
+ s->mem_map->get_dirty_bits = kvm_get_dirty_bits;
+ s->mem_map->set_ram_addr = kvm_set_ram_addr;
+ s->mem_map->opaque = s;
+}
+
+static void kvm_exit_io(PCMachine *s, struct kvm_run *run)
+{
+ uint8_t *ptr;
+ int i;
+
+ ptr = (uint8_t *)run + run->io.data_offset;
+ // printf("port: addr=%04x\n", run->io.port);
+
+ for(i = 0; i < run->io.count; i++) {
+ if (run->io.direction == KVM_EXIT_IO_OUT) {
+ switch(run->io.size) {
+ case 1:
+ st_port(s, run->io.port, *(uint8_t *)ptr, 0);
+ break;
+ case 2:
+ st_port(s, run->io.port, *(uint16_t *)ptr, 1);
+ break;
+ case 4:
+ st_port(s, run->io.port, *(uint32_t *)ptr, 2);
+ break;
+ default:
+ abort();
+ }
+ } else {
+ switch(run->io.size) {
+ case 1:
+ *(uint8_t *)ptr = ld_port(s, run->io.port, 0);
+ break;
+ case 2:
+ *(uint16_t *)ptr = ld_port(s, run->io.port, 1);
+ break;
+ case 4:
+ *(uint32_t *)ptr = ld_port(s, run->io.port, 2);
+ break;
+ default:
+ abort();
+ }
+ }
+ ptr += run->io.size;
+ }
+}
+
+static void kvm_exit_mmio(PCMachine *s, struct kvm_run *run)
+{
+ uint8_t *data = run->mmio.data;
+ PhysMemoryRange *pr;
+ uint64_t addr;
+
+ pr = get_phys_mem_range(s->mem_map, run->mmio.phys_addr);
+ if (run->mmio.is_write) {
+ if (!pr || pr->is_ram)
+ return;
+ addr = run->mmio.phys_addr - pr->addr;
+ switch(run->mmio.len) {
+ case 1:
+ if (pr->devio_flags & DEVIO_SIZE8) {
+ pr->write_func(pr->opaque, addr, *(uint8_t *)data, 0);
+ }
+ break;
+ case 2:
+ if (pr->devio_flags & DEVIO_SIZE16) {
+ pr->write_func(pr->opaque, addr, *(uint16_t *)data, 1);
+ }
+ break;
+ case 4:
+ if (pr->devio_flags & DEVIO_SIZE32) {
+ pr->write_func(pr->opaque, addr, *(uint32_t *)data, 2);
+ }
+ break;
+ case 8:
+ if (pr->devio_flags & DEVIO_SIZE32) {
+ pr->write_func(pr->opaque, addr, *(uint32_t *)data, 2);
+ pr->write_func(pr->opaque, addr + 4, *(uint32_t *)(data + 4), 2);
+ }
+ break;
+ default:
+ abort();
+ }
+ } else {
+ if (!pr || pr->is_ram)
+ goto no_dev;
+ addr = run->mmio.phys_addr - pr->addr;
+ switch(run->mmio.len) {
+ case 1:
+ if (!(pr->devio_flags & DEVIO_SIZE8))
+ goto no_dev;
+ *(uint8_t *)data = pr->read_func(pr->opaque, addr, 0);
+ break;
+ case 2:
+ if (!(pr->devio_flags & DEVIO_SIZE16))
+ goto no_dev;
+ *(uint16_t *)data = pr->read_func(pr->opaque, addr, 1);
+ break;
+ case 4:
+ if (!(pr->devio_flags & DEVIO_SIZE32))
+ goto no_dev;
+ *(uint32_t *)data = pr->read_func(pr->opaque, addr, 2);
+ break;
+ case 8:
+ if (pr->devio_flags & DEVIO_SIZE32) {
+ *(uint32_t *)data =
+ pr->read_func(pr->opaque, addr, 2);
+ *(uint32_t *)(data + 4) =
+ pr->read_func(pr->opaque, addr + 4, 2);
+ } else {
+ no_dev:
+ memset(run->mmio.data, 0, run->mmio.len);
+ }
+ break;
+ default:
+ abort();
+ }
+
+ }
+}
+
+static void kvm_exec(PCMachine *s)
+{
+ struct kvm_run *run = s->kvm_run;
+ struct itimerval ival;
+ int ret;
+
+ /* Not efficient but simple: we use a timer to interrupt the
+ execution after a given time */
+ ival.it_interval.tv_sec = 0;
+ ival.it_interval.tv_usec = 0;
+ ival.it_value.tv_sec = 0;
+ ival.it_value.tv_usec = 10 * 1000; /* 10 ms max */
+ setitimer(ITIMER_REAL, &ival, NULL);
+
+ ret = ioctl(s->vcpu_fd, KVM_RUN, 0);
+ if (ret < 0) {
+ if (errno == EINTR || errno == EAGAIN) {
+ /* timeout */
+ return;
+ }
+ perror("KVM_RUN");
+ exit(1);
+ }
+ // printf("exit=%d\n", run->exit_reason);
+ switch(run->exit_reason) {
+ case KVM_EXIT_HLT:
+ break;
+ case KVM_EXIT_IO:
+ kvm_exit_io(s, run);
+ break;
+ case KVM_EXIT_MMIO:
+ kvm_exit_mmio(s, run);
+ break;
+ case KVM_EXIT_FAIL_ENTRY:
+ fprintf(stderr, "KVM_EXIT_FAIL_ENTRY: reason=0x%" PRIx64 "\n",
+ (uint64_t)run->fail_entry.hardware_entry_failure_reason);
+#if 0
+ {
+ struct kvm_regs regs;
+ if (ioctl(s->vcpu_fd, KVM_GET_REGS, &regs) < 0) {
+ perror("KVM_SET_REGS");
+ exit(1);
+ }
+ printf("RIP=%016" PRIx64 "\n", (uint64_t)regs.rip);
+ }
+#endif
+ exit(1);
+ case KVM_EXIT_INTERNAL_ERROR:
+ fprintf(stderr, "KVM_EXIT_INTERNAL_ERROR: suberror=0x%x\n",
+ (uint32_t)run->internal.suberror);
+ exit(1);
+ default:
+ fprintf(stderr, "KVM: unsupported exit_reason=%d\n", run->exit_reason);
+ exit(1);
+ }
+}
+#endif
+
+#if defined(EMSCRIPTEN)
+/* with Javascript clock_gettime() is not enough precise enough to
+ have a reliable TSC counter. XXX: increment the cycles during the
+ power down time */
+static uint64_t cpu_get_tsc(void *opaque)
+{
+ PCMachine *s = opaque;
+ uint64_t c;
+ c = x86_cpu_get_cycles(s->cpu_state);
+ return c;
+}
+#else
+
+#define TSC_FREQ 100000000
+
+static uint64_t cpu_get_tsc(void *opaque)
+{
+ struct timespec ts;
+
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return (uint64_t)ts.tv_sec * TSC_FREQ +
+ (ts.tv_nsec / (1000000000 / TSC_FREQ));
+}
+#endif
+
+static void pc_flush_tlb_write_range(void *opaque, uint8_t *ram_addr,
+ size_t ram_size)
+{
+ PCMachine *s = opaque;
+ x86_cpu_flush_tlb_write_range_ram(s->cpu_state, ram_addr, ram_size);
+}
+
+static VirtMachine *pc_machine_init(const VirtMachineParams *p)
+{
+ PCMachine *s;
+ int i, piix3_devfn;
+ PCIBus *pci_bus;
+ VIRTIOBusDef vbus_s, *vbus = &vbus_s;
+
+ if (strcmp(p->machine_name, "pc") != 0) {
+ vm_error("unsupported machine: %s\n", p->machine_name);
+ return NULL;
+ }
+
+ assert(p->ram_size >= (1 << 20));
+
+ s = mallocz(sizeof(*s));
+ s->common.vmc = p->vmc;
+ s->ram_size = p->ram_size;
+
+ s->port_map = phys_mem_map_init();
+ s->mem_map = phys_mem_map_init();
+
+#ifdef USE_KVM
+ if (p->accel_enable) {
+ kvm_init(s);
+ }
+#endif
+
+#ifdef USE_KVM
+ if (!s->kvm_enabled)
+#endif
+ {
+ s->cpu_state = x86_cpu_init(s->mem_map);
+ x86_cpu_set_get_tsc(s->cpu_state, cpu_get_tsc, s);
+ x86_cpu_set_port_io(s->cpu_state, ld_port, st_port, s);
+
+ /* needed to handle the RAM dirty bits */
+ s->mem_map->opaque = s;
+ s->mem_map->flush_tlb_write_range = pc_flush_tlb_write_range;
+ }
+
+ /* set the RAM mapping and leave the VGA addresses empty */
+ cpu_register_ram(s->mem_map, 0xc0000, p->ram_size - 0xc0000, 0);
+ cpu_register_ram(s->mem_map, 0, 0xa0000, 0);
+
+ /* devices */
+ cpu_register_device(s->port_map, 0x80, 2, s, port80_read, port80_write,
+ DEVIO_SIZE8);
+ cpu_register_device(s->port_map, 0x92, 2, s, port92_read, port92_write,
+ DEVIO_SIZE8);
+
+ /* setup the bios */
+ if (p->files[VM_FILE_BIOS].len > 0) {
+ int bios_size, bios_size1;
+ uint8_t *bios_buf, *ptr;
+ uint32_t bios_addr;
+
+ bios_size = p->files[VM_FILE_BIOS].len;
+ bios_buf = p->files[VM_FILE_BIOS].buf;
+ assert((bios_size % 65536) == 0 && bios_size != 0);
+ bios_addr = -bios_size;
+ /* at the top of the 4GB memory */
+ cpu_register_ram(s->mem_map, bios_addr, bios_size, DEVRAM_FLAG_ROM);
+ ptr = get_ram_ptr(s, bios_addr);
+ memcpy(ptr, bios_buf, bios_size);
+ /* in the lower 1MB memory (currently set as RAM) */
+ bios_size1 = min_int(bios_size, 128 * 1024);
+ ptr = get_ram_ptr(s, 0x100000 - bios_size1);
+ memcpy(ptr, bios_buf + bios_size - bios_size1, bios_size1);
+#ifdef DEBUG_BIOS
+ cpu_register_device(s->port_map, 0x402, 2, s,
+ bios_debug_read, bios_debug_write,
+ DEVIO_SIZE8);
+#endif
+ }
+
+#ifdef USE_KVM
+ if (!s->kvm_enabled)
+#endif
+ {
+ s->pic_state = pic2_init(s->port_map, 0x20, 0xa0,
+ 0x4d0, 0x4d1,
+ pic_set_irq_cb, s,
+ s->pic_irq);
+ x86_cpu_set_get_hard_intno(s->cpu_state, get_hard_intno_cb, s);
+ s->pit_state = pit_init(s->port_map, 0x40, 0x61, &s->pic_irq[0],
+ pit_get_ticks_cb, s);
+ }
+
+ s->cmos_state = cmos_init(s->port_map, 0x70, &s->pic_irq[8],
+ p->rtc_local_time);
+
+ /* various cmos data */
+ {
+ int size;
+ /* memory size */
+ size = min_int((s->ram_size - (1 << 20)) >> 10, 65535);
+ put_le16(s->cmos_state->cmos_data + 0x30, size);
+ if (s->ram_size >= (16 << 20)) {
+ size = min_int((s->ram_size - (16 << 20)) >> 16, 65535);
+ put_le16(s->cmos_state->cmos_data + 0x34, size);
+ }
+ s->cmos_state->cmos_data[0x14] = 0x06; /* mouse + FPU present */
+ }
+
+ s->i440fx_state = i440fx_init(&pci_bus, &piix3_devfn, s->mem_map,
+ s->port_map, s->pic_irq);
+
+ s->common.console = p->console;
+ /* serial console */
+ if (0) {
+ s->serial_state = serial_init(s->port_map, 0x3f8, &s->pic_irq[4],
+ serial_write_cb, s);
+ }
+
+ memset(vbus, 0, sizeof(*vbus));
+ vbus->pci_bus = pci_bus;
+
+ if (p->console) {
+ /* virtio console */
+ s->common.console_dev = virtio_console_init(vbus, p->console);
+ }
+
+ /* block devices */
+ for(i = 0; i < p->drive_count;) {
+ const VMDriveEntry *de = &p->tab_drive[i];
+
+ if (!de->device || !strcmp(de->device, "virtio")) {
+ virtio_block_init(vbus, p->tab_drive[i].block_dev);
+ i++;
+ } else if (!strcmp(de->device, "ide")) {
+ BlockDevice *tab_bs[2];
+
+ tab_bs[0] = p->tab_drive[i++].block_dev;
+ tab_bs[1] = NULL;
+ if (i < p->drive_count)
+ tab_bs[1] = p->tab_drive[i++].block_dev;
+ ide_init(s->port_map, 0x1f0, 0x3f6, &s->pic_irq[14], tab_bs);
+ piix3_ide_init(pci_bus, piix3_devfn + 1);
+ }
+ }
+
+ /* virtio filesystem */
+ for(i = 0; i < p->fs_count; i++) {
+ virtio_9p_init(vbus, p->tab_fs[i].fs_dev,
+ p->tab_fs[i].tag);
+ }
+
+ if (p->display_device) {
+ FBDevice *fb_dev;
+
+ fb_dev = mallocz(sizeof(*fb_dev));
+ s->common.fb_dev = fb_dev;
+ if (!strcmp(p->display_device, "vga")) {
+ int bios_size;
+ uint8_t *bios_buf;
+ bios_size = p->files[VM_FILE_VGA_BIOS].len;
+ bios_buf = p->files[VM_FILE_VGA_BIOS].buf;
+ pci_vga_init(pci_bus, fb_dev, p->width, p->height,
+ bios_buf, bios_size);
+ } else if (!strcmp(p->display_device, "simplefb")) {
+ simplefb_init(s->mem_map,
+ FRAMEBUFFER_BASE_ADDR,
+ fb_dev, p->width, p->height);
+ } else {
+ vm_error("unsupported display device: %s\n", p->display_device);
+ exit(1);
+ }
+ }
+
+ if (p->input_device) {
+ if (!strcmp(p->input_device, "virtio")) {
+ s->keyboard_dev = virtio_input_init(vbus, VIRTIO_INPUT_TYPE_KEYBOARD);
+
+ s->mouse_dev = virtio_input_init(vbus, VIRTIO_INPUT_TYPE_TABLET);
+ } else if (!strcmp(p->input_device, "ps2")) {
+ s->kbd_state = i8042_init(&s->ps2_kbd, &s->ps2_mouse,
+ s->port_map,
+ &s->pic_irq[1], &s->pic_irq[12], 0x60);
+ /* vmmouse */
+ cpu_register_device(s->port_map, 0x5658, 1, s,
+ vmport_read, vmport_write,
+ DEVIO_SIZE32);
+ s->vm_mouse = vmmouse_init(s->ps2_mouse);
+ } else {
+ vm_error("unsupported input device: %s\n", p->input_device);
+ exit(1);
+ }
+ }
+
+ /* virtio net device */
+ for(i = 0; i < p->eth_count; i++) {
+ virtio_net_init(vbus, p->tab_eth[i].net);
+ s->common.net = p->tab_eth[i].net;
+ }
+
+ if (p->files[VM_FILE_KERNEL].buf) {
+ copy_kernel(s, p->files[VM_FILE_KERNEL].buf,
+ p->files[VM_FILE_KERNEL].len,
+ p->cmdline ? p->cmdline : "");
+ }
+
+ return (VirtMachine *)s;
+}
+
+static void pc_machine_end(VirtMachine *s1)
+{
+ PCMachine *s = (PCMachine *)s1;
+ /* XXX: free all */
+ if (s->cpu_state) {
+ x86_cpu_end(s->cpu_state);
+ }
+ phys_mem_map_end(s->mem_map);
+ phys_mem_map_end(s->port_map);
+ free(s);
+}
+
+static void pc_vm_send_key_event(VirtMachine *s1, BOOL is_down, uint16_t key_code)
+{
+ PCMachine *s = (PCMachine *)s1;
+ if (s->keyboard_dev) {
+ virtio_input_send_key_event(s->keyboard_dev, is_down, key_code);
+ } else if (s->ps2_kbd) {
+ ps2_put_keycode(s->ps2_kbd, is_down, key_code);
+ }
+}
+
+static BOOL pc_vm_mouse_is_absolute(VirtMachine *s1)
+{
+ PCMachine *s = (PCMachine *)s1;
+ if (s->mouse_dev) {
+ return TRUE;
+ } else if (s->vm_mouse) {
+ return vmmouse_is_absolute(s->vm_mouse);
+ } else {
+ return FALSE;
+ }
+}
+
+static void pc_vm_send_mouse_event(VirtMachine *s1, int dx, int dy, int dz,
+ unsigned int buttons)
+{
+ PCMachine *s = (PCMachine *)s1;
+ if (s->mouse_dev) {
+ virtio_input_send_mouse_event(s->mouse_dev, dx, dy, dz, buttons);
+ } else if (s->vm_mouse) {
+ vmmouse_send_mouse_event(s->vm_mouse, dx, dy, dz, buttons);
+ }
+}
+
+struct screen_info {
+} __attribute__((packed));
+
+/* from plex86 (BSD license) */
+struct __attribute__ ((packed)) linux_params {
+ /* screen_info structure */
+ uint8_t orig_x; /* 0x00 */
+ uint8_t orig_y; /* 0x01 */
+ uint16_t ext_mem_k; /* 0x02 */
+ uint16_t orig_video_page; /* 0x04 */
+ uint8_t orig_video_mode; /* 0x06 */
+ uint8_t orig_video_cols; /* 0x07 */
+ uint8_t flags; /* 0x08 */
+ uint8_t unused2; /* 0x09 */
+ uint16_t orig_video_ega_bx;/* 0x0a */
+ uint16_t unused3; /* 0x0c */
+ uint8_t orig_video_lines; /* 0x0e */
+ uint8_t orig_video_isVGA; /* 0x0f */
+ uint16_t orig_video_points;/* 0x10 */
+
+ /* VESA graphic mode -- linear frame buffer */
+ uint16_t lfb_width; /* 0x12 */
+ uint16_t lfb_height; /* 0x14 */
+ uint16_t lfb_depth; /* 0x16 */
+ uint32_t lfb_base; /* 0x18 */
+ uint32_t lfb_size; /* 0x1c */
+ uint16_t cl_magic, cl_offset; /* 0x20 */
+ uint16_t lfb_linelength; /* 0x24 */
+ uint8_t red_size; /* 0x26 */
+ uint8_t red_pos; /* 0x27 */
+ uint8_t green_size; /* 0x28 */
+ uint8_t green_pos; /* 0x29 */
+ uint8_t blue_size; /* 0x2a */
+ uint8_t blue_pos; /* 0x2b */
+ uint8_t rsvd_size; /* 0x2c */
+ uint8_t rsvd_pos; /* 0x2d */
+ uint16_t vesapm_seg; /* 0x2e */
+ uint16_t vesapm_off; /* 0x30 */
+ uint16_t pages; /* 0x32 */
+ uint16_t vesa_attributes; /* 0x34 */
+ uint32_t capabilities; /* 0x36 */
+ uint32_t ext_lfb_base; /* 0x3a */
+ uint8_t _reserved[2]; /* 0x3e */
+
+ /* 0x040 */ uint8_t apm_bios_info[20]; // struct apm_bios_info
+ /* 0x054 */ uint8_t pad2[0x80 - 0x54];
+
+ // Following 2 from 'struct drive_info_struct' in drivers/block/cciss.h.
+ // Might be truncated?
+ /* 0x080 */ uint8_t hd0_info[16]; // hd0-disk-parameter from intvector 0x41
+ /* 0x090 */ uint8_t hd1_info[16]; // hd1-disk-parameter from intvector 0x46
+
+ // System description table truncated to 16 bytes
+ // From 'struct sys_desc_table_struct' in linux/arch/i386/kernel/setup.c.
+ /* 0x0a0 */ uint16_t sys_description_len;
+ /* 0x0a2 */ uint8_t sys_description_table[14];
+ // [0] machine id
+ // [1] machine submodel id
+ // [2] BIOS revision
+ // [3] bit1: MCA bus
+
+ /* 0x0b0 */ uint8_t pad3[0x1e0 - 0xb0];
+ /* 0x1e0 */ uint32_t alt_mem_k;
+ /* 0x1e4 */ uint8_t pad4[4];
+ /* 0x1e8 */ uint8_t e820map_entries;
+ /* 0x1e9 */ uint8_t eddbuf_entries; // EDD_NR
+ /* 0x1ea */ uint8_t pad5[0x1f1 - 0x1ea];
+ /* 0x1f1 */ uint8_t setup_sects; // size of setup.S, number of sectors
+ /* 0x1f2 */ uint16_t mount_root_rdonly; // MOUNT_ROOT_RDONLY (if !=0)
+ /* 0x1f4 */ uint16_t sys_size; // size of compressed kernel-part in the
+ // (b)zImage-file (in 16 byte units, rounded up)
+ /* 0x1f6 */ uint16_t swap_dev; // (unused AFAIK)
+ /* 0x1f8 */ uint16_t ramdisk_flags;
+ /* 0x1fa */ uint16_t vga_mode; // (old one)
+ /* 0x1fc */ uint16_t orig_root_dev; // (high=Major, low=minor)
+ /* 0x1fe */ uint8_t pad6[1];
+ /* 0x1ff */ uint8_t aux_device_info;
+ /* 0x200 */ uint16_t jump_setup; // Jump to start of setup code,
+ // aka "reserved" field.
+ /* 0x202 */ uint8_t setup_signature[4]; // Signature for SETUP-header, ="HdrS"
+ /* 0x206 */ uint16_t header_format_version; // Version number of header format;
+ /* 0x208 */ uint8_t setup_S_temp0[8]; // Used by setup.S for communication with
+ // boot loaders, look there.
+ /* 0x210 */ uint8_t loader_type;
+ // 0 for old one.
+ // else 0xTV:
+ // T=0: LILO
+ // T=1: Loadlin
+ // T=2: bootsect-loader
+ // T=3: SYSLINUX
+ // T=4: ETHERBOOT
+ // V=version
+ /* 0x211 */ uint8_t loadflags;
+ // bit0 = 1: kernel is loaded high (bzImage)
+ // bit7 = 1: Heap and pointer (see below) set by boot
+ // loader.
+ /* 0x212 */ uint16_t setup_S_temp1;
+ /* 0x214 */ uint32_t kernel_start;
+ /* 0x218 */ uint32_t initrd_start;
+ /* 0x21c */ uint32_t initrd_size;
+ /* 0x220 */ uint8_t setup_S_temp2[4];
+ /* 0x224 */ uint16_t setup_S_heap_end_pointer;
+ /* 0x226 */ uint16_t pad70;
+ /* 0x228 */ uint32_t cmd_line_ptr;
+ /* 0x22c */ uint8_t pad7[0x2d0 - 0x22c];
+
+ /* 0x2d0 : Int 15, ax=e820 memory map. */
+ // (linux/include/asm-i386/e820.h, 'struct e820entry')
+#define E820MAX 32
+#define E820_RAM 1
+#define E820_RESERVED 2
+#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
+#define E820_NVS 4
+ struct {
+ uint64_t addr;
+ uint64_t size;
+ uint32_t type;
+ } e820map[E820MAX];
+
+ /* 0x550 */ uint8_t pad8[0x600 - 0x550];
+
+ // BIOS Enhanced Disk Drive Services.
+ // (From linux/include/asm-i386/edd.h, 'struct edd_info')
+ // Each 'struct edd_info is 78 bytes, times a max of 6 structs in array.
+ /* 0x600 */ uint8_t eddbuf[0x7d4 - 0x600];
+
+ /* 0x7d4 */ uint8_t pad9[0x800 - 0x7d4];
+ /* 0x800 */ uint8_t commandline[0x800];
+
+ uint64_t gdt_table[4];
+};
+
+#define KERNEL_PARAMS_ADDR 0x00090000
+
+static void copy_kernel(PCMachine *s, const uint8_t *buf, int buf_len,
+ const char *cmd_line)
+{
+ uint8_t *ram_ptr;
+ int setup_sects, header_len, copy_len, setup_hdr_start, setup_hdr_end;
+ uint32_t load_address;
+ struct linux_params *params;
+ FBDevice *fb_dev;
+
+ if (buf_len < 1024) {
+ too_small:
+ fprintf(stderr, "Kernel too small\n");
+ exit(1);
+ }
+ if (buf[0x1fe] != 0x55 || buf[0x1ff] != 0xaa) {
+ fprintf(stderr, "Invalid kernel magic\n");
+ exit(1);
+ }
+ setup_sects = buf[0x1f1];
+ if (setup_sects == 0)
+ setup_sects = 4;
+ header_len = (setup_sects + 1) * 512;
+ if (buf_len < header_len)
+ goto too_small;
+ if (memcmp(buf + 0x202, "HdrS", 4) != 0) {
+ fprintf(stderr, "Kernel too old\n");
+ exit(1);
+ }
+ load_address = 0x100000; /* we don't support older protocols */
+
+ ram_ptr = get_ram_ptr(s, load_address);
+ copy_len = buf_len - header_len;
+ if (copy_len > (s->ram_size - load_address)) {
+ fprintf(stderr, "Not enough RAM\n");
+ exit(1);
+ }
+ memcpy(ram_ptr, buf + header_len, copy_len);
+
+ params = (void *)get_ram_ptr(s, KERNEL_PARAMS_ADDR);
+
+ memset(params, 0, sizeof(struct linux_params));
+
+ /* copy the setup header */
+ setup_hdr_start = 0x1f1;
+ setup_hdr_end = 0x202 + buf[0x201];
+ memcpy((uint8_t *)params + setup_hdr_start, buf + setup_hdr_start,
+ setup_hdr_end - setup_hdr_start);
+
+ strcpy((char *)params->commandline, cmd_line);
+
+ params->mount_root_rdonly = 0;
+ params->cmd_line_ptr = KERNEL_PARAMS_ADDR +
+ offsetof(struct linux_params, commandline);
+ params->alt_mem_k = (s->ram_size / 1024) - 1024;
+ params->loader_type = 0x01;
+#if 0
+ if (initrd_size > 0) {
+ params->initrd_start = INITRD_LOAD_ADDR;
+ params->initrd_size = initrd_size;
+ }
+#endif
+ params->orig_video_lines = 0;
+ params->orig_video_cols = 0;
+
+ fb_dev = s->common.fb_dev;
+ if (fb_dev) {
+
+ params->orig_video_isVGA = 0x23; /* VIDEO_TYPE_VLFB */
+
+ params->lfb_depth = 32;
+ params->red_size = 8;
+ params->red_pos = 16;
+ params->green_size = 8;
+ params->green_pos = 8;
+ params->blue_size = 8;
+ params->blue_pos = 0;
+ params->rsvd_size = 8;
+ params->rsvd_pos = 24;
+
+ params->lfb_width = fb_dev->width;
+ params->lfb_height = fb_dev->height;
+ params->lfb_linelength = fb_dev->stride;
+ params->lfb_size = fb_dev->fb_size;
+ params->lfb_base = FRAMEBUFFER_BASE_ADDR;
+ }
+
+ params->gdt_table[2] = 0x00cf9b000000ffffLL; /* CS */
+ params->gdt_table[3] = 0x00cf93000000ffffLL; /* DS */
+
+#ifdef USE_KVM
+ if (s->kvm_enabled) {
+ struct kvm_sregs sregs;
+ struct kvm_segment seg;
+ struct kvm_regs regs;
+
+ /* init flat protected mode */
+
+ if (ioctl(s->vcpu_fd, KVM_GET_SREGS, &sregs) < 0) {
+ perror("KVM_GET_SREGS");
+ exit(1);
+ }
+
+ sregs.cr0 |= (1 << 0); /* CR0_PE */
+ sregs.gdt.base = KERNEL_PARAMS_ADDR +
+ offsetof(struct linux_params, gdt_table);
+ sregs.gdt.limit = sizeof(params->gdt_table) - 1;
+
+ memset(&seg, 0, sizeof(seg));
+ seg.limit = 0xffffffff;
+ seg.present = 1;
+ seg.db = 1;
+ seg.s = 1; /* code/data */
+ seg.g = 1; /* 4KB granularity */
+
+ seg.type = 0xb; /* code */
+ seg.selector = 2 << 3;
+ sregs.cs = seg;
+
+ seg.type = 0x3; /* data */
+ seg.selector = 3 << 3;
+ sregs.ds = seg;
+ sregs.es = seg;
+ sregs.ss = seg;
+ sregs.fs = seg;
+ sregs.gs = seg;
+
+ if (ioctl(s->vcpu_fd, KVM_SET_SREGS, &sregs) < 0) {
+ perror("KVM_SET_SREGS");
+ exit(1);
+ }
+
+ memset(&regs, 0, sizeof(regs));
+ regs.rip = load_address;
+ regs.rsi = KERNEL_PARAMS_ADDR;
+ regs.rflags = 0x2;
+ if (ioctl(s->vcpu_fd, KVM_SET_REGS, &regs) < 0) {
+ perror("KVM_SET_REGS");
+ exit(1);
+ }
+ } else
+#endif
+ {
+ int i;
+ X86CPUSeg sd;
+ uint32_t val;
+ val = x86_cpu_get_reg(s->cpu_state, X86_CPU_REG_CR0);
+ x86_cpu_set_reg(s->cpu_state, X86_CPU_REG_CR0, val | (1 << 0));
+
+ sd.base = KERNEL_PARAMS_ADDR +
+ offsetof(struct linux_params, gdt_table);
+ sd.limit = sizeof(params->gdt_table) - 1;
+ x86_cpu_set_seg(s->cpu_state, X86_CPU_SEG_GDT, &sd);
+ sd.sel = 2 << 3;
+ sd.base = 0;
+ sd.limit = 0xffffffff;
+ sd.flags = 0xc09b;
+ x86_cpu_set_seg(s->cpu_state, X86_CPU_SEG_CS, &sd);
+ sd.sel = 3 << 3;
+ sd.flags = 0xc093;
+ for(i = 0; i < 6; i++) {
+ if (i != X86_CPU_SEG_CS) {
+ x86_cpu_set_seg(s->cpu_state, i, &sd);
+ }
+ }
+
+ x86_cpu_set_reg(s->cpu_state, X86_CPU_REG_EIP, load_address);
+ x86_cpu_set_reg(s->cpu_state, 6, KERNEL_PARAMS_ADDR); /* esi */
+ }
+
+ /* map PCI interrupts (no BIOS, so we must do it) */
+ {
+ uint8_t elcr[2];
+ static const uint8_t pci_irqs[4] = { 9, 10, 11, 12 };
+
+ i440fx_map_interrupts(s->i440fx_state, elcr, pci_irqs);
+ /* XXX: KVM support */
+ if (s->pic_state) {
+ pic2_set_elcr(s->pic_state, elcr);
+ }
+ }
+}
+
+/* in ms */
+static int pc_machine_get_sleep_duration(VirtMachine *s1, int delay)
+{
+ PCMachine *s = (PCMachine *)s1;
+
+#ifdef USE_KVM
+ if (s->kvm_enabled) {
+ /* XXX: improve */
+ cmos_update_irq(s->cmos_state);
+ delay = 0;
+ } else
+#endif
+ {
+ cmos_update_irq(s->cmos_state);
+ delay = min_int(delay, pit_update_irq(s->pit_state));
+ if (!x86_cpu_get_power_down(s->cpu_state))
+ delay = 0;
+ }
+ return delay;
+}
+
+static void pc_machine_interp(VirtMachine *s1, int max_exec_cycles)
+{
+ PCMachine *s = (PCMachine *)s1;
+#ifdef USE_KVM
+ if (s->kvm_enabled) {
+ kvm_exec(s);
+ } else
+#endif
+ {
+ x86_cpu_interp(s->cpu_state, max_exec_cycles);
+ }
+}
+
+const VirtMachineClass pc_machine_class = {
+ "pc",
+ pc_machine_set_defaults,
+ pc_machine_init,
+ pc_machine_end,
+ pc_machine_get_sleep_duration,
+ pc_machine_interp,
+ pc_vm_mouse_is_absolute,
+ pc_vm_send_mouse_event,
+ pc_vm_send_key_event,
+};
diff --git a/jslinux-2019-12-21/x86emu-wasm.js b/jslinux-2019-12-21/x86emu-wasm.js
new file mode 100644
index 0000000..a89b8b4
--- /dev/null
+++ b/jslinux-2019-12-21/x86emu-wasm.js
@@ -0,0 +1,4 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="x86emu-wasm.wast";var wasmBinaryFile="x86emu-wasm.wasm";var asmjsCodeFile="x86emu-wasm.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){err("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){err("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){err("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver).catch((function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource).catch((function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module["wasmMaxTableSize"];if(typeof WebAssembly==="object"&&typeof WebAssembly.Table==="function"){if(MAX_TABLE_SIZE!==undefined){env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,"maximum":MAX_TABLE_SIZE,"element":"anyfunc"})}else{env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,element:"anyfunc"})}}else{env["table"]=new Array(TABLE_SIZE)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+16810192;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});var STATIC_BUMP=16810192;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=(function(){Module["dynCall_vi"](func,arg)})}else{browserIterationFunc=(function(){Module["dynCall_v"](func)})}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}}),runIter:(function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}if(Module["postMainLoop"])Module["postMainLoop"]()})},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject==="undefined"){console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Module["preloadedImages"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module["preloadedAudios"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module["preloadedAudios"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(function(){});canvas.exitFullscreen=canvas.exitFullscreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?(function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null)||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullscreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullscreen()}}),requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){err("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");Browser.requestFullScreen=(function(lockPointer,resizeCanvas,vrDevice){return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)});return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),asyncLoad:(function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";Module["readAsync"](url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(dep)addRunDependency(dep)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}),wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:(function(){var handle=Browser.nextWgetRequestHandle;Browser.nextWgetRequestHandle++;return handle})};function _emscripten_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.");Module["requestFullScreen"]=Module["requestFullscreen"];Browser.requestFullScreen(lockPointer,resizeCanvas,vrDevice)};Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas,vrDevice){Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=244;Module["wasmMaxTableSize"]=244;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_gmtime_r":_gmtime_r,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var __get_daylight=Module["__get_daylight"]=(function(){return Module["asm"]["__get_daylight"].apply(null,arguments)});var __get_timezone=Module["__get_timezone"]=(function(){return Module["asm"]["__get_timezone"].apply(null,arguments)});var __get_tzname=Module["__get_tzname"]=(function(){return Module["asm"]["__get_tzname"].apply(null,arguments)});var _console_queue_char=Module["_console_queue_char"]=(function(){return Module["asm"]["_console_queue_char"].apply(null,arguments)});var _display_key_event=Module["_display_key_event"]=(function(){return Module["asm"]["_display_key_event"].apply(null,arguments)});var _display_mouse_event=Module["_display_mouse_event"]=(function(){return Module["asm"]["_display_mouse_event"].apply(null,arguments)});var _display_wheel_event=Module["_display_wheel_event"]=(function(){return Module["asm"]["_display_wheel_event"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _fs_import_file=Module["_fs_import_file"]=(function(){return Module["asm"]["_fs_import_file"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _net_set_carrier=Module["_net_set_carrier"]=(function(){return Module["asm"]["_net_set_carrier"].apply(null,arguments)});var _net_write_packet=Module["_net_write_packet"]=(function(){return Module["asm"]["_net_write_packet"].apply(null,arguments)});var _vm_start=Module["_vm_start"]=(function(){return Module["asm"]["_vm_start"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiijjjjj=Module["dynCall_iiiiiiijjjjj"]=(function(){return Module["asm"]["dynCall_iiiiiiijjjjj"].apply(null,arguments)});var dynCall_iiijii=Module["dynCall_iiijii"]=(function(){return Module["asm"]["dynCall_iiijii"].apply(null,arguments)});var dynCall_iijiiii=Module["dynCall_iijiiii"]=(function(){return Module["asm"]["dynCall_iijiiii"].apply(null,arguments)});var dynCall_iijji=Module["dynCall_iijji"]=(function(){return Module["asm"]["dynCall_iijji"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiji=Module["dynCall_viiji"]=(function(){return Module["asm"]["dynCall_viiji"].apply(null,arguments)});Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run()
+
+
+
diff --git a/jslinux-2019-12-21/x86emu-wasm.wasm b/jslinux-2019-12-21/x86emu-wasm.wasm
new file mode 100644
index 0000000..d8f51b9
--- /dev/null
+++ b/jslinux-2019-12-21/x86emu-wasm.wasm
Binary files differ
diff --git a/jslinux-2019-12-21/x86emu.js b/jslinux-2019-12-21/x86emu.js
new file mode 100644
index 0000000..2e85a7f
--- /dev/null
+++ b/jslinux-2019-12-21/x86emu.js
@@ -0,0 +1,22 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+16809184;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});memoryInitializer="data:application/octet-stream;base64,AAAAAAAAAABjY2NjfHx8fHd3d3d7e3t78vLy8mtra2tvb29vxcXFxTAwMDABAQEBZ2dnZysrKyv+/v7+19fX16urq6t2dnZ2ysrKyoKCgoLJycnJfX19ffr6+vpZWVlZR0dHR/Dw8PCtra2t1NTU1KKioqKvr6+vnJycnKSkpKRycnJywMDAwLe3t7f9/f39k5OTkyYmJiY2NjY2Pz8/P/f39/fMzMzMNDQ0NKWlpaXl5eXl8fHx8XFxcXHY2NjYMTExMRUVFRUEBAQEx8fHxyMjIyPDw8PDGBgYGJaWlpYFBQUFmpqamgcHBwcSEhISgICAgOLi4uLr6+vrJycnJ7KysrJ1dXV1CQkJCYODg4MsLCwsGhoaGhsbGxtubm5uWlpaWqCgoKBSUlJSOzs7O9bW1tazs7OzKSkpKePj4+MvLy8vhISEhFNTU1PR0dHRAAAAAO3t7e0gICAg/Pz8/LGxsbFbW1tbampqasvLy8u+vr6+OTk5OUpKSkpMTExMWFhYWM/Pz8/Q0NDQ7+/v76qqqqr7+/v7Q0NDQ01NTU0zMzMzhYWFhUVFRUX5+fn5AgICAn9/f39QUFBQPDw8PJ+fn5+oqKioUVFRUaOjo6NAQEBAj4+Pj5KSkpKdnZ2dODg4OPX19fW8vLy8tra2ttra2tohISEhEBAQEP/////z8/Pz0tLS0s3Nzc0MDAwMExMTE+zs7OxfX19fl5eXl0REREQXFxcXxMTExKenp6d+fn5+PT09PWRkZGRdXV1dGRkZGXNzc3NgYGBggYGBgU9PT0/c3NzcIiIiIioqKiqQkJCQiIiIiEZGRkbu7u7uuLi4uBQUFBTe3t7eXl5eXgsLCwvb29vb4ODg4DIyMjI6Ojo6CgoKCklJSUkGBgYGJCQkJFxcXFzCwsLC09PT06ysrKxiYmJikZGRkZWVlZXk5OTkeXl5eefn5+fIyMjINzc3N21tbW2NjY2N1dXV1U5OTk6pqampbGxsbFZWVlb09PT06urq6mVlZWV6enp6rq6urggICAi6urq6eHh4eCUlJSUuLi4uHBwcHKampqa0tLS0xsbGxujo6Ojd3d3ddHR0dB8fHx9LS0tLvb29vYuLi4uKioqKcHBwcD4+Pj61tbW1ZmZmZkhISEgDAwMD9vb29g4ODg5hYWFhNTU1NVdXV1e5ubm5hoaGhsHBwcEdHR0dnp6enuHh4eH4+Pj4mJiYmBERERFpaWlp2dnZ2Y6Ojo6UlJSUm5ubmx4eHh6Hh4eH6enp6c7Ozs5VVVVVKCgoKN/f39+MjIyMoaGhoYmJiYkNDQ0Nv7+/v+bm5uZCQkJCaGhoaEFBQUGZmZmZLS0tLQ8PDw+wsLCwVFRUVLu7u7sWFhYWAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAbAAAANgAAAAAAAAAAUKf0UVNlQX7DpBcall4nOstrqzvxRZ0fq1j6rJMD40tV+jAg9m12rZF2zIglTAL1/NflT9fLKsWARDUmj6NitUlasd5nG7olmA7qReHA/l0CdS/DEvBMgaOXRo3G+dNr51+PA5WckhXrem2/2llSlS2DvtTTIXRYKWngSUTIyY5qicJ1eHmO9Gs+WJndcbkntk/hvhetiPBmrCDJtDrOfRhK32OCMRrlYDNRl0V/U2Lgd2SxhK5ruxyggf6UKwj5WGhIcBn9RY+HbN6Ut/h7UiPTc6viAktyV48f4yqrVWYHKOuyA8K1L5p7xYalCDfT8ocoMLKlvyO6agMCXIIW7Sscz4qStHmn8PIH86HiaU7N9Npl1b4FBh9iNNGK/qbEnVMuNKBV86Iy4YoFdev2pDnsgwuq72BABp9xXlEQbr35iiE+PQbdlq4FPt1GveZNtY1UkQVdxHFv1AYE/xVQYCT7mBmX6b3WzENAiXee2We9QuiwiIuJBzhbGefb7sh5Rwp8oekPQnzJHoT4AAAAAIOGgAlI7SsyrHARHk5yWmz7/w79VjiFDx7Vrj0nOS02ZNkPCiGmXGjRVFubOi42JLFnCgwP51eT0pbutJ6RmxtPxcCAoiDcYWlLd1oWGhIcCrqT4uUqoMBD4CI8HRcbEgsNCQ6tx4vyuai2LcipHhSFGfFXTAd1r7vdme79YH+jnyYB97z1clzFO2ZENH77W3YpQ4vcxiPLaPzttmPx5LjK3DHXEIVjQkAilxMgEcaEfSRKhfg9u9IRMvmubaEpx0svnh3zMLLc7FKGDdDjwXdsFrMrmblwqfpIlBEiZOlHxIz8qBo/8KDYLH1W75AzIsdOSYfB0TjZ/qLKjDYL1JjPgfWmKN56pSaOt9qkv60/5J06LA2SeFCbzF9qYkZ+VMITjfbouNiQXvc5LvWvw4K+gF2ffJPQaakt1W+zEiXPO5msyKd9GBBuY5zoe7s72wl4Js30GFluAbea7KiaT4NlbpXmfub/qgjPvCHm6BXv2Zvnus42b0rUCZ/q1nywKa+ypDExIz8qMJSlxsBmojU3vE50psqC/LDQkOAV2KczSpgE8ffa7EEOUM1/L/aRF43WTXZNsO9DVE2qzN8EluTjtdGeG4hqTLgfLMF/UWVGBOpenV01jAFzdIf6LkEL+1odZ7NS0tuSM1YQ6RNH1m2MYdeaegyhN44U+FmJPBPr7iepzjXJYbft5RzhPLFHelnf0pw/c/JVec4UGL83x3PqzfdTW6r9XxRvPd+G20R4gfOvyj7EaLksNCQ4X0CjwnLDHRYMJeK8i0k8KEGVDf9xAag53rMMCJzktNiQwVZkYYTLe3C2MtV0XGxIQle40Kf0UVBlQX5TpBcaw14nOpZrqzvLRZ0f8Vj6rKsD40uT+jAgVW12rfZ2zIiRTAL1JdflT/zLKsXXRDUmgKNitY9asd5JG7olZw7qRZjA/l3hdS/DAvBMgRKXRo2j+dNrxl+PA+eckhWVem2/61lSldqDvtQtIXRY02ngSSnIyY5EicJ1anmO9Hg+WJlrcbkn3U/hvratiPAXrCDJZjrOfbRK32MYMRrlgjNRl2B/U2JFd2Sx4K5ru4Sggf4cKwj5lGhIcFj9RY8ZbN6Uh/h7UrfTc6sjAkty4o8f41erVWYqKOuyB8K1LwN7xYaaCDfTpYcoMPKlvyOyagMCuoIW7Vwcz4ortHmnkvIH8/DiaU6h9Nplzb4FBtViNNEf/qbEilMuNJ1V86Kg4YoFMuv2pHXsgws572BAqp9xXgYQbr1RiiE++Qbdlj0FPt2uveZNRo1UkbVdxHEF1AYEbxVQYP/7mBkk6b3Wl0NAicye2Wd3QuiwvYuJB4hbGec47sh52wp8oUcPQnzpHoT4yQAAAACGgAmD7SsySHARHqxyWmxO/w79+ziFD1bVrj0eOS02J9kPCmSmXGghVFub0S42JDpnCgyx51eTD5butNKRmxuexcCATyDcYaJLd1ppGhIcFrqT4goqoMDl4CI8QxcbEh0NCQ4Lx4vyrai2LbmpHhTIGfFXhQd1r0zdme67YH+j/SYB95/1cly8O2ZExX77WzQpQ4t2xiPL3Pzttmjx5Lhj3DHXyoVjQhAilxNAEcaEICRKhX09u9L4MvmuEaEpx20vnh1LMLLc81KGDezjwXfQFrMrbLlwqZlIlBH6ZOlHIoz8qMQ/8KAaLH1W2JAzIu9OSYfH0TjZwaLKjP4L1Jg2gfWmz956pSiOt9omv60/pJ06LOSSeFANzF9qm0Z+VGITjfbCuNiQ6Pc5Ll6vw4L1gF2fvpPQaXwt1W+pEiXPs5msyDt9GBCnY5zobrs723t4Js0JGFlu9Lea7AGaT4OobpXmZeb/qn7PvCEI6BXv5pvnutk2b0rOCZ/q1HywKdaypDGvIz8qMZSlxjBmojXAvE50N8qC/KbQkOCw2KczFZgE8Ura7EH3UM1/DvaRFy/WTXaNsO9DTU2qzFQEluTftdGe44hqTBsfLMG4UWVGf+penQQ1jAFddIf6c0EL+y4dZ7Na0tuSUlYQ6TNH1m0TYdeajAyhN3oU+FmOPBPriSepzu7JYbc15Rzh7bFHejzf0pxZc/JVP84UGHk3x3O/zfdT6qr9X1tvPd8U20R4hvOvyoHEaLk+NCQ4LECjwl/DHRZyJeK8DEk8KIuVDf9BAag5cbMMCN7ktNicwVZkkITLe2G2MtVwXGxIdFe40EL0UVCnQX5TZRcaw6QnOpZeqzvLa50f8UX6rKtY40uTAzAgVfp2rfZtzIiRdgL1JUzlT/zXKsXXyzUmgERitY+jsd5JWrolZxvqRZgO/l3hwC/DAnVMgRLwRo2jl9NrxvmPA+dfkhWVnG2/63pSldpZvtQtg3RY0yHgSSlpyY5EyMJ1aomO9Hh5WJlrPrkn3XHhvrZPiPAXrSDJZqzOfbQ632MYShrlgjFRl2AzU2JFf2Sx4Hdru4Sugf4coAj5lCtIcFhoRY8Z/d6Uh2x7Urf4c6sj00ty4gIf41ePVWYqq+uyByi1LwPCxYaaezfTpQgoMPKHvyOypQMCumoW7VyCz4orHHmnkrQH8/DyaU6h4tplzfQFBtW+NNEfYqbEiv4uNJ1T86KgVYoFMuH2pHXrgws57GBAqu9xXgafbr1RECE++Yrdlj0GPt2uBeZNRr1UkbWNxHEFXQYEb9RQYP8VmBkk+73Wl+lAicxD2Wd3nuiwvUKJB4iLGec4W8h52+58oUcKQnzpD4T4yR4AAAAAgAmDhisySO0RHqxwWmxOcg79+/+FD1Y4rj0e1S02JzkPCmTZXGghplub0VQ2JDouCgyxZ1eTD+futNKWmxuekcCAT8XcYaIgd1ppSxIcFhqT4gq6oMDlKiI8Q+AbEh0XCQ4LDYvyrce2LbmoHhTIqfFXhRl1r0wHme673X+j/WAB958mcly89WZExTv7WzR+Q4t2KSPL3Mbttmj85Lhj8THXytxjQhCFlxNAIsaEIBFKhX0ku9L4PfmuETIpx22hnh1LL7Lc8zCGDexSwXfQ47MrbBZwqZm5lBH6SOlHImT8qMSM8KAaP31W2CwzIu+QSYfHTjjZwdHKjP6i1Jg2C/Wmz4F6pSjet9omjq0/pL86LOSdeFANkl9qm8x+VGJGjfbCE9iQ6Lg5Ll73w4L1r12fvoDQaXyT1W+pLSXPsxKsyDuZGBCnfZzobmM723u7Js0JeFlu9Bia7AG3T4OompXmZW7/qn7mvCEIzxXv5ujnutmbb0rONp/q1AmwKdZ8pDGvsj8qMSOlxjCUojXAZk50N7yC/KbKkOCw0KczFdgE8UqY7EH32s1/DlCRFy/2TXaN1u9DTbCqzFRNluTfBNGe47VqTBuILMG4H2VGf1FenQTqjAFdNYf6c3QL+y5BZ7NaHduSUtIQ6TNW1m0TR9eajGGhN3oM+FmOFBPriTypzu4nYbc1yRzh7eVHejyx0pxZ3/JVP3MUGHnOx3O/N/dT6s39X1uqPd8Ub0R4htuvyoHzaLk+xCQ4LDSjwl9AHRZyw+K8DCU8KItJDf9Blag5cQEMCN6ztNic5FZkkMHLe2GEMtVwtmxIdFy40EJXUVCn9H5TZUEaw6QXOpZeJzvLa6sf8UWdrKtY+kuTA+MgVfowrfZtdoiRdsz1JUwCT/zX5cXXyyomgEQ1tY+jYt5JWrElZxu6RZgO6l3hwP7DAnUvgRLwTI2jl0ZrxvnTA+dfjxWVnJK/63ptldpZUtQtg75Y0yF0SSlp4I5EyMl1aonC9Hh5jplrPlgn3XG5vrZP4fAXrYjJZqwgfbQ6zmMYSt/lgjEal2AzUWJFf1Ox4Hdku4Sua/4coIH5lCsIcFhoSI8Z/UWUh2zeUrf4e6sj03Ny4gJL41ePH2Yqq1WyByjrLwPCtYaae8XTpQg3MPKHKCOypb8CumoD7VyCFoorHM+nkrR58/DyB06h4mllzfTaBtW+BdEfYjTEiv6mNJ1TLqKgVfMFMuGKpHXr9gs57INAqu9gXgafcb1REG4++Yohlj0G3d2uBT5NRr3mkbWNVHEFXcQEb9QGYP8VUBkk+5jWl+m9icxDQGd3ntmwvULoB4iLiec4Wxl52+7IoUcKfHzpD0L4yR6EAAAAAAmDhoAySO0rHqxwEWxOclr9+/8OD1Y4hT0e1a42JzktCmTZD2ghplyb0VRbJDouNgyxZwqTD+dXtNKW7huekZuAT8XAYaIg3FppS3ccFhoS4gq6k8DlKqA8Q+AiEh0XGw4LDQnyrceLLbmothTIqR5XhRnxr0wHde673Zmj/WB/958mAVy89XJExTtmWzR++4t2KUPL3MYjtmj87bhj8eTXytwxQhCFYxNAIpeEIBHGhX0kStL4PbuuETL5x22hKR1LL57c8zCyDexShnfQ48ErbBazqZm5cBH6SJRHImTpqMSM/KAaP/BW2Cx9Iu+QM4fHTknZwdE4jP6iypg2C9Smz4H1pSjeetomjrc/pL+tLOSdOlANknhqm8xfVGJGfvbCE42Q6LjYLl73OYL1r8OfvoBdaXyT0G+pLdXPsxIlyDuZrBCnfRjobmOc23u7O80JeCZu9BhZ7AG3moOomk/mZW6Vqn7m/yEIz7zv5ugVutmb50rONm/q1AmfKdZ8sDGvsqQqMSM/xjCUpTXAZqJ0N7xO/KbKguCw0JAzFdin8UqYBEH32ux/DlDNFy/2kXaN1k1DTbDvzFRNquTfBJae47XRTBuIasG4HyxGf1FlnQTqXgFdNYz6c3SH+y5BC7NaHWeSUtLb6TNWEG0TR9aajGHXN3oMoVmOFPjriTwTzu4nqbc1yWHh7eUcejyxR5xZ39JVP3PyGHnOFHO/N8dT6s33X1uq/d8Ubz14httEyoHzr7k+xGg4LDQkwl9AoxZywx28DCXiKItJPP9BlQ05cQGoCN6zDNic5LRkkMFWe2GEy9VwtjJIdFxs0EJXuKVjY8aEfHz4mXd37o17e/YN8vL/vWtr1rFvb95UxcWRUDAwYAMBAQKpZ2fOfSsrVhn+/udi19e15qurTZp2duxFysqPnYKCH0DJyYmHfX36Ffr67+tZWbLJR0eOC/Dw++ytrUFn1NSz/aKiX+qvr0W/nJwj96SkU5ZycuRbwMCbwre3dRz9/eGuk5M9aiYmTFo2NmxBPz9+Avf39U/MzINcNDRo9KWlUTTl5dEI8fH5k3Fx4nPY2KtTMTFiPxUVKgwEBAhSx8eVZSMjRl7Dw50oGBgwoZaWNw8FBQq1mpovCQcHDjYSEiSbgIAbPeLi3ybr681pJydOzbKyf591deobCQkSnoODHXQsLFguGho0LRsbNrJubtzuWlq0+6CgW/ZSUqRNOzt2YdbWt86zs317KSlSPuPj3XEvL16XhIQT9VNTpmjR0bkAAAAALO3twWAgIEAf/PzjyLGxee1bW7a+amrURsvLjdm+vmdLOTly3kpKlNRMTJjoWFiwSs/PhWvQ0Lsq7+/F5aqqTxb7++3FQ0OG101NmlUzM2aUhYURz0VFihD5+ekGAgIEgX9//vBQUKBEPDx4up+fJeOoqEvzUVGi/qOjXcBAQICKj48FrZKSP7ydnSFIODhwBPX18d+8vGPBtrZ3ddrar2MhIUIwEBAgGv//5Q7z8/1t0tK/TM3NgRQMDBg1ExMmL+zsw+FfX76il5c1zEREiDkXFy5XxMST8qenVYJ+fvxHPT16rGRkyOddXborGRkylXNz5qBgYMCYgYEZ0U9Pnn/c3KNmIiJEfioqVKuQkDuDiIgLykZGjCnu7sfTuLhrPBQUKHne3qfiXl68HQsLFnbb26074ODbVjIyZE46OnQeCgoU20lJkgoGBgxsJCRI5FxcuF3Cwp9u09O976ysQ6ZiYsSokZE5pJWVMTfk5NOLeXnyMufn1UPIyItZNzdut21t2oyNjQFk1dWx0k5OnOCpqUm0bGzY+lZWrAf09PMl6urPr2Vlyo56evTprq5HGAgIENW6um+IeHjwbyUlSnIuLlwkHBw48aamV8e0tHNRxsaXI+joy3zd3aGcdHToIR8fPt1LS5bcvb1hhouLDYWKig+QcHDgQj4+fMS1tXGqZmbM2EhIkAUDAwYB9vb3Eg4OHKNhYcJfNTVq+VdXrtC5uWmRhoYXWMHBmScdHTq5np4nOOHh2RP4+OuzmJgrMxERIrtpadJw2dmpiY6OB6eUlDO2m5stIh4ePJKHhxUg6enJSc7Oh/9VVap4KChQet/fpY+MjAP4oaFZgImJCRcNDRrav79lMebm18ZCQoS4aGjQw0FBgrCZmSl3LS1aEQ8PHsuwsHv8VFSo1ru7bToWFixjY8alfHz4hHd37pl7e/aN8vL/DWtr1r1vb96xxcWRVDAwYFABAQIDZ2fOqSsrVn3+/ucZ19e1YqurTeZ2duyaysqPRYKCH53JyYlAfX36h/r67xVZWbLrR0eOyfDw+wutrUHs1NSzZ6KiX/2vr0XqnJwjv6SkU/dycuSWwMCbW7e3dcL9/eEck5M9riYmTGo2NmxaPz9+Qff39QLMzINPNDRoXKWlUfTl5dE08fH5CHFx4pPY2KtzMTFiUxUVKj8EBAgMx8eVUiMjRmXDw51eGBgwKJaWN6EFBQoPmpovtQcHDgkSEiQ2gIAbm+Li3z3r680mJydOabKyf811deqfCQkSG4ODHZ4sLFh0Gho0LhsbNi1ubtyyWlq07qCgW/tSUqT2Ozt2TdbWt2Gzs33OKSlSe+Pj3T4vL15xhIQTl1NTpvXR0bloAAAAAO3twSwgIEBg/PzjH7GxechbW7btamrUvsvLjUa+vmfZOTlyS0pKlN5MTJjUWFiw6M/PhUrQ0Ltr7+/FKqqqT+X7++0WQ0OGxU1NmtczM2ZVhYURlEVFis/5+ekQAgIEBn9//oFQUKDwPDx4RJ+fJbqoqEvjUVGi86OjXf5AQIDAj48FipKSP62dnSG8ODhwSPX18QS8vGPftrZ3wdrar3UhIUJjEBAgMP//5Rrz8/0O0tK/bc3NgUwMDBgUExMmNezswy9fX77hl5c1okREiMwXFy45xMSTV6enVfJ+fvyCPT16R2RkyKxdXbrnGRkyK3Nz5pVgYMCggYEZmE9PntHc3KN/IiJEZioqVH6QkDuriIgLg0ZGjMru7scpuLhr0xQUKDze3qd5Xl684gsLFh3b26124ODbOzIyZFY6OnROCgoUHklJktsGBgwKJCRIbFxcuOTCwp9d09O9bqysQ+9iYsSmkZE5qJWVMaTk5NM3eXnyi+fn1TLIyItDNzduWW1t2reNjQGM1dWxZE5OnNKpqUngbGzYtFZWrPr09PMH6urPJWVlyq96evSOrq5H6QgIEBi6um/VeHjwiCUlSm8uLlxyHBw4JKamV/G0tHPHxsaXUejoyyPd3aF8dHTonB8fPiFLS5bdvb1h3IuLDYaKig+FcHDgkD4+fEK1tXHEZmbMqkhIkNgDAwYF9vb3AQ4OHBJhYcKjNTVqX1dXrvm5uWnQhoYXkcHBmVgdHTonnp4nueHh2Tj4+OsTmJgrsxERIjNpadK72dmpcI6OB4mUlDOnm5stth4ePCKHhxWS6enJIM7Oh0lVVar/KChQeN/fpXqMjAOPoaFZ+ImJCYANDRoXv79l2ubm1zFCQoTGaGjQuEFBgsOZmSmwLS1adw8PHhGwsHvLVFSo/Lu7bdYWFiw6Y8alY3z4hHx37pl3e/aNe/L/DfJr1r1rb96xb8WRVMUwYFAwAQIDAWfOqWcrVn0r/ucZ/te1YterTearduyadsqPRcqCH52CyYlAyX36h3367xX6WbLrWUeOyUfw+wvwrUHsrdSzZ9SiX/2ir0Xqr5wjv5ykU/ekcuSWcsCbW8C3dcK3/eEc/ZM9rpMmTGomNmxaNj9+QT/39QL3zINPzDRoXDSlUfSl5dE05fH5CPFx4pNx2Ktz2DFiUzEVKj8VBAgMBMeVUscjRmUjw51ewxgwKBiWN6GWBQoPBZovtZoHDgkHEiQ2EoAbm4Di3z3i680m6ydOaSeyf82ydeqfdQkSGwmDHZ6DLFh0LBo0LhobNi0bbtyyblq07lqgW/ugUqT2Ujt2TTvWt2HWs33OsylSeynj3T7jL15xL4QTl4RTpvVT0blo0QAAAADtwSztIEBgIPzjH/yxecixW7btW2rUvmrLjUbLvmfZvjlySzlKlN5KTJjUTFiw6FjPhUrP0Ltr0O/FKu+qT+Wq++0W+0OGxUNNmtdNM2ZVM4URlIVFis9F+ekQ+QIEBgJ//oF/UKDwUDx4RDyfJbqfqEvjqFGi81GjXf6jQIDAQI8Fio+SP62SnSG8nThwSDj18QT1vGPfvLZ3wbbar3XaIUJjIRAgMBD/5Rr/8/0O89K/bdLNgUzNDBgUDBMmNRPswy/sX77hX5c1opdEiMxEFy45F8STV8SnVfKnfvyCfj16Rz1kyKxkXbrnXRkyKxlz5pVzYMCgYIEZmIFPntFP3KN/3CJEZiIqVH4qkDurkIgLg4hGjMpG7scp7rhr07gUKDwU3qd53l684l4LFh0L26122+DbO+AyZFYyOnROOgoUHgpJkttJBgwKBiRIbCRcuORcwp9dwtO9btOsQ++sYsSmYpE5qJGVMaSV5NM35Hnyi3nn1TLnyItDyDduWTdt2rdtjQGMjdWxZNVOnNJOqUngqWzYtGxWrPpW9PMH9OrPJeplyq9levSOeq5H6a4IEBgIum/VunjwiHglSm8lLlxyLhw4JBymV/GmtHPHtMaXUcboyyPo3aF83XTonHQfPiEfS5bdS71h3L2LDYaLig+FinDgkHA+fEI+tXHEtWbMqmZIkNhIAwYFA/b3AfYOHBIOYcKjYTVqXzVXrvlXuWnQuYYXkYbBmVjBHTonHZ4nuZ7h2Tjh+OsT+Jgrs5gRIjMRadK7admpcNmOB4mOlDOnlJsttpsePCIehxWSh+nJIOnOh0nOVar/VShQeCjfpXrfjAOPjKFZ+KGJCYCJDRoXDb9l2r/m1zHmQoTGQmjQuGhBgsNBmSmwmS1ady0PHhEPsHvLsFSo/FS7bda7Fiw6FsalY2P4hHx87pl3d/aNe3v/DfLy1r1ra96xb2+RVMXFYFAwMAIDAQHOqWdnVn0rK+cZ/v61YtfXTearq+yadnaPRcrKH52CgolAycn6h3197xX6+rLrWVmOyUdH+wvw8EHsra2zZ9TUX/2iokXqr68jv5ycU/ekpOSWcnKbW8DAdcK3t+Ec/f09rpOTTGomJmxaNjZ+QT8/9QL394NPzMxoXDQ0UfSlpdE05eX5CPHx4pNxcatz2NhiUzExKj8VFQgMBASVUsfHRmUjI51ew8MwKBgYN6GWlgoPBQUvtZqaDgkHByQ2EhIbm4CA3z3i4s0m6+tOaScnf82ysuqfdXUSGwkJHZ6Dg1h0LCw0LhoaNi0bG9yybm607lpaW/ugoKT2UlJ2TTs7t2HW1n3Os7NSeykp3T7j415xLy8Tl4SEpvVTU7lo0dEAAAAAwSzt7UBgICDjH/z8ecixsbbtW1vUvmpqjUbLy2fZvr5ySzk5lN5KSpjUTEyw6FhYhUrPz7tr0NDFKu/vT+Wqqu0W+/uGxUNDmtdNTWZVMzMRlIWFis9FRekQ+fkEBgIC/oF/f6DwUFB4RDw8Jbqfn0vjqKii81FRXf6jo4DAQEAFio+PP62SkiG8nZ1wSDg48QT19WPfvLx3wba2r3Xa2kJjISEgMBAQ5Rr///0O8/O/bdLSgUzNzRgUDAwmNRMTwy/s7L7hX181opeXiMxERC45FxeTV8TEVfKnp/yCfn56Rz09yKxkZLrnXV0yKxkZ5pVzc8CgYGAZmIGBntFPT6N/3NxEZiIiVH4qKjurkJALg4iIjMpGRscp7u5r07i4KDwUFKd53t684l5eFh0LC61229vbO+DgZFYyMnROOjoUHgoKkttJSQwKBgZIbCQkuORcXJ9dwsK9btPTQ++srMSmYmI5qJGRMaSVldM35OTyi3l51TLn54tDyMhuWTc32rdtbQGMjY2xZNXVnNJOTkngqanYtGxsrPpWVvMH9PTPJerqyq9lZfSOenpH6a6uEBgICG/VurrwiHh4Sm8lJVxyLi44JBwcV/GmpnPHtLSXUcbGyyPo6KF83d3onHR0PiEfH5bdS0th3L29DYaLiw+FiorgkHBwfEI+PnHEtbXMqmZmkNhISAYFAwP3Afb2HBIODsKjYWFqXzU1rvlXV2nQubkXkYaGmVjBwTonHR0nuZ6e2Tjh4esT+Pgrs5iYIjMREdK7aWmpcNnZB4mOjjOnlJQttpubPCIeHhWSh4fJIOnph0nOzqr/VVVQeCgopXrf3wOPjIxZ+KGhCYCJiRoXDQ1l2r+/1zHm5oTGQkLQuGhogsNBQSmwmZlady0tHhEPD3vLsLCo/FRUbda7uyw6FhZSUlJSCQkJCWpqamrV1dXVMDAwMDY2NjalpaWlODg4OL+/v79AQEBAo6Ojo56enp6BgYGB8/Pz89fX19f7+/v7fHx8fOPj4+M5OTk5goKCgpubm5svLy8v/////4eHh4c0NDQ0jo6OjkNDQ0NERERExMTExN7e3t7p6enpy8vLy1RUVFR7e3t7lJSUlDIyMjKmpqamwsLCwiMjIyM9PT097u7u7kxMTEyVlZWVCwsLC0JCQkL6+vr6w8PDw05OTk4ICAgILi4uLqGhoaFmZmZmKCgoKNnZ2dkkJCQksrKysnZ2dnZbW1tboqKioklJSUltbW1ti4uLi9HR0dElJSUlcnJycvj4+Pj29vb2ZGRkZIaGhoZoaGhomJiYmBYWFhbU1NTUpKSkpFxcXFzMzMzMXV1dXWVlZWW2tra2kpKSkmxsbGxwcHBwSEhISFBQUFD9/f397e3t7bm5ubna2traXl5eXhUVFRVGRkZGV1dXV6enp6eNjY2NnZ2dnYSEhISQkJCQ2NjY2Kurq6sAAAAAjIyMjLy8vLzT09PTCgoKCvf39/fk5OTkWFhYWAUFBQW4uLi4s7Ozs0VFRUUGBgYG0NDQ0CwsLCweHh4ej4+Pj8rKyso/Pz8/Dw8PDwICAgLBwcHBr6+vr729vb0DAwMDAQEBARMTExOKioqKa2trazo6OjqRkZGREREREUFBQUFPT09PZ2dnZ9zc3Nzq6urql5eXl/Ly8vLPz8/Pzs7OzvDw8PC0tLS05ubm5nNzc3OWlpaWrKysrHR0dHQiIiIi5+fn562tra01NTU1hYWFheLi4uL5+fn5Nzc3N+jo6OgcHBwcdXV1dd/f399ubm5uR0dHR/Hx8fEaGhoacXFxcR0dHR0pKSkpxcXFxYmJiYlvb29vt7e3t2JiYmIODg4OqqqqqhgYGBi+vr6+GxsbG/z8/PxWVlZWPj4+PktLS0vGxsbG0tLS0nl5eXkgICAgmpqamtvb29vAwMDA/v7+/nh4eHjNzc3NWlpaWvT09PQfHx8f3d3d3aioqKgzMzMziIiIiAcHBwfHx8fHMTExMbGxsbESEhISEBAQEFlZWVknJycngICAgOzs7OxfX19fYGBgYFFRUVF/f39/qampqRkZGRm1tbW1SkpKSg0NDQ0tLS0t5eXl5Xp6enqfn5+fk5OTk8nJycmcnJyc7+/v76CgoKDg4ODgOzs7O01NTU2urq6uKioqKvX19fWwsLCwyMjIyOvr6+u7u7u7PDw8PIODg4NTU1NTmZmZmWFhYWEXFxcXKysrKwQEBAR+fn5+urq6und3d3fW1tbWJiYmJuHh4eFpaWlpFBQUFGNjY2NVVVVVISEhIQwMDAx9fX19AAAAAAAAAID/PwAAAAAAAP6KG81LeJrUAEAAAAAAAAC88BdcKTuquP8/AAAAAAAANcJoIaLaD8kAQAAAAAAAAJn3z/uEmiCa/T8AAAAAAACsec/R9xdysf4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgHBgYFBQUFBAQEBAQEBAQDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACIAXQCxAB0BnwE2AuACnANoBEUFMQYrBzIIRglnCi0KrwhaBykGGgUpBFYDngIAAnkBCQGvAGgANAASAAIAAAAAAAAAAAAAAAAAAAD/PwAAAAAAAAAAAAAAAAAA/j9VVVVVVVVVVVVVVVVVVfw/VVVVVVVVVVVVVVVVVVX6PxERERERERERERERERER+D8XbMEWbMEWbMEWbMEWbPU/GqABGqABGqABGqABGqDyPxqgARqgARqgARqgARqg7z8XAOWIHKz6OHNsVTrecew/eWbq0xbwLsf1iXf75CfpP8d9g0t+dP44TlR/VmSu5T+F/qyHqU1Ue4mN/47tHuI/aK8jHTM4ypfQhjphJGHeP+Wj30XxrQvSyQeMSpeT2j+wjO6wVoYd8YE7cz5/rtY/AAAAAAAAAAAAAAAAAAD/P1VVVVVVVVVVVVVVVVVV/b+amZmZmZmZmZmZmZmZmfw/kiRJkiRJkiRJkiRJkiT8vxzHcRzHcRzHcRzHcRzH+z9GF1100UUXXXTRRRdddPu/FDuxEzuxEzuxEzuxEzv7PxERERERERERERERERER+7/i4eHh4eHh4eHh4eHh4fo/G8prKK+hvIbyGsprKK/6vxiGYRiGYRiGYRiGYRiG+j8AAAAAAAAAAAAAAAAAAP8/AAAAAAAAAAAAAAAAAAD+v1VVVVVVVVVVVVVVVVVV+j8XbMEWbMEWbMEWbMEWbPW/GqABGqABGqABGqABGqDvP3lm6tMW8C7H9Yl3++Qn6b+F/qyHqU1Ue4mN/47tHuI/5aPfRfGtC9LJB4xKl5Pav7CM7rBWhh3xgTtzPn+u0j+rwqKGSAC7d9mXO4YnaMq/u/D4K62celAiIEC6QuXBPwAAAAAAAAAAAAAAAAAA/z9VVVVVVVVVVVVVVVVVVfy/ERERERERERERERERERH4PxqgARqgARqgARqgARqg8r8XAOWIHKz6OHNsVTrecew/x32DS350/jhOVH9WZK7lv2ivIx0zOMqX0IY6YSRh3j+wjO6wVoYd8YE7cz5/rta/ABt3l1FgsqbUCgN3LJXOP3WWezvsoUxyFRRotEkvxr9Fbu78RvG+GFfPbe+4cb0/AAAAAAAAAAAAAAAAAAD/P1VVVVVVVVVVVVVVVVVV/T+amZmZmZmZmZmZmZmZmfw/kiRJkiRJkiRJkiRJkiT8PxzHcRzHcRzHcRzHcRzH+z9GF1100UUXXXTRRRdddPs/FDuxEzuxEzuxEzuxEzv7PxERERERERERERERERER+z/i4eHh4eHh4eHh4eHh4fo/HB01ADgAR0hJS01PUFFSUwAAAAAAAAAAAAAAAABbXF3//////////////////////////////////////////w8PDx8Dew8P/wAAAAAAAAARAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABEADwoREREDCgcAARMJCwsAAAkGCwAACwAGEQAAABEREQAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAARAAoKERERAAoAAAIACQsAAAAJAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA0AAAAEDQAAAAAJDgAAAAAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAPAAAAAA8AAAAACRAAAAAAABAAABAAABIAAAASEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAABISEgAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAoAAAAACgAAAAAJCwAAAAAACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAADAxMjM0NTY3ODlBQkNERUZUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wAAAAAAAAAAABJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgAAAAAAAP////////////////////////////////////////////////////////////////8AAQIDBAUGBwgJ/////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD//wAAAAAAAAAAAAAAAACA/78AAAAAAADmBzBnx5NX856j7y/kYv4/AAAAAAAAAID+vwAAAAAAAAAAAAAAAAAAAAAAAAAA/z+4eHAtdCU7p8qEha5nu/8/e1YPLrNbRlg214IjFQz+P7gBF8WMiWmE0UJEtR+S/j+4ARfFjIlphNFCRLUfkv8/uAEXxYyJaYTRQkS1H5IAQAAAAAAAAACA/z8AAAAAAAA60qD9D3134S+4UnZUcQBAAAAAAAAAAAAAAAAAAAAAQM1DAAC3QwAA/wAAAP//AAD/////1kwAAAEAAAABAAAAAgAAAAEAAAABAAAAAgAAAAEAAAABAAAAPDkAAAUAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAA1XwAAQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8OQAABQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAIAAAD4UwAAAAQAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAACv////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnHwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQAAAAEUBAEAAAABFAHAtPmZzX2NvdW50ID09IDEAanNlbXUuYwBpbml0X3ZtX2ZzAHAtPmRyaXZlX2NvdW50ID09IDEAaW5pdF92bV9kcml2ZQBwLT5ldGhfY291bnQgPT0gMQBpbml0X3ZtAHZpcnRpb18lMDR4AHdyaXRlX3NpemUgPj0gMQB2aXJ0aW8uYwB2aXJ0aW9fYmxvY2tfcmVjdl9yZXF1ZXN0AHZpcnRpb190YWJsZXQAdmlydGlvX21vdXNlAHZpcnRpb19rZXlib2FyZAB3d2RkZGRkZHcAd3cAd3N3d3cAUXcAd3NzdwBRAHdzd3d3dwB3AHMAd2QAZFF3d3dkZGRkZGRkZGRkZGRkZGQAd3d3d3dkZGRkZAB3ZHcAd2J3ZGR3cwBiAHdiZGR3cwBiZGR3cwB3d3MAd3N3dwB3c3dzAHdzdwB3cwA5UDIwMDAuTAB3d3NzdwBoAHd3aAA5cDogdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlkPSVkCgBidWYgKyAxIDw9IGJ1Zl9lbmQAbWFyc2hhbGwAYnVmICsgMiA8PSBidWZfZW5kAGJ1ZiArIDQgPD0gYnVmX2VuZABidWYgKyA4IDw9IGJ1Zl9lbmQAbGVuIDw9IDY1NTM1AGJ1ZiArIDIgKyBsZW4gPD0gYnVmX2VuZABidWYgKyAxMyA8PSBidWZfZW5kAG4tPnR5cGUgPT0gRlRfRElSAGZzX25ldC5jAGlub2RlX2Rpcl9hZGQALi4Abi0+cmVmY291bnQgPj0gMQBpbm9kZV9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA9PSAwAGZsdXNoX2RpcgBuLT5yZWZjb3VudCA9PSAwAGlub2RlX2ZyZWUAbi0+b3Blbl9jb3VudCA9PSAwAGZzLT5mc19ibG9ja3MgPj0gMABmcy0+aW5vZGVfY2FjaGVfc2l6ZSA+PSAwAG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0FESU5HAGZzX3dnZXRfc2V0X2Vycm9yAGxpc3RfZW1wdHkoJm4tPnUuZGlyLmRlX2xpc3QpAGZzLT5pbm9kZV9jb3VudCA+PSAwAGJ1LT5yZWZfY291bnQgPj0gMQBmc19iYXNlX3VybF9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA+PSAwAGlub2RlX2RpcmVudF9kZWxldGVfbm9fZGVjcmVmAHhocgAhZnMtPmZzX2F0dGFjaChmcywgJnJvb3RfZmQsICZxaWQsIHVpZCwgIiIsICIiKQBmc19jbWRfeGhyAG4tPnR5cGUgPT0gRlRfUkVHICYmIG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0NBTABzZXRfYmFzZV91cmwAcmVzZXRfYmFzZV91cmwAZnNfaXNfbmV0KGZzMSkAZnNfbmV0X3Jlc2V0X2Jhc2VfdXJsAHNldF91cmwAZXhwb3J0X2ZpbGUAcGJrZGYyAHNldF9pbXBvcnRfZGlyAHVua25vd24gY29tbWFuZDogJyVzJwoAZnNfd3JpdGUAZnNfdHJ1bmNhdGUAZnNfbmV0X3NldF91cmwAZnNfbmV0X3NldF9iYXNlX3VybABuLT5vcGVuX2NvdW50ID49IDEAaW5vZGVfZGVjX29wZW4Abi0+dS5yZWcuc3RhdGUgPT0gUkVHX1NUQVRFX1VOTE9BREVEAGZzX29wZW5fd2dldABuLT51LnJlZy5zdGF0ZSA9PSBSRUdfU1RBVEVfTE9BREVEAGZzX3RyaW1fY2FjaGUAZnNfd2dldF9zZXRfbG9hZGVkAGxpc3RfZW1wdHkoJmZzLT5pbm9kZV9jYWNoZV9saXN0KQBmc19tZW1fZW5kAC90bXAAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAwLCAiIiwgIiIpAGZzX2NyZWF0ZV9jbWQALmZzY21kACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCByb290X2ZkLCBGU0NNRF9OQU1FLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjY2LCAwKQAhZnMtPmZzX2F0dGFjaChmcywgJnMtPnJvb3RfZmQsICZxaWQsIDAsICIiLCAiIikAZnNfaW5pdGlhbF9zeW5jAGhlYWQ/bm9jYWNoZT0lbGxkAC5oZWFkACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBoZWFkX2ZkLCAiLmhlYWQiLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjQ0LCAwKQBjb3VsZCBub3QgbG9hZCAnaGVhZCcgZmlsZSAoSFRUUCBlcnJvcj0lZCkAaW52YWxpZCBoZWFkIHZlcnNpb24AUm9vdElEAGV4cGVjdGVkIFJvb3RJRCB0YWcARlNNYXhTaXplAGZzX25ldF9zZXRfZnNfbWF4X3NpemUAZmlsZXMALwAuZmlsZWxpc3QudHh0ACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBuZXdfZmlsZWxpc3RfZmQsICIuZmlsZWxpc3QudHh0IiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDY0NCwgMCkAaGVhZF9sb2FkZWQAY291bGQgbm90IGxvYWQgZmlsZSBsaXN0IChIVFRQIGVycm9yPSVkKQBlcnJvciB3aGlsZSBwYXJzaW5nIGZpbGUgbGlzdAAucHJlbG9hZDIvcHJlbG9hZC50eHQALnByZWxvYWQAaW52YWxpZCBmaWxlbmFtZQoAaW52YWxpZCBwcmVsb2FkIGZpbGU6ICclcycKAGZpbGVuYW1lIHdpdGhvdXQgdGFyZ2V0OiAlcwoAaW52YWxpZCBzaXplCgBpbnZhbGlkIGZpbGUgaWQKAGludmFsaWQgbW9kZQoAaW52YWxpZCB1aWQKAGludmFsaWQgZ2lkCgBpbnZhbGlkIG1ham9yCgBpbnZhbGlkIG1pbm9yCgBpbnZhbGlkIG10aW1lCgBpbnZhbGlkIHN5bWxpbmsgbmFtZQoARXJyb3I6IABmc19pc19uZXQoZnMpAGZzX25ldF9zZXRfcHdkAC5mc2NtZF9wd2QAIWZzLT5mc19jcmVhdGUoZnMsICZxaWQsIHJvb3RfZmQsICIuZnNjbWRfcHdkIiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDYwMCwgMCkAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAxMDAwLCAiIiwgIiIpAGZzX2ltcG9ydF9maWxlAFBPU1QAR0VUAHNhbHRfbGVuIDw9IFNBTFRfTEVOX01BWABmc193Z2V0LmMAcGJrZGYyX2htYWNfc2hhMjU2APui6QElMDE2bGx4AAoKAFZlcnNpb24AaHR0cDoAaHR0cHM6AGZpbGU6AGlycV9udW0gPCA0AHBjaS5jAHBjaV9kZXZpY2VfZ2V0X2lycQBiYXJfbnVtIDwgUENJX05VTV9SRUdJT05TAHBjaV9yZWdpc3Rlcl9iYXIAKHNpemUgJiAoc2l6ZSAtIDEpKSA9PSAwAHNpemUgPj0gNAByLT5zaXplID09IDAAaTQ0MEZYAFBJSVgzAHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUASW52YWxpZCBwcm9wZXJ0eSBuYW1lACc6JyBleHBlY3RlZABleHBlY3RpbmcgJywnIG9yICd9JwBleHBlY3RpbmcgJywnIG9yICddJwBudWxsAHRydWUAZmFsc2UAdW5rbm93biBpZGVudGlmaWVyOiAnJXMnAHVuZXhwZWN0ZWQgY2hhcmFjdGVyAHVudGVybWluYXRlZCBzdHJpbmcAaW52YWxpZyBoZXggZGlnaXQAdW5rbm93biBlc2NhcGUgY29kZQBzdHJpbmcgdG9vIGxvbmcAdW5leHBlY3RlZCBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQAQ291bGQgbm90IGxvYWQgYmxvY2sgZGV2aWNlIGZpbGUgKGVycj0lZCkKAGJsb2NrX3NpemUAaW52YWxpZCBibG9ja19zaXplCgBuX2Jsb2NrAGludmFsaWQgbl9ibG9jawoAcHJlZmV0Y2hfZ3JvdXBfbGVuAHByZWZldGNoX2dyb3VwX2xlbiBpcyB0b28gbGFyZ2UAcHJlZmV0Y2gAZXhwZWN0aW5nIGFuIGFycmF5CgBleHBlY3RpbmcgYW4gaW50ZWdlcgoAJXNibGslMDl1LmJpbgAlc2dycCUwOXUuYmluAENvdWxkIG5vdCBsb2FkIGdyb3VwICV1CgBzaXplID09IGJsb2NrX2J5dGVzICogcmVxLT5uX2Jsb2NrX251bQBibG9ja19uZXQuYwBiZl9wcmVmZXRjaF9ncm91cF9vbmxvYWQAYi0+c3RhdGUgPT0gQ0JMT0NLX0xPQURJTkcAYmZfdXBkYXRlX2Jsb2NrAENvdWxkIG5vdCBsb2FkIGJsb2NrICV1CgBzaXplID09IGJmLT5ibG9ja19zaXplICogNTEyAGJmX3JlYWRfb25sb2FkAHMtPm5fcGh5c19tZW1fcmFuZ2UgPCBQSFlTX01FTV9SQU5HRV9NQVgAaW9tZW0uYwByZWdpc3Rlcl9yYW1fZW50cnkAKHNpemUgJiAoREVWUkFNX1BBR0VfU0laRSAtIDEpKSA9PSAwICYmIHNpemUgIT0gMABDb3VsZCBub3QgYWxsb2NhdGUgVk0gbWVtb3J5CgBjcHVfcmVnaXN0ZXJfZGV2aWNlAHNpemUgPD0gMHhmZmZmZmZmZgBleHBlY3RpbmcgJyVzJyBwcm9wZXJ0eQoAJXM6IGludGVnZXIgZXhwZWN0ZWQKAEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlsZQoAZXJyb3I6ICVzCgB2ZXJzaW9uAFRoZSBlbXVsYXRvciBpcyB0b28gb2xkIHRvIHJ1biB0aGlzIFZNOiBwbGVhc2UgdXBncmFkZQoAVGhlIFZNIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gb2xkIGZvciB0aGlzIGVtdWxhdG9yIHZlcnNpb246IHBsZWFzZSB1cGdyYWRlIHRoZSBWTSBjb25maWd1cmF0aW9uIGZpbGUKAG1hY2hpbmUAJXM6IHN0cmluZyBleHBlY3RlZAoAVW5rbm93biBtYWNoaW5lIG5hbWU6ICVzCgBtZW1vcnlfc2l6ZQBiaW9zAGtlcm5lbABpbml0cmQAY21kbGluZQBUWgBVVEMlYyUwMmQ6JTAyZABkcml2ZSVkAFRvbyBtYW55IGRyaXZlcwoAZmlsZQBkZXZpY2UAZnMlZABUb28gbWFueSBmaWxlc3lzdGVtcwoAdGFnAC9kZXYvcm9vdAAvZGV2L3Jvb3QlZABldGglZABUb28gbWFueSBldGhlcm5ldCBpbnRlcmZhY2VzCgBkcml2ZXIAdGFwAGlmbmFtZQBkaXNwbGF5MAB3aWR0aABoZWlnaHQAdmdhX2Jpb3MAaW5wdXRfZGV2aWNlAGFjY2VsAG5vbmUAYXV0bwB1bnN1cHBvcnRlZCAnYWNjZWwnIGNvbmZpZzogJXMKAHJ0Y19sb2NhbF90aW1lACVzOiBib29sZWFuIGV4cGVjdGVkCgAlczolZDogJXMKAHg4Nl9jcHUuYwB0cmlwbGUgZmF1bHQ6IHNodXRfZG93bgAuL3g4Nl9oZWxwZXIuaAB1bnN1cHBvcnRlZCBldmVudCB0eXBlAGludmFsaWQgdHNzAGludmFsaWQgdHNzIHR5cGUAcGMAdW5zdXBwb3J0ZWQgbWFjaGluZTogJXMKAHAtPnJhbV9zaXplID49ICgxIDw8IDIwKQB4ODZfbWFjaGluZS5jAHBjX21hY2hpbmVfaW5pdAAoYmlvc19zaXplICUgNjU1MzYpID09IDAgJiYgYmlvc19zaXplICE9IDAAdmlydGlvAGlkZQB2Z2EAc2ltcGxlZmIAdW5zdXBwb3J0ZWQgZGlzcGxheSBkZXZpY2U6ICVzCgBwczIAdW5zdXBwb3J0ZWQgaW5wdXQgZGV2aWNlOiAlcwoAS2VybmVsIHRvbyBzbWFsbAoASW52YWxpZCBrZXJuZWwgbWFnaWMKAEhkclMAS2VybmVsIHRvbyBvbGQKAE5vdCBlbm91Z2ggUkFNCgAJCgsMUklTQ1ZFTVUgSEFSRERJU0sAUElJWDMgSURFAHFlbXU6IHVuc3VwcG9ydGVkIGtleWJvYXJkIGNtZD0weCUwMngKAHN5c3RlbV9yZXNldF9yZXF1ZXN0AFZHQQADPQ8/DgAA/y0rICAgMFgweAAobnVsbCkALTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAAABAgQHAwYF";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=(function(){Module["dynCall_vi"](func,arg)})}else{browserIterationFunc=(function(){Module["dynCall_v"](func)})}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}}),runIter:(function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}if(Module["postMainLoop"])Module["postMainLoop"]()})},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject==="undefined"){console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Module["preloadedImages"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module["preloadedAudios"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module["preloadedAudios"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(function(){});canvas.exitFullscreen=canvas.exitFullscreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?(function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null)||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullscreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullscreen()}}),requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){err("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");Browser.requestFullScreen=(function(lockPointer,resizeCanvas,vrDevice){return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)});return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),asyncLoad:(function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";Module["readAsync"](url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(dep)addRunDependency(dep)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}),wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:(function(){var handle=Browser.nextWgetRequestHandle;Browser.nextWgetRequestHandle++;return handle})};function _emscripten_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.");Module["requestFullScreen"]=Module["requestFullscreen"];Browser.requestFullScreen(lockPointer,resizeCanvas,vrDevice)};Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas,vrDevice){Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==="boolean"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,"base64")}catch(_){buf=new Buffer(s,"base64")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16){var sp=stackSave();try{return Module["dynCall_iiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_iiiiiiii":invoke_iiiiiiii,"invoke_iiiiiiiii":invoke_iiiiiiiii,"invoke_iiiiiiiiiiiiiiiii":invoke_iiiiiiiiiiiiiiiii,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiii":invoke_viiiiii,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"__exit":__exit,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_get_now":_emscripten_get_now,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_emscripten_set_main_loop":_emscripten_set_main_loop,"_emscripten_set_main_loop_timing":_emscripten_set_main_loop_timing,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_get_new_handle":_file_buffer_get_new_handle,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_gmtime_r":_gmtime_r,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"_tzset":_tzset,"flush_NO_FILESYSTEM":flush_NO_FILESYSTEM,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM
+var asm=(/** @suppress {uselessCode} */ function(global,env,buffer) {
+"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iii;var Y=env.invoke_iiii;var Z=env.invoke_iiiii;var _=env.invoke_iiiiii;var $=env.invoke_iiiiiii;var aa=env.invoke_iiiiiiii;var ba=env.invoke_iiiiiiiii;var ca=env.invoke_iiiiiiiiiiiiiiiii;var da=env.invoke_vi;var ea=env.invoke_vii;var fa=env.invoke_viii;var ga=env.invoke_viiii;var ha=env.invoke_viiiii;var ia=env.invoke_viiiiii;var ja=env.___assert_fail;var ka=env.___buildEnvironment;var la=env.___setErrNo;var ma=env.___syscall140;var na=env.___syscall146;var oa=env.___syscall54;var pa=env.___syscall6;var qa=env.__exit;var ra=env._abort;var sa=env._clock_gettime;var ta=env._console_get_size;var ua=env._console_write;var va=env._emscripten_async_call;var wa=env._emscripten_async_wget3_data;var xa=env._emscripten_get_now;var ya=env._emscripten_get_now_is_monotonic;var za=env._emscripten_memcpy_big;var Aa=env._emscripten_random;var Ba=env._emscripten_set_main_loop;var Ca=env._emscripten_set_main_loop_timing;var Da=env._exit;var Ea=env._fb_refresh;var Fa=env._file_buffer_get_new_handle;var Ga=env._file_buffer_init;var Ha=env._file_buffer_read;var Ia=env._file_buffer_reset;var Ja=env._file_buffer_resize;var Ka=env._file_buffer_set;var La=env._file_buffer_write;var Ma=env._fs_export_file;var Na=env._fs_wget_update_downloading;var Oa=env._gettimeofday;var Pa=env._gmtime_r;var Qa=env._localtime_r;var Ra=env._net_recv_packet;var Sa=env._time;var Ta=env._tzset;var Ua=env.flush_NO_FILESYSTEM;var Va=0.0;
+// EMSCRIPTEN_START_FUNCS
+function jb(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function kb(){return l|0}function lb(a){a=a|0;l=a}function mb(a,b){a=a|0;b=b|0;l=a;m=b}function nb(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function ob(a){a=a|0;y=a}function pb(){return y|0}function qb(b){b=b|0;var d=0,e=0;d=c[4202132]|0;if(d>>>0>=1024)return;e=c[4202133]|0;a[20144+e>>0]=b;b=e+1|0;c[4202133]=(b|0)==1024?0:b;c[4202132]=d+1;return}function rb(a,b){a=a|0;b=b|0;var d=0;d=c[4202134]|0;if(!d)return;fb[c[(c[d>>2]|0)+32>>2]&15](d,a,b&65535);return}function sb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[4202134]|0;if(!e)return;Wa[c[(c[e>>2]|0)+24>>2]&15](e)|0;g=c[4202135]|0;h=g+-1|0;e=c[4202136]|0;f=e+-1|0;a=(((h|0)>(a|0)?a:h)<<15|0)/(g|0)|0;e=(((f|0)>(b|0)?b:f)<<15|0)/(e|0)|0;c[4202137]=a;c[4202138]=e;c[4202139]=d;b=c[4202134]|0;hb[c[(c[b>>2]|0)+28>>2]&7](b,a,e,0,d);return}function tb(a){a=a|0;var b=0;b=c[4202134]|0;if(!b)return;hb[c[(c[b>>2]|0)+28>>2]&7](b,c[4202137]|0,c[4202138]|0,a,c[4202139]|0);return}function ub(a,b){a=a|0;b=b|0;var d=0;d=c[(c[4202134]|0)+4>>2]|0;if(!d)return;fb[c[d+24>>2]&15](d,a,b);return}function vb(a){a=a|0;var b=0;c[4202140]=a;b=c[4202134]|0;if(!b)return;b=c[b+4>>2]|0;if(!b)return;eb[c[b+28>>2]&15](b,a);return}function wb(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=Le(20)|0;c[i+4>>2]=b;c[i+8>>2]=Tk(d)|0;if(e|0)c[i+16>>2]=Tk(e)|0;c[4202135]=f;c[4202136]=g;c[i+12>>2]=h;h=Le(248)|0;c[i>>2]=h;lf(h);bf(c[i>>2]|0,a,3,i);return}function xb(a){a=a|0;var b=0,d=0,e=0;e=c[a>>2]|0;b=c[e+164>>2]|0;if((b|0)>0){if((b|0)!=1)ja(15288,15305,207,15313);d=ad(c[e+108>>2]|0,4,a)|0;c[e+112>>2]=d;b=c[a+16>>2]|0;if(!b)return;hd(d,b);return}b=c[e+96>>2]|0;if((b|0)<=0){Bb(a);return}if((b|0)!=1)ja(15324,15305,224,15344);c[e+56>>2]=re(c[e+52>>2]|0,131072,5,a)|0;return}function yb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+144|0;d=h;e=h+132|0;f=h+128|0;g=a+8|0;b=c[g>>2]|0;if(b|0?_b(b)|0:0){b=$b(c[g>>2]|0)|0;i=c[a+12>>2]|0;b=Ya[c[i+8>>2]&63](c[i>>2]|0,d,(b|0)<128?b:128)|0;if((b|0)>0)ac(c[g>>2]|0,d,b)|0;if(c[4202141]|0){ta(e|0,f|0);bc(c[g>>2]|0,c[e>>2]|0,c[f>>2]|0);c[4202141]=0}}b=c[a+16>>2]|0;if(b|0)fb[c[b+24>>2]&15](b,1,0);if(!(Xa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0)){b=0;while(1){eb[c[(c[a>>2]|0)+20>>2]&15](a,2e5);d=Xa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0;if(b>>>0>13|(d|0)!=0)break;else b=b+1|0}if(!d){va(6,a|0,0);l=h;return}}va(6,a|0,10);l=h;return}function zb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[a+8>>2]|0;Ea(b|0,(c[a+12>>2]|0)+(N(h,e)|0)+(d<<2)|0,d|0,e|0,f|0,g|0,h|0);return}function Ab(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;d=c[b+96>>2]|0;if((d|0)<=0){Bb(a);return}if((d|0)!=1)ja(15324,15305,224,15344);c[b+56>>2]=re(c[b+52>>2]|0,131072,5,a)|0;return}function Bb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b>>2]|0;c[g+24>>2]=1;d=c[b+4>>2]<<20;h=g+16|0;c[h>>2]=d;c[h+4>>2]=((d|0)<0)<<31>>31;h=b+8|0;d=c[h>>2]|0;if(d|0?a[d>>0]|0:0)hf(c[b>>2]|0,d);e=c[4202135]|0;d=c[4202136]|0;if((e|0)>0&(d|0)>0){f=g+32|0;if(!(c[f>>2]|0)){c[f>>2]=Tk(19811)|0;e=c[4202135]|0;d=c[4202136]|0}c[g+36>>2]=e;c[g+40>>2]=d}else{c[4202141]=1;f=Le(12)|0;c[f+4>>2]=2;c[f+8>>2]=5;c[g+44>>2]=f}e=g+180|0;d=c[e>>2]|0;do if((d|0)>0)if(c[b+12>>2]|0)if((d|0)==1){f=Le(32)|0;a[f>>0]=2;a[f+1>>0]=~~(+Aa()*256.0);a[f+2>>0]=~~(+Aa()*256.0);a[f+3>>0]=~~(+Aa()*256.0);a[f+4>>0]=~~(+Aa()*256.0);a[f+5>>0]=~~(+Aa()*256.0);c[f+8>>2]=3;c[f+12>>2]=0;c[g+176>>2]=f;break}else ja(15358,15305,269,15376);else{d=0;do{Uj(c[g+168+(d*12|0)+4>>2]|0);Uj(c[g+168+(d*12|0)>>2]|0);d=d+1|0}while((d|0)<(c[e>>2]|0));c[e>>2]=0;break}while(0);f=kf(g)|0;c[4202134]=f;jf(c[b>>2]|0);d=c[f+4>>2]|0;if(d|0)eb[c[d+28>>2]&15](d,c[4202140]|0);Uj(c[b>>2]|0);Uj(c[h>>2]|0);d=b+16|0;e=c[d>>2]|0;if(!e){Uj(b);va(6,f|0,0);return}Nl(e|0,0,gk(e)|0)|0;Uj(c[d>>2]|0);Uj(b);va(6,f|0,0);return}function Cb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[4202132]|0;a=(e|0)>(d|0)?d:e;c[4202132]=e-a;if(!a){b=0;return b|0}e=0;d=c[4202142]|0;do{f=1024-d|0;f=(a|0)<(f|0)?a:f;Ll(b+e|0,20144+d|0,f|0)|0;a=a-f|0;e=f+e|0;f=f+d|0;d=(f|0)==1024?0:f}while((a|0)!=0);c[4202142]=d;f=e;return f|0}function Db(b,d){b=b|0;d=d|0;var e=0,f=0;e=Le(572)|0;Fb(e,b,2,8,1);c[e+544>>2]=d;b=Wa[c[d>>2]&15](d)|0;d=y;a[e+288>>0]=b;a[e+289>>0]=b>>>8;a[e+290>>0]=b>>>16;a[e+291>>0]=b>>>24;a[e+292>>0]=d;f=Il(b|0,d|0,40)|0;a[e+293>>0]=f;f=Il(b|0,d|0,48)|0;a[e+294>>0]=f;d=Il(b|0,d|0,56)|0;a[e+295>>0]=d;return e|0}function Eb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;h=k;i=c[a+544>>2]|0;j=a+548|0;if(c[j>>2]|0){j=-1;l=k;return j|0}if((Rb(a,h,b,d,0,16,0)|0)<0){j=0;l=k;return j|0}m=c[h>>2]|0;g=a+552|0;c[g>>2]=m;c[g+12>>2]=b;c[g+16>>2]=d;switch(m|0){case 0:{b=Tj(f)|0;c[g+4>>2]=b;c[g+8>>2]=f;m=h+8|0;b=ab[c[i+4>>2]&3](i,c[m>>2]|0,c[m+4>>2]|0,b,(f+-1|0)/512|0,2,a)|0;if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Tb(a,b);m=0;l=k;return m|0}}case 1:{if((f|0)<=0)ja(15396,15412,1097,15421);f=e+-16|0;m=Tj(f)|0;Rb(a,m,b,d,16,f,0)|0;b=h+8|0;b=ab[c[i+8>>2]&3](i,c[b>>2]|0,c[b+4>>2]|0,m,(f|0)/512|0,2,a)|0;Uj(m);if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Tb(a,b);m=0;l=k;return m|0}}default:{m=0;l=k;return m|0}}return 0}function Fb(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+64|0;m=n+32|0;k=n;Nl(d|0,0,544)|0;if(!(c[e>>2]|0)){k=c[e+4>>2]|0;c[d>>2]=k;c[d+12>>2]=c[e+16>>2];m=e+8|0;c[d+4>>2]=He(k,c[m>>2]|0,c[m+4>>2]|0,4096,0,d,8,3,7)|0;c[d+16>>2]=9}else{switch(f|0){case 1:{i=4096;j=512;break}case 2:{i=4097;j=256;break}case 3:{i=4099;j=1920;break}case 9:{i=4169;j=2;break}case 18:{i=4178;j=2432;break}default:ra()}c[m>>2]=i&65535;nk(k,32,15384,m)|0;v=Qd(c[e>>2]|0,k,-1,6900,i,0,j)|0;k=d+8|0;c[k>>2]=v;Yd(v,44,6900);Yd(c[k>>2]|0,46,f&65535);Xd(c[k>>2]|0,61,1);c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;v=m+2|0;a[v>>0]=16;u=m+3|0;a[u>>0]=1;t=m+4|0;a[t>>0]=4;s=m+8|0;r=m+9|0;q=m+10|0;p=m+11|0;o=m+12|0;i=m+13|0;c[s>>2]=0;a[s+4>>0]=0;a[i>>0]=16;j=m+14|0;a[j>>0]=0;e=m+15|0;a[e>>0]=0;Zd(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=3;a[t>>0]=4;a[s>>0]=0;a[r>>0]=16;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Zd(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=4;a[t>>0]=4;a[s>>0]=0;a[r>>0]=32;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Zd(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;a[m>>0]=9;a[v>>0]=20;a[u>>0]=2;a[t>>0]=4;a[s>>0]=0;a[r>>0]=48;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;c[m+16>>2]=0;Zd(c[k>>2]|0,m,20)|0;c[d+16>>2]=6;c[d+12>>2]=Sd(c[k>>2]|0,0)|0;m=Td(c[k>>2]|0)|0;c[d>>2]=m;c[d+4>>2]=He(m,0,0,16384,0,d,7,1,23)|0;Vd(c[k>>2]|0,4,16384,0,d,2)}c[d+264>>2]=f;c[d+268>>2]=65535;c[d+284>>2]=g;c[d+276>>2]=h;v=d+24|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[d+44>>2]=16;c[d+52>>2]=0;c[d+56>>2]=0;c[d+60>>2]=0;b[d+48>>1]=0;c[d+68>>2]=0;c[d+72>>2]=16;c[d+80>>2]=0;c[d+84>>2]=0;c[d+88>>2]=0;b[d+76>>1]=0;c[d+96>>2]=0;c[d+100>>2]=16;c[d+108>>2]=0;c[d+112>>2]=0;c[d+116>>2]=0;b[d+104>>1]=0;c[d+124>>2]=0;c[d+128>>2]=16;c[d+136>>2]=0;c[d+140>>2]=0;c[d+144>>2]=0;b[d+132>>1]=0;c[d+152>>2]=0;c[d+156>>2]=16;c[d+164>>2]=0;c[d+168>>2]=0;c[d+172>>2]=0;b[d+160>>1]=0;c[d+180>>2]=0;c[d+184>>2]=16;c[d+192>>2]=0;c[d+196>>2]=0;c[d+200>>2]=0;b[d+188>>1]=0;c[d+208>>2]=0;c[d+212>>2]=16;c[d+220>>2]=0;c[d+224>>2]=0;c[d+228>>2]=0;b[d+216>>1]=0;c[d+236>>2]=0;c[d+240>>2]=16;c[d+248>>2]=0;c[d+252>>2]=0;c[d+256>>2]=0;b[d+244>>1]=0;l=n;return}function Gb(a,b,d){a=a|0;b=b|0;d=d|0;return Wd(c[a+8>>2]|0,b,0,d)|0}function Hb(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;f=b&4095;switch(b>>>12&1048575|0){case 0:switch(e|0){case 2:switch(b&4095){case 4:{b=c[a+32>>2]|0;switch(b|0){case 0:{a=c[a+272>>2]|0;return a|0}case 1:{a=b;return a|0}default:{a=0;return a|0}}}case 0:{a=c[a+32>>2]|0;return a|0}case 32:{a=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;return a|0}case 40:{a=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;return a|0}case 48:{a=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;return a|0}default:{a=0;return a|0}}case 1:{f=f+-18|0;switch(f>>>1|f<<31|0){case 0:{a=16;return a|0}case 2:{a=c[a+36>>2]|0;return a|0}case 3:{a=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;return a|0}case 5:{a=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;return a|0}default:{a=0;return a|0}}}default:{if(!((e|0)==0&(f|0)==20)){a=0;return a|0}a=c[a+28>>2]|0;return a|0}}case 1:{if(f|e|0){a=0;return a|0}e=a+24|0;f=c[e>>2]|0;c[e>>2]=0;a=c[a+12>>2]|0;fb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);a=f;return a|0}case 2:{switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=f>>>0){a=0;return a|0}a=d[a+288+f>>0]|0;return a|0}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0);return a|0}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0)|(d[a+2>>0]|0)<<16|(d[a+3>>0]|0)<<24;return a|0}default:ra()}break}default:{a=0;return a|0}}return 0}function Ib(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0;g=d&4095;switch(d>>>12&1048575|0){case 0:switch(f|0){case 2:switch(g>>>3|d<<29|0){case 0:{c[a+32>>2]=e;return}case 4:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 5:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 6:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}default:return}case 1:switch(d&4095){case 22:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 24:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 28:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}default:return}default:{if(!((g|0)==20&(f|0)==0))return;c[a+28>>2]=e;if(e|0)return;g=c[a+12>>2]|0;fb[c[g>>2]&15](c[g+4>>2]|0,c[g+8>>2]|0,0);g=a+24|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}}case 2:{Nb(a,g,e,f);return}case 3:{if(e>>>0>=8)return;Ob(a,e);return}default:return}}function Jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Ie(c[a+4>>2]|0,d,0,e);return}function Kb(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;a:do if(b>>>0<=255)if((e|0)==2)do switch(b|0){case 0:{f=1953655158;break a}case 4:{f=2;break a}case 8:{f=c[a+264>>2]|0;break a}case 12:{f=c[a+268>>2]|0;break a}case 16:{f=c[a+32>>2]|0;switch(f|0){case 1:break a;case 0:{f=c[a+272>>2]|0;break a}default:{f=0;break a}}}case 20:{f=c[a+32>>2]|0;break a}case 48:{f=c[a+36>>2]|0;break a}case 52:{f=16;break a}case 56:{f=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;break a}case 128:{f=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;break a}case 144:{f=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;break a}case 160:{f=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;break a}case 68:{f=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;break a}case 96:{f=c[a+24>>2]|0;break a}case 112:{f=c[a+28>>2]|0;break a}case 252:{f=0;break a}default:{f=0;break a}}while(0);else f=0;else{b=b+-256|0;switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=b>>>0){f=0;break a}f=d[a+288+b>>0]|0;break a}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0);break a}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;break a}default:ra()}}while(0);return f|0}function Lb(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;if(d>>>0>255){Nb(a,d+-256|0,e,f);return}if((f|0)!=2)return;do switch(d|0){case 20:{c[a+32>>2]=e;return}case 48:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 56:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 128:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 144:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 160:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}case 112:{c[a+28>>2]=e;if(e|0)return;f=c[a+12>>2]|0;fb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);f=a+24|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}case 68:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}case 80:{if(e>>>0>=8)return;Ob(a,e);return}case 100:{d=a+24|0;f=c[d>>2]&~e;c[d>>2]=f;if(f|0)return;f=c[a+12>>2]|0;fb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);return}default:return}while(0)}function Mb(a,b,d){a=a|0;b=b|0;d=d|0;return Je(c[a>>2]|0,b,0,d)|0}function Nb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;switch(f|0){case 0:{if((c[b+284>>2]|0)>>>0<=d>>>0)return;a[b+288+d>>0]=e;d=c[b+280>>2]|0;if(!d)return;db[d&15](b);return}case 1:{if(((c[b+284>>2]|0)+-1|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=(e&65535)>>>8;d=c[b+280>>2]|0;if(!d)return;db[d&15](b);return}case 2:{if(((c[b+284>>2]|0)+-3|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=e>>>8;a[d+2>>0]=e>>>16;a[d+3>>0]=e>>>24;d=c[b+280>>2]|0;if(!d)return;db[d&15](b);return}default:return}}function Ob(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;k=p+4|0;m=p;if(c[a+40+(d*28|0)+24>>2]|0){l=p;return}o=a+40+(d*28|0)+16|0;f=(c[o>>2]|0)+2|0;if((f&1|0)==0?(e=Ya[c[a+16>>2]&63](a,f,0)|0,(e|0)!=0):0)f=b[e>>1]|0;else f=0;g=a+276|0;h=a+40+(d*28|0)+8|0;e=b[h>>1]|0;if(e<<16>>16==f<<16>>16){l=p;return}i=a+40+(d*28|0)+4|0;j=a+16|0;while(1){e=(c[o>>2]|0)+4+(((c[i>>2]|0)+65535&(e&65535))<<1)|0;if((e&1|0)==0?(n=Ya[c[j>>2]&63](a,e,0)|0,(n|0)!=0):0)e=b[n>>1]|0;else e=0;e=e&65535;if((Pb(a,k,m,d,e)|0)==0?(_a[c[g>>2]&7](a,d,e,c[k>>2]|0,c[m>>2]|0)|0)<0:0){e=13;break}e=(b[h>>1]|0)+1<<16>>16;b[h>>1]=e;if(e<<16>>16==f<<16>>16){e=13;break}}if((e|0)==13){l=p;return}}function Pb(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;Qb(a,p,g,h);o=p+12|0;j=e[o>>1]|0;a:do if(!(j&2)){i=p+8|0;k=p+14|0;h=0;do{h=(c[i>>2]|0)+h|0;if(!(j&1)){i=0;break a}Qb(a,p,g,e[k>>1]|0);m=b[o>>1]|0;j=m&65535}while(!(j&2|0));j=m&65535;n=6}else{h=0;n=6}while(0);b:do if((n|0)==6){k=p+8|0;m=p+14|0;i=0;while(1){i=(c[k>>2]|0)+i|0;if(!(j&1))break b;Qb(a,p,g,e[m>>1]|0);j=e[o>>1]|0;if(!(j&2)){h=-1;break}}l=q;return h|0}while(0);c[d>>2]=h;c[f>>2]=i;f=0;l=q;return f|0}function Qb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a+16|0;g=16;e=(c[a+40+(d*28|0)+12>>2]|0)+(e<<4)|0;while(1){d=4096-(e&4095)|0;d=(g|0)<(d|0)?g:d;f=Ya[c[h>>2]&63](a,e,0)|0;if(!f){b=4;break}Ll(b|0,f|0,d|0)|0;g=g-d|0;if((g|0)<=0){b=4;break}else{b=b+d|0;e=d+e|0}}if((b|0)==4)return}function Rb(a,d,f,g,h,i,j){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;y=z;if(!i){y=0;l=z;return y|0}x=a+40+(f*28|0)+12|0;w=a+16|0;m=y;n=16;g=(c[x>>2]|0)+(g<<4)|0;while(1){f=4096-(g&4095)|0;f=(n|0)<(f|0)?n:f;k=Ya[c[w>>2]&63](a,g,0)|0;if(!k)break;Ll(m|0,k|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{m=m+f|0;g=f+g|0}}u=(j|0)!=0;v=y+12|0;k=b[v>>1]|0;f=k&65535;g=f&2;a:do if(u)if(!g){j=y+14|0;while(1){if(!(f&1)){q=-1;break}g=y;k=16;m=((e[j>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Ya[c[w>>2]&63](a,m,0)|0;if(!n)break;Ll(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}k=b[v>>1]|0;f=k&65535;g=f&2;if(g){t=2;break a}}l=z;return q|0}else t=2;else t=0;while(0);if((g|0)!=(t|0)){y=-1;l=z;return y|0}r=y+8|0;s=y+14|0;m=h;while(1){p=c[r>>2]|0;if(m>>>0<p>>>0){f=21;break}if(!(f&1)){q=-1;f=40;break}o=m-p|0;g=y;n=16;j=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(j&4095)|0;f=(n|0)<(f|0)?n:f;h=Ya[c[w>>2]&63](a,j,0)|0;if(!h)break;Ll(g|0,h|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{g=g+f|0;j=f+j|0}}g=b[v>>1]|0;f=g&65535;if((f&2|0)!=(t|0)){q=-1;f=40;break}else{m=o;k=g}}if((f|0)==21){n=d;g=i;f=k;b:while(1){q=n;d=g;do{o=p-m|0;o=(d|0)<(o|0)?d:o;k=m+(c[y>>2]|0)|0;g=(o|0)>0;c:do if(u){if(g){n=o;j=q;while(1){g=4096-(k&4095)|0;g=(n|0)<(g|0)?n:g;h=Ya[c[w>>2]&63](a,k,1)|0;if(!h)break c;Ll(h|0,j|0,g|0)|0;n=n-g|0;if((n|0)<=0)break;else{k=g+k|0;j=j+g|0}}}}else if(g){j=q;h=o;while(1){g=4096-(k&4095)|0;g=(h|0)<(g|0)?h:g;n=Ya[c[w>>2]&63](a,k,0)|0;if(!n)break c;Ll(j|0,n|0,g|0)|0;h=h-g|0;if((h|0)<=0)break;else{j=j+g|0;k=g+k|0}}}while(0);d=d-o|0;if(!d){q=0;f=40;break b}m=o+m|0;q=q+o|0}while((m|0)!=(p|0));if(!(f&1)){q=-1;f=40;break}g=y;k=16;m=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Ya[c[w>>2]&63](a,m,0)|0;if(!n)break;Ll(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}f=b[v>>1]|0;if((t|0)!=(f&2|0)){q=-1;f=40;break}n=q;g=d;m=0;p=c[r>>2]|0}if((f|0)==40){l=z;return q|0}}else if((f|0)==40){l=z;return q|0}return 0}function Sb(a,b){a=a|0;b=b|0;Tb(a,b);c[a+548>>2]=0;Ob(a,c[a+564>>2]|0);return}function Tb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;e=i;f=b+552|0;g=c[f+12>>2]|0;h=c[f+16>>2]|0;switch(c[f>>2]|0){case 0:{e=c[f+8>>2]|0;f=c[f+4>>2]|0;a[f+(e+-1)>>0]=d>>>31;Rb(b,f,g,h,0,e,1)|0;Uj(f);Ub(b,g,h,e);l=i;return}case 1:{a[e>>0]=d>>>31;Rb(b,e,g,h,0,1,1)|0;Ub(b,g,h,1);l=i;return}default:ra()}}function Ub(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=a+40+(d*28|0)+20|0;h=(c[j>>2]|0)+2|0;if(!(h&1)){i=a+16|0;g=Ya[c[i>>2]&63](a,h,0)|0;if(!g)g=0;else g=b[g>>1]|0;g=g&65535;h=Ya[c[i>>2]&63](a,h,1)|0;if(h)b[h>>1]=g+1}else g=0;g=(c[j>>2]|0)+4+(((c[a+40+(d*28|0)+4>>2]|0)+65535&g)<<3)|0;if((g&3|0)==0?(k=Ya[c[a+16>>2]&63](a,g,1)|0,k|0):0)c[k>>2]=e;g=g+4|0;if((g&3|0)==0?(l=Ya[c[a+16>>2]&63](a,g,1)|0,l|0):0)c[l>>2]=f;l=a+24|0;c[l>>2]=c[l>>2]|1;l=c[a+12>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}function Vb(d,e){d=d|0;e=e|0;var f=0;f=Le(552)|0;Fb(f,d,1,8,2);c[f+272>>2]=32;c[f+64>>2]=1;c[f+544>>2]=e;d=f+288|0;c[d>>2]=c[e>>2];b[d+4>>1]=b[e+4>>1]|0;a[f+294>>0]=0;a[f+295>>0]=0;c[f+548>>2]=12;c[e+16>>2]=f;c[e+20>>2]=4;c[e+24>>2]=4;c[e+28>>2]=3;return f|0}function Wb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=c[a+544>>2]|0;if((b|0)!=1){l=h;return 0}f=a+548|0;if((Rb(a,h,1,d,0,c[f>>2]|0,0)|0)<0){l=h;return 0}f=c[f>>2]|0;b=e-f|0;e=Tj(b)|0;Rb(a,e,1,d,f,b,0)|0;fb[c[g+8>>2]&15](g,e,b);Uj(e);Ub(a,1,d,0);l=h;return 0}function Xb(a){a=a|0;var d=0,e=0;e=c[a+16>>2]|0;if(!(c[e+40>>2]|0)){e=0;return e|0}a=(c[e+56>>2]|0)+2|0;if((a&1|0)==0?(d=Ya[c[e+16>>2]&63](e,a,0)|0,(d|0)!=0):0)a=b[d>>1]|0;else a=0;e=(b[e+48>>1]|0)!=a<<16>>16&1;return e|0}function Yb(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;m=o+8|0;j=o+4|0;n=o;k=c[a+16>>2]|0;if(!(c[k+40>>2]|0)){l=o;return}g=k+56|0;a=(c[g>>2]|0)+2|0;if((a&1|0)==0?(f=Ya[c[k+16>>2]&63](k,a,0)|0,(f|0)!=0):0)a=b[f>>1]|0;else a=0;i=k+48|0;f=b[i>>1]|0;if(f<<16>>16==a<<16>>16){l=o;return}a=(c[g>>2]|0)+4+(((c[k+44>>2]|0)+65535&(f&65535))<<1)|0;if((a&1|0)==0?(h=Ya[c[k+16>>2]&63](k,a,0)|0,(h|0)!=0):0)a=b[h>>1]|0;else a=0;h=a&65535;if(Pb(k,j,n,0,h)|0){l=o;return}a=k+548|0;f=c[a>>2]|0;g=f+e|0;if((g|0)>(c[n>>2]|0)){l=o;return}Nl(m|0,0,f|0)|0;Rb(k,m,0,h,0,f,1)|0;Rb(k,d,0,h,c[a>>2]|0,e,1)|0;Ub(k,0,h,g);b[i>>1]=(b[i>>1]|0)+1<<16>>16;l=o;return}function Zb(a,b){a=a|0;b=b|0;return}function _b(a){a=a|0;var d=0,e=0;if(!(c[a+40>>2]|0)){a=0;return a|0}e=(c[a+56>>2]|0)+2|0;if((e&1|0)==0?(d=Ya[c[a+16>>2]&63](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;a=(b[a+48>>1]|0)!=d<<16>>16&1;return a|0}function $b(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j+4|0;i=j;if(!(c[a+40>>2]|0)){i=0;l=j;return i|0}f=a+56|0;e=(c[f>>2]|0)+2|0;if((e&1|0)==0?(d=Ya[c[a+16>>2]&63](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;e=b[a+48>>1]|0;if(e<<16>>16==d<<16>>16){i=0;l=j;return i|0}d=(c[f>>2]|0)+4+(((c[a+44>>2]|0)+65535&(e&65535))<<1)|0;if((d&1|0)==0?(g=Ya[c[a+16>>2]&63](a,d,0)|0,(g|0)!=0):0)d=b[g>>1]|0;else d=0;h=(Pb(a,h,i,0,d&65535)|0)==0;i=h?c[i>>2]|0:0;l=j;return i|0}function ac(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(c[a+40>>2]|0)){e=0;return e|0}i=a+56|0;g=(c[i>>2]|0)+2|0;if((g&1|0)==0?(f=Ya[c[a+16>>2]&63](a,g,0)|0,(f|0)!=0):0)f=b[f>>1]|0;else f=0;h=a+48|0;g=b[h>>1]|0;if(g<<16>>16==f<<16>>16){e=0;return e|0}f=(c[i>>2]|0)+4+(((c[a+44>>2]|0)+65535&(g&65535))<<1)|0;if((f&1|0)==0?(j=Ya[c[a+16>>2]&63](a,f,0)|0,(j|0)!=0):0)f=b[j>>1]|0;else f=0;j=f&65535;Rb(a,d,0,j,0,e,1)|0;Ub(a,0,j,e);b[h>>1]=(b[h>>1]|0)+1<<16>>16;return e|0}function bc(b,d,e){b=b|0;d=d|0;e=e|0;a[b+288>>0]=d;a[b+289>>0]=(d&65535)>>>8;a[b+290>>0]=e;a[b+291>>0]=(e&65535)>>>8;e=b+24|0;c[e>>2]=c[e>>2]|2;e=c[b+12>>2]|0;fb[c[e>>2]&15](c[e+4>>2]|0,c[e+8>>2]|0,1);return}function cc(a,b){a=a|0;b=b|0;var d=0;d=Le(548)|0;Fb(d,a,3,4,3);c[d+272>>2]=1;c[d+64>>2]=1;c[d+544>>2]=b;return d|0}function dc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[a+544>>2]|0;if((b|0)!=1)return 0;b=Tj(e)|0;Rb(a,b,1,d,0,e,0)|0;fb[c[f+4>>2]&15](c[f>>2]|0,b,e);Uj(b);Ub(a,1,d,0);return 0}function ec(a,b,d){a=a|0;b=b|0;d=d|0;if(c[a+544>>2]|0){a=-1;return a|0}b=fc(a,1,d,b)|0;if(b|0){a=b;return a|0}a=fc(a,0,0,0)|0;return a|0}function fc(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;if(!(c[d+40>>2]|0)){j=-1;l=k;return j|0}a[j>>0]=e;a[j+1>>0]=(e&65535)>>>8;a[j+2>>0]=f;a[j+3>>0]=(f&65535)>>>8;a[j+4>>0]=g;a[j+5>>0]=g>>>8;a[j+6>>0]=g>>>16;a[j+7>>0]=g>>>24;g=d+56|0;e=(c[g>>2]|0)+2|0;if((e&1|0)==0?(h=Ya[c[d+16>>2]&63](d,e,0)|0,(h|0)!=0):0)e=b[h>>1]|0;else e=0;h=d+48|0;f=b[h>>1]|0;if(f<<16>>16==e<<16>>16){j=-1;l=k;return j|0}e=(c[g>>2]|0)+4+(((c[d+44>>2]|0)+65535&(f&65535))<<1)|0;if((e&1|0)==0?(i=Ya[c[d+16>>2]&63](d,e,0)|0,(i|0)!=0):0)e=b[i>>1]|0;else e=0;i=e&65535;Rb(d,j,0,i,0,8,1)|0;Ub(d,0,i,8);b[h>>1]=(b[h>>1]|0)+1<<16>>16;j=0;l=k;return j|0}function gc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[a+544>>2]|0;if((g+-1|0)>>>0>=2){i=-1;return i|0}if((g|0)==1){b=fc(a,2,0,b)|0;if(b|0){i=b;return i|0}b=fc(a,2,1,d)|0;if(b|0){i=b;return i|0}}else{b=fc(a,3,0,b)|0;if(b|0){i=b;return i|0}b=fc(a,3,1,d)|0;if(b|0){i=b;return i|0}}if(e|0?(h=fc(a,2,8,e)|0,h|0):0){i=h;return i|0}d=a+548|0;b=c[d>>2]|0;if((b|0)!=(f|0)){g=f&1;do if((g|0)!=(b&1|0)){b=fc(a,1,272,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>1&1;do if((g|0)!=(b>>>1&1|0)){b=fc(a,1,273,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>2&1;if((g|0)!=(b>>>2&1|0)?(i=fc(a,1,274,g)|0,i|0):0)return i|0;c[d>>2]=f}i=fc(a,0,0,0)|0;return i|0}function hc(a,b){a=a|0;b=b|0;var d=0;d=Le(552)|0;Fb(d,a,18,256,4);c[d+64>>2]=1;c[d+272>>2]=0;c[d+280>>2]=7;c[d+544>>2]=b;return d|0}function ic(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if((b|0)!=1)return 0;Ub(a,1,c,0);return 0}function jc(b){b=b|0;var e=0,f=0;switch(a[b+288>>0]|0){case 1:{switch(c[b+544>>2]|0){case 0:{e=15474;break}case 1:{e=15461;break}case 2:{e=15447;break}default:ra()}f=gk(e)|0;a[b+290>>0]=f;Ll(b+296|0,e|0,f|0)|0;return}case 18:{if((c[b+544>>2]|0)!=2)return;if((d[b+289>>0]|0)>=2)return;a[b+290>>0]=20;e=b+296|0;a[e>>0]=0;a[e+1>>0]=0;a[e+2>>0]=0;a[e+3>>0]=0;a[b+300>>0]=-1;a[b+301>>0]=127;e=b+302|0;f=e+14|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));return}case 17:{e=b+290|0;a[e>>0]=0;switch(c[b+544>>2]|0){case 0:switch(a[b+289>>0]|0){case 1:{a[e>>0]=16;e=b+296|0;f=e+16|0;do{a[e>>0]=255;e=e+1|0}while((e|0)<(f|0));return}case 20:{a[e>>0]=1;return}default:return}case 1:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=3;a[b+297>>0]=1;return}default:return}case 2:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=0;a[b+297>>0]=1;return}case 3:{a[e>>0]=1;a[b+296>>0]=3;return}default:return}default:ra()}break}case 0:return;default:{a[b+290>>0]=0;return}}}function kc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=gk(e)|0;f=Le(564)|0;Fb(f,b,9,g+2|0,5);c[f+272>>2]=1;a[f+288>>0]=g;a[f+289>>0]=g>>>8;Ll(f+290|0,e|0,g|0)|0;c[f+544>>2]=d;c[f+548>>2]=8192;e=f+552|0;c[e>>2]=e;c[f+556>>2]=e;return f|0}function lc(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;Va=l;l=l+3008|0;Ta=Va+2984|0;A=Va+2976|0;z=Va+2968|0;fa=Va+2960|0;y=Va+2944|0;x=Va+2928|0;Ia=Va+2920|0;Ga=Va+2912|0;Ea=Va+2904|0;w=Va+2888|0;v=Va+2880|0;za=Va+2872|0;u=Va+2848|0;t=Va+2840|0;s=Va+2832|0;r=Va+2816|0;q=Va+2800|0;Q=Va+2792|0;o=Va+2776|0;n=Va+2760|0;Aa=Va+2736|0;ea=Va+2712|0;xa=Va+2704|0;J=Va+2672|0;I=Va+2664|0;G=Va+2648|0;F=Va+2608|0;R=Va+2464|0;E=Va+2456|0;qa=Va+2448|0;D=Va+2440|0;pa=Va+2432|0;C=Va+2408|0;oa=Va+2400|0;B=Va+2384|0;na=Va+2376|0;p=Va+2352|0;H=Va+2344|0;m=Va+2288|0;Sa=Va+2240|0;Ha=Va+2992|0;Oa=Va+1024|0;Pa=Va;Na=Va+2120|0;Ma=Va+2988|0;Ka=Va+2104|0;Ja=Va+2088|0;Fa=Va+2072|0;ja=Va+2064|0;ka=Va+2056|0;la=Va+2048|0;La=f+544|0;Qa=c[La>>2]|0;if(g|0){h=0;l=Va;return h|0}P=f+560|0;if(c[P>>2]|0){h=-1;l=Va;return h|0}c[Ha>>2]=0;a:do if(!(Rb(f,Oa,0,h,0,7,0)|0)){Ra=a[Oa+4>>0]|0;i=a[Oa+5>>0]|0;g=(d[Oa+6>>0]<<8|i&255)&65535;c[Ha>>2]=(c[Ha>>2]|0)+7;Ra=Ra&255;Wa=Ra+-8|0;j=(g&65535)>>>8&255;do switch(Wa>>>1|Wa<<31|0){case 11:{k=-524;break a}case 0:{eb[c[Qa+8>>2]&15](Qa,Sa);Ta=c[Sa>>2]|0;Ja=Sa+8|0;Ia=c[Ja>>2]|0;Ja=c[Ja+4>>2]|0;La=Sa+16|0;Ka=c[La>>2]|0;La=c[La+4>>2]|0;Na=Sa+24|0;Ma=c[Na>>2]|0;Na=c[Na+4>>2]|0;Qa=Sa+32|0;Pa=c[Qa>>2]|0;Qa=c[Qa+4>>2]|0;Ua=Sa+40|0;Wa=c[Ua>>2]|0;Ua=c[Ua+4>>2]|0;c[m>>2]=0;c[m+4>>2]=Ta;Ta=m+8|0;c[Ta>>2]=Ia;c[Ta+4>>2]=Ja;Ta=m+16|0;c[Ta>>2]=Ka;c[Ta+4>>2]=La;Ta=m+24|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Na;Ta=m+32|0;c[Ta>>2]=Pa;c[Ta+4>>2]=Qa;Ta=m+40|0;c[Ta>>2]=Wa;c[Ta+4>>2]=Ua;c[m+48>>2]=0;c[m+52>>2]=256;Ta=mc(0,Oa,1024,15490,m)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}case 2:{c[H>>2]=Sa;c[H+4>>2]=Pa;b:do if((nc(f,0,h,Ha,15500,H)|0)==0?(W=c[Sa>>2]|0,X=f+552|0,k=c[f+556>>2]|0,(k|0)!=(X|0)):0){while(1){if((c[k+8>>2]|0)==(W|0))break;k=c[k+4>>2]|0;if((k|0)==(X|0))break b}if(k|0?(ia=c[k+12>>2]|0,ia|0):0){j=Tj(16)|0;c[j>>2]=f;c[j+4>>2]=0;c[j+8>>2]=h;b[j+12>>1]=g;i=$a[c[Qa+24>>2]&15](Qa,Na,ia,c[Pa>>2]|0,4,j)|0;if((i|0)<1)pc(Na,i,j);else c[P>>2]=1;Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 3:{c[p>>2]=Sa;c[p+4>>2]=Ka;c[p+8>>2]=Pa;c[p+12>>2]=Na;c[p+16>>2]=Ma;if(nc(f,0,h,Ha,15503,p)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;c:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=25;break c}}if((k|0)!=0?(ra=c[k+12>>2]|0,(ra|0)!=0):0){k=ab[c[Qa+28>>2]&3](Qa,Ja,ra,c[Ka>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0)|0;Uj(c[Ka>>2]|0);if(!k){Ta=(c[f+548>>2]|0)+-24|0;c[na>>2]=Ja;c[na+4>>2]=Ta;Ta=mc(0,Oa,1024,15509,na)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=25}else Ua=25;while(0);if((Ua|0)==25){Uj(c[Ka>>2]|0);k=-71}break a}case 4:{c[B>>2]=Sa;c[B+4>>2]=Na;c[B+8>>2]=Ma;c[B+12>>2]=Pa;if(nc(f,0,h,Ha,15512,B)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;d:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break d}}if((k|0)!=0?(sa=c[k+12>>2]|0,(sa|0)!=0):0)k=$a[c[Qa+60>>2]&15](Qa,Ka,sa,c[Na>>2]|0,c[Ma>>2]|0,c[Pa>>2]|0)|0;else k=-71}else k=-71;while(0);Uj(c[Na>>2]|0);Uj(c[Ma>>2]|0);if(k|0)break a;c[oa>>2]=Ka;Ta=mc(0,Oa,1024,15517,oa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}case 5:{c[C>>2]=Sa;c[C+4>>2]=Ja;c[C+8>>2]=Pa;c[C+12>>2]=Na;c[C+16>>2]=Ma;c[C+20>>2]=Ka;e:do if(!(nc(f,0,h,Ha,15519,C)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;f:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break f}if(k|0?(ta=c[k+12>>2]|0,ta|0):0){k=bb[c[Qa+64>>2]&1](Qa,Fa,ta,c[Ja>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;Uj(c[Ja>>2]|0);if(k|0){g=5;break e}c[pa>>2]=Fa;Wa=mc(0,Oa,1024,15517,pa)|0;k=Wa+7|0;g=Tj(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ll(g+7|0,Oa|0,Wa|0)|0;Rb(f,g,0,h,0,k,1)|0;Ub(f,0,h,k);Uj(g);g=0;k=0;break e}}while(0);Uj(c[Ja>>2]|0);g=5;k=-71}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 7:{c[D>>2]=Sa;if(nc(f,0,h,Ha,15526,D)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;g:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break g}}if((k|0)!=0?(ua=c[k+12>>2]|0,(ua|0)!=0):0){k=Za[c[Qa+68>>2]&3](Qa,Pa,1024,ua)|0;if(!k){c[qa>>2]=Pa;Ta=mc(0,Oa,1024,15528,qa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);break a}case 8:{c[E>>2]=Sa;c[E+4>>2]=Pa;h:do if((nc(f,0,h,Ha,15530,E)|0)==0?(Y=c[Sa>>2]|0,Z=f+552|0,K=c[f+556>>2]|0,(K|0)!=(Z|0)):0){k=K;while(1){if((c[k+8>>2]|0)==(Y|0))break;k=c[k+4>>2]|0;if((k|0)==(Z|0))break h}if(k|0?(_=c[k+12>>2]|0,_|0):0){k=Ya[c[Qa+32>>2]&63](Qa,_,Na)|0;if(k|0)break a;ua=Pa;va=c[ua+4>>2]|0;xa=c[Na+16>>2]|0;ya=c[Na+20>>2]|0;Ta=c[Na+24>>2]|0;Aa=Na+32|0;za=c[Aa>>2]|0;Aa=c[Aa+4>>2]|0;Ca=Na+40|0;Ba=c[Ca>>2]|0;Ca=c[Ca+4>>2]|0;Ea=Na+48|0;Da=c[Ea>>2]|0;Ea=c[Ea+4>>2]|0;Ga=Na+56|0;Fa=c[Ga>>2]|0;Ga=c[Ga+4>>2]|0;Ia=Na+64|0;Ha=c[Ia>>2]|0;Ia=c[Ia+4>>2]|0;Ka=Na+72|0;Ja=c[Ka>>2]|0;Ka=c[Ka+4>>2]|0;La=c[Na+80>>2]|0;Pa=Na+88|0;Ma=c[Pa>>2]|0;Pa=c[Pa+4>>2]|0;Qa=c[Na+96>>2]|0;Wa=Na+104|0;Sa=c[Wa>>2]|0;Wa=c[Wa+4>>2]|0;Ua=c[Na+112>>2]|0;wa=R;c[wa>>2]=c[ua>>2];c[wa+4>>2]=va;c[R+8>>2]=Na;c[R+12>>2]=xa;c[R+16>>2]=ya;c[R+20>>2]=Ta;Ta=R+24|0;c[Ta>>2]=za;c[Ta+4>>2]=Aa;Ta=R+32|0;c[Ta>>2]=Ba;c[Ta+4>>2]=Ca;Ta=R+40|0;c[Ta>>2]=Da;c[Ta+4>>2]=Ea;Ta=R+48|0;c[Ta>>2]=Fa;c[Ta+4>>2]=Ga;Ta=R+56|0;c[Ta>>2]=Ha;c[Ta+4>>2]=Ia;Ta=R+64|0;c[Ta>>2]=Ja;c[Ta+4>>2]=Ka;Ta=R+72|0;c[Ta>>2]=La;c[Ta+4>>2]=0;Ta=R+80|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Pa;Ta=R+88|0;c[Ta>>2]=Qa;c[Ta+4>>2]=0;Ta=R+96|0;c[Ta>>2]=Sa;c[Ta+4>>2]=Wa;Ta=R+104|0;c[Ta>>2]=Ua;c[Ta+4>>2]=0;Ta=R+112|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+120|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+128|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+136|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=mc(0,Oa,1024,15533,R)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 9:{c[F>>2]=Sa;c[F+4>>2]=Pa;c[F+8>>2]=Na;c[F+12>>2]=Ma;c[F+16>>2]=Ka;c[F+20>>2]=Ja;c[F+24>>2]=Fa;c[F+28>>2]=ja;c[F+32>>2]=ka;c[F+36>>2]=la;i:do if(!(nc(f,0,h,Ha,15554,F)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){g=4;k=0;break i}}if((k|0)!=0?(va=c[k+12>>2]|0,(va|0)!=0):0){La=Fa;Oa=ja;Wa=ka;k=la;k=cb[c[Qa+36>>2]&1](Qa,va,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0,c[Ja>>2]|0,c[Ja+4>>2]|0,c[La>>2]|0,c[La+4>>2]|0,c[Oa>>2]|0,c[Oa+4>>2]|0,c[Wa>>2]|0,c[Wa+4>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0;if(!k){g=Tj(7)|0;a[g>>0]=7;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Rb(f,g,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(g);g=0;k=0}else g=5}else{g=4;k=0}}else{g=4;k=0}}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:case 4:{Ua=262;break a}default:i=0}l=Va;return i|0}case 16:{c[G>>2]=Sa;c[G+4>>2]=Na;c[G+8>>2]=Pa;j:do if((nc(f,0,h,Ha,15565,G)|0)==0?($=c[Sa>>2]|0,aa=f+552|0,L=c[f+556>>2]|0,(L|0)!=(aa|0)):0){k=L;while(1){if((c[k+8>>2]|0)==($|0))break;k=c[k+4>>2]|0;if((k|0)==(aa|0))break j}if(k|0?(ma=c[k+12>>2]|0,ma|0):0){k=c[Pa>>2]|0;g=Tj(k+4|0)|0;Wa=Na;k=$a[c[Qa+44>>2]&15](Qa,ma,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0)break a;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,g|0,k+4|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Uj(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 21:{c[I>>2]=Sa;if(nc(f,0,h,Ha,15526,I)|0){Ua=262;break a}Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}case 22:{n=Pa+28|0;c[J>>2]=Sa;c[J+4>>2]=Pa;c[J+8>>2]=Pa+4;c[J+12>>2]=Pa+8;c[J+16>>2]=Pa+16;c[J+20>>2]=Pa+24;c[J+24>>2]=n;if(nc(f,0,h,Ha,15569,J)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;k:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=106;break k}}if((k|0)!=0?(ya=c[k+12>>2]|0,(ya|0)!=0):0){k=Ya[c[Qa+80>>2]&63](Qa,ya,Pa)|0;Uj(c[n>>2]|0);if((k|0)>=0){c[xa>>2]=k;Ta=mc(0,Oa,1024,15577,xa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=106}else Ua=106;while(0);if((Ua|0)==106){Uj(c[n>>2]|0);k=-71}break a}case 23:{n=Pa+8|0;o=Pa+16|0;p=Pa+24|0;q=Pa+28|0;c[ea>>2]=Sa;c[ea+4>>2]=Pa;c[ea+8>>2]=n;c[ea+12>>2]=o;c[ea+16>>2]=p;c[ea+20>>2]=q;if(nc(f,0,h,Ha,15579,ea)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;l:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break l}}if((k|0)!=0?(Ba=c[k+12>>2]|0,(Ba|0)!=0):0){k=Ya[c[Qa+84>>2]&63](Qa,Ba,Pa)|0;if((k|0)>=0){c[Aa>>2]=Pa;c[Aa+4>>2]=n;c[Aa+8>>2]=o;c[Aa+12>>2]=p;c[Aa+16>>2]=q;Ta=mc(0,Oa,1024,15586,Aa)|0;Uj(c[q>>2]|0);Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);Uj(c[q>>2]|0);break a}case 31:{c[n>>2]=Sa;c[n+4>>2]=Pa;c[n+8>>2]=Na;if(nc(f,0,h,Ha,15592,n)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;m:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=127;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==127)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=134;break m}}if((k|0)!=0?(Ca=c[k+12>>2]|0,(m|0)!=0&(Ca|0)!=0):0){k=Za[c[Qa+56>>2]&3](Qa,m,Ca,c[Na>>2]|0)|0;Uj(c[Na>>2]|0);if(!k){Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=134}else Ua=134;while(0);if((Ua|0)==134){Uj(c[Na>>2]|0);k=-71}break a}case 32:{c[o>>2]=Sa;c[o+4>>2]=Ma;c[o+8>>2]=Pa;c[o+12>>2]=Na;n:do if((nc(f,0,h,Ha,15596,o)|0)==0?(ba=c[Sa>>2]|0,ca=f+552|0,M=c[f+556>>2]|0,(M|0)!=(ca|0)):0){k=M;while(1){if((c[k+8>>2]|0)==(ba|0))break;k=c[k+4>>2]|0;if((k|0)==(ca|0))break n}if(k|0?(da=c[k+12>>2]|0,da|0):0){k=$a[c[Qa+20>>2]&15](Qa,Ka,da,c[Ma>>2]|0,c[Pa>>2]|0,c[Na>>2]|0)|0;if(k|0)break a;c[Q>>2]=Ka;Ta=mc(0,Oa,1024,15517,Q)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 33:{c[q>>2]=Sa;c[q+4>>2]=Na;c[q+8>>2]=Pa;c[q+12>>2]=Ma;if(nc(f,0,h,Ha,15601,q)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;o:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=156;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==156)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){k=-71;break o}}if((k|0)!=0?(Da=c[k+12>>2]|0,(m|0)!=0&(Da|0)!=0):0)k=_a[c[Qa+72>>2]&7](Qa,m,c[Na>>2]|0,Da,c[Ma>>2]|0)|0;else k=-71}else k=-71;while(0);Uj(c[Na>>2]|0);Uj(c[Ma>>2]|0);if(k|0)break a;Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}case 34:{c[r>>2]=Sa;c[r+4>>2]=Na;c[r+8>>2]=Pa;if(nc(f,0,h,Ha,15606,r)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;p:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=174;break p}}if((k|0)!=0?(wa=c[k+12>>2]|0,(wa|0)!=0):0){k=Ya[c[Qa+76>>2]&63](Qa,wa,c[Na>>2]|0)|0;Uj(c[Na>>2]|0);if(!k){Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=174}else Ua=174;while(0);if((Ua|0)==174){Uj(c[Na>>2]|0);k=-71}break a}case 46:{c[s>>2]=Sa;c[s+4>>2]=Pa;if(nc(f,0,h,Ha,15610,s)|0){Ua=262;break a}Ta=f+548|0;c[Ta>>2]=c[Sa>>2];Uj(c[Pa>>2]|0);c[t>>2]=c[Ta>>2];c[t+4>>2]=15613;Ta=mc(0,Oa,1024,15610,t)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}case 48:{c[u>>2]=Sa;c[u+4>>2]=Pa;c[u+8>>2]=Ma;c[u+12>>2]=Ka;c[u+16>>2]=Na;if(!(nc(f,0,h,Ha,15622,u)|0)){k=$a[c[Qa+12>>2]&15](Qa,Fa,Ja,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;if(!k){p=c[Sa>>2]|0;m=c[Fa>>2]|0;n=f+552|0;o=f+556|0;g=c[o>>2]|0;q:do if((g|0)!=(n|0)){k=g;while(1){if((c[k+8>>2]|0)==(p|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=190;break q}}if(k){Qa=c[La>>2]|0;Wa=k+12|0;eb[c[Qa+4>>2]&15](Qa,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=190}else Ua=190;while(0);if((Ua|0)==190){Wa=Tj(16)|0;c[Wa+8>>2]=p;c[Wa+12>>2]=m;c[o>>2]=Wa;c[Wa>>2]=n;c[Wa+4>>2]=g;c[g>>2]=Wa}Uj(c[Ma>>2]|0);Uj(c[Ka>>2]|0);c[za>>2]=Ja;Wa=mc(0,Oa,1024,15517,za)|0;k=Wa+7|0;g=Tj(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ll(g+7|0,Oa|0,Wa|0)|0;Rb(f,g,0,h,0,k,1)|0;Ub(f,0,h,k);Uj(g);g=0;k=0}else g=5}else{g=2;k=0}switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 50:{c[v>>2]=Sa;if(nc(f,0,h,Ha,15628,v)|0){Ua=262;break a}Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}case 51:{c[w>>2]=Sa;c[w+4>>2]=Pa;c[w+8>>2]=Na;r:do if(!(nc(f,0,h,Ha,15630,w)|0)){g=c[Sa>>2]|0;p=f+552|0;q=f+556|0;k=c[q>>2]|0;s:do if((k|0)!=(p|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0))break s}if(k|0){k=c[k+12>>2]|0;c[Ma>>2]=k;if(!k)break r;m=Le(e[Na>>1]<<2)|0;Wa=b[Na>>1]|0;n=Tj((Wa&65535)<<4)|0;t:do if(!(Wa<<16>>16)){g=0;Ua=209}else{k=0;do{c[Ea>>2]=m+(k<<2);k=k+1|0;if(nc(f,0,h,Ha,15528,Ea)|0){k=-71;break t}g=b[Na>>1]|0}while(k>>>0<(g&65535)>>>0);g=g&65535;k=c[Ma>>2]|0;Ua=209}while(0);if((Ua|0)==209)k=$a[c[Qa+16>>2]&15](Qa,Ma,n,k,g,m)|0;if(b[Na>>1]|0){g=0;do{Uj(c[m+(g<<2)>>2]|0);g=g+1|0}while(g>>>0<(e[Na>>1]|0)>>>0)}Uj(m);if((k|0)<0){Uj(n);break a}c[Ga>>2]=k;g=mc(0,Oa,1024,15628,Ga)|0;if(!k)o=g;else{m=0;do{c[Ia>>2]=n+(m<<4);g=(mc(0,Oa+g|0,1024-g|0,15517,Ia)|0)+g|0;m=m+1|0}while((m|0)<(k|0));o=g}Uj(n);n=c[Pa>>2]|0;m=c[Ma>>2]|0;g=c[q>>2]|0;u:do if((g|0)!=(p|0)){k=g;while(1){if((c[k+8>>2]|0)==(n|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0)){Ua=223;break u}}if(k){Ta=c[La>>2]|0;Wa=k+12|0;eb[c[Ta+4>>2]&15](Ta,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=223}else Ua=223;while(0);if((Ua|0)==223){Wa=Tj(16)|0;c[Wa+8>>2]=n;c[Wa+12>>2]=m;c[q>>2]=Wa;c[Wa>>2]=p;c[Wa+4>>2]=g;c[g>>2]=Wa}Ua=o+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,o|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);c[Ma>>2]=0}while(0);Ua=262;break a}case 54:{c[x>>2]=Sa;c[x+4>>2]=Na;c[x+8>>2]=Pa;v:do if((nc(f,0,h,Ha,15565,x)|0)==0?(S=c[Sa>>2]|0,T=f+552|0,N=c[f+556>>2]|0,(N|0)!=(T|0)):0){k=N;while(1){if((c[k+8>>2]|0)==(S|0))break;k=c[k+4>>2]|0;if((k|0)==(T|0))break v}if(k|0?(ga=c[k+12>>2]|0,ga|0):0){k=c[Pa>>2]|0;g=Tj(k+4|0)|0;Wa=Na;k=$a[c[Qa+48>>2]&15](Qa,ga,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0){Uj(g);break a}a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,g|0,k+4|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Uj(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 55:{c[y>>2]=Sa;c[y+4>>2]=Na;c[y+8>>2]=Pa;w:do if((nc(f,0,h,Ha,15565,y)|0)==0?(U=c[Sa>>2]|0,V=f+552|0,O=c[f+556>>2]|0,(O|0)!=(V|0)):0){k=O;while(1){if((c[k+8>>2]|0)==(U|0))break;k=c[k+4>>2]|0;if((k|0)==(V|0))break w}if(k|0?(ha=c[k+12>>2]|0,ha|0):0){Wa=c[Pa>>2]|0;g=Tj(Wa)|0;if(Rb(f,g,0,h,c[Ha>>2]|0,Wa,0)|0){Uj(g);break}k=Na;k=$a[c[Qa+52>>2]&15](Qa,ha,c[k>>2]|0,c[k+4>>2]|0,g,c[Pa>>2]|0)|0;Uj(g);if((k|0)<0)break a;c[fa>>2]=k;Ta=mc(0,Oa,1024,15526,fa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 56:{c[z>>2]=Sa;if(nc(f,0,h,Ha,15526,z)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;x:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break x}if(k|0){Ua=c[La>>2]|0;eb[c[Ua+4>>2]&15](Ua,c[k+12>>2]|0);Ua=c[k>>2]|0;Wa=c[k+4>>2]|0;c[Ua+4>>2]=Wa;c[Wa>>2]=Ua;Uj(k)}}while(0);Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}default:{c[A>>2]=Ra;pl(15634,A)|0;Ua=262;break a}}while(0)}else{i=0;j=0;Ua=262}while(0);if((Ua|0)==262)k=-71;c[Ta>>2]=0-k;Ta=mc(0,Sa,4,15526,Ta)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=7;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Sa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}function mc(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;c[k>>2]=g;j=d+e|0;e=a[f>>0]|0;if(!(e<<24>>24)){k=d;d=k-d|0;l=m;return d|0}b=d;a:while(1){f=f+1|0;switch(e<<24>>24|0){case 98:{e=b+1|0;if(e>>>0>j>>>0){e=5;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;b=e;break}case 104:{e=b+2|0;if(e>>>0>j>>>0){e=8;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;b=e;break}case 119:{e=b+4|0;if(e>>>0>j>>>0){e=11;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=i>>>8;a[b+2>>0]=i>>>16;a[b+3>>0]=i>>>24;b=e;break}case 100:{e=b+8|0;if(e>>>0>j>>>0){e=14;break a}g=(c[k>>2]|0)+(8-1)&~(8-1);i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;c[k>>2]=g+8;a[b>>0]=h;a[b+1>>0]=h>>>8;a[b+2>>0]=h>>>16;a[b+3>>0]=h>>>24;a[b+4>>0]=i;a[b+5>>0]=Il(h|0,i|0,40)|0;a[b+6>>0]=Il(h|0,i|0,48)|0;a[b+7>>0]=Il(h|0,i|0,56)|0;b=e;break}case 115:{i=(c[k>>2]|0)+(4-1)&~(4-1);h=c[i>>2]|0;c[k>>2]=i+4;i=gk(h)|0;if((i|0)>=65536){e=17;break a}e=b+2|0;g=e+i|0;if(g>>>0>j>>>0){e=19;break a}a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;Ll(e|0,h|0,i|0)|0;b=g;break}case 81:{e=b+13|0;if(e>>>0>j>>>0){e=22;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=a[i>>0]|0;h=c[i+4>>2]|0;a[b+1>>0]=h;a[b+2>>0]=h>>>8;a[b+3>>0]=h>>>16;a[b+4>>0]=h>>>24;i=i+8|0;h=c[i>>2]|0;i=c[i+4>>2]|0;a[b+5>>0]=h;a[b+6>>0]=h>>>8;a[b+7>>0]=h>>>16;a[b+8>>0]=h>>>24;a[b+9>>0]=i;a[b+10>>0]=Il(h|0,i|0,40)|0;a[b+11>>0]=Il(h|0,i|0,48)|0;a[b+12>>0]=Il(h|0,i|0,56)|0;b=e;break}default:{e=24;break a}}e=a[f>>0]|0;if(!(e<<24>>24)){e=26;break}}if((e|0)==5)ja(15667,15412,1783,15686);else if((e|0)==8)ja(15695,15412,1793,15686);else if((e|0)==11)ja(15714,15412,1803,15686);else if((e|0)==14)ja(15733,15412,1813,15686);else if((e|0)==17)ja(15752,15412,1832,15686);else if((e|0)==19)ja(15765,15412,1833,15686);else if((e|0)==22)ja(15790,15412,1843,15686);else if((e|0)==24)ra();else if((e|0)==26){k=b;d=k-d|0;l=m;return d|0}return 0}function nc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;x=l;l=l+32|0;u=x+16|0;v=x;m=c[h>>2]|0;c[u>>2]=j;k=a[i>>0]|0;a:do if(k<<24>>24){n=v+1|0;o=v+2|0;p=v+3|0;q=v+4|0;r=v+5|0;s=v+6|0;t=v+7|0;j=m;b:while(1){i=i+1|0;switch(k<<24>>24|0){case 98:{if(Rb(e,v,f,g,j,1,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;a[m>>0]=a[v>>0]|0;j=j+1|0;break}case 104:{if(Rb(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;b[m>>1]=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;break}case 119:{if(Rb(e,v,f,g,j,4,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;j=j+4|0;break}case 100:{if(Rb(e,v,f,g,j,8,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;k=(d[r>>0]|0)<<8|(d[q>>0]|0)|(d[s>>0]|0)<<16|(d[t>>0]|0)<<24;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;c[m+4>>2]=k;j=j+8|0;break}case 115:{if(Rb(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}m=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;k=Tj(m+1|0)|0;if(Rb(e,k,f,g,j,m,0)|0){j=-1;k=18;break b}a[k+m>>0]=0;z=(c[u>>2]|0)+(4-1)&~(4-1);y=c[z>>2]|0;c[u>>2]=z+4;c[y>>2]=k;j=m+j|0;break}default:{k=15;break b}}k=a[i>>0]|0;if(!(k<<24>>24)){w=j;break a}}if((k|0)==15)ra();else if((k|0)==18){l=x;return j|0}}else w=m;while(0);c[h>>2]=w;z=0;l=x;return z|0}function oc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[e>>2]|0;a=c[e+4>>2]|0;pc(b,d,e);c[f+560>>2]=0;Ob(f,a);return}function pc(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+64|0;k=m+40|0;j=m+32|0;g=m+48|0;h=m;i=c[f>>2]|0;if((e|0)<0){d=c[f+4>>2]|0;h=c[f+8>>2]|0;n=b[f+12>>1]|0;c[j>>2]=0-e;e=mc(0,g,4,15526,j)|0;j=e+7|0;k=Tj(j)|0;a[k>>0]=j;a[k+1>>0]=j>>>8;a[k+2>>0]=j>>>16;a[k+3>>0]=j>>>24;a[k+4>>0]=7;a[k+5>>0]=n;a[k+6>>0]=(n&65535)>>>8;Ll(k+7|0,g|0,e|0)|0;Rb(i,k,d,h,0,j,1)|0;Ub(i,d,h,j);Uj(k);Uj(f);l=m;return}else{e=(c[i+548>>2]|0)+-24|0;c[k>>2]=d;c[k+4>>2]=e;e=mc(0,h,32,15509,k)|0;g=c[f+4>>2]|0;j=c[f+8>>2]|0;d=b[f+12>>1]|0;k=e+7|0;n=Tj(k)|0;a[n>>0]=k;a[n+1>>0]=k>>>8;a[n+2>>0]=k>>>16;a[n+3>>0]=k>>>24;a[n+4>>0]=13;a[n+5>>0]=d;a[n+6>>0]=(d&65535)>>>8;Ll(n+7|0,h|0,e|0)|0;Rb(i,n,g,j,0,k,1)|0;Ub(i,g,j,k);Uj(n);Uj(f);l=m;return}}function qc(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+32|0;d=e+16|0;c[d>>2]=b;$a[c[a+16>>2]&15](a,d,e,b,0,0)|0;l=e;return c[d>>2]|0}function rc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;p=r+20|0;j=r+24|0;k=r+16|0;q=r;c[p>>2]=d;i=(f|0)==0;n=b+16|0;o=b+4|0;m=1;g=(a[e>>0]|0)==47?e+1|0:e;while(1){h=kk(g,47)|0;if(!h){c[j>>2]=g;if(!i){e=5;break}g=1;e=$a[c[n>>2]&15](b,k,q,d,1,j)|0}else{e=h-g|0;s=Tj(e+1|0)|0;c[j>>2]=s;Ll(s|0,g|0,e|0)|0;a[s+e>>0]=0;e=$a[c[n>>2]&15](b,k,q,d,1,j)|0;Uj(c[j>>2]|0);g=0}if(!m)eb[c[o>>2]&15](b,c[p>>2]|0);d=c[k>>2]|0;c[p>>2]=d;if((e|0)<1){e=13;break}if(g){e=15;break}else{m=0;g=h+1|0}}if((e|0)==5){c[f>>2]=g;if(!m){s=d;l=r;return s|0}if(($a[c[n>>2]&15](b,p,q,d,0,0)|0)<0){c[p>>2]=0;s=0;l=r;return s|0}else{s=c[p>>2]|0;l=r;return s|0}}else if((e|0)==13){eb[c[o>>2]&15](b,d);c[p>>2]=0;s=0;l=r;return s|0}else if((e|0)==15){l=r;return d|0}return 0}function sc(a,b,c){a=a|0;b=b|0;c=c|0;return rc(a,b,c,0)|0}function tc(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=l;l=l+16|0;e=m;b=Le(208)|0;c[b>>2]=8;c[b+4>>2]=4;c[b+8>>2]=5;c[b+12>>2]=1;c[b+16>>2]=2;c[b+20>>2]=3;c[b+24>>2]=4;c[b+28>>2]=1;c[b+32>>2]=10;c[b+36>>2]=1;c[b+40>>2]=6;c[b+44>>2]=5;c[b+48>>2]=6;c[b+52>>2]=7;c[b+56>>2]=1;c[b+60>>2]=8;c[b+64>>2]=1;c[b+68>>2]=2;c[b+72>>2]=6;c[b+76>>2]=11;c[b+80>>2]=12;c[b+84>>2]=13;n=b+88|0;c[n>>2]=n;o=b+92|0;c[o>>2]=n;j=b+128|0;f=j;c[f>>2]=1;c[f+4>>2]=0;f=b+136|0;c[f>>2]=12;g=b+140|0;c[g>>2]=4096;h=b+104|0;c[h>>2]=1048576;c[h+4>>2]=0;h=b+120|0;c[h>>2]=262144;c[h+4>>2]=0;h=b+148|0;c[h>>2]=h;c[b+152>>2]=h;h=b+168|0;c[h>>2]=67108864;c[h+4>>2]=0;h=b+176|0;c[h>>2]=h;c[b+180>>2]=h;h=b+184|0;c[h>>2]=h;c[b+188>>2]=h;h=b+192|0;c[h>>2]=h;c[b+196>>2]=h;h=Le(104)|0;i=h+16|0;c[i>>2]=1;c[h+20>>2]=0;p=j;d=c[p+4>>2]|0;k=h+8|0;c[k>>2]=c[p>>2];c[k+4>>2]=d;k=j;k=xl(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[j>>2]=k;c[j+4>>2]=y;j=h+24|0;c[j>>2]=4;c[h+28>>2]=511;c[h+32>>2]=0;c[h+36>>2]=0;k=h+56|0;c[k>>2]=k;c[h+60>>2]=k;d=c[o>>2]|0;c[o>>2]=h;c[h>>2]=n;c[h+4>>2]=d;c[d>>2]=h;d=b+96|0;n=d;n=xl(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;c[d>>2]=n;c[d+4>>2]=y;Oa(e|0,0)|0;d=c[e>>2]|0;c[h+40>>2]=d;e=(c[e+4>>2]|0)*1e3|0;c[h+48>>2]=e;c[h+44>>2]=d;c[h+52>>2]=e;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)!=4)ja(15810,15828,456,15837);p=Le(18)|0;c[p+8>>2]=h;d=p+13|0;a[d>>0]=46;a[d+1>>0]=0;d=h+64|0;e=c[d>>2]|0;o=e+18|0;t=xl(c[g>>2]|0,0,-1,-1)|0;s=y;n=xl(t|0,s|0,o|0,((o|0)<0)<<31>>31|0)|0;r=c[f>>2]|0;n=Il(n|0,y|0,r|0)|0;q=y;e=xl(t|0,s|0,e|0,((e|0)<0)<<31>>31|0)|0;r=Il(e|0,y|0,r|0)|0;e=b+112|0;s=e;r=yl(c[s>>2]|0,c[s+4>>2]|0,r|0,y|0)|0;q=xl(r|0,y|0,n|0,q|0)|0;n=e;c[n>>2]=q;c[n+4>>2]=y;c[d>>2]=o;o=c[k>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[p+4>>2]=k;c[k>>2]=p;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)==4){t=Le(19)|0;c[t+8>>2]=h;o=t+13|0;a[o>>0]=a[15851]|0;a[o+1>>0]=a[15852]|0;a[o+2>>0]=a[15853]|0;o=c[d>>2]|0;s=o+19|0;j=xl(c[g>>2]|0,0,-1,-1)|0;n=y;r=xl(j|0,n|0,s|0,((s|0)<0)<<31>>31|0)|0;p=c[f>>2]|0;r=Il(r|0,y|0,p|0)|0;q=y;o=xl(j|0,n|0,o|0,((o|0)<0)<<31>>31|0)|0;p=Il(o|0,y|0,p|0)|0;o=e;p=yl(c[o>>2]|0,c[o+4>>2]|0,p|0,y|0)|0;q=xl(p|0,y|0,r|0,q|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;c[d>>2]=s;s=c[k>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[t+4>>2]=k;c[k>>2]=t;c[b+144>>2]=h;l=m;return b|0}else ja(15810,15828,456,15837);return 0}function uc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+88|0;b=c[a+92>>2]|0;if((b|0)!=(h|0))do{e=b;b=c[b+4>>2]|0;c[e+16>>2]=0;if((c[e+24>>2]|0)==4){g=e+56|0;f=e+60|0;d=c[f>>2]|0;if((d|0)!=(g|0))do{j=d+4|0;i=d;d=c[j>>2]|0;k=c[i>>2]|0;c[k+4>>2]=d;c[d>>2]=k;c[i>>2]=0;c[j>>2]=0;Uj(i)}while((d|0)!=(g|0));c[g>>2]=g;c[f>>2]=g}Rc(a,e)}while((b|0)!=(h|0));k=a+148|0;if((c[k+4>>2]|0)==(k|0)){Uj(c[a+200>>2]|0);return}else ja(16653,15828,1527,16687)}function vc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+8|0;if(c[d>>2]|0)c[d>>2]=0;d=b+16|0;e=c[d>>2]|0;if(e|0){f=c[e+4>>2]|0;if(f|0)c[f>>2]=0;Uj(e);c[d>>2]=0}d=c[b+4>>2]|0;e=d+20|0;f=c[e>>2]|0;if((f|0)<=0)ja(16501,15828,397,16520);c[e>>2]=f+-1;if((f|0)!=1){Uj(b);return}if((c[d+16>>2]|0)>=1){Uj(b);return}Rc(a,d);Uj(b);return}function wc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=1024;d=a+120|0;e=d;f=a+136|0;e=Jl(c[e>>2]|0,c[e+4>>2]|0,(c[f>>2]|0)+-10|0)|0;g=b+8|0;c[g>>2]=e;c[g+4>>2]=y;g=a+112|0;g=yl(c[d>>2]|0,c[d+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0)|0;f=Jl(g|0,y|0,(c[f>>2]|0)+-10|0)|0;g=y;d=b+16|0;c[d>>2]=f;c[d+4>>2]=g;d=b+24|0;c[d>>2]=f;c[d+4>>2]=g;d=a+104|0;g=d;f=c[g+4>>2]|0;e=b+32|0;c[e>>2]=c[g>>2];c[e+4>>2]=f;a=a+96|0;a=yl(c[d>>2]|0,c[d+4>>2]|0,c[a>>2]|0,c[a+4>>2]|0)|0;b=b+40|0;c[b>>2]=a;c[b+4>>2]=y;return}function xc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=b+144|0;g=c[b>>2]|0;h=Le(20)|0;i=g+20|0;c[i>>2]=(c[i>>2]|0)+1;c[h+4>>2]=g;c[h>>2]=f;c[d>>2]=h;b=c[b>>2]|0;d=c[b+24>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;g=b+8|0;h=c[g+4>>2]|0;i=e+8|0;c[i>>2]=c[g>>2];c[i+4>>2]=h;return 0}function yc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=c[f+4>>2]|0;a:do if((g|0)>0){b=0;do{k=c[h+(b<<2)>>2]|0;if((c[i+24>>2]|0)!=4)break a;l=i+56|0;j=c[i+60>>2]|0;if((j|0)==(l|0))break a;while(1){if(!(fk(j+13|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(l|0))break a}if(!j)break a;i=c[j+8>>2]|0;j=e+(b<<4)|0;k=c[i+24>>2]|0;do if((k|0)!=4)if((k|0)==10){a[j>>0]=2;break}else{a[j>>0]=0;break}else a[j>>0]=-128;while(0);c[e+(b<<4)+4>>2]=0;j=i+8|0;k=c[j+4>>2]|0;l=e+(b<<4)+8|0;c[l>>2]=c[j>>2];c[l+4>>2]=k;b=b+1|0}while((b|0)<(g|0))}else b=0;while(0);h=c[f>>2]|0;f=Le(20)|0;g=i+20|0;c[g>>2]=(c[g>>2]|0)+1;c[f+4>>2]=i;c[f>>2]=h;c[d>>2]=f;return b|0}function zc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;s=l;l=l+16|0;n=s;q=c[e+4>>2]|0;r=q+24|0;if((c[r>>2]|0)!=4){d=-20;l=s;return d|0}p=q+56|0;i=c[q+60>>2]|0;a:do if((i|0)!=(p|0)){while(1){if(!(fk(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(p|0))break a}if(i|0){d=-17;l=s;return d|0}}while(0);j=c[e>>2]|0;k=Le(104)|0;e=k+16|0;c[e>>2]=1;c[k+20>>2]=0;m=b+128|0;u=m;t=c[u+4>>2]|0;o=k+8|0;i=o;c[i>>2]=c[u>>2];c[i+4>>2]=t;i=m;i=xl(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[m>>2]=i;c[m+4>>2]=y;m=k+24|0;c[m>>2]=4;c[k+28>>2]=g&4095;c[k+32>>2]=j;c[k+36>>2]=h;j=k+56|0;c[j>>2]=j;c[k+60>>2]=j;g=b+92|0;h=c[g>>2]|0;c[g>>2]=k;c[k>>2]=b+88;c[k+4>>2]=h;c[h>>2]=k;h=b+96|0;g=h;g=xl(c[g>>2]|0,c[g+4>>2]|0,1,0)|0;c[h>>2]=g;c[h+4>>2]=y;Oa(n|0,0)|0;h=c[n>>2]|0;c[k+40>>2]=h;n=(c[n+4>>2]|0)*1e3|0;c[k+48>>2]=n;c[k+44>>2]=h;c[k+52>>2]=n;c[e>>2]=(c[e>>2]|0)+1;if((c[m>>2]|0)!=4)ja(15810,15828,456,15837);u=Le(18)|0;c[u+8>>2]=k;e=u+13|0;a[e>>0]=46;a[e+1>>0]=0;e=k+64|0;i=c[e>>2]|0;t=i+18|0;g=b+140|0;z=xl(c[g>>2]|0,0,-1,-1)|0;x=y;v=xl(z|0,x|0,t|0,((t|0)<0)<<31>>31|0)|0;h=b+136|0;w=c[h>>2]|0;v=Il(v|0,y|0,w|0)|0;n=y;i=xl(z|0,x|0,i|0,((i|0)<0)<<31>>31|0)|0;w=Il(i|0,y|0,w|0)|0;i=b+112|0;b=i;b=yl(c[b>>2]|0,c[b+4>>2]|0,w|0,y|0)|0;n=xl(b|0,y|0,v|0,n|0)|0;b=i;c[b>>2]=n;c[b+4>>2]=y;c[e>>2]=t;t=c[j>>2]|0;c[t+4>>2]=u;c[u>>2]=t;c[u+4>>2]=j;c[j>>2]=u;u=q+16|0;c[u>>2]=(c[u>>2]|0)+1;if((c[m>>2]|0)!=4)ja(15810,15828,456,15837);z=Le(19)|0;c[z+8>>2]=q;t=z+13|0;a[t>>0]=a[15851]|0;a[t+1>>0]=a[15852]|0;a[t+2>>0]=a[15853]|0;t=c[e>>2]|0;x=t+19|0;n=xl(c[g>>2]|0,0,-1,-1)|0;b=y;w=xl(n|0,b|0,x|0,((x|0)<0)<<31>>31|0)|0;u=c[h>>2]|0;w=Il(w|0,y|0,u|0)|0;v=y;t=xl(n|0,b|0,t|0,((t|0)<0)<<31>>31|0)|0;u=Il(t|0,y|0,u|0)|0;t=i;u=yl(c[t>>2]|0,c[t+4>>2]|0,u|0,y|0)|0;v=xl(u|0,y|0,w|0,v|0)|0;w=i;c[w>>2]=v;c[w+4>>2]=y;c[e>>2]=x;x=c[j>>2]|0;c[x+4>>2]=z;c[z>>2]=x;c[z+4>>2]=j;c[j>>2]=z;if((c[r>>2]|0)!=4)ja(15810,15828,456,15837);x=gk(f)|0;w=x+17|0;z=Le(w)|0;c[z+8>>2]=k;Ll(z+13|0,f|0,x+1|0)|0;x=q+64|0;r=c[x>>2]|0;w=r+w|0;f=xl(c[g>>2]|0,0,-1,-1)|0;q=y;u=xl(f|0,q|0,w|0,((w|0)<0)<<31>>31|0)|0;t=c[h>>2]|0;u=Il(u|0,y|0,t|0)|0;v=y;r=xl(f|0,q|0,r|0,((r|0)<0)<<31>>31|0)|0;t=Il(r|0,y|0,t|0)|0;r=i;t=yl(c[r>>2]|0,c[r+4>>2]|0,t|0,y|0)|0;v=xl(t|0,y|0,u|0,v|0)|0;c[i>>2]=v;c[i+4>>2]=y;c[x>>2]=w;i=c[p>>2]|0;c[i+4>>2]=z;c[z>>2]=i;c[z+4>>2]=p;c[p>>2]=z;i=c[m>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;w=o;x=c[w+4>>2]|0;z=d+8|0;c[z>>2]=c[w>>2];c[z+4>>2]=x;z=0;l=s;return z|0}function Ac(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=c[e+4>>2]|0;l=e+8|0;if(c[l>>2]|0)c[l>>2]=0;i=e+16|0;j=c[i>>2]|0;if(j|0){k=c[j+4>>2]|0;if(k|0)c[k>>2]=0;Uj(j);c[i>>2]=0}j=u+24|0;i=c[j>>2]|0;a:do if(f&65536){if((i|0)!=4){h=-20;return h|0}}else{switch(i|0){case 4:case 8:break a;default:i=-22}return i|0}while(0);c[e+12>>2]=f;b:do if((c[j>>2]|0)==8){if(!((f&512|0)==0|(f&3|0)==0))Xc(b,u,0,0)|0;t=u+56|0;c:do switch(c[t>>2]|0){case 0:break b;case 1:{k=u+80|0;j=c[k>>2]|0;k=c[k+4>>2]|0;f=b+176|0;i=c[b+180>>2]|0;d:do if((i|0)!=(f|0)){while(1){s=i+8|0;if((c[s>>2]|0)==(j|0)?(c[s+4>>2]|0)==(k|0):0)break;i=c[i+4>>2]|0;if((i|0)==(f|0))break d}s=i+16|0;i=c[i+20>>2]|0;if((i|0)!=(s|0)){q=b+184|0;r=b+188|0;do{k=c[i+12>>2]|0;e:do if(!(c[i+8>>2]|0)){j=Vc(b,k)|0;if((j|0?(c[j+24>>2]|0)==8:0)?(c[j+56>>2]|0)==1:0)Yc(b,j,0)|0}else{j=c[r>>2]|0;if((j|0)!=(q|0)){while(1){if(!(fk(c[j+8>>2]|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(q|0))break e}if(j|0){o=Vc(b,k)|0;do if((o|0?(c[o+24>>2]|0)==8:0)?(c[o+56>>2]|0)==1:0){p=j+12|0;n=j+16|0;k=c[n>>2]|0;if((k|0)==(p|0))break e;f=0;d=0;m=0;do{l=Vc(b,c[k+24>>2]|0)|0;do if(l){if((c[l+24>>2]|0)!=8)break;f=(c[l+56>>2]|0)==1?1:f}while(0);l=k+16|0;m=xl(c[l>>2]|0,c[l+4>>2]|0,m|0,d|0)|0;d=y;k=c[k+4>>2]|0}while((k|0)!=(p|0));if(!f)break e;if(!((d|0)==0?(m|0)==(c[o+60>>2]|0):0))break;Yc(b,o,1)|0;j=c[n>>2]|0;if((j|0)==(p|0))break e;m=o+96|0;l=0;d=0;while(1){k=j+24|0;f=Vc(b,c[k>>2]|0)|0;f:do if(f|0){if((c[f+24>>2]|0)!=8)break;if((c[f+56>>2]|0)!=1)break;o=j+16|0;do if((c[o+4>>2]|0)==0?(c[o>>2]|0)==(c[f+60>>2]|0):0){n=f+80|0;o=j+8|0;if(!((c[n>>2]|0)==(c[o>>2]|0)?(c[n+4>>2]|0)==(c[o+4>>2]|0):0))break;Yc(b,f,2)|0;o=f+96|0;k=c[o>>2]|0;f=k+24|0;n=(c[m>>2]|0)+40|0;v=c[n>>2]|0;c[v+4>>2]=f;c[f>>2]=v;c[k+28>>2]=n;c[n>>2]=f;o=(c[o>>2]|0)+32|0;c[o>>2]=l;c[o+4>>2]=d;break f}while(0);k=Vc(b,c[k>>2]|0)|0;if(!k)break;if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Yc(b,k,0)|0}while(0);v=j+16|0;l=xl(c[v>>2]|0,c[v+4>>2]|0,l|0,d|0)|0;j=c[j+4>>2]|0;if((j|0)==(p|0))break e;else d=y}}while(0);f=j+12|0;j=c[j+16>>2]|0;if((j|0)!=(f|0))do{k=Vc(b,c[j+24>>2]|0)|0;do if(k|0){if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Yc(b,k,0)|0}while(0);j=c[j+4>>2]|0}while((j|0)!=(f|0))}}}while(0);i=c[i+4>>2]|0}while((i|0)!=(s|0));if((c[t>>2]|0)==2)break c}}while(0);i=Yc(b,u,0)|0;if(i|0){v=i;return v|0}v=c[u+96>>2]|0;c[v+48>>2]=e;c[v+52>>2]=g;c[v+56>>2]=h;v=1;return v|0}case 2:break;case 3:{h=u+88|0;v=c[h>>2]|0;g=u+92|0;e=c[g>>2]|0;c[v+4>>2]=e;c[e>>2]=v;c[h>>2]=0;c[g>>2]=0;e=b+148|0;b=e+4|0;v=c[b>>2]|0;c[b>>2]=h;c[h>>2]=e;c[g>>2]=v;c[v>>2]=h;break b}default:ra()}while(0);i=c[u+96>>2]|0;j=i+52|0;if(c[j>>2]|0){v=-5;return v|0}c[i+48>>2]=e;c[j>>2]=g;c[i+56>>2]=h;v=1;return v|0}while(0);c[l>>2]=1;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=u+8|0;h=c[g+4>>2]|0;v=d+8|0;c[v>>2]=c[g>>2];c[v+4>>2]=h;v=0;return v|0}function Bc(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+16|0;u=x;w=e+4|0;v=c[w>>2]|0;r=v+24|0;if((c[r>>2]|0)!=4){d=-20;l=x;return d|0}s=v+56|0;j=c[v+60>>2]|0;a:do if((j|0)!=(s|0)){while(1){if(!(fk(j+13|0,f)|0))break;j=c[j+4>>2]|0;if((j|0)==(s|0))break a}if(j|0){d=-17;l=x;return d|0}}while(0);t=e+8|0;if(c[t>>2]|0)c[t>>2]=0;j=e+16|0;k=c[j>>2]|0;if(k|0){m=c[k+4>>2]|0;if(m|0)c[m>>2]=0;Uj(k);c[j>>2]=0}m=c[e>>2]|0;n=Le(104)|0;c[n+16>>2]=1;o=n+20|0;c[o>>2]=0;p=b+128|0;z=p;j=c[z+4>>2]|0;q=n+8|0;k=q;c[k>>2]=c[z>>2];c[k+4>>2]=j;k=p;k=xl(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[p>>2]=k;c[p+4>>2]=y;p=n+24|0;c[p>>2]=8;c[n+28>>2]=h&4095;c[n+32>>2]=m;c[n+36>>2]=i;Ga(n+64|0);h=b+92|0;i=c[h>>2]|0;c[h>>2]=n;c[n>>2]=b+88;c[n+4>>2]=i;c[i>>2]=n;i=b+96|0;h=i;h=xl(c[h>>2]|0,c[h+4>>2]|0,1,0)|0;c[i>>2]=h;c[i+4>>2]=y;Oa(u|0,0)|0;i=c[u>>2]|0;c[n+40>>2]=i;u=(c[u+4>>2]|0)*1e3|0;c[n+48>>2]=u;c[n+44>>2]=i;c[n+52>>2]=u;if((c[r>>2]|0)!=4)ja(15810,15828,456,15837);k=gk(f)|0;m=k+17|0;j=Le(m)|0;c[j+8>>2]=n;Ll(j+13|0,f|0,k+1|0)|0;k=v+64|0;z=c[k>>2]|0;m=z+m|0;f=xl(c[b+140>>2]|0,0,-1,-1)|0;h=y;u=xl(f|0,h|0,m|0,((m|0)<0)<<31>>31|0)|0;i=c[b+136>>2]|0;u=Il(u|0,y|0,i|0)|0;v=y;z=xl(f|0,h|0,z|0,((z|0)<0)<<31>>31|0)|0;i=Il(z|0,y|0,i|0)|0;z=b+112|0;h=z;i=yl(c[h>>2]|0,c[h+4>>2]|0,i|0,y|0)|0;v=xl(i|0,y|0,u|0,v|0)|0;c[z>>2]=v;c[z+4>>2]=y;c[k>>2]=m;k=c[s>>2]|0;c[k+4>>2]=j;c[j>>2]=k;c[j+4>>2]=s;c[s>>2]=j;j=c[w>>2]|0;k=j+20|0;m=c[k>>2]|0;if((m|0)<=0)ja(16501,15828,397,16520);c[k>>2]=m+-1;if((m|0)==1?(c[j+16>>2]|0)<1:0)Rc(b,j);c[o>>2]=(c[o>>2]|0)+1;c[w>>2]=n;c[t>>2]=1;c[e+12>>2]=g;j=c[p>>2]|0;do if((j|0)!=4)if((j|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=q;w=c[g+4>>2]|0;z=d+8|0;c[z>>2]=c[g>>2];c[z+4>>2]=w;z=0;l=x;return z|0}function Cc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;h=i+24|0;d=c[h>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;d=i+8|0;g=c[d+4>>2]|0;f=e+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=g;c[e+16>>2]=c[h>>2]<<12|c[i+28>>2];c[e+20>>2]=c[i+32>>2];c[e+24>>2]=c[i+36>>2];f=c[i+16>>2]|0;g=e+32|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;switch(c[h>>2]|0){case 2:case 6:{d=c[i+56>>2]<<8|c[i+60>>2];f=0;break}default:{d=0;f=0}}g=e+40|0;c[g>>2]=d;c[g+4>>2]=f;g=b+140|0;f=e+56|0;c[f>>2]=c[g>>2];c[f+4>>2]=0;switch(c[h>>2]|0){case 8:{d=c[i+60>>2]|0;f=0;break}case 10:{d=gk(c[i+56>>2]|0)|0;f=0;break}case 4:{f=c[i+64>>2]|0;d=f;f=((f|0)<0)<<31>>31;break}default:{d=0;f=0}}h=e+48|0;c[h>>2]=d;c[h+4>>2]=f;g=c[g>>2]|0;h=xl(d|0,f|0,-1,-1)|0;g=xl(h|0,y|0,g|0,0)|0;b=c[b+136>>2]|0;g=Il(g|0,y|0,b|0)|0;b=Jl(g|0,y|0,b+-9|0)|0;g=e+64|0;c[g>>2]=b;c[g+4>>2]=y;g=i+40|0;b=e+72|0;c[b>>2]=c[g>>2];c[b+4>>2]=0;b=i+48|0;c[e+80>>2]=c[b>>2];h=e+88|0;c[h>>2]=c[g>>2];c[h+4>>2]=0;c[e+96>>2]=c[b>>2];b=e+104|0;c[b>>2]=c[i+44>>2];c[b+4>>2]=0;c[e+112>>2]=c[i+52>>2];return 0}function Dc(a,b,d,e,f,g,h,i,j,k,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;var s=0;p=l;l=l+16|0;n=p;m=c[b+4>>2]|0;if(d&1|0)c[m+28>>2]=e;if(d&2|0)c[m+32>>2]=f;if(d&4|0)c[m+36>>2]=g;if(d&8|0?(s=Xc(a,m,h,i)|0,s|0):0){i=s;l=p;return i|0}do if(d&32|0)if(!(d&256)){Oa(n|0,0)|0;c[m+40>>2]=c[n>>2];c[m+48>>2]=(c[n+4>>2]|0)*1e3;break}else{c[m+40>>2]=o;c[m+48>>2]=q;break}while(0);if(!(d&64)){i=0;l=p;return i|0}Oa(n|0,0)|0;c[m+44>>2]=c[n>>2];c[m+52>>2]=(c[n+4>>2]|0)*1e3;i=0;l=p;return i|0}function Ec(a,b){a=a|0;b=b|0;var d=0;a=b+8|0;if(c[a>>2]|0)c[a>>2]=0;a=b+16|0;b=c[a>>2]|0;if(!b)return;d=c[b+4>>2]|0;if(d|0)c[d>>2]=0;Uj(b);c[a>>2]=0;return}function Fc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;return h|0}if((c[b+24>>2]|0)!=4){h=-71;return h|0}m=b+56|0;b=c[b+60>>2]|0;a:do if((e|0)==0&(f|0)==0){e=b;i=0;d=0}else{i=0;d=0;while(1){if((b|0)==(m|0)){b=0;break}i=xl(i|0,d|0,1,0)|0;d=y;b=c[b+4>>2]|0;if(!(d>>>0<f>>>0|(d|0)==(f|0)&i>>>0<e>>>0)){e=b;break a}}return b|0}while(0);if((e|0)==(m|0)){h=0;return h|0}b=0;while(1){f=e+13|0;j=gk(f)|0;k=b+24|0;l=k+j|0;if((l|0)>(h|0)){d=11;break}i=xl(i|0,d|0,1,0)|0;d=y;p=c[e+8>>2]|0;n=p+24|0;o=c[n>>2]|0;a[g+b>>0]=(o|0)==4?-128:(o|0)==10?2:0;o=g+(b+1)|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;a[o+3>>0]=0;o=g+(b+5)|0;p=p+8|0;q=c[p>>2]|0;p=c[p+4>>2]|0;a[o>>0]=q;a[o+1>>0]=q>>>8;a[o+2>>0]=q>>>16;a[o+3>>0]=q>>>24;a[o+4>>0]=p;r=Il(q|0,p|0,40)|0;a[o+5>>0]=r;r=Il(q|0,p|0,48)|0;a[o+6>>0]=r;p=Il(q|0,p|0,56)|0;a[o+7>>0]=p;o=g+(b+13)|0;a[o>>0]=i;a[o+1>>0]=i>>>8;a[o+2>>0]=i>>>16;a[o+3>>0]=i>>>24;a[o+4>>0]=d;p=Il(i|0,d|0,40)|0;a[o+5>>0]=p;p=Il(i|0,d|0,48)|0;a[o+6>>0]=p;p=Il(i|0,d|0,56)|0;a[o+7>>0]=p;a[g+(b+21)>>0]=c[n>>2];b=g+(b+22)|0;a[b>>0]=j;a[b+1>>0]=(j&65535)>>>8;Ll(g+k|0,f|0,j|0)|0;e=c[e+4>>2]|0;if((e|0)==(m|0)){b=l;d=11;break}else b=l}if((d|0)==11)return b|0;return 0}function Gc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=c[b+4>>2]|0;if(!(c[b+8>>2]|0)){g=-71;return g|0}if((c[h+24>>2]|0)!=8){g=-5;return g|0}if((c[b+12>>2]&3|0)==1){g=-5;return g|0}if(!(c[h+100>>2]|0)){i=c[h+60>>2]|0;a=yl(i|0,0,d|0,e|0)|0;b=y;if(!(0>e>>>0|0==(e|0)&i>>>0>d>>>0)){i=0;return i|0}i=((g|0)<0)<<31>>31;i=b>>>0<i>>>0|(b|0)==(i|0)&a>>>0<g>>>0?a:g;Ha(h+64|0,d|0,f|0,i|0);return i|0}else{a=c[b+16>>2]|0;if(!a){i=-5;return i|0}i=c[a+8>>2]|0;i=(i|0)<(g|0)?i:g;Ll(f|0,a+12|0,i|0)|0;return i|0}return 0}function Hc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=l;l=l+4480|0;k=L+4448|0;A=L+4472|0;F=L+3408|0;H=L+2384|0;B=L+1360|0;J=L+336|0;x=L+208|0;v=L+80|0;z=L+4432|0;I=L+4464|0;w=L+4460|0;G=L+64|0;q=L+4456|0;m=L+4452|0;j=L;s=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;l=L;return h|0}if((c[s+24>>2]|0)!=8){h=-5;l=L;return h|0}if(!(c[d+12>>2]&3)){h=-5;l=L;return h|0}if(!h){h=0;l=L;return h|0}if(!(c[s+100>>2]|0)){f=xl(h|0,((h|0)<0)<<31>>31|0,e|0,f|0)|0;i=y;j=s+60|0;if(i>>>0>0|((i|0)==0?f>>>0>(c[j>>2]|0)>>>0:0)?(p=Xc(b,s,f,i)|0,p|0):0){h=p;l=L;return h|0}Oa(A|0,0)|0;c[s+40>>2]=c[A>>2];c[s+48>>2]=(c[A+4>>2]|0)*1e3;f=s+56|0;do if((c[f>>2]|0)==3){K=s+88|0;H=c[K>>2]|0;J=s+92|0;I=c[J>>2]|0;c[H+4>>2]=I;c[I>>2]=H;c[K>>2]=0;c[J>>2]=0;J=b+160|0;K=J;K=yl(c[K>>2]|0,c[K+4>>2]|0,c[j>>2]|0,0)|0;b=y;c[J>>2]=K;c[J+4>>2]=b;if((b|0)>-1|(b|0)==-1&K>>>0>4294967295){c[f>>2]=0;break}else ja(15979,15828,1283,16445)}while(0);La(s+64|0,e|0,g|0,h|0);l=L;return h|0}e=Tj(h+1|0)|0;Ll(e|0,g|0,h|0)|0;a[e+h>>0]=0;c[m>>2]=e;a:do if((zd(j,64,m)|0)<0)K=104;else{do if(!(fk(j,16197)|0)){f=c[d>>2]|0;c[A>>2]=c[m>>2];p=d+16|0;b:do if((((((c[p>>2]|0)==0?(zd(J,1024,A)|0)>=0:0)?(zd(x,128,A)|0)>=0:0)?(zd(v,128,A)|0)>=0:0)?(zd(H,1024,A)|0)>=0:0)?(zd(F,1024,A)|0)>=0:0){do if(((zd(B,1024,A)|0)>=0?(r=gk(B)|0,(r&1|0)==0):0)?(t=r>>1,(r|0)<=33):0){if((Gd(G,B,t)|0)<0)break;if((r|0)<0){f=-5;break b}if((Cd(q,A)|0)<0){f=-5;break b}o=(t|0)==0;if((t|16|0)!=16){f=-5;break b}m=(a[x>>0]|0)==0?0:x;k=(a[v>>0]|0)==0?0:v;if($a[c[b+12>>2]&15](b,I,z,f,16809164,16809164)|0)ja(16201,15828,2526,16249);n=rc(b,c[I>>2]|0,F,w)|0;do if(!n){f=-2;i=b+4|0}else{Ya[c[b+76>>2]&63](b,n,c[w>>2]|0)|0;f=ab[c[b+28>>2]&3](b,z,n,c[w>>2]|0,514,384,0)|0;c:do if((f|0)<0)j=0;else{do if(a[H>>0]|0){j=sc(b,c[I>>2]|0,H)|0;if(!j){j=0;f=-2;break c}f=$a[c[b+24>>2]&15](b,z,j,0,0,0)|0;if((f|0)<0)break c;f=c[j+4>>2]|0;if((c[f+24>>2]|0)!=8)ja(16260,15828,2555,16249);if(!(c[f+56>>2]|0)){C=j;D=c[f+60>>2]|0;E=0;break}else ja(16260,15828,2555,16249)}else{C=0;D=0;E=0}while(0);i=Le(260)|0;c[i+4>>2]=c[I>>2];c[i+8>>2]=n;c[i+12>>2]=C;if(o)f=0;else{f=i+16|0;Re(G,128,f)|0}I=Le(76)|0;c[I>>2]=0;c[I+8>>2]=0;c[I+4>>2]=i;c[i>>2]=d;c[p>>2]=I;sd(b,n,J,m,k,C,D,E,2,i,f);f=0;break b}while(0);i=b+4|0;eb[c[i>>2]&15](b,n);if(!j)break;eb[c[i>>2]&15](b,j)}while(0);eb[c[i>>2]&15](b,c[I>>2]|0);break b}while(0);f=-5}else f=-5;while(0)}else{if(!(fk(j,16315)|0)){c[A>>2]=c[m>>2];d:do if((((zd(H,1024,A)|0)>=0?(zd(J,1024,A)|0)>=0:0)?(zd(x,128,A)|0)>=0:0)?(zd(v,128,A)|0)>=0:0){do if(((zd(B,1024,A)|0)>=0?(i=gk(B)|0,(i&1|0)==0):0)?(o=i>>1,(i|0)<=33):0){if((Gd(G,B,o)|0)<0)break;if((i|0)<0){f=-22;break d}j=(a[x>>0]|0)==0?0:x;i=(a[v>>0]|0)==0?0:v;switch(o|0){case 0:{f=0;break}case 16:{Re(G,128,F)|0;f=F;break}default:{f=-22;break d}}Uc(b,H,J,j,i,f);f=0;break d}while(0);f=-22}else f=-22;while(0);break}if(!(fk(j,16328)|0)){c[A>>2]=c[m>>2];e:do if((zd(B,1024,A)|0)>=0){if((c[b>>2]|0)!=8)ja(16343,15828,1665,16358);i=b+192|0;f=c[i+4>>2]|0;if((f|0)!=(i|0)){while(1){if(!(fk(c[f+12>>2]|0,B)|0))break;f=c[f+4>>2]|0;if((f|0)==(i|0)){f=0;break e}}if(f){Sc(f);f=0}else f=0}else f=0}else f=-22;while(0);break}if(!(fk(j,16380)|0)){c[A>>2]=c[m>>2];if((((zd(J,1024,A)|0)>=0?(zd(B,1024,A)|0)>=0:0)?(Ed(F,A)|0)>=0:0)?(Bd(H,A)|0)>=0:0){f=Vc(b,J)|0;if(!f)f=-2;else{I=F;J=H;f=Wc(b,f,B,c[I>>2]|0,c[I+4>>2]|0,c[J>>2]|0,c[J+4>>2]|0)|0}}else f=-22;break}if(!(fk(j,16388)|0)){c[A>>2]=c[m>>2];f:do if((zd(B,1024,A)|0)>=0){f=Vc(b,B)|0;if(f)if((c[f+24>>2]|0)==8){switch(c[f+56>>2]|0){case 3:case 0:break;default:{f=-5;break f}}I=Rk(B,47)|0;J=f+60|0;b=Tj(c[J>>2]|0)|0;Ha(f+64|0,0,b|0,c[J>>2]|0);Ma(((I|0)==0?B:I+1|0)|0,b|0,c[J>>2]|0);Uj(b);f=0}else f=-5;else f=-2}else f=-5;while(0);break}if(fk(j,16400)|0){if(fk(j,16407)|0){c[k>>2]=j;pl(16422,k)|0;K=104;break a}c[A>>2]=c[m>>2];if((zd(B,1024,A)|0)<0)f=-22;else{f=b+200|0;Uj(c[f>>2]|0);c[f>>2]=Tk(B)|0;f=0}break}c[A>>2]=c[m>>2];j=d+16|0;g:do if(!(c[j>>2]|0)){do if(((zd(B,1024,A)|0)>=0?(n=gk(B)|0,(n&1|0)==0):0)?(u=n>>1,(n|0)<=2049):0){if((Gd(J,B,u)|0)<0)break;if((n|0)<0){f=-22;break g}do if((zd(B,1024,A)|0)<0)f=-1;else{f=gk(B)|0;if(f&1|0){f=-1;break}i=f>>1;if((f|0)>257){f=-1;break}f=(Gd(x,B,i)|0)<0;f=f?-1:i}while(0);if((Cd(F,A)|0)<0){f=-22;break g}if((Cd(H,A)|0)<0){f=-22;break g}if(((c[H>>2]|0)+-1|0)>>>0>63){f=-22;break g}b=Le(76)|0;c[b>>2]=1;I=c[H>>2]|0;c[b+8>>2]=I;vd(J,u,x,f,c[F>>2]|0,I,b+12|0);c[j>>2]=b;f=0;break g}while(0);f=-22}else f=-5;while(0)}while(0);Uj(e);f=(f|0)==0?h:f}while(0);if((K|0)==104){Uj(e);f=-5}h=f;l=L;return h|0}function Ic(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[b+4>>2]|0;g=c[d+4>>2]|0;if((c[g+24>>2]|0)==4){e=-1;return e|0}d=h+24|0;a:do if((c[d>>2]|0)==4?(i=h+56|0,f=c[h+60>>2]|0,(f|0)!=(i|0)):0){b=f;while(1){if(!(fk(b+13|0,e)|0))break;b=c[b+4>>2]|0;if((b|0)==(i|0))break a}if(b|0){e=-17;return e|0}}while(0);i=g+16|0;c[i>>2]=(c[i>>2]|0)+1;if((c[d>>2]|0)!=4)ja(15810,15828,456,15837);j=gk(e)|0;l=j+17|0;i=Le(l)|0;c[i+8>>2]=g;Ll(i+13|0,e|0,j+1|0)|0;e=h+56|0;h=h+64|0;j=c[h>>2]|0;g=j+l|0;l=xl(c[a+140>>2]|0,0,-1,-1)|0;k=y;d=xl(l|0,k|0,g|0,((g|0)<0)<<31>>31|0)|0;b=c[a+136>>2]|0;d=Il(d|0,y|0,b|0)|0;f=y;j=xl(l|0,k|0,j|0,((j|0)<0)<<31>>31|0)|0;b=Il(j|0,y|0,b|0)|0;a=a+112|0;j=a;b=yl(c[j>>2]|0,c[j+4>>2]|0,b|0,y|0)|0;f=xl(b|0,y|0,d|0,f|0)|0;c[a>>2]=f;c[a+4>>2]=y;c[h>>2]=g;a=c[e>>2]|0;c[a+4>>2]=i;c[i>>2]=a;c[i+4>>2]=e;c[e>>2]=i;e=0;return e|0}function Jc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=l;l=l+16|0;k=o;m=c[e+4>>2]|0;n=m+24|0;a:do if((c[n>>2]|0)==4?(j=m+56|0,i=c[m+60>>2]|0,(i|0)!=(j|0)):0){while(1){if(!(fk(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(j|0))break a}if(i|0){d=-17;l=o;return d|0}}while(0);p=c[e>>2]|0;i=Le(104)|0;c[i+16>>2]=1;c[i+20>>2]=0;j=b+128|0;s=j;r=c[s+4>>2]|0;e=i+8|0;q=e;c[q>>2]=c[s>>2];c[q+4>>2]=r;q=j;q=xl(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[j>>2]=q;c[j+4>>2]=y;j=i+24|0;c[j>>2]=10;c[i+28>>2]=511;c[i+32>>2]=p;c[i+36>>2]=h;p=b+92|0;h=c[p>>2]|0;c[p>>2]=i;c[i>>2]=b+88;c[i+4>>2]=h;c[h>>2]=i;h=b+96|0;p=h;p=xl(c[p>>2]|0,c[p+4>>2]|0,1,0)|0;c[h>>2]=p;c[h+4>>2]=y;Oa(k|0,0)|0;h=c[k>>2]|0;c[i+40>>2]=h;k=(c[k+4>>2]|0)*1e3|0;c[i+48>>2]=k;c[i+44>>2]=h;c[i+52>>2]=k;c[i+56>>2]=Tk(g)|0;if((c[n>>2]|0)!=4)ja(15810,15828,456,15837);r=gk(f)|0;q=r+17|0;s=Le(q)|0;c[s+8>>2]=i;Ll(s+13|0,f|0,r+1|0)|0;i=m+56|0;r=m+64|0;p=c[r>>2]|0;q=p+q|0;g=xl(c[b+140>>2]|0,0,-1,-1)|0;h=y;m=xl(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;k=c[b+136>>2]|0;m=Il(m|0,y|0,k|0)|0;n=y;p=xl(g|0,h|0,p|0,((p|0)<0)<<31>>31|0)|0;k=Il(p|0,y|0,k|0)|0;p=b+112|0;h=p;k=yl(c[h>>2]|0,c[h+4>>2]|0,k|0,y|0)|0;n=xl(k|0,y|0,m|0,n|0)|0;c[p>>2]=n;c[p+4>>2]=y;c[r>>2]=q;r=c[i>>2]|0;c[r+4>>2]=s;c[s>>2]=r;c[s+4>>2]=i;c[i>>2]=s;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;q=e;r=c[q+4>>2]|0;s=d+8|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;s=0;l=o;return s|0}function Kc(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;s=l;l=l+16|0;q=s;n=c[e+4>>2]|0;r=g>>>12;o=r&15;r=r&255;switch(r&15){case 1:case 2:case 6:case 8:case 12:break;default:{d=-22;l=s;return d|0}}p=n+24|0;a:do if((c[p>>2]|0)==4?(m=n+56|0,k=c[n+60>>2]|0,(k|0)!=(m|0)):0){while(1){if(!(fk(k+13|0,f)|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break a}if(k|0){d=-17;l=s;return d|0}}while(0);t=c[e>>2]|0;k=Le(104)|0;c[k+16>>2]=1;c[k+20>>2]=0;m=b+128|0;w=m;v=c[w+4>>2]|0;e=k+8|0;u=e;c[u>>2]=c[w>>2];c[u+4>>2]=v;u=m;u=xl(c[u>>2]|0,c[u+4>>2]|0,1,0)|0;c[m>>2]=u;c[m+4>>2]=y;m=k+24|0;c[m>>2]=o;c[k+28>>2]=g&4095;c[k+32>>2]=t;c[k+36>>2]=j;switch(r&15){case 8:{Ga(k+64|0);break}case 4:{w=k+56|0;c[w>>2]=w;c[k+60>>2]=w;break}default:{}}w=b+92|0;v=c[w>>2]|0;c[w>>2]=k;c[k>>2]=b+88;c[k+4>>2]=v;c[v>>2]=k;v=b+96|0;w=v;w=xl(c[w>>2]|0,c[w+4>>2]|0,1,0)|0;c[v>>2]=w;c[v+4>>2]=y;Oa(q|0,0)|0;v=c[q>>2]|0;c[k+40>>2]=v;w=(c[q+4>>2]|0)*1e3|0;c[k+48>>2]=w;c[k+44>>2]=v;c[k+52>>2]=w;if((o|4|0)==6){c[k+56>>2]=h;c[k+60>>2]=i}if((c[p>>2]|0)!=4)ja(15810,15828,456,15837);v=gk(f)|0;u=v+17|0;w=Le(u)|0;c[w+8>>2]=k;Ll(w+13|0,f|0,v+1|0)|0;k=n+56|0;v=n+64|0;t=c[v>>2]|0;u=t+u|0;h=xl(c[b+140>>2]|0,0,-1,-1)|0;i=y;q=xl(h|0,i|0,u|0,((u|0)<0)<<31>>31|0)|0;j=c[b+136>>2]|0;q=Il(q|0,y|0,j|0)|0;r=y;t=xl(h|0,i|0,t|0,((t|0)<0)<<31>>31|0)|0;j=Il(t|0,y|0,j|0)|0;t=b+112|0;i=t;j=yl(c[i>>2]|0,c[i+4>>2]|0,j|0,y|0)|0;r=xl(j|0,y|0,q|0,r|0)|0;c[t>>2]=r;c[t+4>>2]=y;c[v>>2]=u;v=c[k>>2]|0;c[v+4>>2]=w;c[w>>2]=v;c[w+4>>2]=k;c[k>>2]=w;k=c[m>>2]|0;do if((k|0)!=4)if((k|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;u=e;v=c[u+4>>2]|0;w=d+8|0;c[w>>2]=c[u>>2];c[w+4>>2]=v;w=0;l=s;return w|0}function Lc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[f+4>>2]|0;if((c[b+24>>2]|0)!=10){e=-5;return e|0}f=c[b+56>>2]|0;b=gk(f)|0;e=e+-1|0;e=(b|0)<(e|0)?b:e;Ll(d|0,f|0,e|0)|0;a[d+e>>0]=0;e=0;return e|0}function Mc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=b+4|0;b=c[l>>2]|0;if((c[b+24>>2]|0)!=4){a=-2;return a|0}h=b+56|0;b=c[b+60>>2]|0;if((b|0)==(h|0)){a=-2;return a|0}k=b;while(1){if(!(fk(k+13|0,d)|0))break;b=c[k+4>>2]|0;if((b|0)==(h|0)){b=-2;i=28;break}else k=b}if((i|0)==28)return b|0;if(!k){a=-2;return a|0}e=e+4|0;h=c[e>>2]|0;d=h+24|0;a:do if((c[d>>2]|0)==4?(j=h+56|0,g=c[h+60>>2]|0,(g|0)!=(j|0)):0){while(1){if(!(fk(g+13|0,f)|0))break;b=c[g+4>>2]|0;if((b|0)==(j|0)){e=0;break a}else g=b}if(g){b=c[g+8>>2]|0;if((c[b+24>>2]|0)==4){a=-17;return a|0}else{Qc(a,h,g);h=c[e>>2]|0;e=b;d=h+24|0;break}}else e=0}else e=0;while(0);b=k+8|0;g=c[b>>2]|0;j=g+16|0;c[j>>2]=(c[j>>2]|0)+1;if((c[d>>2]|0)!=4)ja(15810,15828,456,15837);i=gk(f)|0;p=i+17|0;j=Le(p)|0;c[j+8>>2]=g;Ll(j+13|0,f|0,i+1|0)|0;g=h+56|0;h=h+64|0;i=c[h>>2]|0;f=i+p|0;p=xl(c[a+140>>2]|0,0,-1,-1)|0;o=y;m=xl(p|0,o|0,f|0,((f|0)<0)<<31>>31|0)|0;n=c[a+136>>2]|0;m=Il(m|0,y|0,n|0)|0;d=y;i=xl(p|0,o|0,i|0,((i|0)<0)<<31>>31|0)|0;n=Il(i|0,y|0,n|0)|0;i=a+112|0;o=i;n=yl(c[o>>2]|0,c[o+4>>2]|0,n|0,y|0)|0;d=xl(n|0,y|0,m|0,d|0)|0;c[i>>2]=d;c[i+4>>2]=y;c[h>>2]=f;h=c[g>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[j+4>>2]=g;c[g>>2]=j;h=c[b>>2]|0;Qc(a,c[l>>2]|0,k);b=h+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(15854,15828,389,15871);c[b>>2]=g+-1;if((g|0)==1?(c[h+20>>2]|0)<1:0)Rc(a,h);if(!e){p=0;return p|0}b=e+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(15854,15828,389,15871);c[b>>2]=g+-1;if((g|0)!=1){p=0;return p|0}if((c[e+20>>2]|0)>=1){p=0;return p|0}Rc(a,e);p=0;return p|0}function Nc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!(fk(d,20119)|0)){o=-2;return o|0}if(!(fk(d,15851)|0)){o=-2;return o|0}m=b+4|0;g=c[m>>2]|0;if((c[g+24>>2]|0)!=4){o=-2;return o|0}f=g+56|0;b=c[g+60>>2]|0;if((b|0)==(f|0)){o=-2;return o|0}while(1){if(!(fk(b+13|0,d)|0))break;e=c[b+4>>2]|0;if((e|0)==(f|0)){k=-2;l=30;break}else b=e}if((l|0)==30)return k|0;if(!b){o=-2;return o|0}i=b+8|0;j=c[i>>2]|0;do if((c[j+24>>2]|0)==4){h=j+56|0;e=c[j+60>>2]|0;a:do if((e|0)!=(h|0)){f=e;do{d=f+13|0;if(fk(d,20119)|0?fk(d,15851)|0:0){k=-39;l=30;break}f=c[f+4>>2]|0}while((f|0)!=(h|0));if((l|0)==30)return k|0;while(1){d=e;e=c[e+4>>2]|0;f=c[d+8>>2]|0;Qc(a,j,d);d=f+16|0;g=c[d>>2]|0;if((g|0)<=0)break;c[d>>2]=g+-1;if((g|0)==1?(c[f+20>>2]|0)<1:0)Rc(a,f);if((e|0)==(h|0))break a}ja(15854,15828,389,15871)}while(0);if(!(c[j+64>>2]|0)){n=c[m>>2]|0;o=c[i>>2]|0;break}else ja(15884,15828,576,15903)}else{n=g;o=j}while(0);Qc(a,n,b);b=o+16|0;e=c[b>>2]|0;if((e|0)<=0)ja(15854,15828,389,15871);c[b>>2]=e+-1;if((e|0)!=1){o=0;return o|0}if((c[o+20>>2]|0)>=1){o=0;return o|0}Rc(a,o);o=0;return o|0}function Oc(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Pc(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Qc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=gk(d+13|0)|0;e=b+64|0;i=c[e>>2]|0;b=-17-k+i|0;k=xl(c[a+140>>2]|0,0,-1,-1)|0;j=y;f=xl(k|0,j|0,b|0,((b|0)<0)<<31>>31|0)|0;h=c[a+136>>2]|0;f=Il(f|0,y|0,h|0)|0;g=y;i=xl(k|0,j|0,i|0,((i|0)<0)<<31>>31|0)|0;h=Il(i|0,y|0,h|0)|0;a=a+112|0;i=a;h=yl(c[i>>2]|0,c[i+4>>2]|0,h|0,y|0)|0;g=xl(h|0,y|0,f|0,g|0)|0;f=a;c[f>>2]=g;c[f+4>>2]=y;c[e>>2]=b;if((b|0)<=-1)ja(16148,15828,554,16167);k=a;j=c[k+4>>2]|0;if((j|0)>-1|(j|0)==-1&(c[k>>2]|0)>>>0>4294967295){j=c[d>>2]|0;k=c[d+4>>2]|0;c[j+4>>2]=k;c[k>>2]=j;Uj(d);return}else ja(15960,15828,555,16167)}function Rc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c[b+16>>2]|0)ja(15913,15828,334,15930);if(c[b+20>>2]|0)ja(15941,15828,335,15930);a:do switch(c[b+24>>2]|0){case 8:{d=b+60|0;k=c[a+140>>2]|0;k=Il(xl(xl(c[d>>2]|0,0,-1,-1)|0,y|0,k|0,0)|0,y|0,c[a+136>>2]|0)|0;h=a+112|0;i=h;k=yl(c[i>>2]|0,c[i+4>>2]|0,k|0,y|0)|0;i=y;c[h>>2]=k;c[h+4>>2]=i;if(!((i|0)>-1|(i|0)==-1&k>>>0>4294967295))ja(15960,15828,339,15930);Ia(b+64|0);switch(c[b+56>>2]|0){case 0:break a;case 3:{k=b+88|0;h=c[k>>2]|0;i=b+92|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[k>>2]=0;c[i>>2]=0;i=a+160|0;k=i;k=yl(c[k>>2]|0,c[k+4>>2]|0,c[d>>2]|0,0)|0;j=y;c[i>>2]=k;c[i+4>>2]=j;if((j|0)>-1|(j|0)==-1&k>>>0>4294967295){Sc(c[b+72>>2]|0);break a}else ja(15979,15828,348,15930);break}case 2:{k=c[b+96>>2]|0;d=c[k+8>>2]|0;if(d|0)md(d);i=k+4|0;d=c[i>>2]|0;do if((d|0)==1){h=k+40|0;d=c[k+44>>2]|0;if((d|0)!=(h|0)){while(1){e=d;d=c[d+4>>2]|0;e=c[e+-12>>2]|0;f=e+56|0;if((c[f>>2]|0)!=2){e=18;break}g=c[e+96>>2]|0;c[f>>2]=1;Ia(e+64|0);e=c[g+52>>2]|0;if(e|0)gb[e&63](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){e=g+24|0;m=c[e>>2]|0;f=g+28|0;l=c[f>>2]|0;c[m+4>>2]=l;c[l>>2]=m;c[e>>2]=0;c[f>>2]=0}e=c[g+16>>2]|0;if(e|0)rd(e);Uj(g);if((d|0)==(h|0)){e=26;break}}if((e|0)==18)ja(16005,15828,754,16041);else if((e|0)==26){j=c[i>>2]|0;e=27;break}}}else{j=d;e=27}while(0);if((e|0)==27?(j|0)==2:0){l=k+24|0;i=c[l>>2]|0;m=k+28|0;j=c[m>>2]|0;c[i+4>>2]=j;c[j>>2]=i;c[l>>2]=0;c[m>>2]=0}d=c[k+16>>2]|0;if(d|0)rd(d);Uj(k);Sc(c[b+72>>2]|0);break a}case 1:{Sc(c[b+72>>2]|0);break a}default:ra()}break}case 10:{Uj(c[b+56>>2]|0);break}case 4:{if((c[b+60>>2]|0)!=(b+56|0))ja(16059,15828,376,15930);break}default:{}}while(0);m=c[b>>2]|0;l=c[b+4>>2]|0;c[m+4>>2]=l;c[l>>2]=m;Uj(b);b=a+96|0;l=b;m=c[l>>2]|0;l=c[l+4>>2]|0;a=xl(m|0,l|0,-1,-1)|0;c[b>>2]=a;c[b+4>>2]=y;if((l|0)>0|(l|0)==0&m>>>0>0)return;else ja(16089,15828,384,15930)}function Sc(a){a=a|0;var b=0,d=0;b=a+8|0;d=c[b>>2]|0;if((d|0)<=0)ja(16110,15828,1609,16129);d=d+-1|0;c[b>>2]=d;if(d|0)return;Uj(c[a+12>>2]|0);Uj(c[a+16>>2]|0);Uj(c[a+20>>2]|0);Uj(c[a+24>>2]|0);b=c[a>>2]|0;d=c[a+4>>2]|0;c[b+4>>2]=d;c[d>>2]=b;Uj(a);return}function Tc(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;d=c[g+8>>2]|0;if(d|0)eb[c[b+4>>2]&15](b,d);h=c[g+12>>2]|0;d=b+4|0;if(h|0)eb[c[d>>2]&15](b,h);eb[c[d>>2]&15](b,c[g+4>>2]|0);d=c[g>>2]|0;if(!d){Uj(g);return}b=c[d+16>>2]|0;h=(f|0)<0;e=h?e:0;a[b+12>>0]=e;a[b+13>>0]=e>>>8;a[b+14>>0]=e>>>16;a[b+15>>0]=e>>>24;c[b+8>>2]=4;c[b+4>>2]=0;Uj(g);return}function Uc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((c[a>>2]|0)!=8)ja(16343,15828,1629,16481);h=a+192|0;a=c[h+4>>2]|0;a:do if((a|0)!=(h|0)){while(1){if(!(fk(c[a+12>>2]|0,b)|0))break;a=c[a+4>>2]|0;if((a|0)==(h|0)){i=8;break a}}if(a){Uj(c[a+16>>2]|0);Uj(c[a+20>>2]|0);Uj(c[a+24>>2]|0);h=a}else i=8}else i=8;while(0);if((i|0)==8){i=Le(276)|0;c[i+12>>2]=Tk(b)|0;c[i+8>>2]=1;b=c[h>>2]|0;c[b+4>>2]=i;c[i>>2]=b;c[i+4>>2]=h;c[h>>2]=i;h=i}c[h+16>>2]=Tk(d)|0;if(!e)a=0;else a=Tk(e)|0;c[h+20>>2]=a;if(!f)a=0;else a=Tk(f)|0;c[h+24>>2]=a;a=h+28|0;if(!g){c[a>>2]=0;return}else{c[a>>2]=1;Ll(h+32|0,g|0,244)|0;return}}function Vc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+1024|0;g=h;if(!b){g=0;l=h;return g|0}b=c[b+144>>2]|0;d=(a[d>>0]|0)==47?d+1|0:d;a:do if(a[d>>0]|0)while(1){e=kk(d,47)|0;if(!e){f=gk(d)|0;e=0}else{f=e-d|0;e=e+1|0}if(f>>>0>1023){b=0;break a}Ll(g|0,d|0,f|0)|0;a[g+f>>0]=0;if((c[b+24>>2]|0)!=4){b=0;break a}d=b+56|0;b=c[b+60>>2]|0;if((b|0)==(d|0)){b=0;break a}while(1){if(!(fk(b+13|0,g)|0))break;b=c[b+4>>2]|0;if((b|0)==(d|0)){b=0;break a}}if(!b){b=0;break a}b=c[b+8>>2]|0;if(!e)break;else d=e}while(0);g=b;l=h;return g|0}function Wc(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if((c[a>>2]|0)!=8)ja(16343,15828,1687,16466);k=a+192|0;i=c[k+4>>2]|0;if((i|0)==(k|0)){l=-2;return l|0}j=i;while(1){if(!(fk(c[j+12>>2]|0,d)|0))break;i=c[j+4>>2]|0;if((i|0)==(k|0)){i=-2;l=13;break}else j=i}if((l|0)==13)return i|0;if(!j){l=-2;return l|0}if((c[b+24>>2]|0)!=8){l=-5;return l|0}i=b+56|0;if(c[i>>2]|0){l=-5;return l|0}if(c[b+68>>2]|0){l=-5;return l|0}if((g|0)==0&(h|0)==0){l=0;return l|0}c[i>>2]=1;c[b+72>>2]=j;l=j+8|0;c[l>>2]=(c[l>>2]|0)+1;c[b+60>>2]=g;l=c[a+140>>2]|0;g=xl(g|0,h|0,-1,-1)|0;g=xl(g|0,y|0,l|0,0)|0;g=Il(g|0,y|0,c[a+136>>2]|0)|0;l=a+112|0;h=l;h=xl(g|0,y|0,c[h>>2]|0,c[h+4>>2]|0)|0;c[l>>2]=h;c[l+4>>2]=y;l=b+80|0;c[l>>2]=e;c[l+4>>2]=f;l=0;return l|0}function Xc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((c[b+24>>2]|0)!=8){l=-22;return l|0}if(e>>>0>0|(e|0)==0&d>>>0>4294967295){l=-28;return l|0}j=b+60|0;f=c[j>>2]|0;h=d-f|0;if(!h){l=0;return l|0}m=xl(c[a+140>>2]|0,0,-1,-1)|0;g=y;i=xl(m|0,g|0,d|0,e|0)|0;k=c[a+136>>2]|0;i=Il(i|0,y|0,k|0)|0;l=y;g=xl(m|0,g|0,f|0,0)|0;k=Il(g|0,y|0,k|0)|0;k=yl(i|0,l|0,k|0,y|0)|0;l=b+56|0;a:do switch(c[l>>2]|0){case 1:{if((d|0)==0&(e|0)==0)c[l>>2]=0;break}case 0:case 3:{if((h|0)<=0){f=(c[b+68>>2]<<2>>>0)/5|0;if(!(0<e>>>0|0==(e|0)&f>>>0<d>>>0)?(Ja(b+64|0,f|0)|0)<0:0){m=-28;return m|0}}else{i=a+112|0;i=xl(c[i>>2]|0,c[i+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;n=y;m=a+120|0;g=c[m+4>>2]|0;if(n>>>0>g>>>0|((n|0)==(g|0)?i>>>0>(c[m>>2]|0)>>>0:0)){n=-28;return n|0}i=b+64|0;g=c[b+68>>2]|0;do if(0<e>>>0|0==(e|0)&g>>>0<d>>>0){n=(g*5|0)>>>2;if((Ja(i|0,(0<e>>>0|0==(e|0)&n>>>0<d>>>0?d:n)|0)|0)<0){n=-28;return n|0}else{f=c[j>>2]|0;break}}while(0);Ka(i|0,f|0,0,h|0)}if((c[l>>2]|0)==3){n=b+88|0;i=c[n>>2]|0;b=b+92|0;m=c[b>>2]|0;c[i+4>>2]=m;c[m>>2]=i;c[n>>2]=0;c[b>>2]=0;b=a+160|0;n=b;n=yl(c[n>>2]|0,c[n+4>>2]|0,c[j>>2]|0,0)|0;m=y;c[b>>2]=n;c[b+4>>2]=m;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){c[l>>2]=0;break a}else ja(15979,15828,1240,16454)}break}case 2:{n=-5;return n|0}default:ra()}while(0);l=a+112|0;n=l;n=xl(c[n>>2]|0,c[n+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;m=y;c[l>>2]=n;c[l+4>>2]=m;if(!((m|0)>-1|(m|0)==-1&n>>>0>4294967295))ja(15960,15828,1248,16454);c[j>>2]=d;n=0;return n|0}function Yc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;p=q;j=b+56|0;if((c[j>>2]|0)!=1)ja(16535,15828,848,16572);k=b+60|0;m=c[k>>2]|0;o=a+160|0;r=o;r=xl(c[r>>2]|0,c[r+4>>2]|0,m|0,0)|0;t=y;h=a+168|0;g=h;s=c[g+4>>2]|0;do if((t|0)>(s|0)|((t|0)==(s|0)?r>>>0>(c[g>>2]|0)>>>0:0)?(i=a+148|0,e=c[i>>2]|0,(e|0)!=(i|0)):0){f=e+-32|0;if((c[f>>2]|0)!=3)ja(16585,15828,684,16620);g=e;while(1){e=g;g=c[g>>2]|0;if(!(c[e+-68>>2]|0)){Ia(e+-24|0);c[f>>2]=1;s=c[e>>2]|0;f=e+4|0;t=c[f>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[e>>2]=0;c[f>>2]=0;f=o;e=yl(c[f>>2]|0,c[f+4>>2]|0,c[e+-28>>2]|0,0)|0;f=y;t=o;c[t>>2]=e;c[t+4>>2]=f;if(!((f|0)>-1|(f|0)==-1&e>>>0>4294967295)){f=10;break}s=xl(e|0,f|0,m|0,0)|0;f=y;t=h;r=c[t+4>>2]|0;if((g|0)==(i|0)|((f|0)<(r|0)|((f|0)==(r|0)?s>>>0<=(c[t>>2]|0)>>>0:0))){f=14;break}}else if((g|0)==(i|0)){f=14;break}f=g+-32|0;if((c[f>>2]|0)!=3){f=7;break}}if((f|0)==7)ja(16585,15828,684,16620);else if((f|0)==10)ja(15979,15828,697,16620);else if((f|0)==14){n=c[k>>2]|0;break}}else n=m;while(0);if((Ja(b+64|0,n|0)|0)<0){t=-5;l=q;return t|0}c[j>>2]=2;g=Le(64)|0;c[g+20>>2]=0;c[g>>2]=a;c[g+12>>2]=b;c[g+4>>2]=d;switch(d|0){case 2:break;case 1:{f=g+40|0;c[f>>2]=f;c[g+44>>2]=f;f=18;break}default:f=18}if((f|0)==18){f=b+80|0;Fd(p,c[f>>2]|0,c[f+4>>2]|0)|0;f=c[b+72>>2]|0;e=wd(c[f+16>>2]|0,p)|0;if(c[f+28>>2]|0)c[g+16>>2]=od(f+32|0,14,g)|0;c[g+8>>2]=nd(e,c[f+20>>2]|0,c[f+24>>2]|0,g,5,0)|0}c[b+96>>2]=g;t=0;l=q;return t|0}function Zc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a+12>>2]|0;a=a+20|0;e=c[a>>2]|0;g=(c[f+60>>2]|0)-e|0;d=g>>>0>d>>>0?d:g;La(f+64|0,e|0,b|0,d|0);c[a>>2]=d+(c[a>>2]|0);return 0}function _c(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1024|0;n=q;j=a+12|0;p=c[j>>2]|0;do if((b|0)>=0){f=a+16|0;g=c[f>>2]|0;if(!g){g=p+60|0;m=a+20|0;r=c[m>>2]|0;f=(c[g>>2]|0)-r|0;f=f>>>0>e>>>0?e:f;La(p+64|0,r|0,d|0,f|0);f=f+(c[m>>2]|0)|0;c[m>>2]=f;if(b){l=q;return}}else{if((pd(g,d,e)|0)<0)break;if(b|0){l=q;return}if((qd(c[f>>2]|0)|0)<0)break;g=p+60|0;f=c[a+20>>2]|0}if((f|0)==(c[g>>2]|0)){if((c[a+4>>2]|0)==1?(o=a+40|0,i=c[a+44>>2]|0,(i|0)!=(o|0)):0){m=(c[j>>2]|0)+64|0;do{f=i;i=c[i+4>>2]|0;j=c[f+-12>>2]|0;k=j+60|0;g=c[k>>2]|0;if(g|0){b=f+8|0;a=j+64|0;f=0;h=0;d=0;e=c[b>>2]|0;b=c[b+4>>2]|0;while(1){f=yl(g|0,f|0,h|0,d|0)|0;r=y;s=r>>>0<0|(r|0)==0&f>>>0<1024;f=s?f:1024;r=s?r:0;Ha(m|0,e|0,n|0,f|0);La(a|0,h|0,n|0,f|0);e=xl(f|0,r|0,e|0,b|0)|0;b=y;h=xl(f|0,r|0,h|0,d|0)|0;d=y;g=c[k>>2]|0;if(!(d>>>0<0|(d|0)==0&h>>>0<g>>>0))break;else f=0}}$c(j)}while((i|0)!=(o|0))}$c(p);l=q;return}}while(0);a:do if((c[a+4>>2]|0)==1?(k=a+40|0,h=c[a+44>>2]|0,(h|0)!=(k|0)):0){while(1){f=h;h=c[h+4>>2]|0;f=c[f+-12>>2]|0;g=f+56|0;if((c[g>>2]|0)!=2)break;d=c[f+96>>2]|0;c[g>>2]=1;Ia(f+64|0);f=c[d+52>>2]|0;if(f|0)gb[f&63](c[d>>2]|0,0,-5,c[d+56>>2]|0);if((c[d+4>>2]|0)==2){r=d+24|0;n=c[r>>2]|0;s=d+28|0;o=c[s>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[r>>2]=0;c[s>>2]=0}f=c[d+16>>2]|0;if(f|0)rd(f);Uj(d);if((h|0)==(k|0))break a}ja(16005,15828,754,16041)}while(0);f=p+56|0;if((c[f>>2]|0)!=2)ja(16005,15828,754,16041);g=c[p+96>>2]|0;c[f>>2]=1;Ia(p+64|0);f=c[g+52>>2]|0;if(f|0)gb[f&63](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){r=g+24|0;o=c[r>>2]|0;s=g+28|0;p=c[s>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[r>>2]=0;c[s>>2]=0}f=c[g+16>>2]|0;if(f|0)rd(f);Uj(g);l=q;return}function $c(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;e=g;d=b+56|0;if((c[d>>2]|0)!=2)ja(16005,15828,735,16634);f=c[b+96>>2]|0;h=c[f>>2]|0;c[d>>2]=3;i=b+88|0;j=h+152|0;d=c[j>>2]|0;c[j>>2]=i;c[i>>2]=h+148;c[b+92>>2]=d;c[d>>2]=i;d=h+160|0;h=d;h=xl(c[h>>2]|0,c[h+4>>2]|0,c[b+60>>2]|0,0)|0;c[d>>2]=h;c[d+4>>2]=y;d=f+52|0;if(c[d>>2]|0){c[(c[f+48>>2]|0)+8>>2]=1;h=c[b+24>>2]|0;a[e>>0]=(h|0)==4?-128:(h|0)==10?2:0;c[e+4>>2]=0;h=b+8|0;i=c[h+4>>2]|0;j=e+8|0;c[j>>2]=c[h>>2];c[j+4>>2]=i;gb[c[d>>2]&63](c[f>>2]|0,e,0,c[f+56>>2]|0)}if((c[f+4>>2]|0)==2){i=f+24|0;e=c[i>>2]|0;j=f+28|0;h=c[j>>2]|0;c[e+4>>2]=h;c[h>>2]=e;c[i>>2]=0;c[j>>2]=0}d=c[f+16>>2]|0;if(!d){Uj(f);l=g;return}rd(d);Uj(f);l=g;return}function ad(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;i=o+144|0;m=o+128|0;g=o;h=o+152|0;n=tc()|0;if(!(c[4202143]|0))c[4202143]=n;c[n+200>>2]=Tk(16698)|0;e=n+12|0;if($a[c[e>>2]&15](n,m,g,0,16809164,16809164)|0)ja(16703,15828,2070,16749);j=n+28|0;if(ab[c[j>>2]&3](n,g,c[m>>2]|0,16763,514,438,0)|0)ja(16770,15828,2072,16749);k=c[m>>2]|0;c[(c[k+4>>2]|0)+100>>2]=1;eb[c[n+4>>2]&15](n,k);if(!a){l=o;return n|0}k=Le(28)|0;c[k>>2]=n;f=k+4|0;c[f>>2]=Tk(a)|0;c[k+8>>2]=b;c[k+12>>2]=d;a=k+16|0;if($a[c[e>>2]&15](n,a,m,0,16809164,16809164)|0)ja(16849,15828,2145,16898);Oa(h|0,0)|0;b=c[h>>2]|0;b=Dl(b|0,((b|0)<0)<<31>>31|0,1e6,0)|0;h=c[h+4>>2]|0;h=xl(b|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;nk(g,128,16914,i)|0;b=xd(c[f>>2]|0,g)|0;a=qc(n,c[a>>2]|0)|0;if(ab[c[j>>2]&3](n,m,a,16932,514,420,0)|0)ja(16938,15828,2154,16898);sd(n,a,b,0,0,0,0,0,3,k,0);Uj(b);l=o;return n|0}function bd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;h=n+64|0;j=n;k=n+56|0;m=n+40|0;i=n+32|0;if((f|0)<0){c[h>>2]=0-e;cd(17014,h)}f=Tj(e+1|0)|0;$a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;eb[c[b+4>>2]&15](b,d);d=g+16|0;Ya[c[b+76>>2]&63](b,c[d>>2]|0,16932)|0;if((Ld(f)|0)!=1)cd(17057,n+72|0);if((Kd(k,f,17078)|0)<0)cd(17085,n+80|0);e=(Jd(i,f,17105)|0)==0;h=i;f=c[h>>2]|0;h=c[h+4>>2]|0;do if(e&(h>>>0>0|(h|0)==0&f>>>0>1048575))if((c[b>>2]|0)==8){e=c[b+140>>2]|0;i=xl(f|0,h|0,-1,-1)|0;e=xl(i|0,y|0,e|0,0)|0;e=Il(e|0,y|0,c[b+136>>2]|0)|0;i=b+120|0;c[i>>2]=e;c[i+4>>2]=y;break}else ja(16343,15828,1677,17115);while(0);h=xd(c[g+4>>2]|0,17138)|0;Uc(b,17144,h,0,0,0);f=qc(b,c[d>>2]|0)|0;if(!(ab[c[b+28>>2]&3](b,m,f,17146,514,420,0)|0)){m=k;Fd(j,c[m>>2]|0,c[m+4>>2]|0)|0;m=xd(h,j)|0;sd(b,f,m,0,0,0,0,0,4,g,0);Uj(h);Uj(m);l=n;return}else ja(17160,15828,2196,17252)}function cd(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;b=c[3662]|0;ll(17579,7,1,b)|0;pk(b,a,d)|0;ql(10,b)|0;Da(1)}function dd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;h=k;i=k+12|0;if((f|0)<0){c[h>>2]=0-e;cd(17264,h)}f=Tj(e+1|0)|0;$a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;eb[c[b+4>>2]&15](b,d);Ya[c[b+76>>2]&63](b,c[g+16>>2]|0,17146)|0;if((Ld(f)|0)==1?(e=Hd(f)|0,c[i>>2]=e,e|0):0)if(!(ed(b,i,c[b+144>>2]|0,16809164)|0)){c[g+24>>2]=0;fd(b,0,0,g);l=k;return}else cd(17305,j);cd(17305,j)}function ed(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;K=l;l=l+2080|0;D=K+2056|0;E=K+1024|0;F=K;J=K+2076|0;G=K+2072|0;H=K+2068|0;o=K+2064|0;p=K+2048|0;c[J>>2]=c[d>>2];q=b+128|0;r=b+88|0;s=b+92|0;t=b+96|0;u=D+4|0;v=b+140|0;w=b+136|0;x=b+112|0;z=e+16|0;A=e+24|0;B=e+56|0;C=e+64|0;a:while(1){g=c[J>>2]|0;b:do switch(a[g>>0]|0){case 0:{h=44;break a}case 46:{h=5;break a}case 35:{yd(J);break}default:{if((Ad(G,J,8)|0)<0){h=7;break a}m=c[G>>2]|0;n=m>>>12;c[G>>2]=m&4095;if((Cd(H,J)|0)<0){h=9;break a}if((Cd(o,J)|0)<0){h=11;break a}h=c[G>>2]|0;k=c[H>>2]|0;m=c[o>>2]|0;i=Le(104)|0;g=i+16|0;c[g>>2]=1;c[i+20>>2]=0;M=q;j=c[M+4>>2]|0;L=i+8|0;c[L>>2]=c[M>>2];c[L+4>>2]=j;L=q;j=q;c[j>>2]=xl(c[L>>2]|0,c[L+4>>2]|0,1,0)|0;c[j+4>>2]=y;j=i+24|0;c[j>>2]=n;c[i+28>>2]=h&4095;c[i+32>>2]=k;c[i+36>>2]=m;switch(n&1048575|0){case 8:{Ga(i+64|0);break}case 4:{M=i+56|0;c[M>>2]=M;c[i+60>>2]=M;break}default:{}}k=c[s>>2]|0;c[s>>2]=i;c[i>>2]=r;c[i+4>>2]=k;c[k>>2]=i;k=t;L=t;c[L>>2]=xl(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[L+4>>2]=y;Oa(D|0,0)|0;L=c[D>>2]|0;k=i+40|0;c[k>>2]=L;M=(c[u>>2]|0)*1e3|0;m=i+48|0;c[m>>2]=M;c[i+44>>2]=L;c[i+52>>2]=M;M=p;c[M>>2]=0;c[M+4>>2]=0;switch(n&1048575|0){case 6:case 2:{if((Cd(i+56|0,J)|0)<0){h=17;break a}if((Cd(i+60|0,J)|0)<0){h=19;break a}break}case 8:{if((Bd(p,J)|0)<0){h=21;break a}break}case 4:{c[g>>2]=(c[g>>2]|0)+1;if((c[j>>2]|0)!=4){h=23;break a}M=Le(18)|0;c[M+8>>2]=i;g=M+13|0;a[g>>0]=46;a[g+1>>0]=0;g=i+56|0;h=i+64|0;R=c[h>>2]|0;L=R+18|0;S=xl(c[v>>2]|0,0,-1,-1)|0;N=y;P=xl(S|0,N|0,L|0,((L|0)<0)<<31>>31|0)|0;Q=c[w>>2]|0;P=Il(P|0,y|0,Q|0)|0;O=y;Q=Il(xl(S|0,N|0,R|0,((R|0)<0)<<31>>31|0)|0,y|0,Q|0)|0;R=x;N=x;c[N>>2]=xl(yl(c[R>>2]|0,c[R+4>>2]|0,Q|0,y|0)|0,y|0,P|0,O|0)|0;c[N+4>>2]=y;c[h>>2]=L;L=c[g>>2]|0;c[L+4>>2]=M;c[M>>2]=L;c[M+4>>2]=g;c[g>>2]=M;c[z>>2]=(c[z>>2]|0)+1;if((c[j>>2]|0)!=4){h=25;break a}S=Le(19)|0;c[S+8>>2]=e;M=S+13|0;a[M>>0]=a[15851]|0;a[M+1>>0]=a[15852]|0;a[M+2>>0]=a[15853]|0;M=c[h>>2]|0;R=M+19|0;L=xl(c[v>>2]|0,0,-1,-1)|0;Q=y;O=xl(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Il(O|0,y|0,N|0)|0;P=y;N=Il(xl(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=xl(yl(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[h>>2]=R;R=c[g>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=g;c[g>>2]=S;break}default:{}}if((Dd(k,m,J)|0)<0){h=28;break a}if((zd(E,1024,J)|0)<0){h=30;break a}if((c[A>>2]|0)!=4){h=32;break a}M=gk(E)|0;R=M+17|0;S=Le(R)|0;c[S+8>>2]=i;Ll(S+13|0,E|0,M+1|0)|0;M=c[C>>2]|0;R=M+R|0;L=xl(c[v>>2]|0,0,-1,-1)|0;Q=y;O=xl(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Il(O|0,y|0,N|0)|0;P=y;N=Il(xl(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=xl(yl(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[C>>2]=R;R=c[B>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=B;c[B>>2]=S;do if((n|0)!=10){S=p;if(!((n|0)==8&((c[S>>2]|0)!=0|(c[S+4>>2]|0)!=0))){yd(J);if((n|0)!=4)break b;S=wd(f,E)|0;g=ed(b,J,i,S)|0;Uj(S);if(!g)break b;else{h=46;break a}}else{if((Ed(D,J)|0)<0){h=40;break a}R=D;S=p;Wc(b,i,17144,c[R>>2]|0,c[R+4>>2]|0,c[S>>2]|0,c[S+4>>2]|0)|0;break}}else{if((zd(F,1024,J)|0)<0){h=35;break a}c[i+56>>2]=Tk(F)|0}while(0);yd(J)}}while(0)}switch(h|0){case 5:{c[J>>2]=g+1;yd(J);I=c[J>>2]|0;break}case 7:{ll(17472,13,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 9:{ll(17486,12,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 11:{ll(17499,12,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 17:{ll(17512,14,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 19:{ll(17527,14,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 21:{ll(17441,13,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 23:{ja(15810,15828,456,15837);break}case 25:{ja(15810,15828,456,15837);break}case 28:{ll(17542,14,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 30:{ll(17366,17,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 32:{ja(15810,15828,456,15837);break}case 35:{ll(17557,21,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 40:{ll(17455,16,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 44:{I=g;break}case 46:{l=K;return g|0}}c[d>>2]=I;S=0;l=K;return S|0}function fd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;f=h;g=e+20|0;b=c[g>>2]|0;if(b|0){eb[c[a+4>>2]&15](a,b);c[g>>2]=0}b=e+24|0;d=c[b>>2]|0;if((d|0)<=1){i=c[e+16>>2]|0;c[b>>2]=d+1;b=sc(a,i,c[14592+(d<<2)>>2]|0)|0;c[g>>2]=b;if(b|0?($a[c[a+24>>2]&15](a,f,b,0,6,e)|0)>=1:0){l=h;return}fd(a,0,0,e);l=h;return}if((gd(a,17335,1)|0)<0)gd(a,17357,0)|0;eb[c[a+4>>2]&15](a,c[e+16>>2]|0);b=c[e+8>>2]|0;if(b|0)db[b&15](c[e+12>>2]|0);Uj(e);l=h;return}function gd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=l;l=l+1072|0;h=t+1056|0;o=t+1048|0;n=t+1040|0;q=t+1060|0;r=t;k=t+1032|0;m=t+1024|0;d=Vc(b,d)|0;if(!d){s=-1;l=t;return s|0}if((c[d+24>>2]|0)!=8){s=-1;l=t;return s|0}if((c[d+56>>2]|0)!=3){s=-1;l=t;return s|0}j=c[d+60>>2]|0;p=Tj(j+1|0)|0;Ha(d+64|0,0,p|0,j|0);a[p+j>>0]=0;if(!e){c[q>>2]=p;f=c[3662]|0;g=b+176|0;d=p;a:while(1)b:do switch(a[d>>0]|0){case 0:break a;case 9:case 32:{d=d+1|0;c[q>>2]=d;break}case 10:{d=d+1|0;c[q>>2]=d;break}default:{if((zd(r,1024,q)|0)<0){s=49;break a}d=Vc(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0){o=Le(24)|0;m=d+80|0;n=c[m+4>>2]|0;e=o+8|0;c[e>>2]=c[m>>2];c[e+4>>2]=n;e=o+16|0;c[e>>2]=e;c[o+20>>2]=e;n=c[g>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=g;c[g>>2]=o;while(1){d=c[q>>2]|0;c:while(1){switch(a[d>>0]|0){case 10:case 0:break b;case 9:case 32:break;default:break c}o=d+1|0;c[q>>2]=o;d=o}if((zd(r,1024,q)|0)<0){s=61;break a}o=Le(16)|0;c[o+12>>2]=Tk(r)|0;n=c[e>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=e;c[e>>2]=o}}c[h>>2]=r;nl(f,17384,h)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:break b;default:{}}o=d+1|0;c[q>>2]=o;d=o}}}while(0);if((s|0)==49)ll(17366,17,1,f)|0;else if((s|0)==61)ll(17366,17,1,f)|0}else{c[q>>2]=p;h=c[3662]|0;i=b+176|0;j=b+184|0;e=0;g=0;d=p;d:while(1){f=e;e:while(1){f:while(1){e=a[d>>0]|0;g:while(1)switch(e<<24>>24){case 0:break d;case 64:{s=12;break e}case 10:break f;case 35:break;case 9:case 32:break g;default:{e=0;break e}}e=d+1|0;c[q>>2]=e;d=e}d=d+1|0;c[q>>2]=d;f=0}if((s|0)==12){c[q>>2]=d+1;e=1}if((zd(r,1024,q)|0)<0){s=14;break}d=c[q>>2]|0;h:while(1){switch(a[d>>0]|0){case 58:{s=18;break h}case 9:case 32:break;default:{s=27;break h}}s=d+1|0;c[q>>2]=s;d=s}i:do if((s|0)==18){s=0;c[q>>2]=d+1;d=Vc(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0)if(!e){f=Le(24)|0;d=d+80|0;e=c[d+4>>2]|0;g=f+8|0;c[g>>2]=c[d>>2];c[g+4>>2]=e;g=f+16|0;c[g>>2]=g;c[f+20>>2]=g;g=c[i>>2]|0;c[g+4>>2]=f;c[f>>2]=g;c[f+4>>2]=i;c[i>>2]=f;g=0;break}else{g=Le(20)|0;c[g+8>>2]=Tk(r)|0;f=g+12|0;c[f>>2]=f;c[g+16>>2]=f;f=c[j>>2]|0;c[f+4>>2]=g;c[g>>2]=f;c[g+4>>2]=j;c[j>>2]=g;f=0;break}c[n>>2]=r;nl(h,17384,n)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:{f=0;g=0;break i}default:{}}g=d+1|0;c[q>>2]=g;d=g}}else if((s|0)==27){s=0;d=(g|0)!=0;if(!(d|(f|0)!=0)){s=28;break d}if(!d){d=Le(16)|0;c[d+12>>2]=Tk(r)|0;c[d+8>>2]=e;g=f+16|0;e=c[g>>2]|0;c[e+4>>2]=d;c[d>>2]=e;c[d+4>>2]=g;c[g>>2]=d;g=0;break}if((Bd(m,q)|0)<0){s=31;break d}if((Ed(k,q)|0)<0){s=33;break d}d=Le(32)|0;c[d+24>>2]=Tk(r)|0;e=k;u=c[e+4>>2]|0;v=d+8|0;c[v>>2]=c[e>>2];c[v+4>>2]=u;v=m;u=c[v+4>>2]|0;e=d+16|0;c[e>>2]=c[v>>2];c[e+4>>2]=u;e=g+12|0;u=c[e>>2]|0;c[u+4>>2]=d;c[d>>2]=u;c[d+4>>2]=e;c[e>>2]=d}while(0);d=c[q>>2]|0;v=a[d>>0]|0;e=v<<24>>24==10;if(e^v<<24>>24!=0)do{d=d+1|0;c[q>>2]=d;v=a[d>>0]|0;e=v<<24>>24==10}while(e^v<<24>>24!=0);if(e){d=d+1|0;c[q>>2]=d}e=f}if((s|0)==14)ll(17366,17,1,h)|0;else if((s|0)==28){c[o>>2]=r;nl(h,17412,o)|0}else if((s|0)==31)ll(17441,13,1,h)|0;else if((s|0)==33)ll(17455,16,1,h)|0}Uj(p);v=0;l=t;return v|0}function hd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=l;l=l+32|0;d=f+16|0;e=f;if((c[a>>2]|0)!=8)ja(17587,15828,2865,17601);if($a[c[a+12>>2]&15](a,d,e,0,16809164,16809164)|0)ja(16703,15828,2867,17601);if(!(ab[c[a+28>>2]&3](a,e,c[d>>2]|0,17616,514,384,0)|0)){h=c[a+52>>2]|0;g=c[d>>2]|0;e=gk(b)|0;$a[h&15](a,g,0,0,b,e)|0;eb[c[a+4>>2]&15](a,c[d>>2]|0);l=f;return}else ja(17627,15828,2869,17601)}function id(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;f=i+16|0;g=i;h=c[4202143]|0;if(!h){Uj(b);l=i;return}if($a[c[h+12>>2]&15](h,f,g,1e3,16809164,16809164)|0)ja(17708,15828,2892,17757);e=sc(h,c[f>>2]|0,c[h+200>>2]|0)|0;if(e|0){Nc(h,c[f>>2]|0,a)|0;if((ab[c[h+28>>2]&3](h,g,e,a,514,384,0)|0)>=0)$a[c[h+52>>2]&15](h,e,0,0,b,d)|0;eb[c[h+4>>2]&15](h,e)}a=c[f>>2]|0;if(a|0)eb[c[h+4>>2]&15](h,a);Uj(b);l=i;return}function jd(){return}function kd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[4202144]|0;c[4202144]=f+-1;a=(f|0)>1;if((f|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;gb[a&63](c[b>>2]|0,0,d,e);return}function ld(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[4202144]|0;c[4202144]=e+-1;a=(e|0)>1;if((e|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;gb[a&63](c[b>>2]|0,(d|0)<1?-404:0-d|0,0,0);return}function md(a){a=a|0;c[a+4>>2]=0;c[a>>2]=0;return}function nd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;g=Le(8)|0;c[g>>2]=e;c[g+4>>2]=f;f=c[4202144]|0;c[4202144]=f+1;if(!f)Na(1);wa(a|0,17777,b|0,d|0,0,0,g|0,1,7,8,0)|0;return g|0}function od(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Le(4132)|0;c[e>>2]=b;c[e+4>>2]=d;c[e+16>>2]=a;return e|0}function pd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!e){q=0;return q|0}l=b+8|0;m=b+12|0;n=b+36|0;o=b+16|0;p=b+20|0;q=b+4|0;k=b+40|0;j=d;a:while(1){switch(c[l>>2]|0){case 0:{i=c[m>>2]|0;d=20-i|0;d=(e|0)<(d|0)?e:d;Ll(b+36+i|0,j|0,d|0)|0;i=d+(c[m>>2]|0)|0;c[m>>2]=i;if((i|0)>19){if(Zk(n,17835,4)|0){d=-1;e=12;break a}f=p;g=k;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[l>>2]=1;c[m>>2]=0}break}case 1:{d=c[m>>2]|0;i=4096-d|0;i=(e|0)<(i|0)?e:i;Ll(b+36+d|0,j|0,i|0)|0;d=i+(c[m>>2]|0)|0;c[m>>2]=d;if((d|0)>4095){d=d+-16|0;Ue(n,n,d,c[o>>2]|0,p,0);d=Ya[c[b>>2]&63](c[q>>2]|0,n,d)|0;if((d|0)<0){e=12;break a}f=n;g=(c[m>>2]|0)+(b+36)+-16|0;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[m>>2]=16;d=i}else d=i;break}default:{e=10;break a}}e=e-d|0;if(!e){d=0;e=12;break}else j=j+d|0}if((e|0)==10)ra();else if((e|0)==12)return d|0;return 0}function qd(b){b=b|0;var d=0,e=0,f=0,g=0;if((c[b+8>>2]|0)!=1){g=-1;return g|0}d=b+12|0;e=c[d>>2]|0;if(!((e|0)!=0&(e&15|0)==0)){g=-1;return g|0}g=b+36|0;Ue(g,g,e,c[b+16>>2]|0,b+20|0,0);d=a[(c[d>>2]|0)+-1+(b+36)>>0]|0;if((d+-1&255)>15){g=-1;return g|0}d=e-(d&255)|0;if(d|0?(f=Ya[c[b>>2]&63](c[b+4>>2]|0,g,d)|0,(f|0)<0):0){g=f;return g|0}g=0;return g|0}function rd(a){a=a|0;Uj(a);return}function sd(a,b,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=Le(48)|0;c[m>>2]=a;c[m+4>>2]=b;b=m+8|0;c[b>>2]=0;c[b+4>>2]=0;c[m+16>>2]=j;c[m+20>>2]=k;b=m+24|0;c[b>>2]=g;k=m+32|0;g=k;c[g>>2]=0;c[g+4>>2]=0;if(l|0){g=Le(4132)|0;c[g>>2]=15;c[g+4>>2]=m;c[g+16>>2]=l;c[m+40>>2]=g}l=Le(8)|0;c[l>>2]=m;c[l+4>>2]=9;g=(h|0)!=0|(i|0)!=0;if(g){a=Tj(h)|0;j=c[m>>2]|0;b=c[b>>2]|0;if((b|0)!=0?(n=k,n=$a[c[j+48>>2]&15](j,b,c[n>>2]|0,c[n+4>>2]|0,a,h)|0,(n|0)>=0):0){b=k;n=xl(c[b>>2]|0,c[b+4>>2]|0,n|0,((n|0)<0)<<31>>31|0)|0;b=k;c[b>>2]=n;c[b+4>>2]=y;b=17772}else b=17772}else{a=0;b=17777}n=c[4202144]|0;c[4202144]=n+1;if(!n)Na(1);wa(d|0,b|0,e|0,f|0,a|0,h|0,l|0,1,7,8,0)|0;if(!g)return;Uj(a);return}function td(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=c[a>>2]|0;e=a+8|0;f=e;a=$a[c[g+52>>2]&15](g,c[a+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,b,d)|0;if((a|0)<0)return a|0;f=e;f=xl(c[f>>2]|0,c[f+4>>2]|0,a|0,((a|0)<0)<<31>>31|0)|0;g=e;c[g>>2]=f;c[g+4>>2]=y;return a|0}function ud(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[b>>2]|0;do if((d|0)<0){h=b+40|0;i=d;g=((d|0)<0)<<31>>31}else{h=b+40|0;g=c[h>>2]|0;do if(!g){i=b+8|0;g=i;g=$a[c[o+52>>2]&15](o,c[b+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0,e,f)|0;if((g|0)<0)n=13;else{m=i;m=xl(c[m>>2]|0,c[m+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;n=i;c[n>>2]=m;c[n+4>>2]=y;n=14}}else{g=pd(g,e,f)|0;if(!((d|0)==0&(g|0)>-1))if((g|0)<0){n=13;break}else{n=14;break}g=c[h>>2]|0;if((((c[g+8>>2]|0)==1?(i=g+12|0,j=c[i>>2]|0,(j|0)!=0&(j&15|0)==0):0)?(k=g+36|0,Ue(k,k,j,c[g+16>>2]|0,g+20|0,0),l=a[(c[i>>2]|0)+-1+(g+36)>>0]|0,(l+-1&255)<=15):0)?(m=j-(l&255)|0,m|0):0)Ya[c[g>>2]&63](c[g+4>>2]|0,k,m)|0}while(0);if((n|0)==13){i=g;g=((g|0)<0)<<31>>31;break}if((n|0)==14?d|0:0)return;g=b+8|0;i=c[g>>2]|0;g=c[g+4>>2]|0}while(0);hb[c[b+16>>2]&7](o,c[b+4>>2]|0,i,g,c[b+20>>2]|0);g=c[h>>2]|0;if(g|0)Uj(g);Uj(b);return}function vd(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=l;l=l+288|0;x=A+48|0;y=A;z=A+80|0;if((f|0)>=33)ja(17781,17806,589,17816);if((h|0)<=0){l=A;return}o=y+f|0;p=y+(f+1)|0;q=y+(f+2)|0;r=y+(f+3)|0;s=f+4|0;t=(g|0)>0;u=(d|0)>64;v=z+112|0;w=z+176|0;n=1;while(1){c[x>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;Ll(y|0,e|0,f|0)|0;a[o>>0]=n>>>24;a[p>>0]=n>>>16;a[q>>0]=n>>>8;a[r>>0]=n;if(t){k=s;m=0;while(1){if(u){Ze(b,d,v);j=32}else{Ll(v|0,b|0,d|0)|0;j=d}Nl(z+112+j|0,0,64-j|0)|0;j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^54;j=j+1|0}while((j|0)!=64);Ve(z);We(z,v,64);We(z,y,k);Ye(w,z);j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^106;j=j+1|0}while((j|0)!=64);Ze(v,96,y);j=0;do{B=x+j|0;a[B>>0]=a[B>>0]^a[y+j>>0];j=j+1|0}while((j|0)!=32);m=m+1|0;if((m|0)==(g|0))break;else k=32}}j=(h|0)<32?h:32;Ll(i|0,x|0,j|0)|0;h=h-j|0;if((h|0)<=0)break;else{i=i+j|0;n=n+1|0}}l=A;return}function wd(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(!(a[b>>0]|0)){f=Tk(c)|0;return f|0}g=gk(b)|0;e=gk(c)|0;f=Tj(g+2+e|0)|0;Ll(f|0,b|0,g|0)|0;d=f+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ll(d|0,c|0,e+1|0)|0;g=f;return g|0}function xd(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(kk(c,58)|0){f=Tk(c)|0;return f|0}if(!(a[b>>0]|0)){f=Tk(c)|0;return f|0}g=gk(b)|0;f=gk(c)|0;e=Tj(g+2+f|0)|0;Ll(e|0,b|0,g|0)|0;d=e+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ll(d|0,c|0,f+1|0)|0;g=e;return g|0}function yd(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]|0;while(1){g=a[d>>0]|0;e=g<<24>>24==10;f=d+1|0;if(e^g<<24>>24!=0)d=f;else break}c[b>>2]=e?f:d;return}function zd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[e>>2]|0;a:while(1){f=a[h>>0]|0;switch(f<<24>>24){case 34:{j=4;break a}case 0:{i=-1;j=26;break a}case 9:case 32:break;default:{j=21;break a}}h=h+1|0}b:do if((j|0)==4){k=b+d+-1|0;f=h+1|0;c:while(1){d=f+1|0;j=a[f>>0]|0;h=j<<24>>24;d:do switch(j<<24>>24){case 34:{g=b;l=d;break b}case 0:case 10:{i=-1;j=26;break c}case 92:{i=f+2|0;h=a[d>>0]|0;switch(h|0){case 92:case 34:case 39:{f=i;break d}case 110:{h=10;f=i;break d}case 114:{h=13;f=i;break d}case 116:{h=9;f=i;break d}case 120:{i=a[i>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{j=d+-87|0;break}else{j=d+-55|0;break}else j=h;while(0);i=a[f+3>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{h=d+-87|0;break}else{h=d+-55|0;break}while(0);h=h|j<<4;f=f+4|0;break d}default:{i=-1;j=26;break c}}}default:f=d}while(0);if(b>>>0>=k>>>0){i=-1;j=26;break}a[b>>0]=h;b=b+1|0}if((j|0)==26)return i|0}else if((j|0)==21){i=b+d+-1|0;g=b;while(1){switch(f<<24>>24){case 10:case 0:case 9:case 32:{l=h;break b}default:{}}if(g>>>0>=i>>>0){i=-1;break}l=h+1|0;a[g>>0]=f;g=g+1|0;h=l;f=a[l>>0]|0}return i|0}else if((j|0)==26)return i|0;while(0);a[g>>0]=0;c[e>>2]=l;e=0;return e|0}function Ad(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=c[d>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=_k(g,f,e)|0;b=c[f>>2]|0;if((b|0)==(g|0)){d=-1;l=h;return d|0}c[d>>2]=b;d=0;l=h;return d|0}function Bd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=il(f,e,0)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function Cd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}c[b>>2]=_k(f,e,0)|0;b=c[e>>2]|0;if((b|0)==(f|0)){d=-1;l=g;return d|0}c[d>>2]=b;d=0;l=g;return d|0}function Dd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;g=c[e>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=_k(g,f,0)|0;b=c[f>>2]|0;if((b|0)==(g|0)){e=-1;l=i;return e|0}if((a[b>>0]|0)==46){b=b+1|0;f=a[b>>0]|0;if((f+-48&255)<10){g=0;h=1e9;do{h=(h>>>0)/10|0;g=(N((f<<24>>24)+-48|0,h)|0)+g|0;b=b+1|0;f=a[b>>0]|0}while((f+-48&255)<10);f=g}else f=0}else f=0;c[d>>2]=f;c[e>>2]=b;e=0;l=i;return e|0}function Ed(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=il(f,e,16)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function Fd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=f;c[g>>2]=b;c[g+4>>2]=d;$k(a,17839,f)|0;l=e;return a|0}function Gd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if((d|0)<=0){d=0;return d|0}j=0;a:while(1){h=j<<1;f=a[c+h>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{i=g+-87|0;break}else{i=g+-55|0;break}else i=e;while(0);f=a[c+(h|1)>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{e=g+-87|0;break}else{e=g+-55|0;break}while(0);a[b+j>>0]=e|i<<4;j=j+1|0;if((j|0)>=(d|0)){e=0;f=12;break}}if((f|0)==12)return e|0;return 0}function Hd(a){a=a|0;a=Uk(a,17847)|0;return ((a|0)==0?0:a+2|0)|0}function Id(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+128|0;i=k;j=i;a:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 10:case 0:{d=-1;f=18;break a}default:{}}f=i;b:while(1){switch(g<<24>>24){case 0:case 10:case 58:break b;default:{}}if((f-j|0)>>>0<127){a[f>>0]=g;f=f+1|0}g=d+1|0;d=g;g=a[g>>0]|0}a[f>>0]=0;if((a[d>>0]|0)!=58){d=-1;f=18;break}c:while(1){d=d+1|0;switch(a[d>>0]|0){case 9:case 32:break;default:break c}}f=kk(d,10)|0;g=(f|0)!=0;if(g)h=f-d|0;else h=gk(d)|0;if(!(fk(i,e)|0)){f=16;break}if(g)d=f+1|0;else{d=-1;f=18;break}}if((f|0)==16){c=(h|0)<(c|0)?h:c+-1|0;Ll(b|0,d|0,c|0)|0;a[b+c>>0]=0;c=0;l=k;return c|0}else if((f|0)==18){l=k;return d|0}return 0}function Jd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Id(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=il(f,g,0)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function Kd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Id(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=il(f,g,16)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function Ld(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+80|0;e=f+64|0;d=f;if(Id(d,64,b,17850)|0){l=f;return -1}a:while(1){switch(a[d>>0]|0){case 9:case 32:break;default:break a}d=d+1|0}b=il(d,e,0)|0;l=f;return ((c[e>>2]|0)==(d|0)?-1:b)|0}function Md(a){a=a|0;if(Me(a,17858,0)|0){a=1;return a|0}if(Me(a,17864,0)|0){a=1;return a|0}a=(Me(a,17871,0)|0)!=0&1;return a|0}function Nd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[e>>2]|0;o=Xa[c[o+2576>>2]&3](o,e)|0;if((f|0)<=0)return;m=a+8|0;n=a+4|0;l=0;h=0;e=0;while(1){g=c[o+(l>>>5<<2)>>2]|0;if(!g)g=h;else{i=0;k=e;while(1){j=i;while(1){e=1<<j;if(!(e&g))j=j+1|0;else break}g=g&~e;e=j+l<<12;p=c[m>>2]|0;i=(e|0)/(p|0)|0;p=((e|4095|0)/(p|0)|0)+1|0;e=c[n>>2]|0;e=(p|0)<(e|0)?p:e;if((k|0)!=(h|0)){if((i|0)>(k+3|0)){ib[b&1](a,d,0,h,c[a>>2]|0,k-h|0);h=i}}else h=i;if(!g){g=h;break}else{i=j;k=e}}}l=l+32|0;if((l|0)>=(f|0))break;else h=g}if((e|0)==(g|0))return;ib[b&1](a,d,0,g,c[a>>2]|0,e-g|0);return}function Od(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=Le(12)|0;c[h>>2]=e;c[e>>2]=f;c[e+4>>2]=g;f=f<<2;c[e+8>>2]=f;f=(N(f,g)|0)+65535&-65536;g=e+16|0;c[g>>2]=f;c[h+4>>2]=f>>12;g=c[g>>2]|0;g=$a[c[a+2568>>2]&15](a,b,d,g,((g|0)<0)<<31>>31,2)|0;c[h+8>>2]=g;c[e+12>>2]=c[g+40>>2];c[e+20>>2]=h;c[e+24>>2]=5;return h|0}function Pd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+20>>2]|0;Nd(a,b,d,c[e+8>>2]|0,c[e+4>>2]|0);return}function Qd(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;a:do if((e|0)>=0){j=b+4+(e<<2)|0;if(c[j>>2]|0){i=0;return i|0}}else{e=0;while(1){j=b+4+(e<<2)|0;if(!(c[j>>2]|0))break a;e=e+8|0;if(e>>>0>=256){e=0;break}}return e|0}while(0);k=Le(432)|0;c[k>>2]=b;c[k+316>>2]=Tk(d)|0;a[k+4>>0]=e;a[k+56>>0]=f;a[k+57>>0]=(f&65535)>>>8;a[k+58>>0]=g;a[k+59>>0]=(g&65535)>>>8;a[k+64>>0]=h;a[k+66>>0]=i;a[k+67>>0]=(i&65535)>>>8;a[k+70>>0]=0;a[k+312>>0]=64;Ke(k+8|0,6,k,0);Ke(k+20|0,6,k,1);Ke(k+32|0,6,k,2);Ke(k+44|0,6,k,3);c[j>>2]=k;i=k;return i|0}function Rd(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a>>2]|0;f=d[a+4>>0]|0;a=b+3+(f>>>3)&3;b=1<<(f&31);if(!e){e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]&~b}else{e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]|b}fb[c[g+1164+(a*12|0)>>2]&15](c[g+1164+(a*12|0)+4>>2]|0,c[g+1164+(a*12|0)+8>>2]|0,(c[g+1036+(a<<5)+28>>2]|(c[g+1036+(a<<5)+24>>2]|(c[g+1036+(a<<5)+20>>2]|(c[g+1036+(a<<5)+16>>2]|(c[g+1036+(a<<5)+12>>2]|(c[g+1036+(a<<5)+8>>2]|(c[g+1036+(a<<5)+4>>2]|c[g+1036+(a<<5)>>2]))))))|0)!=0&1);return}function Sd(a,b){a=a|0;b=b|0;if(b>>>0<4)return a+8+(b*12|0)|0;else ja(17877,17889,140,17895);return 0}function Td(a){a=a|0;return c[(c[a>>2]|0)+1028>>2]|0}function Ud(a){a=a|0;return c[(c[a>>2]|0)+1032>>2]|0}function Vd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;if(d>>>0>=7)ja(17914,17889,190,17940);if(e+-1&e|0)ja(17957,17889,191,17940);if(e>>>0<=3)ja(17982,17889,192,17940);i=b+320+(d<<4)|0;if(!(c[i>>2]|0)){c[i>>2]=e;f=f&255;a[b+320+(d<<4)+4>>0]=f;a[b+320+(d<<4)+5>>0]=0;c[b+320+(d<<4)+8>>2]=g;c[b+320+(d<<4)+12>>2]=h;g=(d|0)==6;h=(g?48:(d<<2)+16|0)+(b+56)|0;a[h>>0]=g?0:f;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;return}else ja(17992,17889,194,17940)}function Wd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return Je(c[(c[a>>2]|0)+1028>>2]|0,b,d,e)|0}function Xd(b,c,d){b=b|0;c=c|0;d=d|0;a[(c&255)+(b+56)>>0]=d;return}function Yd(b,c,d){b=b|0;c=c|0;d=d|0;c=(c&255)+(b+56)|0;a[c>>0]=d;a[c+1>>0]=(d&65535)>>>8;return}function Zd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+312|0;f=a[e>>0]|0;g=f&255;h=g+d|0;if((h|0)>256){h=-1;return h|0}a[e>>0]=h;h=b+62|0;a[h>>0]=a[h>>0]|16;Ll(b+56+g|0,c|0,d|0)|0;h=b+108|0;a[g+1+(b+56)>>0]=a[h>>0]|0;a[h>>0]=f;h=g;return h|0}function _d(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=Le(36)|0;j=Le(1212)|0;c[j>>2]=0;c[j+1028>>2]=f;c[j+1032>>2]=g;c[i+32>>2]=h;Ke(j+1164|0,7,i,0);Ke(j+1176|0,7,i,1);Ke(j+1188|0,7,i,2);Ke(j+1200|0,7,i,3);He(g,3320,0,1,0,i,16,10,4)|0;He(g,3324,0,4,0,i,17,11,7)|0;g=Qd(j,18005,0,-32634,4663,2,1536)|0;a[g+100>>0]=-12;a[g+101>>0]=26;a[g+102>>0]=0;a[g+103>>0]=17;c[i+4>>2]=g;c[i>>2]=j;g=Qd(j,18012,8,-32634,28672,0,1537)|0;h=i+8|0;c[h>>2]=g;a[g+70>>0]=-128;c[b>>2]=j;c[e>>2]=d[(c[h>>2]|0)+4>>0];return i|0}function $d(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;g=e+96+((c[b+8>>2]|0)+56)|0;h=a[g>>0]&127;a[g>>0]=h;g=h&255;if((h&255)>=16)return;e=1<<e;if(!f){h=b+16+g|0;e=(e^255)&(d[h>>0]|0)&255;a[h>>0]=e}else{h=b+16+g|0;e=(e|(d[h>>0]|0))&255;a[h>>0]=e}h=c[b+32>>2]|0;fb[c[h+(g*12|0)>>2]&15](c[h+(g*12|0)+4>>2]|0,c[h+(g*12|0)+8>>2]|0,e<<24>>24!=0&1);return}function ae(a,b,d){a=a|0;b=b|0;d=d|0;return c[a+12>>2]|0}function be(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+12>>2]=d;return}function ce(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a+12>>2]|0;if((g|0)>=0){e=c[14600+(e<<2)>>2]|0;return e|0}f=c[a>>2]|0;if((e|0)==2){if((g>>>16&255|0)!=(c[f>>2]|0)){e=-1;return e|0}a=c[f+4+((g>>>8&255)<<2)>>2]|0;if(!a){e=-1;return e|0}e=(g&252)+(a+56)|0;e=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[e+3>>0]|0)<<24;return e|0}a=g|b;if((a>>>16&255|0)!=(c[f>>2]|0)){e=c[14600+(e<<2)>>2]|0;return e|0}b=c[f+4+((a>>>8&255)<<2)>>2]|0;if(!b){e=c[14600+(e<<2)>>2]|0;return e|0}f=a&255;switch(e|0){case 0:{e=d[b+56+f>>0]|0;return e|0}case 1:{a=b+56+f|0;b=d[a>>0]|0;if((f|0)==255){e=b;return e|0}e=(d[a+1>>0]|0)<<8|b;return e|0}default:ra()}return 0}function de(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[a+12>>2]|0;if((f|0)>=0)return;a=c[a>>2]|0;if((e|0)==2){ee(a,f&-4,d,2);return}else{ee(a,f|b,d,e);return}}function ee(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;if((e>>>16&255|0)!=(c[b>>2]|0))return;l=c[b+4+((e>>>8&255)<<2)>>2]|0;if(!l)return;k=e&255;switch(g|0){case 2:{b=k+-16|0;e=(k|0)==48;if(e|b>>>0<24?(j=e?6:b>>>2,i=c[l+320+(j<<4)>>2]|0,(i|0)!=0):0){b=0-i|0;if((j|0)==6)b=(b|1)&f;else b=b&f|d[l+320+(j<<4)+4>>0];f=l+56+k|0;a[f>>0]=b;a[f+1>>0]=b>>>8;a[f+2>>0]=b>>>16;a[f+3>>0]=b>>>24;fe(l);return}else h=10;break}case 31:{b=-2147483648;break}default:h=10}if((h|0)==10){b=1<<g;h=l+70|0;e=0;do{i=e+k|0;a:do if(i>>>0<256){g=f>>>(e<<3);if((i|1|0)==7){j=l+56+i|0;a[j>>0]=(g^255)&d[j>>0];break}switch(a[h>>0]|0){case -128:case 0:{switch(i|0){case 39:case 38:case 37:case 36:case 35:case 34:case 33:case 32:case 31:case 30:case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 18:case 17:case 16:case 51:case 50:case 49:case 48:case 61:case 14:case 11:case 10:case 9:case 8:case 3:case 2:case 1:case 0:break a;default:{}}break}default:switch(i|0){case 59:case 58:case 57:case 56:case 61:case 14:case 11:case 10:case 9:case 8:case 3:case 2:case 1:case 0:break a;default:{}}}a[l+56+i>>0]=g}while(0);e=e+1|0}while((e|0)<(b|0))}if(!(k>>>0<5&(b+k|0)>>>0>4))return;fe(l);return}function fe(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=d[b+60>>0]|0;j=(k&1|0)==0;k=(k&2|0)==0;e=0;do{l=(e|0)==6;g=(l?48:(e<<2)+16|0)+(b+56)|0;f=d[g>>0]|0;g=d[g+1>>0]<<8|f|d[g+2>>0]<<16|d[g+3>>0]<<24;h=c[b+320+(e<<4)>>2]|0;do if(!h)m=6;else{if(j|(a[b+320+(e<<4)+4>>0]&1)==0?k|l&(f&1|0)==0:0){m=6;break}gb[c[b+320+(e<<4)+12>>2]&63](c[b+320+(e<<4)+8>>2]|0,e,g&0-h,1);a[b+320+(e<<4)+5>>0]=1}while(0);if((m|0)==6?(m=0,i=b+320+(e<<4)+5|0,a[i>>0]|0):0){gb[c[b+320+(e<<4)+12>>2]&63](c[b+320+(e<<4)+8>>2]|0,e,0,0);a[i>>0]=0}e=e+1|0}while((e|0)!=7);return}function ge(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=c[b>>2]|0;g=c[b+8>>2]|0;a[e>>0]=0;a[e+1>>0]=0;b=a[f>>0]|0;j=b&255;a[g+152>>0]=b;b=e+(j>>>3)|0;a[b>>0]=1<<(j&7)|d[b>>0];b=a[f+1>>0]|0;j=b&255;a[g+153>>0]=b;b=e+(j>>>3)|0;a[b>>0]=1<<(j&7)|d[b>>0];b=a[f+2>>0]|0;j=b&255;a[g+154>>0]=b;b=e+(j>>>3)|0;a[b>>0]=1<<(j&7)|d[b>>0];b=a[f+3>>0]|0;f=b&255;a[g+155>>0]=b;b=e+(f>>>3)|0;a[b>>0]=1<<(f&7)|d[b>>0];b=0;do{e=c[h+4+(b<<2)>>2]|0;if((e|0?a[e+117>>0]|0:0)?(i=a[(((d[e+4>>0]|0)>>>3)+3&3|96)+(g+56)>>0]|0,(i&255)<16):0)a[e+116>>0]=i;b=b+1|0}while((b|0)!=256);return}function he(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((c[b>>2]|0)!=2){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;f=c[b>>2]|0;a:do if((f|0)>0){e=c[b+8>>2]|0;b=0;while(1){if(!(fk((c[e+(b<<4)+4>>2]|0)+4|0,d)|0))break;b=b+1|0;if((b|0)>=(f|0))break a}if(e+(b<<4)|0){e=e+(b<<4)+8|0;f=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=f;return}}while(0);c[a>>2]=6;c[a+4>>2]=0;return}function ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;if((c[a>>2]|0)!=2){d=-1;l=j;return d|0}i=c[a+4>>2]|0;a=c[i>>2]|0;a:do if((a|0)>0){f=c[i+8>>2]|0;e=0;while(1){if(!(fk((c[f+(e<<4)+4>>2]|0)+4|0,b)|0))break;e=e+1|0;if((e|0)>=(a|0)){h=8;break a}}if(f+(e<<4)|0){a=f+(e<<4)+8|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];je(g)}else h=8}else h=8;while(0);if((h|0)==8){e=i+4|0;f=c[e>>2]|0;if((a|0)<(f|0))e=c[i+8>>2]|0;else{g=a+1|0;a=(f*3|0)/2|0;a=(g|0)>(a|0)?g:a;g=i+8|0;h=Vj(c[g>>2]|0,a<<4)|0;c[g>>2]=h;c[e>>2]=a;a=c[i>>2]|0;e=h}c[i>>2]=a+1;h=gk(b)|0;i=Tj(h+5|0)|0;c[i>>2]=h;Ll(i+4|0,b|0,h+1|0)|0;c[e+(a<<4)>>2]=0;c[e+(a<<4)+4>>2]=i;a=e+(a<<4)+8|0}i=d;b=c[i+4>>2]|0;d=a;c[d>>2]=c[i>>2];c[d+4>>2]=b;d=0;l=j;return d|0}function je(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=l;l=l+16|0;e=f;switch(c[a>>2]|0){case 7:case 0:{Uj(c[a+4>>2]|0);l=f;return}case 3:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=(c[d>>2]|0)+(a<<3)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];je(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Uj(b);l=f;return}case 2:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=c[d>>2]|0;h=g+(a<<4)|0;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];je(e);g=g+(a<<4)+8|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];je(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Uj(b);l=f;return}case 6:case 5:case 4:case 1:{l=f;return}default:ra()}}function ke(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[b>>2]|0)!=3){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;if((c[b>>2]|0)>>>0>d>>>0){e=(c[b+8>>2]|0)+(d<<3)|0;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}else{c[a>>2]=6;c[a+4>>2]=0;return}}function le(a){a=a|0;return ((c[a>>2]|0)==7?(c[a+4>>2]|0)+4|0:0)|0}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+272|0;g=e+256|0;f=e;c[g>>2]=d;ok(f,256,b,g)|0;b=gk(f)|0;d=Tj(b+5|0)|0;c[d>>2]=b;Ll(d+4|0,f|0,b+1|0)|0;c[a>>2]=7;c[a+4>>2]=d;l=e;return}
+function qf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;z=l;l=l+32|0;w=z;q=z+24|0;r=z+20|0;s=z+16|0;t=z+12|0;c[5756]=f+1;c[5759]=0;c[5758]=0;c[5761]=c[5640];c[5757]=0;v=((f|0)<0)<<31>>31;g=0;h=0;a:while(1){p=(c[5756]|0)+-1|0;c[5756]=p;if(!p){i=c[5757]|0;if(!i){x=2301;break}c[5756]=i;c[5757]=0}else{h=c[5758]|0;if(h>>>0<(c[5759]|0)>>>0){c[5760]=h;p=d[h>>0]|0;c[5758]=h+1;h=p}else{n=(c[5761]|0)+h|0;o=(c[5690]|0)+n|0;h=c[23084+((o>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|0)==-1){do if(!(wf(r,s,t,o,0,(a[22968]|0)==3&1)|0)){h=c[r>>2]|0;i=Ge(c[4202123]|0,h,0)|0;if(i|0?c[i+32>>2]|0:0){h=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;c[5758]=h;xf(o,h,c[s>>2]|0,c[t>>2]|0);h=0;break}c[5760]=c[5758];h=5}else{c[5760]=c[5758];h=4}while(0);if(h|0){x=29;break}i=c[5758]|0}else{i=h+o|0;c[5758]=i}c[5760]=i;c[5761]=n-i;j=o&4095;c[5759]=i+(4082-j);h=d[i>>0]|0;c[5758]=i+1;if(j>>>0>=4081){if(yf(q,o,h)|0){x=28;break}m=c[q>>2]|0;if((m+j|0)>4096){if((m|0)>0){k=0;do{i=k+o|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!(j&1))i=d[j+i>>0]|0;else{if(zf(i,0,0,2)|0){x=28;break a}i=c[5762]|0}a[23004+k>>0]=i;k=k+1|0}while((k|0)<(m|0))}c[5760]=23004;c[5761]=n-23004;c[5758]=23005;c[5759]=23004+m}}}p=c[5730]|0;c[5755]=p;h=p&256|h}b:do switch(h|0){case 251:{x=916;break a}case 244:{x=920;break a}case 241:{x=2303;break a}case 102:{h=c[5755]|0;i=c[5730]|0;if((h|0)==(i|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,102)|0){x=2304;break a}i=c[5730]|0;h=c[5755]|0}p=(i&256|0)==0?h|256:h&-257;c[5755]=p;o=c[5758]|0;h=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=p&256|h;break}case 103:{i=c[5755]|0;h=c[5730]|0;if((i|0)==(h|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,103)|0){x=2304;break a}h=c[5730]|0;i=c[5755]|0}p=(h&128|0)==0?i|128:i&-129;c[5755]=p;o=c[5758]|0;h=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=p&256|h;break}case 240:{h=c[5755]|0;if((h|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,240)|0){x=2304;break a}h=c[5755]|0}c[5755]=h|64;o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=h&256|p;break}case 242:{h=c[5755]|0;if((h|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,242)|0){x=2304;break a}h=c[5755]|0}c[5755]=h|32;o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=h&256|p;break}case 243:{h=c[5755]|0;if((h|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,243)|0){x=2304;break a}h=c[5755]|0}c[5755]=h|16;o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=h&256|p;break}case 62:case 54:case 46:case 38:{i=c[5755]|0;if((i|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,h)|0){x=2304;break a}i=c[5755]|0}c[5755]=i&-16|(h>>>3&3)+1;p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5757]=c[5756];c[5756]=1;h=i&256|h;break}case 101:case 100:{i=c[5755]|0;if((i|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,h)|0){x=2304;break a}i=c[5755]|0}c[5755]=i&-16|(h&7)+1;p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5757]=c[5756];c[5756]=1;h=i&256|h;break}case 183:case 182:case 181:case 180:case 179:case 178:case 177:case 176:{p=c[5758]|0;g=d[p>>0]|0;c[5758]=p+1;p=h&7;h=22528+((h&3)<<2)|0;o=p<<1&8;c[h>>2]=c[h>>2]&~(255<<o)|g<<o;h=p;break}case 191:case 190:case 189:case 188:case 187:case 186:case 185:case 184:{p=c[5758]|0;g=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[22528+((h&7)<<2)>>2]=g;break}case 136:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3;j=c[22528+((j&3)<<2)>>2]>>(j<<1&8);g=j&255;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;c[p>>2]=c[p>>2]&~(255<<h)|g<<h;h=136;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(i&1)if(!(Bf(h,g,0,2)|0)){h=136;break b}else{x=2304;break a}else{a[i+h>>0]=j;h=136;break b}}case 137:{g=c[5758]|0;h=d[g>>0]|0;c[5758]=g+1;g=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){c[22528+((h&7)<<2)>>2]=g;h=137;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,g,2,2)|0)){h=137;break b}else{x=2304;break a}else{c[i+h>>2]=g;h=137;break b}}case 138:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&3)<<2)>>2]>>(i<<1&8)&255;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=i>>>3;h=22528+((p&3)<<2)|0;p=p<<1&8;c[h>>2]=c[h>>2]&~(255<<p)|(g&255)<<p;h=138;break}case 139:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)!=192){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;c[22528+((i>>>3&7)<<2)>>2]=g;h=139;break}case 160:{j=c[5755]|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0];g=i+2|0;if(!(j&128)){h=d[g>>0]<<16|h|d[i+3>>0]<<24;g=i+4|0}c[5758]=g;g=j&15;g=(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)+h|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!(h&1))g=d[h+g>>0]|0;else{if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}c[5632]=c[5632]&-256|g;h=160;break}case 161:{j=c[5755]|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0];g=i+2|0;if(!(j&128)){h=d[g>>0]<<16|h|d[i+3>>0]<<24;g=i+4|0}c[5758]=g;g=j&15;g=(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)+h|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=h+g|0;g=c[g>>2]|0;c[5632]=g;h=161;break}case 162:{k=c[5755]|0;j=c[5758]|0;i=d[j+1>>0]<<8|d[j>>0];h=j+2|0;if(!(k&128)){i=d[h>>0]<<16|i|d[j+3>>0]<<24;h=j+4|0}c[5758]=h;h=k&15;h=(c[22740+(((h|0)==0?3:h+-1|0)<<4)+4>>2]|0)+i|0;i=c[5632]|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(j&1)if(!(Bf(h,i,0,2)|0)){h=162;break b}else{x=2304;break a}else{a[j+h>>0]=i;h=162;break b}}case 163:{k=c[5755]|0;j=c[5758]|0;i=d[j+1>>0]<<8|d[j>>0];h=j+2|0;if(!(k&128)){i=d[h>>0]<<16|i|d[j+3>>0]<<24;h=j+4|0}c[5758]=h;h=k&15;h=(c[22740+(((h|0)==0?3:h+-1|0)<<4)+4>>2]|0)+i|0;i=c[5632]|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((j|h)&3)if(!(Bf(h,i,2,2)|0)){h=163;break b}else{x=2304;break a}else{c[j+h>>2]=i;h=163;break b}}case 215:{h=c[5632]|0;i=(h&255)+(c[5635]|0)|0;p=c[5755]|0;g=p&15;g=((p&128|0)==0?i:i&65535)+(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!(i&1))g=d[g+i>>0]|0;else{if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5632]|0}c[5632]=h&-256|g&255;h=215;break}case 198:{g=c[5758]|0;h=d[g>>0]|0;i=g+1|0;c[5758]=i;if((h&192|0)==192){p=d[i>>0]|0;c[5758]=g+2;g=22528+((h&3)<<2)|0;h=h<<1&8;c[g>>2]=c[g>>2]&~(255<<h)|p<<h;g=p;h=198;break b}h=Af(h)|0;j=c[5758]|0;i=a[j>>0]|0;g=i&255;c[5758]=j+1;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(j&1)if(!(Bf(h,g,0,2)|0)){h=198;break b}else{x=2304;break a}else{a[j+h>>0]=i;h=198;break b}}case 199:{g=c[5758]|0;h=d[g>>0]|0;i=g+1|0;c[5758]=i;if((h&192|0)==192){p=d[g+2>>0]<<8|d[i>>0]|d[g+3>>0]<<16|d[g+4>>0]<<24;c[5758]=g+5;c[22528+((h&7)<<2)>>2]=p;g=p;h=199;break b}h=Af(h)|0;i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,g,2,2)|0)){h=199;break b}else{x=2304;break a}else{c[i+h>>2]=g;h=199;break b}}case 151:case 150:case 149:case 148:case 147:case 146:case 145:{g=c[5632]|0;p=22528+((h&7)<<2)|0;c[5632]=c[p>>2];c[p>>2]=g;break}case 134:{k=c[5758]|0;g=d[k>>0]|0;c[5758]=k+1;k=g>>>3;do if((g&192|0)!=192){m=Af(g)|0;h=m>>>12;i=8411692+((c[5770]|0)+h<<2)|0;g=c[i>>2]|0;if(!(g&1)){g=d[g+m>>0]|0;j=i}else{if(zf(m,0,1,2)|0){x=2304;break a}g=c[5762]|0;j=8411692+((c[5770]|0)+h<<2)|0}i=22528+((k&3)<<2)|0;h=k<<1&8;k=c[i>>2]>>h;j=c[j>>2]|0;if(j&1)if(!(Bf(m,k&255,0,2)|0))break;else{x=2304;break a}else{a[j+m>>0]=k;break}}else{o=22528+((g&3)<<2)|0;p=c[o>>2]|0;g=g<<1&8;i=22528+((k&3)<<2)|0;h=k<<1&8;c[o>>2]=(c[i>>2]>>h&255)<<g|p&~(255<<g);g=p>>g&255}while(0);c[i>>2]=c[i>>2]&~(255<<h)|(g&255)<<h;h=134;break}case 135:{j=c[5758]|0;g=d[j>>0]|0;c[5758]=j+1;j=g>>>3&7;do if((g&192|0)!=192){m=Af(g)|0;g=m>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|m)&3)){k=h;g=i+m|0}else{if(zf(m,2,1,2)|0){x=2304;break a}k=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;h=22528+(j<<2)|0;j=c[h>>2]|0;i=c[k>>2]|0;if((i|m)&3)if(!(Bf(m,j,2,2)|0))break;else{x=2304;break a}else{c[i+m>>2]=j;break}}else{p=22528+((g&7)<<2)|0;g=c[p>>2]|0;h=22528+(j<<2)|0;c[p>>2]=c[h>>2]}while(0);c[h>>2]=g;h=135;break}case 142:{i=c[5758]|0;g=d[i>>0]|0;c[5758]=i+1;i=g>>>3&7;if(i>>>0>5|(i|0)==1){x=2303;break a}do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]&65535;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if(Cf(i,g)|0){x=2304;break a}if((i|0)==2){x=154;break a}else h=142;break}case 140:{g=c[5758]|0;h=d[g>>0]|0;c[5758]=g+1;g=h>>>3&7;if(g>>>0>5){x=2303;break a}g=c[22740+(g<<4)>>2]|0;if((h&192|0)==192){h=22528+((h&7)<<2)|0;if(!(c[5755]&256)){c[h>>2]=g;h=140;break b}else{c[h>>2]=c[h>>2]&-65536|g&65535;h=140;break b}}else{h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=140;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=140;break b}}}case 197:case 196:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;if((i&192|0)==192){x=2303;break a}p=Af(i)|0;if(Df((h|0)==196?0:3,i>>>3&7,p)|0){x=2304;break a}break}case 56:case 48:case 40:case 32:case 24:case 16:case 8:case 0:{j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=h>>>3;k=i>>>3;k=c[22528+((k&3)<<2)>>2]>>(k<<1&8);n=k&255;if((i&192|0)==192){p=22528+((i&3)<<2)|0;o=i<<1&8;n=Ef(j,c[p>>2]>>o&255,n)|0;c[p>>2]=c[p>>2]&~(255<<o)|(n&255)<<o;break b}m=Af(i)|0;i=m>>>12;g=(c[5770]|0)+i|0;if((j|0)==7){g=c[23084+(g<<2)>>2]|0;if(!(g&1))g=d[g+m>>0]|0;else{if(zf(m,0,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=n;c[5642]=g-k<<24>>24;c[5643]=6;break b}g=c[8411692+(g<<2)>>2]|0;if(!(g&1))g=d[g+m>>0]|0;else{if(zf(m,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Ef(j,g,n)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(i&1)if(!(Bf(m,g,0,2)|0))break b;else{x=2304;break a}else{a[i+m>>0]=g;break b}}case 1:{j=c[5758]|0;g=d[j>>0]|0;c[5758]=j+1;j=c[22528+((g>>>3&7)<<2)>>2]|0;if((g&192|0)==192){h=22528+((g&7)<<2)|0;g=c[h>>2]|0;c[5641]=j;g=g+j|0;c[5642]=g;c[5643]=2;c[h>>2]=g;h=1;break b}k=Af(g)|0;g=k>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|k)&3))g=i+k|0;else{if(zf(k,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;c[5641]=j;g=g+j|0;c[5642]=g;c[5643]=2;h=c[h>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=1;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=1;break b}}case 49:case 41:case 33:case 25:case 17:case 9:{j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=h>>>3;k=c[22528+((i>>>3&7)<<2)>>2]|0;if((i&192|0)==192){p=22528+((i&7)<<2)|0;c[p>>2]=Ff(j,c[p>>2]|0,k)|0;break b}m=Af(i)|0;i=m>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|m)&3)if(!(zf(m,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+m|0;g=Ff(j,c[g>>2]|0,k)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((i|m)&3)if(!(Bf(m,g,2,2)|0))break b;else{x=2304;break a}else{c[i+m>>2]=g;break b}}case 57:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){c[5641]=i;c[5642]=(c[22528+((h&7)<<2)>>2]|0)-i;c[5643]=8;h=57;break b}g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=h+g|0;g=c[g>>2]|0;c[5641]=i;c[5642]=g-i;c[5643]=8;h=57;break}case 58:case 50:case 42:case 34:case 26:case 18:case 10:case 2:{k=c[5758]|0;i=d[k>>0]|0;c[5758]=k+1;k=h>>>3;m=i>>>3;do if((i&192|0)==192)i=c[22528+((i&3)<<2)>>2]>>(i<<1&8)&255;else{i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!(j&1)){i=d[j+i>>0]|0;break}if(zf(i,0,0,2)|0){x=2304;break a}i=c[5762]|0}while(0);p=22528+((m&3)<<2)|0;o=m<<1&8;n=Ef(k,c[p>>2]>>o&255,i)|0;c[p>>2]=c[p>>2]&~(255<<o)|(n&255)<<o;break}case 3:{i=c[5758]|0;g=d[i>>0]|0;c[5758]=i+1;i=g>>>3&7;do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;h=22528+(i<<2)|0;p=c[h>>2]|0;c[5641]=g;g=p+g|0;c[5642]=g;c[5643]=2;c[h>>2]=g;h=3;break}case 51:case 43:case 35:case 27:case 19:case 11:{k=c[5758]|0;i=d[k>>0]|0;c[5758]=k+1;k=h>>>3;m=i>>>3&7;do if((i&192|0)!=192){i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((j|i)&3)if(!(zf(i,2,0,2)|0)){i=23048;break}else{x=2304;break a}else{i=j+i|0;break}}else i=22528+((i&7)<<2)|0;while(0);p=22528+(m<<2)|0;c[p>>2]=Ff(k,c[p>>2]|0,c[i>>2]|0)|0;break}case 59:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);h=c[h>>2]|0;c[5641]=h;c[5642]=(c[22528+(j<<2)>>2]|0)-h;c[5643]=8;h=59;break}case 60:case 52:case 44:case 36:case 28:case 20:case 12:case 4:{o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;p=Ef(h>>>3,c[5632]&255,p)|0;c[5632]=c[5632]&-256|p&255;break}case 5:{g=c[5758]|0;h=d[g+1>>0]<<8|d[g>>0]|d[g+2>>0]<<16|d[g+3>>0]<<24;c[5758]=g+4;g=c[5632]|0;c[5641]=h;g=h+g|0;c[5642]=g;c[5643]=2;c[5632]=g;h=5;break}case 45:case 37:case 29:case 21:case 13:{o=c[5758]|0;p=d[o+1>>0]<<8|d[o>>0]|d[o+2>>0]<<16|d[o+3>>0]<<24;c[5758]=o+4;c[5632]=Ff(h>>>3,c[5632]|0,p)|0;break}case 53:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0]|d[h+2>>0]<<16|d[h+3>>0]<<24;c[5758]=h+4;g=g^c[5632];c[5642]=g;c[5643]=14;c[5632]=g;h=53;break}case 61:{p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5641]=h;c[5642]=(c[5632]|0)-h;c[5643]=8;h=61;break}case 130:case 128:{i=c[5758]|0;j=d[i>>0]|0;k=i+1|0;c[5758]=k;m=j>>>3&7;if((j&192|0)==192){n=d[k>>0]|0;c[5758]=i+2;p=22528+((j&3)<<2)|0;o=j<<1&8;n=Ef(m,c[p>>2]>>o&255,n)|0;c[p>>2]=c[p>>2]&~(255<<o)|(n&255)<<o;break b}k=Af(j)|0;i=c[5758]|0;j=d[i>>0]|0;c[5758]=i+1;i=k>>>12;g=(c[5770]|0)+i|0;if((m|0)==7){g=c[23084+(g<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=j;c[5642]=g-j<<24>>24;c[5643]=6;break b}g=c[8411692+(g<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Ef(m,g,j)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(i&1)if(!(Bf(k,g,0,2)|0))break b;else{x=2304;break a}else{a[i+k>>0]=g;break b}}case 129:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;m=i>>>3&7;k=(i&192|0)==192;if((m|0)==7){do if(!k){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5641]=h;c[5642]=g-h;c[5643]=8;h=129;break b}if(k){p=d[h+2>>0]<<8|d[j>>0]|d[h+3>>0]<<16|d[h+4>>0]<<24;c[5758]=h+5;h=22528+((i&7)<<2)|0;c[h>>2]=Ff(m,c[h>>2]|0,p)|0;h=129;break b}j=Af(i)|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Ff(m,c[g>>2]|0,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=129;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=129;break b}}case 131:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;m=i>>>3&7;k=(i&192|0)==192;if((m|0)==7){do if(!k){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;p=c[5758]|0;h=a[p>>0]|0;c[5758]=p+1;c[5641]=h;c[5642]=g-h;c[5643]=8;h=131;break b}if(k){p=a[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;c[h>>2]=Ff(m,c[h>>2]|0,p)|0;h=131;break b}j=Af(i)|0;i=c[5758]|0;h=a[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Ff(m,c[g>>2]|0,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=131;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=131;break b}}case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:{g=22528+((h&7)<<2)|0;i=c[g>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=i+1|0;c[5642]=p;c[5643]=27;c[g>>2]=p;g=p;break}case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:{g=22528+((h&7)<<2)|0;i=c[g>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=i+-1|0;c[5642]=p;c[5643]=30;c[g>>2]=p;g=p;break}case 107:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);h=c[h>>2]|0;o=c[5758]|0;n=a[o>>0]|0;c[5758]=o+1;o=Dl(((n|0)<0?0-n|0:n)|0,0,((h|0)<0?0-h|0:h)|0,0)|0;p=y;n=(h^n|0)>-1;h=n?o:0-o|0;c[5642]=h;c[5641]=(n?p:(o|0)==0?0-p|0:~p)-(h>>31);c[5643]=23;c[22528+(j<<2)>>2]=h;h=107;break}case 105:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);n=c[h>>2]|0;p=c[5758]|0;h=d[p+3>>0]<<24;o=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|h;c[5758]=p+4;o=Dl(((o|0)<0?0-o|0:o)|0,0,((n|0)<0?0-n|0:n)|0,0)|0;p=y;n=(h^n|0)>-1;h=n?o:0-o|0;c[5642]=h;c[5641]=(n?p:(o|0)==0?0-p|0:~p)-(h>>31);c[5643]=23;c[22528+(j<<2)>>2]=h;h=105;break}case 132:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&3)<<2)>>2]>>(i<<1&8)&255;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=i>>>3;c[5642]=(c[22528+((h&3)<<2)>>2]>>(h<<1&8)&g)<<24>>24;c[5643]=12;h=132;break}case 133:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)!=192){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;c[5642]=c[22528+((i>>>3&7)<<2)>>2]&g;c[5643]=14;h=133;break}case 168:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5642]=(c[5632]&h)<<24>>24;c[5643]=12;h=168;break}case 169:{p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5642]=h&c[5632];c[5643]=14;h=169;break}case 246:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5642]=(g&h)<<24>>24;c[5643]=12;h=246;break b}case 2:{if((h&192|0)==192){p=22528+((h&3)<<2)|0;o=c[p>>2]|0;h=h<<1&8;c[p>>2]=(o>>h&255^255)<<h|o&~(255<<h);h=246;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}g=~g;h=c[h>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=246;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=246;break b}}case 3:{if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;o=c[p>>2]>>h;c[5641]=o&255;o=0-(o<<24)>>24;c[5642]=o;c[5643]=6;c[p>>2]=c[p>>2]&~(255<<h)|(o&255)<<h;h=246;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}c[5641]=g;g=0-(g<<24)>>24;c[5642]=g;c[5643]=6;h=c[h>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=246;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=246;break b}}case 4:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;p=N(h&255,g&255)|0;c[5641]=p>>>8;c[5642]=p<<24>>24;c[5643]=21;c[5632]=p|h&-65536;h=246;break b}case 5:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;p=N(h<<24>>24,g<<24>>24)|0;o=p<<24>>24;c[5642]=o;c[5641]=(p|0)!=(o|0)&1;c[5643]=21;c[5632]=p&65535|h&-65536;h=246;break b}case 6:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;i=h&65535;j=g&255;if(i>>>8>>>0>=j>>>0){x=359;break a}p=(i>>>0)/(j>>>0)|0;c[5632]=p&255|h&-65536|i-(N(p,j)|0)<<8&65280;h=246;break b}case 7:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;i=h<<16>>16;p=g<<24;j=p>>24;if(!p){x=367;break a}k=(i|0)/(j|0)|0;if((k<<24>>24|0)!=(k|0)){x=369;break a}c[5632]=k&255|h&-65536|i-(N(k,j)|0)<<8&65280;h=246;break b}default:{x=2303;break a}}}case 247:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5642]=h&g;c[5643]=14;h=247;break b}case 2:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=~c[h>>2];h=247;break b}j=Af(h)|0;g=j>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|j)&3))g=i+j|0;else{if(zf(j,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=~c[g>>2];h=c[h>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=247;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=247;break b}}case 3:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[5641]=p;p=0-p|0;c[5642]=p;c[5643]=8;c[h>>2]=p;h=247;break b}j=Af(h)|0;g=j>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|j)&3))g=i+j|0;else{if(zf(j,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;c[5641]=g;g=0-g|0;c[5642]=g;c[5643]=8;h=c[h>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=247;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=247;break b}}case 4:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;p=Dl(c[5632]|0,0,g|0,0)|0;h=y;c[5642]=p;c[5641]=h;c[5643]=23;c[5632]=p;c[5634]=h;h=247;break b}case 5:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;n=c[5632]|0;o=Dl(((n|0)<0?0-n|0:n)|0,0,((g|0)<0?0-g|0:g)|0,0)|0;h=y;n=(n^g|0)>-1;p=n?o:0-o|0;h=n?h:(o|0)==0?0-h|0:~h;c[5642]=p;c[5641]=h-(p>>31);c[5643]=23;c[5632]=p;c[5634]=h;h=247;break b}case 6:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;h=c[5634]|0;if(h>>>0>=g>>>0){x=414;break a}o=c[5632]|0;p=Fl(o|0,h|0,g|0,0)|0;h=yl(o|0,h|0,Dl(p|0,y|0,g|0,0)|0,y|0)|0;c[5632]=p;c[5634]=h;h=247;break b}case 7:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;m=c[5634]|0;h=c[5632]|0;i=(m|0)<0;k=i?((h|0)==0?0-m|0:~m):m;m=m>>>31;j=(g|0)<0?0-g|0:g;if(k>>>0>=j>>>0){x=422;break a}i=i?0-h|0:h;h=Fl(i|0,k|0,j|0,0)|0;i=yl(i|0,k|0,Dl(h|0,y|0,j|0,0)|0,y|0)|0;if((g>>>31|0)==(m|0)){if((h|0)<0){x=428;break a}}else{if(h>>>0>2147483648){x=425;break a}h=0-h|0}c[5632]=h;c[5634]=(m|0)==0?i:0-i|0;h=247;break b}default:{x=2303;break a}}}case 192:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=d[j>>0]|0;c[5758]=h+2;h=22528+((i&3)<<2)|0;p=i<<1&8;o=Gf(k,c[h>>2]>>p&255,o)|0;c[h>>2]=c[h>>2]&~(255<<p)|(o&255)<<p;h=192;break b}j=Af(i)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Gf(k,g,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=192;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=192;break b}}case 193:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){p=d[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;c[h>>2]=Hf(k,c[h>>2]|0,p)|0;h=193;break b}j=Af(i)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Hf(k,c[g>>2]|0,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=193;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=193;break b}}case 208:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;o=Gf(i,c[p>>2]>>h&255,1)|0;c[p>>2]=c[p>>2]&~(255<<h)|(o&255)<<h;h=208;break b}j=Af(h)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Gf(i,g,1)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=208;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=208;break b}}case 209:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=Hf(i,c[h>>2]|0,1)|0;h=209;break b}j=Af(h)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Hf(i,c[g>>2]|0,1)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=209;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=209;break b}}case 210:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;j=c[5633]&255;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;o=Gf(i,c[p>>2]>>h&255,j)|0;c[p>>2]=c[p>>2]&~(255<<h)|(o&255)<<h;h=210;break b}k=Af(h)|0;h=k>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Gf(i,g,j)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(h&1)if(!(Bf(k,g,0,2)|0)){h=210;break b}else{x=2304;break a}else{a[h+k>>0]=g;h=210;break b}}case 211:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;j=c[5633]&255;if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=Hf(i,c[h>>2]|0,j)|0;h=211;break b}k=Af(h)|0;h=k>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;g=Hf(i,c[g>>2]|0,j)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=211;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=211;break b}}case 152:{c[5632]=c[5632]<<16>>16;h=152;break}case 153:{c[5634]=c[5632]>>31;h=153;break}case 87:case 86:case 85:case 84:case 83:case 82:case 81:case 80:{g=c[22528+((h&7)<<2)>>2]|0;k=(c[5636]|0)+-4|0;if(!(c[5731]|0)){i=(c[5729]&k)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,g,2,2)|0){x=2304;break a}}else c[j+i>>2]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&k;break b}else{i=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((i|k)&3){if(Bf(k,g,2,2)|0){x=2304;break a}}else c[i+k>>2]=g;c[5636]=k;break b}}case 95:case 94:case 93:case 92:case 91:case 90:case 89:case 88:{k=c[5636]|0;if(!(c[5731]|0)){g=c[5729]|0;i=(g&k)+(c[5694]|0)|0;j=c[23084+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((j|i)&3)){m=g;g=j+i|0}else{if(zf(i,2,0,2)|0){x=2304;break a}m=c[5729]|0;k=c[5636]|0;g=23048}i=k&~m|k+4&m}else{g=c[23084+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,0,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=k+4|0}g=c[g>>2]|0;c[5636]=i;c[22528+((h&7)<<2)>>2]=g;break}case 96:{if(!(If()|0))h=96;else{x=2304;break a}break}case 97:{if(!(Jf()|0))h=97;else{x=2304;break a}break}case 143:{j=c[5758]|0;k=d[j>>0]|0;c[5758]=j+1;j=(k&192|0)==192;h=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){g=23048;x=508}else h=1;else{g=i+h|0;x=508}if((x|0)==508){x=0;h=0;g=c[g>>2]|0}if(j){if(h){x=2304;break a}p=c[5636]|0;h=c[5729]|0;c[5636]=p&~h|p+4&h;c[22528+((k&7)<<2)>>2]=g;h=143;break b}if(h){x=2304;break a}i=c[5636]|0;j=c[5729]|0;j=i&~j|i+4&j;c[5636]=j;h=Af(k)|0;c[5636]=i;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;c[5636]=j;h=143;break}case 104:{j=c[5758]|0;g=d[j+1>>0]<<8|d[j>>0]|d[j+2>>0]<<16|d[j+3>>0]<<24;c[5758]=j+4;j=(c[5636]|0)+-4|0;if(!(c[5731]|0)){h=(c[5729]&j)+(c[5694]|0)|0;i=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;h=c[5729]|0;c[5636]=c[5636]&~h|h&j;h=104;break b}else{h=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((h|j)&3){if(Bf(j,g,2,2)|0){x=2304;break a}}else c[h+j>>2]=g;c[5636]=j;h=104;break b}}case 106:{j=c[5758]|0;g=a[j>>0]|0;c[5758]=j+1;j=(c[5636]|0)+-4|0;if(!(c[5731]|0)){h=(c[5729]&j)+(c[5694]|0)|0;i=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;h=c[5729]|0;c[5636]=c[5636]&~h|h&j;h=106;break b}else{h=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((h|j)&3){if(Bf(j,g,2,2)|0){x=2304;break a}}else c[h+j>>2]=g;c[5636]=j;h=106;break b}}case 200:{n=c[5758]|0;o=d[n+1>>0]<<8|d[n>>0];p=n+2|0;c[5758]=p;p=d[p>>0]|0;c[5758]=n+3;if(!(Kf(o,p)|0))h=200;else{x=2304;break a}break}case 201:{if(!(c[5731]|0))if(!(Lf()|0)){h=201;break b}else{x=2304;break a}h=c[5637]|0;g=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((g|h)&3)if(!(zf(h,2,0,2)|0))g=23048;else{x=2304;break a}else g=g+h|0;g=c[g>>2]|0;c[5637]=g;c[5636]=h+4;h=201;break}case 156:{g=c[5766]|0;if(g|0?c[g+12>>2]&65536|0:0){x=544;break a}p=c[5647]|0;if((p&131072|0)!=0&(p&12288|0)!=12288){x=2302;break a}k=sf()|0;g=k&-196609;h=c[5636]|0;if(!(c[5755]&256)){h=h+-4|0;i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,g,2,2)|0){x=2304;break a}}else c[j+i>>2]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=156;break b}else{h=h+-2|0;i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&1){if(Bf(i,g,1,2)|0){x=2304;break a}}else b[j+i>>1]=k;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=156;break b}}case 157:{g=c[5766]|0;if(g|0?c[g+12>>2]&131072|0:0){x=557;break a}p=c[5647]|0;m=p>>>12&3;if((p&131072|0)!=0&(m|0)!=3){x=2302;break a}i=c[5636]|0;h=c[5729]|0;j=(h&i)+(c[5694]|0)|0;k=c[23084+((j>>>12)+(c[5770]|0)<<2)>>2]|0;g=k|j;if(!(c[5755]&256)){if(!(g&3))g=k+j|0;else{if(zf(j,2,0,2)|0){x=2304;break a}h=c[5729]|0;i=c[5636]|0;g=23048}g=c[g>>2]|0;k=i&~h;j=i+4|0;i=-1}else{if(!(g&1))g=e[k+j>>1]|0;else{if(zf(j,1,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5729]|0;i=c[5636]|0}k=i&~h;j=i+2|0;i=65535}c[5636]=k|j&h;h=a[22968]|0;h=(h<<24>>24==0?2388736:m>>>0<(h&255)>>>0?2375936:2376448)&i;c[5641]=g&2261;c[5642]=g>>>6&1^1;c[5643]=24;c[5646]=1-(g>>>9&2);h=c[5647]&~h|h&g;c[5647]=h;i=c[5766]|0;j=(i|0)==0;if((!j?c[i+96>>2]&256|0:0)?(h&512|0)!=0&(a[22970]|0)==0:0){x=580;break a}if(a[22971]|0){if(j)h=h>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(c[i+96>>2]&16777216)h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=580;break a}else h=157}else h=157;break}case 30:case 22:case 14:case 6:{i=c[22740+(h>>>3<<4)>>2]|0;j=(c[5636]|0)+-4|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&3){if(Bf(k,i,2,2)|0){x=2304;break a}}else c[m+k>>2]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break}case 31:case 23:case 7:{g=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=i+g|0;g=c[g>>2]|0;i=h>>>3;if(Cf(i,g&65535)|0){x=2304;break a}o=c[5636]|0;p=c[5729]|0;c[5636]=o&~p|o+4&p;if((i|0)==2){x=590;break a}break}case 141:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}c[5755]=c[5755]&-16|11;c[22528+((h>>>3&7)<<2)>>2]=Af(h)|0;h=141;break}case 254:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{if((h&192|0)==192){k=22528+((h&3)<<2)|0;h=h<<1&8;i=c[k>>2]>>h;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<24)+16777216>>24;c[5642]=p;c[5643]=25;c[k>>2]=c[k>>2]&~(255<<h)|(p&255)<<h;h=254;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<24)+16777216>>24;c[5642]=g;c[5643]=25;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=254;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=254;break b}}case 1:{if((h&192|0)==192){k=22528+((h&3)<<2)|0;h=h<<1&8;i=c[k>>2]>>h;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<24)+-16777216>>24;c[5642]=p;c[5643]=28;c[k>>2]=c[k>>2]&~(255<<h)|(p&255)<<h;h=254;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<24)+-16777216>>24;c[5642]=g;c[5643]=28;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=254;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=254;break b}}default:{x=2303;break a}}}case 255:{k=c[5758]|0;p=a[k>>0]|0;g=p&255;c[5758]=k+1;k=g&56;switch((p&255)>>>3&7){case 0:{if((g&192|0)==192){g=22528+((g&7)<<2)|0;h=c[g>>2]|0;i=c[5643]|0;if((i|0)<25){c[5645]=i;c[5644]=c[5642]}h=h+1|0;c[5642]=h;c[5643]=27;c[g>>2]=h;g=h;h=255;break b}j=Af(g)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;h=c[g>>2]|0;g=c[5643]|0;if((g|0)<25){c[5645]=g;c[5644]=c[5642]}g=h+1|0;c[5642]=g;c[5643]=27;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=255;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=255;break b}}case 1:{if((g&192|0)==192){g=22528+((g&7)<<2)|0;h=c[g>>2]|0;i=c[5643]|0;if((i|0)<25){c[5645]=i;c[5644]=c[5642]}h=h+-1|0;c[5642]=h;c[5643]=30;c[g>>2]=h;g=h;h=255;break b}j=Af(g)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;h=c[g>>2]|0;g=c[5643]|0;if((g|0)<25){c[5645]=g;c[5644]=c[5642]}g=h+-1|0;c[5642]=g;c[5643]=30;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=255;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=255;break b}}case 2:{do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;k=(c[5761]|0)+(c[5758]|0)|0;h=(c[5636]|0)+-4|0;do if(c[5731]|0){i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,k,2,2)|0))break;else{x=2304;break a}else{c[i+h>>2]=k;break}}else{i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,k,2,2)|0){x=2304;break a}}else c[j+i>>2]=k;p=c[5729]|0;h=c[5636]&~p|p&h}while(0);c[5636]=h;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=255;break b}case 4:{do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=255;break b}case 6:{do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;j=(c[5636]|0)+-4|0;if(!(c[5731]|0)){h=(c[5729]&j)+(c[5694]|0)|0;i=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;h=c[5729]|0;c[5636]=c[5636]&~h|h&j;h=255;break b}else{h=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((h|j)&3){if(Bf(j,g,2,2)|0){x=2304;break a}}else c[h+j>>2]=g;c[5636]=j;h=255;break b}}case 5:case 3:{if((g&192|0)==192){x=2303;break a}i=Af(g)|0;g=c[5770]|0;h=c[23084+(g+(i>>>12)<<2)>>2]|0;if(!((h|i)&3)){j=g;g=h+i|0}else{if(zf(i,2,0,2)|0){x=2304;break a}j=c[5770]|0;g=23048}g=c[g>>2]|0;i=i+4|0;h=c[23084+(j+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}h=c[5762]|0}i=(c[5761]|0)+(c[5758]|0)|0;if((k|0)==24){if(Mf(1,h,g,i)|0){x=2304;break a}}else if(Nf(h,g,i)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=702;break a}if(!(a[22971]|0)){h=255;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=255;break b}else{x=702;break a}}default:{x=2303;break a}}}case 235:{h=c[5758]|0;g=a[h>>0]|0;h=g+(h+1)+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=235;break}case 233:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0]|d[h+2>>0]<<16|d[h+3>>0]<<24;h=(c[5761]|0)+(h+4)+g|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=233;break}case 234:{i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0];h=i+2|0;if(!(c[5755]&256)){g=d[h>>0]<<16|g|d[i+3>>0]<<24;h=i+4|0}c[5758]=h;o=d[h+1>>0]<<8|d[h>>0];p=h+2|0;c[5758]=p;if(Nf(o,g,(c[5761]|0)+p|0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=719;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=719;break a}else h=234}else h=234;break}case 112:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(uf()|0))h=112;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=112}break}case 113:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(uf()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=113}else h=113;break}case 114:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(nf(22528)|0))h=114;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=114}break}case 115:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(nf(22528)|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=115}else h=115;break}case 116:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if(!(c[5642]|0)){h=g+h+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=116}else h=116;break}case 117:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if(!(c[5642]|0))h=117;else{h=g+h+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=117}break}case 118:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Of()|0))h=118;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=118}break}case 119:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Of()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=119}else h=119;break}case 120:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if((c[5643]|0)==24){if(!(c[5641]&128)){h=120;break b}}else if((c[5642]|0)>=0){h=120;break b}h=h+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=120;break}case 121:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if((c[5643]|0)==24){if(c[5641]&128|0){h=121;break b}}else if((c[5642]|0)<0){h=121;break b}h=h+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=121;break}case 122:{i=c[5758]|0;g=a[i>>0]|0;i=i+1|0;c[5758]=i;if((c[5643]|0)==24)h=(c[5641]|0)>>>2&1;else h=d[21168+(c[5642]&255)>>0]|0;if(!h)h=122;else{h=i+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=122}break}case 123:{i=c[5758]|0;g=a[i>>0]|0;i=i+1|0;c[5758]=i;if((c[5643]|0)==24)h=(c[5641]|0)>>>2&1;else h=d[21168+(c[5642]&255)>>0]|0;if(!h){h=i+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=123}else h=123;break}case 124:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Pf()|0))h=124;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=124}break}case 125:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Pf()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=125}else h=125;break}case 126:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Qf()|0))h=126;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=126}break}case 127:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Qf()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=127}else h=127;break}case 226:case 225:case 224:{j=c[5758]|0;g=a[j>>0]|0;j=j+1|0;c[5758]=j;k=c[5755]|0;m=k<<9&65536;p=c[5633]|0;i=m+-1&p+-1;c[5633]=i|p&0-m;m=h&3;switch(h&3){case 0:{h=(c[5642]|0)!=0;break}case 1:{h=(c[5642]|0)==0;break}default:h=1}if((i|0)!=0&h){h=j+g+(c[5761]|0)|0;if(!(k&256)){c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=m;break b}else{h=h&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=m;break b}}else h=m;break}case 227:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;i=c[5755]|0;if(!((i<<9&65536)+-1&c[5633])){h=h+g+(c[5761]|0)|0;if(!(i&256)){c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=227;break b}else{h=h&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=227;break b}}else h=227;break}case 194:{h=c[5758]|0;m=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=c[5636]|0;g=c[5729]|0;i=(g&h)+(c[5694]|0)|0;j=c[23084+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((j|i)&3)){k=g;g=j+i|0}else{if(zf(i,2,0,2)|0){x=2304;break a}k=c[5729]|0;h=c[5636]|0;g=23048}g=c[g>>2]|0;c[5636]=m+4+h&k|h&~k;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=194;break}case 195:{j=c[5636]|0;if(!(c[5731]|0)){g=c[5729]|0;h=(g&j)+(c[5694]|0)|0;i=c[23084+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|h)&3)){k=g;g=i+h|0}else{if(zf(h,2,0,2)|0){x=2304;break a}k=c[5729]|0;j=c[5636]|0;g=23048}h=j&~k|j+4&k}else{g=c[23084+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if(!((g|j)&3)){h=j;g=g+j|0}else{if(zf(j,2,0,2)|0){x=2304;break a}h=c[5636]|0;g=23048}h=h+4|0}g=c[g>>2]|0;c[5636]=h;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=195;break}case 232:{k=c[5758]|0;g=d[k+1>>0]<<8|d[k>>0]|d[k+2>>0]<<16|d[k+3>>0]<<24;k=k+4|0;c[5758]=k;k=(c[5761]|0)+k|0;h=(c[5636]|0)+-4|0;do if(c[5731]|0){i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,k,2,2)|0))break;else{x=2304;break a}else{c[i+h>>2]=k;break}}else{i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,k,2,2)|0){x=2304;break a}}else c[j+i>>2]=k;p=c[5729]|0;h=c[5636]&~p|p&h}while(0);c[5636]=h;h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=232;break}case 154:{j=(c[5755]|0)>>>8&1^1;i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0];h=i+2|0;if(j){g=d[h>>0]<<16|g|d[i+3>>0]<<24;h=i+4|0}c[5758]=h;o=d[h+1>>0]<<8|d[h>>0];p=h+2|0;c[5758]=p;if(Mf(j,o,g,(c[5761]|0)+p|0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=813;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=813;break a}else h=154}else h=154;break}case 202:{o=c[5758]|0;p=d[o+1>>0]<<8|d[o>>0];c[5758]=o+2;if(Rf((c[5755]|0)>>>8&1^1,p)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=826;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=826;break a}else h=202}else h=202;break}case 203:{if(Rf((c[5755]|0)>>>8&1^1,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=839;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=839;break a}else h=203}else h=203;break}case 207:{h=c[5766]|0;if(h|0?c[h+12>>2]&1048576|0:0){x=842;break a}if(Sf((c[5755]|0)>>>8&1^1,(c[5761]|0)+(c[5758]|0)|0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=855;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=855;break a}else h=207}else h=207;break}case 144:break;case 204:{if(pf(3,2,(c[5761]|0)+(c[5758]|0)|0,0,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=868;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=868;break a}else h=204}else h=204;break}case 205:{h=c[5758]|0;g=d[h>>0]|0;h=h+1|0;c[5758]=h;p=c[5647]|0;if(!((p&131072|0)==0|(p&12288|0)==12288)){x=2302;break a}p=c[5761]|0;c[5640]=p+(c[5760]|0);if(pf(g,2,p+h|0,0,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=882;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=882;break a}else h=205}else h=205;break}case 206:{if(uf()|0){if(pf(4,2,(c[5761]|0)+(c[5758]|0)|0,0,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=896;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=896;break a}else h=206}else h=206}else h=206;break}case 98:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}if(!(Tf(h>>>3&7,Af(h)|0)|0))h=98;else{x=2304;break a}break}case 245:{h=nf(22528)|0;if((c[5643]|0)==24){p=c[5641]|0;i=p>>>7&1;h=p&4|h|((c[5642]|0)==0&1)<<6}else{p=c[5642]|0;i=p>>>31;h=d[21168+(p&255)>>0]<<2|h|((p|0)==0&1)<<6}h=i<<7|h|(uf()|0)<<11|(vf()|0);c[5641]=h^1;c[5642]=h>>>6&1^1;c[5643]=24;h=245;break}case 248:{h=nf(22528)|0;if((c[5643]|0)==24){p=c[5641]|0;i=p>>>7&1;h=p&4|h|((c[5642]|0)==0&1)<<6}else{p=c[5642]|0;i=p>>>31;h=d[21168+(p&255)>>0]<<2|h|((p|0)==0&1)<<6}h=i<<7|h|(uf()|0)<<11|(vf()|0);c[5641]=h&-2;c[5642]=h>>>6&1^1;c[5643]=24;h=248;break}case 249:{h=nf(22528)|0;if((c[5643]|0)==24){p=c[5641]|0;i=p>>>7&1;h=p&4|h|((c[5642]|0)==0&1)<<6}else{p=c[5642]|0;i=p>>>31;h=d[21168+(p&255)>>0]<<2|h|((p|0)==0&1)<<6}h=i<<7|h|(uf()|0)<<11|(vf()|0);c[5641]=h|1;c[5642]=h>>>6&1^1;c[5643]=24;h=249;break}case 214:{g=0-(nf(22528)|0)|0;c[5632]=c[5632]&-256|g&255;h=214;break}case 252:{c[5646]=1;h=252;break}case 253:{c[5646]=-1;h=253;break}case 250:{h=c[5647]|0;if((h>>>12&3)>>>0<(d[22968]|0)>>>0){x=2302;break a}c[5647]=h&-513;h=250;break}case 158:{h=c[5632]|0;c[5641]=h>>>8&213|(uf()|0)<<11;c[5642]=h>>>14&1^1;c[5643]=24;h=158;break}case 159:{g=sf()|0;c[5632]=c[5632]&-65281|g<<8&65280;h=159;break}case 164:{h=Uf()|0;if((h|0)<0){x=2304;break a}if(!h)h=164;else{c[5758]=c[5760];h=164}break}case 165:{h=Vf()|0;if((h|0)<0){x=2304;break a}if(!h)h=165;else{c[5758]=c[5760];h=165}break}case 170:{h=Wf()|0;if((h|0)<0){x=2304;break a}if(!h)h=170;else{c[5758]=c[5760];h=170}break}case 171:{h=Xf()|0;if((h|0)<0){x=2304;break a}if(!h)h=171;else{c[5758]=c[5760];h=171}break}case 166:{h=Yf()|0;if((h|0)<0){x=2304;break a}if(!h)h=166;else{c[5758]=c[5760];h=166}break}case 167:{h=Zf()|0;if((h|0)<0){x=2304;break a}if(!h)h=167;else{c[5758]=c[5760];h=167}break}case 172:{h=_f()|0;if((h|0)<0){x=2304;break a}if(!h)h=172;else{c[5758]=c[5760];h=172}break}case 173:{h=$f()|0;if((h|0)<0){x=2304;break a}if(!h)h=173;else{c[5758]=c[5760];h=173}break}case 174:{h=ag()|0;if((h|0)<0){x=2304;break a}if(!h)h=174;else{c[5758]=c[5760];h=174}break}case 175:{h=bg()|0;if((h|0)<0){x=2304;break a}if(!h)h=175;else{c[5758]=c[5760];h=175}break}case 108:{h=cg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=969;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=969;break a}else h=108}else h=108;break}case 109:{h=dg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=984;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=984;break a}else h=109}else h=109;break}case 110:{h=eg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=999;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=999;break a}else h=110}else h=110;break}case 111:{h=fg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1014;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1014;break a}else h=111}else h=111;break}case 223:case 222:case 221:case 220:case 219:case 218:case 217:case 216:{if(c[5732]&12|0){x=1016;break a}j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=i>>>3&7|h<<3&56;if((i&192|0)==192)if(!(gg(j,i&7)|0))break b;else{x=2304;break a}else if(!(hg(j,Af(i)|0)|0))break b;else{x=2304;break a}}case 155:{h=c[5732]|0;if(h&12|0){x=1021;break a}if((h&32|0)==0|(b[11298]&128)==0)h=155;else{x=1023;break a}break}case 228:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,0,0)|0){x=2304;break a}h=Ya[c[16808512>>2]&63](c[4202130]|0,g,0)|0;c[5632]=c[5632]&-256|h&255;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1036;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1036;break a}else h=228}else h=228;break}case 229:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,2,0)|0){x=2304;break a}c[5632]=Ya[c[16808512>>2]&63](c[4202130]|0,g,2)|0;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1049;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1049;break a}else h=229}else h=229;break}case 230:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,0,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&255,0);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1062;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1062;break a}else h=230}else h=230;break}case 231:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,2,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]|0,2);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1075;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1075;break a}else h=231}else h=231;break}case 236:{p=c[5634]|0;g=p&65535;if(ig(p&65535,0,0)|0){x=2304;break a}h=Ya[c[16808512>>2]&63](c[4202130]|0,g,0)|0;c[5632]=c[5632]&-256|h&255;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1088;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1088;break a}else h=236}else h=236;break}case 237:{p=c[5634]|0;g=p&65535;if(ig(p&65535,2,0)|0){x=2304;break a}c[5632]=Ya[c[16808512>>2]&63](c[4202130]|0,g,2)|0;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1101;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1101;break a}else h=237}else h=237;break}case 238:{p=c[5634]|0;g=p&65535;if(ig(p&65535,0,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&255,0);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1114;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1114;break a}else h=238}else h=238;break}case 239:{p=c[5634]|0;g=p&65535;if(ig(p&65535,2,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]|0,2);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1127;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1127;break a}else h=239}else h=239;break}case 39:{jg();h=39;break}case 47:{kg();h=47;break}case 55:{lg();h=55;break}case 63:{mg();h=63;break}case 212:{p=c[5758]|0;g=d[p>>0]|0;c[5758]=p+1;if(!(ng(g)|0))h=212;else{x=2304;break a}break}case 213:{h=c[5758]|0;g=d[h>>0]|0;c[5758]=h+1;og(g);h=213;break}case 99:{if(!(c[5732]&1)){x=2303;break a}if(c[5647]&131072|0){x=2303;break a}p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;if((i&192|0)==192)h=0;else h=Af(i)|0;if(!(pg(i,h)|0))h=99;else{x=2304;break a}break}case 15:{n=c[5758]|0;p=a[n>>0]|0;o=p&255;h=n+1|0;c[5758]=h;do switch(p<<24>>24){case -113:case -114:case -115:case -116:case -117:case -118:case -119:case -120:case -121:case -122:case -123:case -124:case -125:case -126:case -127:case -128:{g=d[n+2>>0]<<8|d[h>>0]|d[n+3>>0]<<16|d[n+4>>0]<<24;c[5758]=n+5;if(!(qg(o&15)|0)){h=o;break b}h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case -97:case -98:case -99:case -100:case -101:case -102:case -103:case -104:case -105:case -106:case -107:case -108:case -109:case -110:case -111:case -112:{h=d[h>>0]|0;c[5758]=n+2;g=qg(o&15)|0;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;c[p>>2]=c[p>>2]&~(255<<h)|(g&255)<<h;h=o;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(i&1)if(!(Bf(h,g,0,2)|0)){h=o;break b}else{x=2304;break a}else{a[i+h>>0]=g;h=o;break b}}case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:{i=d[h>>0]|0;c[5758]=n+2;do if((i&192|0)!=192){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;if(!(qg(o&15)|0)){h=o;break b}c[22528+((i>>>3&7)<<2)>>2]=g;h=o;break b}case -74:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g;h=182;break b}case -73:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]&65535;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g;h=183;break b}case -66:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g<<24>>24;h=190;break b}case -65:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]|0;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g<<16>>16;h=191;break b}case 0:{if((c[5647]|0)>>>17&1|c[5732]&1^1|0){x=2303;break a}j=d[h>>0]|0;c[5758]=n+2;i=j>>>3;k=i&7;switch(i&7){case 1:case 0:{g=c[5766]|0;if(g|0?c[g+12>>2]&1<<(k|8)|0:0){x=1186;break a}g=(k|0)==0?c[5709]|0:c[5713]|0;if((j&192|0)==192){h=22528+((j&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=0;break b}h=Af(j)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=0;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=0;break b}}case 3:case 2:{if(a[22968]|0){x=2302;break a}g=k+106|0;h=c[5766]|0;if(h|0?c[h+12>>2]&1<<(g&31)|0:0){x=1195;break a}do if((j&192|0)==192)g=c[22528+((j&7)<<2)>>2]&65535;else{g=Af(j)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if((k|0)==2)if(!(rg(g,0)|0)){h=0;break b}else{x=2304;break a}p=g&65535;o=g&65532;if(!o){c[5714]=0;i=0;h=0}else{if(g&4|0){x=1207;break a}h=g&65528;if((h|7)>>>0>(c[5719]|0)>>>0){x=1209;break a}i=(c[5718]|0)+h|0;h=c[23084+(i>>>12<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,0)|0))h=23048;else{x=2304;break a}else h=h+i|0;n=c[h>>2]|0;m=i+4|0;j=m>>>12;h=c[23084+(j<<2)>>2]|0;if((h|m)&3)if(!(zf(m,2,0,0)|0))h=23048;else{x=2304;break a}else h=h+m|0;k=c[h>>2]|0;if(k&4096|0){x=1218;break a}if((k>>>8&7|8|0)!=9){x=1218;break a}if(!(k&32768)){x=1220;break a}i=k|512;h=c[8411692+(j<<2)>>2]|0;if((h|m)&3){if(Bf(m,i,2,0)|0){x=2304;break a}}else c[h+m>>2]=i;c[5714]=k&-16777216|n>>>16|k<<16&16711680;h=k&983040|n&65535;i=k;h=(k&8388608|0)==0?h:h<<12|4095}c[5715]=h;c[5716]=i;c[5713]=p;h=0;break b}case 5:case 4:{do if((j&192|0)==192)g=c[22528+((j&7)<<2)>>2]&65535;else{g=Af(j)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if(!(sg(g,i&1)|0)){h=0;break b}else{x=2304;break a}}default:{x=2303;break a}}}case 1:{h=a[h>>0]|0;k=h&255;j=n+2|0;c[5758]=j;p=k>>>3;m=p&7;switch(p&7){case 1:case 0:{if((k&192|0)==192){x=2303;break a}h=1-m+102|0;i=c[5766]|0;if(i|0?c[i+(h>>>5<<2)>>2]&1<<(h&31)|0:0){x=1237;break a}j=Af(k)|0;k=m|8;h=c[22740+(k<<4)+8>>2]|0;i=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((i|j)&1){if(Bf(j,h,1,2)|0){x=2304;break a}}else b[i+j>>1]=h;j=j+2|0;h=c[22740+(k<<4)+4>>2]|0;i=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((i|j)&3)if(!(Bf(j,h,2,2)|0)){h=1;break b}else{x=2304;break a}else{c[i+j>>2]=h;h=1;break b}}case 3:case 2:{if((k&192|0)!=192){if(a[22968]|0){x=2302;break a}g=3-m+106|0;h=c[5766]|0;if(h|0?c[h+(g>>>5<<2)>>2]&1<<(g&31)|0:0){x=1362;break a}i=Af(k)|0;h=c[5770]|0;g=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((g|i)&1))g=e[g+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5770]|0}i=i+2|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,2)|0))h=23048;else{x=2304;break a}else h=h+i|0;h=c[h>>2]|0;h=(c[5755]&256|0)==0?h:h&16777215;if((m|0)==2){c[5718]=h;c[5719]=g;h=1;break b}else{c[5722]=h;c[5723]=g;h=1;break b}}switch(h&7){case 1:{x=1290;break a}case 0:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&1|0:0){x=1251;break a}m=c[5761]|0;c[5640]=m+(c[5760]|0);m=m+j|0;h=c[5632]|0;if(h&4095|0){x=1275;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=1275;break a}if(!(c[i+32>>2]|0)){x=1275;break a}n=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!n){x=1275;break a}h=c[5765]|0;if(h&4095|0){x=1275;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=1275;break a}if(!(c[i+32>>2]|0)){x=1275;break a}k=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!k){x=1275;break a}j=n+1368|0;i=c[j>>2]|0;j=c[j+4>>2]|0;do if(!((i&1|0)==0&0==0)){if(!(0==0?(c[n+1392>>2]&131072|0)==0:0)){h=3;break}h=a[n+1227>>0]|0;if((h&255)>3){x=1275;break a}else h=h&255}else h=0;while(0);if(0==0?(c[n+144>>2]&1|0)==0:0){if(!(j>>>0>0|(j|0)==0&i>>>0>2147483647)){x=1275;break a}}else if(!(c[5735]&32)){x=1275;break a}i=k+1128|0;c[i>>2]=c[5718];c[i+4>>2]=0;c[k+1124>>2]=c[5719];i=k+1160|0;c[i>>2]=c[5722];c[i+4>>2]=0;c[k+1156>>2]=c[5723];i=k+1368|0;c[i>>2]=c[5732];c[i+4>>2]=0;i=k+1360|0;c[i>>2]=c[5734];c[i+4>>2]=0;i=k+1352|0;c[i>>2]=c[5735];c[i+4>>2]=0;i=k+1232|0;c[i>>2]=c[5764];c[i+4>>2]=0;i=k+1392|0;c[i>>2]=sf()|0;c[i+4>>2]=0;b[k+1024>>1]=c[5685];i=k+1032|0;c[i>>2]=c[5686];c[i+4>>2]=0;c[k+1028>>2]=c[5687];i=c[5688]|0;b[k+1026>>1]=i>>>8&255|i>>>12&3840;i=k+1040|0;b[i>>1]=c[5689];p=i+8|0;c[p>>2]=c[5690];c[p+4>>2]=0;c[i+4>>2]=c[5691];p=c[5692]|0;b[i+2>>1]=p>>>8&255|p>>>12&3840;i=k+1056|0;b[i>>1]=c[5693];p=i+8|0;c[p>>2]=c[5694];c[p+4>>2]=0;c[i+4>>2]=c[5695];p=c[5696]|0;b[i+2>>1]=p>>>8&255|p>>>12&3840;i=k+1072|0;b[i>>1]=c[5697];p=i+8|0;c[p>>2]=c[5698];c[p+4>>2]=0;c[i+4>>2]=c[5699];p=c[5700]|0;b[i+2>>1]=p>>>8&255|p>>>12&3840;i=k+1400|0;c[i>>2]=m;c[i+4>>2]=0;i=k+1496|0;c[i>>2]=c[5636];c[i+4>>2]=0;i=k+1528|0;c[i>>2]=c[5632];c[i+4>>2]=0;tf(n,1);a[22968]=h;c[5770]=(h|0)==3?1048576:0;a[22970]=c[n+104>>2]&1;i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0;j=n+128|0;c[j>>2]=0;c[j+4>>2]=0;c[5766]=n;c[5767]=k;a[23072]=1;j=n+168|0;i=c[j>>2]|0;if((i|0)<0){h=i&255;k=i>>>11&1;switch(i>>>8&7){case 0:{i=1;break}case 2:{i=1;h=2;break}case 3:{i=0;break}case 4:{i=2;break}default:{x=1274;break a}}p=pf(h,i,c[5640]|0,k,c[n+172>>2]|0)|0;c[j>>2]=0;if(p|0)break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];if(a[22970]|0){x=2301;break a}h=c[5766]|0;i=(h|0)==0;do if(!i){if(!(c[h+96>>2]&256))break;if(c[5647]&512|0){x=1289;break a}}while(0);if(!(a[22971]|0)){h=o;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=o;break b}else{x=1289;break a}}case 2:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&4|0:0){x=1299;break a}h=c[5632]|0;if(h&4095|0){x=2302;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=2302;break a}if(!(c[i+32>>2]|0)){x=2302;break a}h=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!h){x=2302;break a}p=h+1088|0;c[5701]=e[p>>1];c[5702]=c[p+8>>2];c[5703]=c[p+4>>2];p=e[p+2>>1]|0;c[5704]=p<<8&65280|p<<12&15728640;p=h+1104|0;c[5705]=e[p>>1];c[5706]=c[p+8>>2];c[5707]=c[p+4>>2];p=e[p+2>>1]|0;c[5708]=p<<8&65280|p<<12&15728640;p=h+1168|0;c[5713]=e[p>>1];c[5714]=c[p+8>>2];c[5715]=c[p+4>>2];p=e[p+2>>1]|0;c[5716]=p<<8&64768|p<<12&15728640;h=h+1136|0;c[5709]=e[h>>1];c[5710]=c[h+8>>2];c[5711]=c[h+4>>2];h=e[h+2>>1]|0;c[5712]=h<<8&65280|h<<12&15728640;h=1;break b}case 3:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&8|0:0){x=1310;break a}h=c[5632]|0;if(h&4095|0){x=2302;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=2302;break a}if(!(c[i+32>>2]|0)){x=2302;break a}h=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!h){x=2302;break a}p=h+1088|0;b[p>>1]=c[5701];o=p+8|0;c[o>>2]=c[5702];c[o+4>>2]=0;c[p+4>>2]=c[5703];o=c[5704]|0;b[p+2>>1]=o>>>8&255|o>>>12&3840;p=h+1104|0;b[p>>1]=c[5705];o=p+8|0;c[o>>2]=c[5706];c[o+4>>2]=0;c[p+4>>2]=c[5707];o=c[5708]|0;b[p+2>>1]=o>>>8&255|o>>>12&3840;p=h+1168|0;b[p>>1]=c[5713];o=p+8|0;c[o>>2]=c[5714];c[o+4>>2]=0;c[p+4>>2]=c[5715];o=c[5716]|0;b[p+2>>1]=o>>>8&255|o>>>12&3840;h=h+1136|0;b[h>>1]=c[5709];p=h+8|0;c[p>>2]=c[5710];c[p+4>>2]=0;c[h+4>>2]=c[5711];p=c[5712]|0;b[h+2>>1]=p>>>8&255|p>>>12&3840;h=1;break b}case 4:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h){if(c[h+16>>2]&16|0){x=1322;break a}a[23072]=1;if((c[h+96>>2]&256|0)!=0?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1333;break a}else i=0}else{a[23072]=1;i=1;h=0}if(!(a[22971]|0)){h=1;break b}if(i)h=(c[5647]|0)>>>9&1&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=1;break b}else{x=1333;break a}}case 5:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&32|0:0){x=1339;break a}a[23072]=0;h=1;break b}case 7:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;i=(h|0)==0;if(!i?c[h+12>>2]&67108864|0:0){x=1346;break a}p=(c[5632]|0)>>>12;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p|1048576;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=(c[5761]|0)+j|0;c[5640]=p;c[5759]=0;c[5758]=0;c[5761]=p;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1358;break a}if(!(a[22971]|0)){h=1;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=1;break b}else{x=1358;break a}}default:{x=2303;break a}}}case 4:{g=c[5766]|0;if(g|0?c[g>>2]&1|0:0){x=1375;break a}g=c[5732]|0;if((k&192|0)==192){h=22528+((k&7)<<2)|0;if(!(c[5755]&256)){c[h>>2]=g;h=1;break b}else{c[h>>2]=c[h>>2]&-65536|g&65535;h=1;break b}}else{h=Af(k)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=1;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=1;break b}}}case 6:{if(a[22968]|0){x=2302;break a}g=c[5766]|0;if(g|0?c[g>>2]&65536|0:0){x=1386;break a}do if((k&192|0)==192)g=c[22528+((k&7)<<2)>>2]|0;else{g=Af(k)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);i=c[5732]|0;g=i&-15|g&15;h=c[5766]|0;if((h|0?c[h+12>>2]&32|0:0)?(g^i)&-11|0:0){x=1401;break a}if((g^i)&-2147418111|0){i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0}c[5732]=g|16;h=(c[5761]|0)+(c[5758]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case 7:{if((k&192|0)==192){if((k&7|0)!=1){x=2303;break a}o=22976;o=xl(c[o>>2]|0,c[o+4>>2]|0,f|0,v|0)|0;p=c[5756]|0;p=yl(o|0,y|0,p|0,((p|0)<0)<<31>>31|0)|0;if(tg(p,y)|0){x=2304;break a}c[5633]=c[5763];h=1;break b}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+12>>2]&33554432|0:0){x=1410;break a}h=(Af(k)|0)>>>12;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;h=h|1048576;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;h=(c[5761]|0)+(c[5758]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=1;break b}default:{x=2303;break a}}}case 3:case 2:{if(!(c[5732]&1)){x=2303;break a}if(c[5647]&131072|0){x=2303;break a}g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]&65535;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if(!(ug((c[5755]|0)>>>8&1^1,o&1,i,g)|0)){h=o;break b}else{x=2304;break a}}case 32:{if(a[22968]|0){x=2302;break a}j=d[h>>0]|0;c[5758]=n+2;if((j&192|0)!=192){x=2303;break a}g=j>>>3;h=g&7;i=c[5766]|0;if(i|0?c[i>>2]&1<<h|0:0){x=1425;break a}switch(g&7){case 0:{g=22928;break}case 2:{g=22932;break}case 3:{g=22936;break}case 4:{g=22940;break}default:{x=2303;break a}}g=c[g>>2]|0;c[22528+((j&7)<<2)>>2]=g;h=32;break b}case 34:{if(a[22968]|0){x=2302;break a}h=d[h>>0]|0;m=n+2|0;c[5758]=m;if((h&192|0)!=192){x=2303;break a}i=h>>>3;g=i&7|16;j=c[5766]|0;k=(j|0)==0;if(!k?c[j>>2]&1<<g|0:0){x=1435;break a}g=c[22528+((h&7)<<2)>>2]|0;switch(i&7){case 0:{if((!k?c[j+12>>2]&32|0:0)?(c[5732]^g)&-11|0:0){x=1445;break a}if((c[5732]^g)&-2147418111|0){i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0}c[5732]=g|16;h=(c[5761]|0)+m|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case 2:{c[5733]=g;h=34;break b}case 3:{c[5734]=g;if((c[5732]|0)<0){i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0}h=(c[5761]|0)+m|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case 4:{c[5735]=g&292;h=34;break b}default:{x=2303;break a}}}case 6:{if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h>>2]&65536|0:0){x=1458;break a}c[5732]=c[5732]&-25|16;h=o;break b}case 35:case 33:{if(a[22968]|0){x=2302;break a}h=d[h>>0]|0;c[5758]=n+2;j=h>>>3&7;if((j|1|0)==5){x=2303;break a}i=h&7;if(!(o&2)){h=c[5766]|0;if(h|0?c[h+4>>2]&1<<j|0:0){x=1470;break a}wg(q,j);c[22528+(i<<2)>>2]=c[q>>2];h=o;break b}else{g=c[5766]|0;if(g|0?c[g+4>>2]&1<<(j|16)|0:0){x=1465;break a}g=c[22528+(i<<2)>>2]|0;vg(j,g);h=o;break b}}case -75:case -76:case -78:{h=d[h>>0]|0;c[5758]=n+2;if((h&192|0)==192){x=2303;break a}if(!(Df(o&7,h>>>3&7,Af(h)|0)|0)){h=o;break b}else{x=2304;break a}}case -94:{h=c[5766]|0;if(h|0?c[h+12>>2]&262144|0:0){x=1475;break a}xg();h=162;break b}case -92:{h=d[h>>0]|0;i=n+2|0;c[5758]=i;m=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){p=a[i>>0]|0;c[5758]=n+3;k=22528+((h&7)<<2)|0;h=c[k>>2]|0;p=p&31;j=p&255;i=m>>>(32-j|0)|h<<j;if(p<<24>>24){c[5641]=h<<j+-1;c[5642]=i;c[5643]=17;h=i}c[k>>2]=h;h=164;break b}k=Af(h)|0;j=c[5758]|0;h=a[j>>0]|0;c[5758]=j+1;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;p=h&31;h=p&255;g=i<<h|m>>>(32-h|0);if(!(p<<24>>24))g=i;else{c[5641]=i<<h+-1;c[5642]=g;c[5643]=17}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=164;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=164;break b}}case -91:{h=d[h>>0]|0;c[5758]=n+2;n=c[22528+((h>>>3&7)<<2)>>2]|0;m=c[5633]|0;if((h&192|0)==192){k=22528+((h&7)<<2)|0;h=c[k>>2]|0;j=m&31;i=h<<j|n>>>(32-j|0);if(j){c[5641]=h<<j+-1;c[5642]=i;c[5643]=17;h=i}c[k>>2]=h;h=165;break b}k=Af(h)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;h=m&31;g=i<<h|n>>>(32-h|0);if(!h)g=i;else{c[5641]=i<<h+-1;c[5642]=g;c[5643]=17}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=165;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=165;break b}}case -84:{h=d[h>>0]|0;i=n+2|0;c[5758]=i;m=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){p=a[i>>0]|0;c[5758]=n+3;k=22528+((h&7)<<2)|0;h=c[k>>2]|0;p=p&31;j=p&255;i=m<<32-j|h>>>j;if(p<<24>>24){c[5641]=h>>j+-1;c[5642]=i;c[5643]=20;h=i}c[k>>2]=h;h=172;break b}k=Af(h)|0;j=c[5758]|0;h=a[j>>0]|0;c[5758]=j+1;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;p=h&31;h=p&255;g=i>>>h|m<<32-h;if(!(p<<24>>24))g=i;else{c[5641]=i>>h+-1;c[5642]=g;c[5643]=20}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=172;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=172;break b}}case -83:{h=d[h>>0]|0;c[5758]=n+2;n=c[22528+((h>>>3&7)<<2)>>2]|0;m=c[5633]|0;if((h&192|0)==192){k=22528+((h&7)<<2)|0;h=c[k>>2]|0;j=m&31;i=h>>>j|n<<32-j;if(j){c[5641]=h>>j+-1;c[5642]=i;c[5643]=20;h=i}c[k>>2]=h;h=173;break b}k=Af(h)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;h=m&31;g=i>>>h|n<<32-h;if(!h)g=i;else{c[5641]=i>>h+-1;c[5642]=g;c[5643]=20}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=173;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=173;break b}}case -70:{h=d[h>>0]|0;i=n+2|0;c[5758]=i;m=h>>>3;switch(m&7){case 4:{if((h&192|0)==192){g=c[22528+((h&7)<<2)>>2]|0;h=d[i>>0]|0;c[5758]=n+3}else{g=Af(h)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=i+g|0;g=c[g>>2]|0}c[5641]=g>>(h&31);c[5643]=20;h=186;break b}case 7:case 6:case 5:break;default:{x=2303;break a}}if((h&192|0)==192){i=a[i>>0]|0;c[5758]=n+3;j=22528+((h&7)<<2)|0;h=c[j>>2]|0;i=i&31;c[5641]=h>>i;i=1<<i;switch(m&3){case 1:{h=i|h;break}case 2:{h=h&~i;break}default:h=i^h}c[5643]=20;c[j>>2]=h;h=186;break b}k=Af(h)|0;j=c[5758]|0;i=a[j>>0]|0;c[5758]=j+1;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;h=c[g>>2]|0;g=i&31;c[5641]=h>>g;g=1<<g;switch(m&3){case 1:{g=h|g;break}case 2:{g=h&~g;break}default:g=h^g}c[5643]=20;h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=186;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=186;break b}}case -93:{g=d[h>>0]|0;c[5758]=n+2;i=c[22528+((g>>>3&7)<<2)>>2]|0;do if((g&192|0)!=192){g=(Af(g)|0)+(i>>5<<2)|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;c[5641]=g>>(i&31);c[5643]=20;h=163;break b}case -69:case -77:case -85:{h=d[h>>0]|0;c[5758]=n+2;k=c[22528+((h>>>3&7)<<2)>>2]|0;m=o>>>3;if((h&192|0)==192){j=22528+((h&7)<<2)|0;i=c[j>>2]|0;h=k&31;c[5641]=i>>h;h=1<<h;switch(m&3){case 1:{h=i|h;break}case 2:{h=i&~h;break}default:h=i^h}c[5643]=20;c[j>>2]=h;h=o;break b}j=(Af(h)|0)+(k>>5<<2)|0;i=j>>>12;g=c[8411692+(i+(c[5770]|0)<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;h=c[g>>2]|0;g=k&31;c[5641]=h>>g;g=1<<g;switch(m&3){case 1:{g=h|g;break}case 2:{g=h&~g;break}default:g=h^g}c[5643]=20;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=o;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=o;break b}}case -67:case -68:{h=d[h>>0]|0;c[5758]=n+2;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);i=c[h>>2]|0;k=22528+(j<<2)|0;h=c[k>>2]|0;j=(i|0)==0;if(!(o&1)){if(!j)if(!(i&1)){h=0;while(1){h=h+1|0;if(!(i&2))i=i>>1;else{i=1;break}}}else{h=0;i=1}else i=0;c[5642]=i;c[5643]=14;c[k>>2]=h;h=o;break b}else{if(!j)if((i|0)>-1){h=31;do{h=h+-1|0;i=i<<1}while((i|0)>-1);i=1}else{h=31;i=1}else i=0;c[5642]=i;c[5643]=14;c[k>>2]=h;h=o;break b}}case -81:{h=d[h>>0]|0;c[5758]=n+2;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);m=c[h>>2]|0;h=22528+(j<<2)|0;p=c[h>>2]|0;n=Dl(((p|0)<0?0-p|0:p)|0,0,((m|0)<0?0-m|0:m)|0,0)|0;o=y;m=(p^m|0)>-1;p=m?n:0-n|0;c[5642]=p;c[5641]=(m?o:(n|0)==0?0-o|0:~o)-(p>>31);c[5643]=23;c[h>>2]=p;h=175;break b}case 49:{o=22976;o=xl(c[o>>2]|0,c[o+4>>2]|0,f|0,v|0)|0;p=c[5756]|0;p=yl(o|0,y|0,p|0,((p|0)<0)<<31>>31|0)|0;if(!(tg(p,y)|0)){h=49;break b}else{x=2304;break a}}case 51:{o=22976;o=xl(c[o>>2]|0,c[o+4>>2]|0,f|0,v|0)|0;p=c[5756]|0;p=yl(o|0,y|0,p|0,((p|0)<0)<<31>>31|0)|0;if(!(yg(p,y)|0)){h=51;break b}else{x=2304;break a}}case 48:{if(a[22968]|0){x=2302;break a}if(!(zg()|0)){h=48;break b}else{x=2304;break a}}case 50:{if(a[22968]|0){x=2302;break a}if(!(Ag()|0)){h=50;break b}else{x=2304;break a}}case -64:{g=d[h>>0]|0;c[5758]=n+2;j=g>>>3;if((g&192|0)==192){h=22528+((g&3)<<2)|0;p=g<<1&8;o=c[h>>2]>>p;g=o&255;n=22528+((j&3)<<2)|0;m=j<<1&8;k=c[n>>2]>>m;c[5641]=k&255;o=k+o<<24>>24;c[5642]=o;c[5643]=0;c[n>>2]=c[n>>2]&~(255<<m)|g<<m;c[h>>2]=c[h>>2]&~(255<<p)|(o&255)<<p;h=192;break b}n=Af(g)|0;h=n>>>12;i=8411692+((c[5770]|0)+h<<2)|0;g=c[i>>2]|0;if(!(g&1))g=d[g+n>>0]|0;else{if(zf(n,0,1,2)|0){x=2304;break a}g=c[5762]|0;i=8411692+((c[5770]|0)+h<<2)|0}m=22528+((j&3)<<2)|0;j=j<<1&8;k=c[m>>2]>>j;c[5641]=k&255;k=k+g<<24>>24;c[5642]=k;c[5643]=0;h=c[i>>2]|0;if(h&1){if(Bf(n,k,0,2)|0){x=2304;break a}}else a[h+n>>0]=k;c[m>>2]=c[m>>2]&~(255<<j)|(g&255)<<j;h=192;break b}case -63:{g=d[h>>0]|0;c[5758]=n+2;j=g>>>3&7;if((g&192|0)==192){h=22528+((g&7)<<2)|0;g=c[h>>2]|0;o=22528+(j<<2)|0;p=c[o>>2]|0;c[5641]=p;p=p+g|0;c[5642]=p;c[5643]=2;c[o>>2]=g;c[h>>2]=p;h=193;break b}k=Af(g)|0;g=k>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|k)&3))g=i+k|0;else{if(zf(k,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;i=22528+(j<<2)|0;j=c[i>>2]|0;c[5641]=j;j=j+g|0;c[5642]=j;c[5643]=2;h=c[h>>2]|0;if((h|k)&3){if(Bf(k,j,2,2)|0){x=2304;break a}}else c[h+k>>2]=j;c[i>>2]=g;h=193;break b}case -80:{g=d[h>>0]|0;c[5758]=n+2;m=g>>>3;if((g&192|0)==192){j=22528+((g&3)<<2)|0;h=g<<1&8;p=c[j>>2]>>h;g=p&255;i=c[5632]|0;c[5641]=g;p=i-p<<24;c[5642]=p>>24;c[5643]=6;if(!p){c[j>>2]=(c[22528+((m&3)<<2)>>2]>>(m<<1&8)&255)<<h|c[j>>2]&~(255<<h);h=176;break b}else{c[5632]=i&-256|g;h=176;break b}}k=Af(g)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5632]|0;c[5641]=g;p=h-g<<24;c[5642]=p>>24;c[5643]=6;if(p|0){c[5632]=h&-256|g&255;h=176;break b}i=c[22528+((m&3)<<2)>>2]>>(m<<1&8);h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if(h&1)if(!(Bf(k,i&255,0,2)|0)){h=176;break b}else{x=2304;break a}else{a[h+k>>0]=i;h=176;break b}}case -79:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;if((g&192|0)==192){h=22528+((g&7)<<2)|0;g=c[h>>2]|0;p=c[5632]|0;c[5641]=g;p=p-g|0;c[5642]=p;c[5643]=8;if(!p){c[h>>2]=c[22528+(i<<2)>>2];h=177;break b}else{c[5632]=g;h=177;break b}}j=Af(g)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=c[g>>2]|0;p=c[5632]|0;c[5641]=g;p=p-g|0;c[5642]=p;c[5643]=8;if(p|0){c[5632]=g;h=177;break b}i=c[22528+(i<<2)>>2]|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,i,2,2)|0)){h=177;break b}else{x=2304;break a}else{c[h+j>>2]=i;h=177;break b}}case -57:{h=d[h>>0]|0;c[5758]=n+2;if(!((h&192|0)!=192&(h&56|0)==8)){x=2303;break a}if(!(Bg(Af(h)|0)|0)){h=199;break b}else{x=2304;break a}}case -88:case -96:{h=c[22740+((o>>>3&7)<<4)>>2]|0;i=(c[5636]|0)+-4|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&3){if(Bf(j,h,2,2)|0){x=2304;break a}}else c[k+j>>2]=h;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;h=o;break b}case -87:case -95:{g=(c[5729]&c[5636])+(c[5694]|0)|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=h+g|0;g=c[g>>2]|0;if(Cf(o>>>3&7,g&65535)|0){x=2304;break a}p=c[5636]|0;h=c[5729]|0;c[5636]=p&~h|p+4&h;h=o;break b}case -49:case -50:case -51:case -52:case -53:case -54:case -55:case -56:{h=22528+((o&7)<<2)|0;g=Kl(c[h>>2]|0)|0;c[h>>2]=g;h=o;break b}case 8:{if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(!h){h=8;break b}if(!(c[h+12>>2]&4194304)){h=8;break b}else{x=1659;break a}}case 9:{if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(!h){h=9;break b}if(!(c[h+16>>2]&512)){h=9;break b}else{x=1663;break a}}case 31:case 30:case 29:case 28:case 27:case 26:case 25:{h=d[h>>0]|0;c[5758]=n+2;if((h&192|0)==192){h=o;break b}Af(h)|0;h=o;break b}default:{x=2303;break a}}while(0)}default:do switch(h|0){case 400:break b;case 393:{g=c[5758]|0;h=d[g>>0]|0;c[5758]=g+1;g=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=393;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=393;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=393;break b}}case 395:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&7)<<2)>>2]|0;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=22528+((i>>>3&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=395;break b}case 447:case 446:case 445:case 444:case 443:case 442:case 441:case 440:{p=c[5758]|0;g=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;p=22528+((h&7)<<2)|0;c[p>>2]=c[p>>2]&-65536|g;break b}case 417:{j=c[5755]|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0];g=i+2|0;if(!(j&128)){h=d[g>>0]<<16|h|d[i+3>>0]<<24;g=i+4|0}c[5758]=g;g=j&15;g=(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)+h|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((h|g)&1))g=e[h+g>>1]|0;else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5632]=c[5632]&-65536|g&65535;h=417;break b}case 419:{k=c[5755]|0;j=c[5758]|0;i=d[j+1>>0]<<8|d[j>>0];h=j+2|0;if(!(k&128)){i=d[h>>0]<<16|i|d[j+3>>0]<<24;h=j+4|0}c[5758]=h;h=k&15;h=(c[22740+(((h|0)==0?3:h+-1|0)<<4)+4>>2]|0)+i|0;i=c[5632]|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((j|h)&1)if(!(Bf(h,i,1,2)|0)){h=419;break b}else{x=2304;break a}else{b[j+h>>1]=i;h=419;break b}}case 455:{g=c[5758]|0;h=d[g>>0]|0;i=g+1|0;c[5758]=i;if((h&192|0)==192){p=d[g+2>>0]<<8|d[i>>0];c[5758]=g+3;g=22528+((h&7)<<2)|0;c[g>>2]=c[g>>2]&-65536|p;g=p;h=455;break b}h=Af(h)|0;i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0];c[5758]=i+2;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=455;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=455;break b}}case 407:case 406:case 405:case 404:case 403:case 402:case 401:{g=c[5632]|0;p=22528+((h&7)<<2)|0;c[5632]=c[p>>2]&65535|g&-65536;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case 391:{j=c[5758]|0;g=d[j>>0]|0;c[5758]=j+1;j=g>>>3&7;do if((g&192|0)!=192){k=Af(g)|0;h=k>>>12;i=8411692+((c[5770]|0)+h<<2)|0;g=c[i>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0;i=8411692+((c[5770]|0)+h<<2)|0}h=22528+(j<<2)|0;j=c[h>>2]|0;i=c[i>>2]|0;if((i|k)&1)if(!(Bf(k,j,1,2)|0))break;else{x=2304;break a}else{b[i+k>>1]=j;break}}else{p=22528+((g&7)<<2)|0;g=c[p>>2]|0;h=22528+(j<<2)|0;c[p>>2]=c[h>>2]&65535|g&-65536}while(0);c[h>>2]=c[h>>2]&-65536|g&65535;h=391;break b}case 453:case 452:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;if((i&192|0)==192){x=2303;break a}p=Af(i)|0;if(!(Cg((h|0)==452?0:3,i>>>3&7,p)|0))break b;else{x=2304;break a}}case 313:case 305:case 297:case 289:case 281:case 273:case 265:case 257:{j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;m=c[22528+((i>>>3&7)<<2)>>2]|0;if((i&192|0)==192){p=22528+((i&7)<<2)|0;o=c[p>>2]|0;c[p>>2]=(mf(22528,j,o,m)|0)&65535|o&-65536;break b}k=Af(i)|0;i=k>>>12;g=(c[5770]|0)+i|0;if((j|0)==7){g=c[23084+(g<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=m;c[5642]=g-m<<16>>16;c[5643]=7;break b}g=c[8411692+(g<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=mf(22528,j,g,m)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((i|k)&1)if(!(Bf(k,g,1,2)|0))break b;else{x=2304;break a}else{b[i+k>>1]=g;break b}}case 315:case 307:case 299:case 291:case 283:case 275:case 267:case 259:{k=c[5758]|0;i=d[k>>0]|0;c[5758]=k+1;k=h>>>3&7;m=i>>>3&7;do if((i&192|0)==192)i=c[22528+((i&7)<<2)>>2]|0;else{i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!((j|i)&1)){i=e[j+i>>1]|0;break}if(zf(i,1,0,2)|0){x=2304;break a}i=c[5762]|0}while(0);p=22528+(m<<2)|0;o=c[p>>2]|0;c[p>>2]=(mf(22528,k,o,i)|0)&65535|o&-65536;break b}case 317:case 309:case 301:case 293:case 285:case 277:case 269:case 261:{p=c[5758]|0;o=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;p=c[5632]|0;c[5632]=(mf(22528,h>>>3&7,p,o)|0)&65535|p&-65536;break b}case 385:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=d[h+2>>0]<<8|d[j>>0];c[5758]=h+3;h=22528+((i&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(mf(22528,k,p,o)|0)&65535|p&-65536;h=385;break b}j=Af(i)|0;h=c[5758]|0;i=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=j>>>12;g=(c[5770]|0)+h|0;if((k|0)==7){g=c[23084+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=i;c[5642]=g-i<<16>>16;c[5643]=7;h=385;break b}g=c[8411692+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=mf(22528,k,g,i)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=385;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=385;break b}}case 387:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=a[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(mf(22528,k,p,o)|0)&65535|p&-65536;h=387;break b}j=Af(i)|0;h=c[5758]|0;i=a[h>>0]|0;c[5758]=h+1;h=j>>>12;g=(c[5770]|0)+h|0;if((k|0)==7){g=c[23084+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=i;c[5642]=g-i<<16>>16;c[5643]=7;h=387;break b}g=c[8411692+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=mf(22528,k,g,i)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=387;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=387;break b}}case 327:case 326:case 325:case 324:case 323:case 322:case 321:case 320:{i=22528+((h&7)<<2)|0;j=c[i>>2]|0;k=c[5643]|0;if((k|0)<25){c[5645]=k;c[5644]=c[5642]}p=(j<<16)+65536>>16;c[5642]=p;c[5643]=26;c[i>>2]=p&65535|j&-65536;break b}case 335:case 334:case 333:case 332:case 331:case 330:case 329:case 328:{i=22528+((h&7)<<2)|0;j=c[i>>2]|0;k=c[5643]|0;if((k|0)<25){c[5645]=k;c[5644]=c[5642]}p=(j<<16)+-65536>>16;c[5642]=p;c[5643]=29;c[i>>2]=p&65535|j&-65536;break b}case 363:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)==192)h=c[22528+((h&7)<<2)>>2]|0;else{h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!((i|h)&1)){h=e[i+h>>1]|0;break}if(zf(h,1,0,2)|0){x=2304;break a}h=c[5762]|0}while(0);p=c[5758]|0;n=a[p>>0]|0;c[5758]=p+1;p=22528+(j<<2)|0;o=c[p>>2]&-65536;h=N(h<<16>>16,n)|0;n=h<<16>>16;c[5642]=n;c[5641]=(h|0)!=(n|0)&1;c[5643]=22;c[p>>2]=o|h&65535;h=363;break b}case 361:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)==192)h=c[22528+((h&7)<<2)>>2]|0;else{h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!((i|h)&1)){h=e[i+h>>1]|0;break}if(zf(h,1,0,2)|0){x=2304;break a}h=c[5762]|0}while(0);p=c[5758]|0;n=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;p=22528+(j<<2)|0;o=c[p>>2]&-65536;h=N(n<<16>>16,h<<16>>16)|0;n=h<<16>>16;c[5642]=n;c[5641]=(h|0)!=(n|0)&1;c[5643]=22;c[p>>2]=h&65535|o;h=361;break b}case 389:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&7)<<2)>>2]|0;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5642]=(c[22528+((i>>>3&7)<<2)>>2]&g)<<16>>16;c[5643]=13;h=389;break b}case 425:{p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;c[5642]=(h&c[5632])<<16>>16;c[5643]=13;h=425;break b}case 503:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;c[5642]=(h&g)<<16>>16;c[5643]=13;h=503;break b}case 2:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=c[h>>2]^65535;h=503;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}g=~g;h=c[h>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=503;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=503;break b}}case 3:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[5641]=p;o=0-(p<<16)>>16;c[5642]=o;c[5643]=7;c[h>>2]=o&65535|p&-65536;h=503;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}c[5641]=g;g=0-(g<<16)>>16;c[5642]=g;c[5643]=7;h=c[h>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=503;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=503;break b}}case 4:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=c[5632]|0;g=N(p&65535,g&65535)|0;h=g>>>16;c[5641]=h;c[5642]=g<<16>>16;c[5643]=22;c[5632]=g&65535|p&-65536;c[5634]=c[5634]&-65536|h;h=503;break b}case 5:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;g=N(h<<16>>16,g<<16>>16)|0;p=g<<16>>16;c[5642]=p;c[5641]=(g|0)!=(p|0)&1;c[5643]=22;c[5632]=g&65535|h&-65536;c[5634]=c[5634]&-65536|g>>>16;h=503;break b}case 6:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5634]|0;i=c[5632]|0;j=i&65535|h<<16;k=g&65535;if((h&65535)>>>0>=k>>>0){x=1839;break a}o=(j|0)/(k|0)|0;p=j-(N(o,k)|0)|0;c[5632]=o&65535|i&-65536;c[5634]=p&65535|h&-65536;h=503;break b}case 7:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5634]|0;i=c[5632]|0;j=i&65535|h<<16;p=g<<16;k=p>>16;if(!p){x=1847;break a}m=(j|0)/(k|0)|0;if((m<<16>>16|0)!=(m|0)){x=1849;break a}p=j-(N(m,k)|0)|0;c[5632]=m&65535|i&-65536;c[5634]=p&65535|h&-65536;h=503;break b}default:{x=2303;break a}}}case 449:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=d[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(Dg(k,p,o)|0)&65535|p&-65536;h=449;break b}j=Af(i)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=Dg(k,g,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=449;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=449;break b}}case 465:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(Dg(i,p,1)|0)&65535|p&-65536;h=465;break b}j=Af(h)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=Dg(i,g,1)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=465;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=465;break b}}case 467:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;j=c[5633]&255;if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(Dg(i,p,j)|0)&65535|p&-65536;h=467;break b}k=Af(h)|0;h=k>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=Dg(i,g,j)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|k)&1)if(!(Bf(k,g,1,2)|0)){h=467;break b}else{x=2304;break a}else{b[h+k>>1]=g;h=467;break b}}case 408:{h=c[5632]|0;c[5632]=h<<24>>24&65535|h&-65536;h=408;break b}case 409:{c[5634]=c[5632]<<16>>31&65535|c[5634]&-65536;h=409;break b}case 343:case 342:case 341:case 340:case 339:case 338:case 337:case 336:{i=c[22528+((h&7)<<2)>>2]|0;j=(c[5636]|0)+-2|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&1){if(Bf(k,i,1,2)|0){x=2304;break a}}else b[m+k>>1]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break b}case 351:case 350:case 349:case 348:case 347:case 346:case 345:case 344:{i=c[5636]|0;k=c[5729]|0;g=(k&i)+(c[5694]|0)|0;j=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((j|g)&1)){g=e[j+g>>1]|0;j=k}else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0;j=c[5729]|0;i=c[5636]|0}c[5636]=i&~j|i+2&j;p=22528+((h&7)<<2)|0;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case 352:if(!(Eg()|0)){h=352;break b}else{x=2304;break a}case 353:if(!(Fg()|0)){h=353;break b}else{x=2304;break a}case 399:{h=c[5758]|0;k=d[h>>0]|0;c[5758]=h+1;h=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|h)&1)){j=0;g=e[i+h>>1]|0}else{p=(zf(h,1,0,2)|0)==0;j=(p^1)<<31>>31;g=p?c[5762]|0:g}h=(j|0)!=0;if((k&192|0)==192){if(h){x=2304;break a}p=c[5636]|0;h=c[5729]|0;c[5636]=p&~h|p+2&h;h=22528+((k&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=399;break b}if(h){x=2304;break a}i=c[5636]|0;j=c[5729]|0;j=i&~j|i+2&j;c[5636]=j;h=Af(k)|0;c[5636]=i;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1){if(Bf(h,g,1,2)|0){x=2304;break a}}else b[i+h>>1]=g;c[5636]=j;h=399;break b}case 360:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=(c[5636]|0)+-2|0;i=(h&c[5729])+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&1){if(Bf(i,g,1,2)|0){x=2304;break a}}else b[j+i>>1]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=360;break b}case 362:{i=c[5758]|0;h=a[i>>0]|0;g=h<<24>>24;c[5758]=i+1;i=(c[5636]|0)+-2|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&1){if(Bf(j,g,1,2)|0){x=2304;break a}}else b[k+j>>1]=h<<24>>24;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;h=362;break b}case 456:{n=c[5758]|0;o=d[n+1>>0]<<8|d[n>>0];p=n+2|0;c[5758]=p;p=d[p>>0]|0;c[5758]=n+3;if(!(Gg(o,p)|0)){h=456;break b}else{x=2304;break a}}case 457:if(!(Hg()|0)){h=457;break b}else{x=2304;break a}case 286:case 278:case 270:case 262:{i=c[22740+((h>>>3&3)<<4)>>2]|0;j=(c[5636]|0)+-2|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&1){if(Bf(k,i,1,2)|0){x=2304;break a}}else b[m+k>>1]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break b}case 287:case 279:case 263:{g=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1))g=e[i+g>>1]|0;else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}i=h>>>3&3;if(Cf(i,g)|0){x=2304;break a}o=c[5636]|0;p=c[5729]|0;c[5636]=o&~p|o+2&p;if((i|0)==2){x=1922;break a}else break b}case 397:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}c[5755]=c[5755]&-16|11;p=Af(h)|0;h=22528+((h>>>3&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|p&65535;h=397;break b}case 511:{j=c[5758]|0;p=a[j>>0]|0;h=p&255;c[5758]=j+1;j=h&56;switch((p&255)>>>3&7){case 0:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;i=c[h>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<16)+65536>>16;c[5642]=p;c[5643]=26;c[h>>2]=p&65535|i&-65536;h=511;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<16)+65536>>16;c[5642]=g;c[5643]=26;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=511;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=511;break b}}case 1:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;i=c[h>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<16)+-65536>>16;c[5642]=p;c[5643]=29;c[h>>2]=p&65535|i&-65536;h=511;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<16)+-65536>>16;c[5642]=g;c[5643]=29;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=511;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=511;break b}}case 2:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]&65535;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=(c[5761]|0)+(c[5758]|0)|0;i=(c[5636]|0)+-2|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&1){if(Bf(j,h,1,2)|0){x=2304;break a}}else b[k+j>>1]=h;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=511;break b}case 4:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]&65535;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=511;break b}case 6:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=(c[5636]|0)+-2|0;i=(h&c[5729])+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&1){if(Bf(i,g,1,2)|0){x=2304;break a}}else b[j+i>>1]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=511;break b}case 5:case 3:{if((h&192|0)==192){x=2303;break a}i=Af(h)|0;h=c[5770]|0;g=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((g|i)&1))g=e[g+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5770]|0}i=i+2|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}h=c[5762]|0}i=(c[5761]|0)+(c[5758]|0)|0;if((j|0)==24){if(Mf(0,h,g,i)|0){x=2304;break a}}else if(Nf(h,g,i)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2002;break a}if(!(a[22971]|0)){h=511;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=511;break b}else{x=2002;break a}}default:{x=2303;break a}}}case 491:{h=c[5758]|0;g=a[h>>0]|0;h=g+(h+1)+(c[5761]|0)&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=491;break b}case 489:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0];h=(c[5761]|0)+(h+2)+g&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=489;break b}case 383:case 382:case 381:case 380:case 379:case 378:case 377:case 376:case 375:case 374:case 373:case 372:case 371:case 370:case 369:case 368:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(qg(h&15)|0))break b;p=(c[5758]|0)+g+(c[5761]|0)&65535;c[5640]=p;c[5759]=0;c[5758]=0;c[5761]=p;break b}case 450:{h=c[5758]|0;k=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=c[5636]|0;j=c[5729]|0;g=(j&h)+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;i=j}else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0;i=c[5729]|0;h=c[5636]|0}c[5636]=k+2+h&i|h&~i;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=450;break b}case 451:{h=c[5636]|0;j=c[5729]|0;g=(j&h)+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;i=j}else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0;i=c[5729]|0;h=c[5636]|0}c[5636]=h&~i|h+2&i;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=451;break b}case 488:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0];h=h+2|0;c[5758]=h;h=(c[5761]|0)+h|0;i=(c[5636]|0)+-2|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&1){if(Bf(j,h,1,2)|0){x=2304;break a}}else b[k+j>>1]=h;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;h=(c[5758]|0)+g+(c[5761]|0)&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=488;break b}case 354:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}if(!(Ig(h>>>3&7,Af(h)|0)|0)){h=354;break b}else{x=2304;break a}}case 421:{h=Jg()|0;if((h|0)<0){x=2304;break a}if(!h){h=421;break b}c[5758]=c[5760];h=421;break b}case 423:{h=Kg()|0;if((h|0)<0){x=2304;break a}if(!h){h=423;break b}c[5758]=c[5760];h=423;break b}case 429:{h=Lg()|0;if((h|0)<0){x=2304;break a}if(!h){h=429;break b}c[5758]=c[5760];h=429;break b}case 431:{h=Mg()|0;if((h|0)<0){x=2304;break a}if(!h){h=431;break b}c[5758]=c[5760];h=431;break b}case 427:{h=Ng()|0;if((h|0)<0){x=2304;break a}if(!h){h=427;break b}c[5758]=c[5760];h=427;break b}case 365:{h=Og()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2052;break a}if(!(a[22971]|0)){h=365;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=365;break b}else{x=2052;break a}}case 367:{h=Pg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2067;break a}if(!(a[22971]|0)){h=367;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=367;break b}else{x=2067;break a}}case 485:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,1,0)|0){x=2304;break a}c[5632]=c[5632]&-65536|(Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0)&65535;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2080;break a}if(!(a[22971]|0)){h=485;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=485;break b}else{x=2080;break a}}case 487:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,1,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&65535,1);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2093;break a}if(!(a[22971]|0)){h=487;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=487;break b}else{x=2093;break a}}case 493:{p=c[5634]|0;g=p&65535;if(ig(p&65535,1,0)|0){x=2304;break a}c[5632]=c[5632]&-65536|(Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0)&65535;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2106;break a}if(!(a[22971]|0)){h=493;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=493;break b}else{x=2106;break a}}case 495:{p=c[5634]|0;g=p&65535;if(ig(p&65535,1,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&65535,1);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2120;break a}if(!(a[22971]|0)){h=495;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=495;break b}else{x=2120;break a}}case 355:case 483:case 482:case 481:case 480:case 490:case 413:case 412:case 410:case 459:case 458:case 463:case 494:case 492:case 486:case 484:case 471:case 460:case 454:case 439:case 438:case 437:case 436:case 435:case 434:case 433:case 432:case 411:case 398:case 396:case 394:case 392:case 390:case 386:case 384:case 430:case 428:case 426:case 422:case 420:case 366:case 364:case 469:case 468:case 319:case 311:case 303:case 295:case 500:case 415:case 414:case 507:case 506:case 509:case 508:case 470:case 505:case 504:case 501:case 462:case 461:case 510:case 466:case 464:case 448:case 502:case 424:case 388:case 479:case 478:case 477:case 476:case 475:case 474:case 473:case 472:case 418:case 416:case 316:case 308:case 300:case 292:case 284:case 276:case 268:case 260:case 314:case 306:case 298:case 290:case 282:case 274:case 266:case 258:case 312:case 304:case 296:case 288:case 280:case 272:case 264:case 256:case 357:case 356:case 318:case 310:case 302:case 294:case 499:case 498:case 496:case 359:case 358:{c[5757]=c[5756];c[5756]=1;h=h&255;break b}case 271:{k=c[5758]|0;p=a[k>>0]|0;o=p&255;i=k+1|0;c[5758]=i;h=o|256;do switch(p<<24>>24){case -113:case -114:case -115:case -116:case -117:case -118:case -119:case -120:case -121:case -122:case -123:case -124:case -125:case -126:case -127:case -128:{g=d[k+2>>0]<<8|d[i>>0];c[5758]=k+3;if(!(qg(o&15)|0))break b;p=(c[5758]|0)+g+(c[5761]|0)&65535;c[5640]=p;c[5759]=0;c[5758]=0;c[5761]=p;break b}case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:{j=d[i>>0]|0;c[5758]=k+2;do if((j&192|0)==192)g=c[22528+((j&7)<<2)>>2]|0;else{g=Af(j)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);i=22528+((j>>>3&7)<<2)|0;if(!(qg(o&15)|0))break b;c[i>>2]=c[i>>2]&-65536|g&65535;break b}case -74:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(i&1)){g=d[i+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=22528+(j<<2)|0;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case -66:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(i&1)){g=d[i+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=22528+(j<<2)|0;c[p>>2]=g<<24>>24&65535|c[p>>2]&-65536;break b}case -65:case -73:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]|0;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=22528+(j<<2)|0;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case -81:{i=d[i>>0]|0;c[5758]=k+2;k=i>>>3&7;do if((i&192|0)==192)i=c[22528+((i&7)<<2)>>2]|0;else{i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!((j|i)&1)){i=e[j+i>>1]|0;break}if(zf(i,1,0,2)|0){x=2304;break a}i=c[5762]|0}while(0);p=22528+(k<<2)|0;o=c[p>>2]|0;n=N(o<<16>>16,i<<16>>16)|0;m=n<<16>>16;c[5642]=m;c[5641]=(n|0)!=(m|0)&1;c[5643]=22;c[p>>2]=n&65535|o&-65536;break b}case -63:{g=d[i>>0]|0;c[5758]=k+2;k=g>>>3&7;if((g&192|0)==192){p=22528+((g&7)<<2)|0;g=c[p>>2]|0;n=22528+(k<<2)|0;o=c[n>>2]|0;c[5641]=o;o=o+g<<16>>16;c[5642]=o;c[5643]=1;c[n>>2]=c[n>>2]&-65536|g&65535;c[p>>2]=c[p>>2]&-65536|o&65535;break b}m=Af(g)|0;j=m>>>12;i=8411692+((c[5770]|0)+j<<2)|0;g=c[i>>2]|0;if(!((g|m)&1))g=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}g=c[5762]|0;i=8411692+((c[5770]|0)+j<<2)|0}k=22528+(k<<2)|0;j=c[k>>2]|0;c[5641]=j;j=j+g<<16>>16;c[5642]=j;c[5643]=1;i=c[i>>2]|0;if((i|m)&1){if(Bf(m,j,1,2)|0){x=2304;break a}}else b[i+m>>1]=j;c[k>>2]=c[k>>2]&-65536|g&65535;break b}case -88:case -96:{i=c[22740+((o>>>3&7)<<4)>>2]|0;j=(c[5636]|0)+-2|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&1){if(Bf(k,i,1,2)|0){x=2304;break a}}else b[m+k>>1]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break b}case -87:case -95:{g=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1))g=e[i+g>>1]|0;else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}if(Cf(o>>>3&7,g)|0){x=2304;break a}o=c[5636]|0;p=c[5729]|0;c[5636]=o&~p|o+2&p;break b}case -75:case -76:case -78:{i=d[i>>0]|0;c[5758]=k+2;if((i&192|0)==192){x=2303;break a}if(!(Cg(o&7,i>>>3&7,Af(i)|0)|0))break b;else{x=2304;break a}}case -84:case -92:{i=d[i>>0]|0;j=k+2|0;c[5758]=j;p=c[22528+((i>>>3&7)<<2)>>2]|0;o=o>>>3&1;if((i&192|0)==192){j=a[j>>0]|0;c[5758]=k+3;m=22528+((i&7)<<2)|0;i=c[m>>2]|0;n=i&-65536;j=j&31;k=j&255;if(j<<24>>24){if(!o){p=p&65535;i=i<<16|p;c[5641]=i>>32-k;i=(((j&255)>16?p<<k+-16:0)|i<<k)>>16}else{i=i&65535|p<<16;c[5641]=i>>k+-1;i=(((j&255)>16?p<<32-k:0)|i>>k)<<16>>16}c[5642]=i;c[5643]=19}c[m>>2]=i&65535|n;break b}m=Af(i)|0;k=c[5758]|0;i=a[k>>0]|0;c[5758]=k+1;k=m>>>12;g=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if(!((g|m)&1))g=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}g=c[5762]|0}i=i&31;j=i&255;if(i<<24>>24){if(!o){p=p&65535;g=g<<16|p;c[5641]=g>>32-j;g=(g<<j|((i&255)>16?p<<j+-16:0))>>16}else{g=g&65535|p<<16;c[5641]=g>>j+-1;g=(g>>j|((i&255)>16?p<<32-j:0))<<16>>16}c[5642]=g;c[5643]=19}i=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if((i|m)&1)if(!(Bf(m,g,1,2)|0))break b;else{x=2304;break a}else{b[i+m>>1]=g;break b}}case -83:case -91:{i=d[i>>0]|0;c[5758]=k+2;p=c[22528+((i>>>3&7)<<2)>>2]|0;n=c[5633]|0;o=o>>>3&1;if((i&192|0)==192){k=22528+((i&7)<<2)|0;i=c[k>>2]|0;m=i&-65536;j=n&31;if(j){if(!o){p=p&65535;i=i<<16|p;c[5641]=i>>32-j;i=(i<<j|(j>>>0>16?p<<j+-16:0))>>16}else{i=i&65535|p<<16;c[5641]=i>>j+-1;i=(i>>j|(j>>>0>16?p<<32-j:0))<<16>>16}c[5642]=i;c[5643]=19}c[k>>2]=i&65535|m;break b}k=Af(i)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0}i=n&31;if(i){if(!o){p=p&65535;g=g<<16|p;c[5641]=g>>32-i;g=(g<<i|(i>>>0>16?p<<i+-16:0))>>16}else{g=g&65535|p<<16;c[5641]=g>>i+-1;g=(g>>i|(i>>>0>16?p<<32-i:0))<<16>>16}c[5642]=g;c[5643]=19}i=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((i|k)&1)if(!(Bf(k,g,1,2)|0))break b;else{x=2304;break a}else{b[i+k>>1]=g;break b}}case -70:{i=d[i>>0]|0;j=k+2|0;c[5758]=j;n=i>>>3;switch(n&7){case 4:{do if((i&192|0)==192){g=c[22528+((i&7)<<2)>>2]|0;i=d[j>>0]|0;c[5758]=k+3}else{g=Af(i)|0;j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((j|g)&1)){g=e[j+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5641]=g>>(i&15);c[5643]=19;break b}case 7:case 6:case 5:break;default:{x=2303;break a}}if((i&192|0)==192){j=a[j>>0]|0;c[5758]=k+3;k=22528+((i&7)<<2)|0;i=c[k>>2]|0;m=i&-65536;j=j&15;c[5641]=i>>j;j=1<<j;switch(n&3){case 1:{i=j|i;break}case 2:{i=i&~j;break}default:i=j^i}c[5643]=19;c[k>>2]=i&65535|m;break b}m=Af(i)|0;k=c[5758]|0;j=a[k>>0]|0;c[5758]=k+1;k=m>>>12;g=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if(!((g|m)&1))i=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}i=c[5762]|0}g=j&15;c[5641]=i>>g;g=1<<g;switch(n&3){case 1:{g=i|g;break}case 2:{g=i&~g;break}default:g=i^g}c[5643]=19;i=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if((i|m)&1)if(!(Bf(m,g,1,2)|0))break b;else{x=2304;break a}else{b[i+m>>1]=g;break b}}case -93:{g=d[i>>0]|0;c[5758]=k+2;j=c[22528+((g>>>3&7)<<2)>>2]|0;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]|0;else{g=(Af(g)|0)+(j>>>3&8190)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5641]=g>>(j&15);c[5643]=19;break b}case -69:case -77:case -85:{i=d[i>>0]|0;c[5758]=k+2;n=c[22528+((i>>>3&7)<<2)>>2]|0;o=o>>>3;if((i&192|0)==192){k=22528+((i&7)<<2)|0;j=c[k>>2]|0;m=j&-65536;i=n&15;c[5641]=j>>i;i=1<<i;switch(o&3){case 1:{i=j|i;break}case 2:{i=j&~i;break}default:i=j^i}c[5643]=19;c[k>>2]=i&65535|m;break b}k=(Af(i)|0)+(n>>>3&8190)|0;j=k>>>12;g=c[8411692+(j+(c[5770]|0)<<2)>>2]|0;if(!((g|k)&1))i=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}i=c[5762]|0}g=n&15;c[5641]=i>>g;g=1<<g;switch(o&3){case 1:{g=i|g;break}case 2:{g=i&~g;break}default:g=i^g}c[5643]=19;i=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((i|k)&1)if(!(Bf(k,g,1,2)|0))break b;else{x=2304;break a}else{b[i+k>>1]=g;break b}}case -67:case -68:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)k=c[22528+((g&7)<<2)>>2]|0;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){k=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}k=c[5762]|0}while(0);m=22528+(j<<2)|0;g=c[m>>2]|0;i=k&65535;j=(i|0)==0;if(!(o&1))if(!j)if(!(k&1)){g=0;while(1){g=g+1|0;if(!(i&2))i=i>>1;else{i=1;break}}}else{g=0;i=1}else i=0;else if(!j)if(!(k&32768)){g=15;while(1){g=g+-1|0;if(!(i&16384))i=i<<1;else{i=1;break}}}else{g=15;i=1}else i=0;c[5642]=i;c[5643]=14;c[m>>2]=c[m>>2]&-65536|g&65535;break b}case -79:{g=d[i>>0]|0;c[5758]=k+2;n=g>>>3&7;if((g&192|0)==192){i=22528+((g&7)<<2)|0;g=c[i>>2]|0;j=c[5632]|0;c[5641]=g;p=j-g<<16;c[5642]=p>>16;c[5643]=7;if(!p){c[i>>2]=c[22528+(n<<2)>>2]&65535|c[i>>2]&-65536;break b}else{c[5632]=j&-65536|g&65535;break b}}m=Af(g)|0;k=m>>>12;g=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if(!((g|m)&1))g=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}g=c[5762]|0}i=c[5632]|0;c[5641]=g;p=i-g<<16;c[5642]=p>>16;c[5643]=7;if(p|0){c[5632]=i&-65536|g&65535;break b}j=c[22528+(n<<2)>>2]|0;i=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if((i|m)&1)if(!(Bf(m,j,1,2)|0))break b;else{x=2304;break a}else{b[i+m>>1]=j;break b}}case -49:case -50:case -51:case -52:case -53:case -54:case -55:case -56:{p=22528+((o&7)<<2)|0;g=Kl(c[p>>2]|0)|0;c[p>>2]=g;break b}case 31:case 30:case 29:case 28:case 27:case 26:case 25:case -57:case 9:case 8:case -80:case -97:case -98:case -99:case -100:case -101:case -102:case -103:case -104:case -105:case -106:case -107:case -108:case -109:case -110:case -111:case -112:case 50:case 48:case 51:case 49:case -94:case 35:case 33:case 6:case 34:case 32:case 3:case 2:case 1:case 0:{c[5758]=k;c[5757]=c[5756];c[5756]=1;h=15;break b}default:{x=2303;break a}}while(0)}default:{x=2303;break a}}while(0)}while(0)}c:switch(x|0){case 28:{x=2304;break}case 29:{switch(h&7){case 4:{x=2304;break c}case 5:{x=2302;break c}default:{}}l=z;return}case 154:{a[22970]=1;x=2301;break}case 359:{c[5746]=0;c[5747]=0;x=2304;break}case 367:{c[5746]=0;c[5747]=0;x=2304;break}case 369:{c[5746]=0;c[5747]=0;x=2304;break}case 414:{c[5746]=0;c[5747]=0;x=2304;break}case 422:{c[5746]=0;c[5747]=0;x=2304;break}case 425:{c[5746]=0;c[5747]=0;x=2304;break}case 428:{c[5746]=0;c[5747]=0;x=2304;break}case 544:{c[5746]=32;w=g+112|0;c[w>>2]=112;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 557:{c[5746]=32;w=g+112|0;c[w>>2]=113;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 580:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 590:{a[22970]=1;x=2301;break}case 702:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 719:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 813:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 826:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 839:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 842:{c[5746]=32;w=h+112|0;c[w>>2]=116;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 855:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 868:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 882:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 896:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 916:{g=c[5647]|0;if((g>>>12&3)>>>0<(d[22968]|0)>>>0)x=2302;else{c[5647]=g|512;a[22970]=1;x=2301}break}case 920:{if(!(a[22968]|0)){g=c[5766]|0;if(g|0?c[g+12>>2]&16777216|0:0){c[5746]=32;x=g+112|0;c[x>>2]=120;c[x+4>>2]=0;x=(c[5766]|0)+120|0;c[x>>2]=0;c[x+4>>2]=0;x=2304;break}a[22969]=1;x=2301}else x=2302;break}case 969:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 984:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 999:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1014:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1016:{c[5746]=7;c[5747]=0;x=2304;break}case 1021:{c[5746]=7;c[5747]=0;x=2304;break}case 1023:{c[5746]=16;c[5747]=0;x=2304;break}case 1036:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1049:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1062:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1075:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1088:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1101:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1114:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1127:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1186:{c[5746]=32;w=g+112|0;c[w>>2]=k|104;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1195:{c[5746]=32;w=h+112|0;c[w>>2]=g;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1207:{c[5746]=13;c[5747]=o;x=2304;break}case 1209:{c[5746]=13;c[5747]=o;x=2304;break}case 1218:{c[5746]=13;c[5747]=o;x=2304;break}case 1220:{c[5746]=11;c[5747]=o;x=2304;break}case 1237:{c[5746]=32;w=i+112|0;c[w>>2]=h;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1251:{c[5746]=32;w=h+112|0;c[w>>2]=128;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1274:{v=c[3662]|0;c[w>>2]=19603;c[w+4>>2]=2771;c[w+8>>2]=19618;nl(v,19558,w)|0;ra();break}case 1275:{c[5746]=13;c[5747]=0;x=f-(c[5756]|0)|0;w=22976;f=22976;c[f>>2]=xl(c[w>>2]|0,c[w+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;c[f+4>>2]=y;l=z;return}case 1289:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1290:{if(((c[5764]&4096|0)!=0?(u=c[5766]|0,(u|0)!=0):0)?(c[u+16>>2]&2|0)!=0:0){c[5746]=32;x=u+112|0;c[x>>2]=129;c[x+4>>2]=0;x=(c[5766]|0)+120|0;c[x>>2]=0;c[x+4>>2]=0;x=2304}else x=2303;break}case 1299:{c[5746]=32;w=h+112|0;c[w>>2]=130;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1310:{c[5746]=32;w=h+112|0;c[w>>2]=131;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1322:{c[5746]=32;w=h+112|0;c[w>>2]=132;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1333:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1339:{c[5746]=32;w=h+112|0;c[w>>2]=133;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1346:{c[5746]=32;w=h+112|0;c[w>>2]=122;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1358:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1362:{c[5746]=32;w=h+112|0;c[w>>2]=g;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1375:{c[5746]=32;w=g+112|0;c[w>>2]=0;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1386:{c[5746]=32;w=g+112|0;c[w>>2]=16;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1401:{c[5746]=32;w=h+112|0;c[w>>2]=101;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1410:{c[5746]=32;w=h+112|0;c[w>>2]=121;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1425:{c[5746]=32;w=i+112|0;c[w>>2]=h;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1435:{c[5746]=32;w=j+112|0;c[w>>2]=g;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1445:{c[5746]=32;w=j+112|0;c[w>>2]=101;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1458:{c[5746]=32;w=h+112|0;c[w>>2]=16;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1465:{c[5746]=32;w=g+112|0;c[w>>2]=j|48;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1470:{c[5746]=32;w=h+112|0;c[w>>2]=j|32;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1475:{c[5746]=32;w=h+112|0;c[w>>2]=114;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1659:{c[5746]=32;w=h+112|0;c[w>>2]=118;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1663:{c[5746]=32;w=h+112|0;c[w>>2]=137;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1839:{c[5746]=0;c[5747]=0;x=2304;break}case 1847:{c[5746]=0;c[5747]=0;x=2304;break}case 1849:{c[5746]=0;c[5747]=0;x=2304;break}case 1922:{a[22970]=1;x=2301;break}case 2002:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2052:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2067:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2080:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2093:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2106:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2120:{c[5756]=(c[5756]|0)+-1;x=2301;break}}if((x|0)==2301){x=f-(c[5756]|0)|0;f=22976;x=xl(c[f>>2]|0,c[f+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;f=22976;c[f>>2]=x;c[f+4>>2]=y;c[5640]=(c[5761]|0)+(c[5758]|0);l=z;return}else if((x|0)==2302){c[5746]=13;c[5747]=0;x=2304}else if((x|0)==2303){c[5746]=6;c[5747]=0;x=2304}if((x|0)==2304)c[5640]=(c[5761]|0)+(c[5760]|0);x=(c[5746]|0)==32;w=f-(c[5756]|0)|0;f=22976;w=xl(c[f>>2]|0,c[f+4>>2]|0,w|0,((w|0)<0)<<31>>31|0)|0;f=22976;c[f>>2]=w;c[f+4>>2]=y;if(!x){l=z;return}c[5746]=-1;g=c[5766]|0;f=g+112|0;if((c[f>>2]|0)==123&(c[f+4>>2]|0)==0){f=g+128|0;c[f>>2]=(c[5761]|0)+(c[5758]|0);c[f+4>>2]=0}rf();l=z;return}
+function rf(){var e=0,f=0,g=0,h=0;f=c[5766]|0;g=c[5767]|0;h=c[5748]|0;if((h|0)>-1){switch(a[22996]|0){case 1:{e=(h|0)==2?512:0;break}case 0:{e=768;break}default:e=1024}c[f+136>>2]=h|e|d[22997]<<11|-2147483648;c[(c[5766]|0)+140>>2]=c[5750];c[5748]=-1}else{c[f+136>>2]=0;c[(c[5766]|0)+140>>2]=0}c[f+104>>2]=d[22970];a[f+1227>>0]=a[22968]|0;e=c[5640]|0;h=f+1128|0;c[h>>2]=c[5718];c[h+4>>2]=0;c[f+1124>>2]=c[5719];h=f+1160|0;c[h>>2]=c[5722];c[h+4>>2]=0;c[f+1156>>2]=c[5723];h=f+1368|0;c[h>>2]=c[5732];c[h+4>>2]=0;h=f+1360|0;c[h>>2]=c[5734];c[h+4>>2]=0;h=f+1352|0;c[h>>2]=c[5735];c[h+4>>2]=0;h=f+1232|0;c[h>>2]=c[5764];c[h+4>>2]=0;h=f+1392|0;c[h>>2]=sf()|0;c[h+4>>2]=0;b[f+1024>>1]=c[5685];h=f+1032|0;c[h>>2]=c[5686];c[h+4>>2]=0;c[f+1028>>2]=c[5687];h=c[5688]|0;b[f+1026>>1]=h>>>8&255|h>>>12&3840;b[f+1040>>1]=c[5689];h=f+1048|0;c[h>>2]=c[5690];c[h+4>>2]=0;c[f+1044>>2]=c[5691];h=c[5692]|0;b[f+1042>>1]=h>>>8&255|h>>>12&3840;b[f+1056>>1]=c[5693];h=f+1064|0;c[h>>2]=c[5694];c[h+4>>2]=0;c[f+1060>>2]=c[5695];h=c[5696]|0;b[f+1058>>1]=h>>>8&255|h>>>12&3840;b[f+1072>>1]=c[5697];h=f+1080|0;c[h>>2]=c[5698];c[h+4>>2]=0;c[f+1076>>2]=c[5699];h=c[5700]|0;b[f+1074>>1]=h>>>8&255|h>>>12&3840;h=f+1400|0;c[h>>2]=e;c[h+4>>2]=0;h=f+1496|0;c[h>>2]=c[5636];c[h+4>>2]=0;h=f+1528|0;c[h>>2]=c[5632];c[h+4>>2]=0;h=f+1600|0;c[h>>2]=c[5733];c[h+4>>2]=0;h=f+1384|0;c[h>>2]=c[5740];c[h+4>>2]=0;f=f+1376|0;c[f>>2]=c[5741];c[f+4>>2]=0;tf(g,0);a[22968]=0;c[5770]=0;c[5741]=1024;f=c[5769]|0;if((f|0)<=0){c[5769]=0;c[5766]=0;c[5767]=0;a[23072]=0;a[22970]=0;return}e=0;do{h=c[16800300+(e<<2)>>2]|0;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;h=h+1048576|0;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;e=e+1|0}while((e|0)!=(f|0));c[5769]=0;c[5766]=0;c[5767]=0;a[23072]=0;a[22970]=0;return}function sf(){var a=0,b=0,e=0;a=nf(22528)|0;if((c[5643]|0)==24){e=c[5641]|0;b=e>>>7&1;a=e&4|a|((c[5642]|0)==0&1)<<6}else{e=c[5642]|0;b=e>>>31;a=(d[21168+(e&255)>>0]|0)<<2|a|((e|0)==0&1)<<6}e=b<<7|a|(uf()|0)<<11;e=e|(vf()|0);return e|c[5646]&1024|c[5647]|0}function tf(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[5718]=c[a+1128>>2];c[5719]=c[a+1124>>2];c[5722]=c[a+1160>>2];c[5723]=c[a+1156>>2];c[5732]=c[a+1368>>2];c[5734]=c[a+1360>>2];c[5735]=c[a+1352>>2];c[5764]=c[a+1232>>2];m=c[a+1392>>2]|0;c[5641]=m&2261;c[5642]=m>>>6&1^1;c[5643]=24;c[5646]=1-(m>>>9&2);c[5647]=c[5647]&-4158209|m&4158208;c[5685]=e[a+1024>>1];m=a+1032|0;i=c[m>>2]|0;m=c[m+4>>2]|0;c[5686]=i;c[5687]=c[a+1028>>2];n=e[a+1026>>1]|0;c[5688]=n<<8&65280|n<<12&15728640;c[5689]=e[a+1040>>1];n=a+1048|0;j=c[n>>2]|0;n=c[n+4>>2]|0;c[5690]=j;c[5691]=c[a+1044>>2];d=e[a+1042>>1]|0;c[5692]=d<<8&65280|d<<12&15728640;c[5693]=e[a+1056>>1];l=a+1064|0;h=c[l>>2]|0;l=c[l+4>>2]|0;c[5694]=h;c[5695]=c[a+1060>>2];f=e[a+1058>>1]|0;c[5696]=f<<8&65280|f<<12&15728640;c[5697]=e[a+1072>>1];k=a+1080|0;g=c[k>>2]|0;k=c[k+4>>2]|0;c[5698]=g;c[5699]=c[a+1076>>2];o=e[a+1074>>1]|0;c[5700]=o<<8&65280|o<<12&15728640;f=f<<6&65536;c[5729]=(f^65536)+-1;c[5731]=(j|i|h|g|0)==0?f>>>16:0;c[5730]=(d&1024|0)==0?384:0;c[5640]=c[a+1400>>2];c[5636]=c[a+1496>>2];c[5632]=c[a+1528>>2];if(!b)return;c[5733]=c[a+1600>>2];c[5740]=c[a+1384>>2];c[5741]=c[a+1376>>2];return}function uf(){var a=0,b=0,d=0;do switch(c[5643]|0){case 0:{d=c[5642]|0;b=c[5641]|0;a=d-b|0;a=((a^d)&(b^128^a))>>>7&1;return a|0}case 1:{a=c[5642]|0;b=c[5641]|0;d=a-b|0;d=((d^a)&(b^32768^d))>>>15&1;return d|0}case 2:{a=c[5642]|0;b=c[5641]|0;d=a-b|0;d=((d^a)&(b^-2147483648^d))>>>31;return d|0}case 3:{a=c[5642]|0;b=c[5641]|0;d=a-b+-1|0;d=((d^a)&(b^128^d))>>>7&1;return d|0}case 4:{a=c[5642]|0;b=c[5641]|0;d=a-b+-1|0;d=((d^a)&(b^32768^d))>>>15&1;return d|0}case 5:{a=c[5642]|0;b=c[5641]|0;d=a-b+-1|0;d=((d^a)&(b^-2147483648^d))>>>31;return d|0}case 6:{d=c[5642]|0;a=c[5641]|0;b=a+d|0;d=((b^a)&(b^d))>>>7&1;return d|0}case 7:{d=c[5642]|0;a=c[5641]|0;b=a+d|0;d=((b^a)&(b^d))>>>15&1;return d|0}case 8:{d=c[5642]|0;a=c[5641]|0;b=a+d|0;d=((b^a)&(b^d))>>>31;return d|0}case 9:{d=c[5642]|0;a=c[5641]|0;b=d+1+a|0;d=((b^a)&(b^d))>>>7&1;return d|0}case 10:{d=c[5642]|0;a=c[5641]|0;b=d+1+a|0;d=((b^a)&(b^d))>>>15&1;return d|0}case 11:{d=c[5642]|0;a=c[5641]|0;b=d+1+a|0;d=((b^a)&(b^d))>>>31;return d|0}case 18:case 15:{d=(c[5642]^c[5641])>>>7&1;return d|0}case 19:case 16:{d=(c[5642]^c[5641])>>>15&1;return d|0}case 20:case 17:{d=(c[5642]^c[5641])>>>31;return d|0}case 23:case 22:case 21:{d=(c[5641]|0)!=0&1;return d|0}case 24:{d=(c[5641]|0)>>>11&1;return d|0}case 25:{d=(c[5642]&255|0)==128&1;return d|0}case 26:{d=(c[5642]&65535|0)==32768&1;return d|0}case 27:{d=(c[5642]|0)==-2147483648&1;return d|0}case 28:{d=(c[5642]&255|0)==127&1;return d|0}case 29:{d=(c[5642]&65535|0)==32767&1;return d|0}case 30:{d=(c[5642]|0)==2147483647&1;return d|0}case 14:case 13:case 12:{d=0;return d|0}default:ra()}while(0);return 0}function vf(){var a=0,b=0;switch(c[5643]|0){case 2:case 1:case 0:{b=c[5642]|0;a=c[5641]|0;a=(a^b^b-a)&16;return a|0}case 5:case 4:case 3:{a=c[5642]|0;b=c[5641]|0;b=(b^a^a+31-b)&16;return b|0}case 8:case 7:case 6:{b=c[5642]|0;a=c[5641]|0;b=(a^b^a+b)&16;return b|0}case 11:case 10:case 9:{a=c[5642]|0;b=c[5641]|0;b=(b^a^a+1+b)&16;return b|0}case 24:{b=c[5641]&16;return b|0}case 27:case 26:case 25:{b=c[5642]|0;b=(b+31^b)&16;return b|0}case 30:case 29:case 28:{b=c[5642]|0;b=(b+1^b)&16;return b|0}case 23:case 22:case 21:case 20:case 17:case 19:case 16:case 18:case 15:case 14:case 13:case 12:{b=0;return b|0}default:ra()}return 0}function wf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+32|0;q=t+24|0;h=t+20|0;s=t+16|0;r=t+12|0;k=t+8|0;m=t+4|0;i=t;c[h>>2]=e;c[s>>2]=0;if((c[5732]|0)>=0){r=c[5766]|0;do if((r|0)!=0?!(0==0?(c[r+144>>2]&1|0)==0:0):0)if(!($g(h,s,e,f,0)|0)){i=c[h>>2]|0;h=c[s>>2]|0;break}else{d=-1;l=t;return d|0}else p=6;while(0);if((p|0)==6){c[s>>2]=1;i=e;h=1}c[a>>2]=i;c[b>>2]=h;c[d>>2]=1;d=0;l=t;return d|0}a:do if(!(c[5735]&32)){h=c[5734]&-4096|e>>>20&4092;c[k>>2]=h;o=c[5766]|0;do if((o|0)!=0?!(0==0?(c[o+144>>2]&1|0)==0:0):0)if(!($g(k,q,h,1,1)|0)){j=c[k>>2]|0;break}else{d=-1;l=t;return d|0}else p=47;while(0);if((p|0)==47)j=h;h=Ge(c[4202123]|0,j,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0)h=c[(c[h+40>>2]|0)+(j-(c[h+8>>2]|0))>>2]|0;else h=0;if(!((h&1|0)==0&0==0)){if((h&32|0)==0&0==0){h=h|32;i=Ge(c[4202123]|0,j,0)|0;if((i|0)!=0?(c[i+32>>2]|0)!=0:0)c[(c[i+40>>2]|0)+(j-(c[i+8>>2]|0))>>2]=h}i=h&-4096|e>>>10&4092;c[m>>2]=i;o=c[5766]|0;do if((o|0)!=0?!(0==0?(c[o+144>>2]&1|0)==0:0):0)if(!($g(m,q,i,1,1)|0)){i=c[m>>2]|0;break}else{d=-1;l=t;return d|0}else p=60;while(0);j=Ge(c[4202123]|0,i,0)|0;if((j|0)!=0?(c[j+32>>2]|0)!=0:0)j=c[(c[j+40>>2]|0)+(i-(c[j+8>>2]|0))>>2]|0;else j=0;if(!((j&1|0)==0&0==0)){k=4096;m=j&h;h=0;p=68}else h=0}else h=0}else{h=c[5734]&-32|e>>>27&24;c[i>>2]=h;u=c[5766]|0;if((u|0)!=0?!(0==0?(c[u+144>>2]&1|0)==0:0):0){if(!($g(i,q,h,1,1)|0)){h=c[i>>2]|0;p=14}}else p=14;b:do if((p|0)==14){i=Ge(c[4202123]|0,h,0)|0;c:do if((i|0?c[i+32>>2]|0:0)?(j=c[(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))>>2]|0,!((j&1|0)==0&0==0)):0){i=j&-4096|e>>>18&4088;c[k>>2]=i;u=c[5766]|0;if((u|0)!=0?!(0==0?(c[u+144>>2]&1|0)==0:0):0){if($g(k,q,i,1,1)|0)break b;i=c[k>>2]|0}h=Ge(c[4202123]|0,i,0)|0;if((h|0?c[h+32>>2]|0:0)?(o=(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))|0,n=c[o>>2]|0,o=c[o+4>>2]|0,!((n&1|0)==0&0==0)):0){do if(!(o>>>0>0|(o|0)==0&n>>>0>4294967295)){if((n&128|0)==0&0==0){do if((n&32|0)==0&0==0){h=n|32;j=Ge(c[4202123]|0,i,0)|0;if(j){if(!(c[j+32>>2]|0))break;c[(c[j+40>>2]|0)+(i-(c[j+8>>2]|0))>>2]=h}}else h=n;while(0);i=h&-4096|e>>>9&4088;c[m>>2]=i;h=c[5766]|0;do if(!h)p=34;else{if(0==0?(c[h+144>>2]&1|0)==0:0){p=34;break}if($g(m,q,i,1,1)|0)break b;i=c[m>>2]|0}while(0);h=Ge(c[4202123]|0,i,0)|0;if(!h)break c;if(!(c[h+32>>2]|0))break c;h=(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))|0;j=c[h>>2]|0;h=c[h+4>>2]|0;if((j&1|0)==0&0==0)break c;if(h>>>0>0|(h|0)==0&j>>>0>4294967295)break;k=4096;m=j&n}else{c[m>>2]=i;k=2097152;m=n;j=n;h=o}p=68;break a}while(0);h=8;break a}}while(0);h=0;break a}while(0);u=-1;l=t;return u|0}while(0);do if((p|0)==68){if(!g){if((m&2|0)==0&((f|0)!=0&(c[5732]&65536|0)!=0)){h=1;break}}else{if(!(m&4)){h=1;break}if((f|0)!=0&(m&2|0)==0){h=1;break}}h=Il(j|0,h|0,6)|0;h=((h&1^1)&f|0)!=0;if((j&32|0)==0&0==0|h){u=h?96:32;j=u|j;h=Ge(c[4202123]|0,i,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0){c[(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))>>2]=j;i=j;h=j}else{i=j;h=j}}else{i=j;h=j}h=(m&2|0)!=0&((h&64|0)!=0|0!=0)&1;c[s>>2]=h;j=m>>>2&1;i=i&0-k|k+-1&e;c[r>>2]=i;u=c[5766]|0;do if((u|0)!=0?!(0==0?(c[u+144>>2]&1|0)==0:0):0){if(!($g(r,q,i,f,0)|0)){h=c[q>>2]&h;c[s>>2]=h;i=c[r>>2]|0;break}u=-1;l=t;return u|0}while(0);c[a>>2]=i;c[b>>2]=h;c[d>>2]=j;u=0;l=t;return u|0}while(0);h=g<<2|f<<1|h;i=c[5766]|0;if((i|0)!=0?(c[i+8>>2]&16384|0)!=0:0){u=i+128|0;c[u>>2]=e;c[u+4>>2]=0}else c[5733]=e;c[5746]=14;c[5747]=h;u=-1;l=t;return u|0}function xf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=b+(0-(a&4095))-(a&-4096)|0;j=a>>>12;i=23084+(j<<2)|0;if((c[i>>2]|0)==-1){g=c[5769]|0;if((g|0)>2047){h=j+1048575&1048575;b=0;f=0;do{a=c[16800300+(f<<2)>>2]|0;if((a|0)==(h|0)){c[16800300+(b<<2)>>2]=h;b=b+1|0}else{c[23084+(a<<2)>>2]=-1;c[8411692+(a<<2)>>2]=-1;a=a+1048576|0;c[23084+(a<<2)>>2]=-1;c[8411692+(a<<2)>>2]=-1}f=f+1|0}while((f|0)!=(g|0));c[5769]=b}else b=g;c[5769]=b+1;c[16800300+(b<<2)>>2]=j}c[i>>2]=k;f=(d|0)!=0;c[8411692+(j<<2)>>2]=f?k:-1;b=j|1048576;a=23084+(b<<2)|0;if(!e){c[a>>2]=-1;c[8411692+(b<<2)>>2]=-1;return}c[a>>2]=k;b=8411692+(b<<2)|0;if(f){c[b>>2]=k;return}else{c[b>>2]=-1;return}}function yf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;j=c[5730]|0;f=e;l=j;e=1;j=(j>>>7&2^2)+2|0;a:while(1){b:do switch(f|0){case 102:if(!(c[5730]&256)){g=l|256;f=2;k=6;break b}else{g=l&-257;f=4;k=6;break b}case 101:case 100:case 62:case 54:case 46:case 38:case 243:case 242:{g=l;f=j;k=6;break}case 240:{if(e>>>0>14){k=13;break a}f=l|64;h=e+b|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1)){g=f;f=d[i+h>>0]|0;break b}if(zf(h,0,0,2)|0){e=-1;k=449;break a}g=f;f=c[5762]|0;break}case 103:{f=(c[5730]&128|0)==0?l|128:l&-129;if(e>>>0>14){k=19;break a}h=e+b|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1)){g=f;f=d[i+h>>0]|0;break b}if(zf(h,0,0,2)|0){e=-1;k=449;break a}g=f;f=c[5762]|0;break}default:{k=25;break a}}while(0);do if((k|0)==6){k=0;if(e>>>0>14){k=7;break a}h=e+b|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1)){j=f;f=d[i+h>>0]|0;break}if(zf(h,0,0,2)|0){e=-1;k=449;break a}j=f;f=c[5762]|0}while(0);l=g;e=e+1|0}if((k|0)==7){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==13){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==19){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==25){c:do if(!(l&64))do switch(f|0){case 111:case 110:case 109:case 108:case 97:case 96:case 63:case 55:case 47:case 39:case 215:case 239:case 238:case 237:case 236:case 155:case 175:case 174:case 173:case 172:case 167:case 166:case 171:case 170:case 165:case 164:case 244:case 159:case 158:case 251:case 250:case 253:case 252:case 214:case 249:case 248:case 245:case 207:case 206:case 204:case 144:case 203:case 195:case 31:case 23:case 7:case 30:case 22:case 14:case 6:case 157:case 156:case 201:case 153:case 152:case 95:case 94:case 93:case 92:case 91:case 90:case 89:case 88:case 87:case 86:case 85:case 84:case 83:case 82:case 81:case 80:case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:case 151:case 150:case 149:case 148:case 147:case 146:case 145:{k=448;break c}case 213:case 212:case 231:case 230:case 229:case 228:case 205:case 227:case 226:case 225:case 224:case 117:case 116:case 127:case 126:case 125:case 124:case 123:case 122:case 121:case 120:case 119:case 118:case 115:case 114:case 113:case 112:case 235:case 106:case 168:case 60:case 52:case 44:case 36:case 28:case 20:case 12:case 4:case 183:case 182:case 181:case 180:case 179:case 178:case 177:case 176:{if(e>>>0<=14){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 232:case 233:case 104:case 169:case 61:case 53:case 45:case 37:case 29:case 21:case 13:case 5:case 191:case 190:case 189:case 188:case 187:case 186:case 185:case 184:{e=j+e|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 99:case 98:case 223:case 222:case 221:case 220:case 219:case 218:case 217:case 216:case 255:case 254:case 141:case 143:case 211:case 210:case 209:case 208:case 133:case 132:case 59:case 51:case 43:case 35:case 27:case 19:case 11:case 3:case 58:case 50:case 42:case 34:case 26:case 18:case 10:case 2:case 57:case 49:case 41:case 33:case 25:case 17:case 9:case 1:case 56:case 48:case 40:case 32:case 24:case 16:case 8:case 0:case 197:case 196:case 140:case 142:case 135:case 134:case 139:case 138:case 137:case 136:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);d:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break d}case 12:{e=e+3|0;break d}case 20:{e=e+6|0;break d}case 5:{e=e+5|0;break d}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break d}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break d}default:{e=h;break d}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+3|0:h;break d}case 1:{e=e+2|0;break d}case 2:{e=e+3|0;break d}default:{e=h;break d}}while(0);if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 163:case 162:case 161:case 160:{e=e+2+(l>>>6&2^2)|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 193:case 192:case 107:case 131:case 130:case 128:case 198:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break e}case 12:{e=e+3|0;break e}case 20:{e=e+6|0;break e}case 5:{e=e+5|0;break e}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break e}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break e}default:{e=h;break e}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+3|0:h;break e}case 1:{e=e+2|0;break e}case 2:{e=e+3|0;break e}default:{e=h;break e}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if((e|0)!=15){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 105:case 129:case 199:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);f:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break f}case 12:{e=e+3|0;break f}case 20:{e=e+6|0;break f}case 5:{e=e+5|0;break f}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break f}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break f}default:{e=h;break f}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+3|0:h;break f}case 1:{e=e+2|0;break f}case 2:{e=e+3|0;break f}default:{e=h;break f}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}e=e+j|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 246:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);g:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break g}case 12:{e=e+3|0;break g}case 20:{e=e+6|0;break g}case 5:{e=e+5|0;break g}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break g}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break g}default:{e=h;break g}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break g}case 1:{e=e+2|0;break g}case 2:{e=e+3|0;break g}default:{e=h;break g}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if(i&56|0){k=448;break c}if((e|0)<=14){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 247:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);h:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break h}case 12:{e=e+3|0;break h}case 20:{e=e+6|0;break h}case 5:{e=e+5|0;break h}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break h}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break h}default:{e=h;break h}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break h}case 1:{e=e+2|0;break h}case 2:{e=e+3|0;break h}default:{e=h;break h}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if(i&56|0){k=448;break c}e=e+j|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 154:case 234:{e=e+2+j|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 202:case 194:{if(e>>>0<=13){e=e+2|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 200:{if(e>>>0<=12){e=e+3|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 241:{c[5746]=6;c[5747]=0;a=-1;return a|0}case 15:{i=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);switch(f|0){case 207:case 206:case 205:case 204:case 203:case 202:case 201:case 200:case 169:case 161:case 168:case 160:case 50:case 48:case 51:case 49:case 162:case 9:case 8:case 6:{e=i;k=448;break c}case 143:case 142:case 141:case 140:case 139:case 138:case 137:case 136:case 135:case 134:case 133:case 132:case 131:case 130:case 129:case 128:{e=j+i|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 31:case 30:case 29:case 28:case 27:case 26:case 25:case 199:case 177:case 176:case 193:case 192:case 175:case 189:case 188:case 187:case 179:case 171:case 163:case 173:case 165:case 181:case 180:case 178:case 34:case 32:case 3:case 2:case 1:case 0:case 191:case 190:case 183:case 182:case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:case 159:case 158:case 157:case 156:case 155:case 154:case 153:case 152:case 151:case 150:case 149:case 148:case 147:case 146:case 145:case 144:{h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);i:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break i}case 12:{e=e+4|0;break i}case 20:{e=e+7|0;break i}case 5:{e=e+6|0;break i}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break i}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break i}default:{e=h;break i}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+4|0:h;break i}case 1:{e=e+3|0;break i}case 2:{e=e+4|0;break i}default:{e=h;break i}}while(0);if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 35:case 33:{if(e>>>0<=13){e=e+2|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 186:case 172:case 164:{h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);j:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break j}case 12:{e=e+4|0;break j}case 20:{e=e+7|0;break j}case 5:{e=e+6|0;break j}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break j}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break j}default:{e=h;break j}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+4|0:h;break j}case 1:{e=e+3|0;break j}case 2:{e=e+4|0;break j}default:{e=h;break j}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if((e|0)!=15){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}default:{c[5746]=6;c[5747]=0;a=-1;return a|0}}}default:{k=447;break c}}while(0);else switch(f|0){case 135:case 134:case 49:case 41:case 33:case 25:case 17:case 9:case 1:case 48:case 40:case 32:case 24:case 16:case 8:case 0:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);k:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}g=h+b|0;f=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;do if(f&1)if(!(zf(g,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[f+g>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break k}case 12:{e=e+3|0;break k}case 20:{e=e+6|0;break k}case 5:{e=e+5|0;break k}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break k}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break k}default:{e=h;break k}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break k}case 1:{e=e+2|0;break k}case 2:{e=e+3|0;break k}default:{e=h;break k}}while(0);if((e|0)<=15)if((i&-64|0)==192){k=447;break c}else{k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 131:case 130:case 128:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);l:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break l}case 12:{e=e+3|0;break l}case 20:{e=e+6|0;break l}case 5:{e=e+5|0;break l}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break l}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break l}default:{e=h;break l}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break l}case 1:{e=e+2|0;break l}case 2:{e=e+3|0;break l}default:{e=h;break l}}while(0);if((e|0)<=15){if((i&-64|0)==192|(i&56|0)==56){k=447;break c}if((e|0)>14){k=447;break c}else{e=e+1|0;k=448;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}case 129:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);m:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break m}case 12:{e=e+3|0;break m}case 20:{e=e+6|0;break m}case 5:{e=e+5|0;break m}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break m}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break m}default:{e=h;break m}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break m}case 1:{e=e+2|0;break m}case 2:{e=e+3|0;break m}default:{e=h;break m}}while(0);if((e|0)<=15){if((i&-64|0)==192|(i&56|0)==56){k=447;break c}e=e+j|0;if((e|0)>15){k=447;break c}else{k=448;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}case 247:case 246:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);n:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break n}case 12:{e=e+3|0;break n}case 20:{e=e+6|0;break n}case 5:{e=e+5|0;break n}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break n}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break n}default:{e=h;break n}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break n}case 1:{e=e+2|0;break n}case 2:{e=e+3|0;break n}default:{e=h;break n}}while(0);if((e|0)<=15){if((i&-64|0)==192){k=447;break c}if((i>>>3&6|1|0)==3){k=448;break c}else{k=447;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}case 255:case 254:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);o:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break o}case 12:{e=e+3|0;break o}case 20:{e=e+6|0;break o}case 5:{e=e+5|0;break o}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break o}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break o}default:{e=h;break o}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break o}case 1:{e=e+2|0;break o}case 2:{e=e+3|0;break o}default:{e=h;break o}}while(0);if((e|0)<=15)if((i&-64|0)!=192&(i&48|0)==0){k=448;break c}else{k=447;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 15:{i=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);switch(f|0){case 199:case 177:case 176:case 193:case 192:case 187:case 179:case 171:{h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);p:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break p}case 12:{e=e+4|0;break p}case 20:{e=e+7|0;break p}case 5:{e=e+6|0;break p}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break p}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break p}default:{e=h;break p}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+4|0:h;break p}case 1:{e=e+3|0;break p}case 2:{e=e+4|0;break p}default:{e=h;break p}}while(0);if((e|0)<=15)if((i&-64|0)==192){k=447;break c}else{k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 186:break;default:{k=447;break c}}h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);q:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break q}case 12:{e=e+4|0;break q}case 20:{e=e+7|0;break q}case 5:{e=e+6|0;break q}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break q}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break q}default:{e=h;break q}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+4|0:h;break q}case 1:{e=e+3|0;break q}case 2:{e=e+4|0;break q}default:{e=h;break q}}while(0);if((e|0)<=15){if((i&-64|0)==192|(i&56)>>>0<40){k=447;break c}if((e|0)>14){k=447;break c}else{e=e+1|0;k=448;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}default:{k=447;break c}}while(0);if((k|0)==447){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==448){c[a>>2]=e;a=0;return a|0}}else if((k|0)==449)return e|0;return 0}function zf(b,f,g,h){b=b|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;o=r+8|0;p=r+4|0;j=r;n=(h|0)==2?(a[22968]|0)==3&1:h;q=1<<f;a:do if(!(q+-1&b)){if(wf(j,o,p,b,g,n)|0){b=-1;l=r;return b|0}h=c[j>>2]|0;j=Ge(c[4202123]|0,h,0)|0;if(!j)i=0;else{if(!(c[j+32>>2]|0)){if(!(c[j+76>>2]&q)){i=0;break}i=Ya[c[j+68>>2]&63](c[j+64>>2]|0,h-(c[j+8>>2]|0)|0,f)|0;break}m=h-(c[j+8>>2]|0)|0;n=(c[j+40>>2]|0)+m|0;h=c[o>>2]|0;do if(h){j=c[j+48>>2]|0;k=(j|0)==0;if(g|0){j=j+(m>>>17<<2)|0;if(k)break;c[j>>2]=c[j>>2]|1<<(m>>>12&31);break}if(!k?(c[j+(m>>>17<<2)>>2]&1<<(m>>>12&31)|0)==0:0){c[o>>2]=0;h=0}}else h=0;while(0);xf(b,n,h,c[p>>2]|0);switch(f|0){case 0:{i=d[n>>0]|0;break a}case 1:{i=e[n>>1]|0;break a}case 2:{i=c[n>>2]|0;break a}default:ra()}}}else{i=(f|0)!=31;if(!g){if(!i){i=0;break}m=n<<20;i=0;k=0;while(1){h=k+b|0;j=c[23084+((h>>>12|m)<<2)>>2]|0;if(!(j&1))h=d[j+h>>0]|0;else{if(zf(h,0,0,n)|0){i=-1;break}h=c[5762]|0}i=h<<(k<<3)|i;k=k+1|0;if((k|0)>=(q|0))break a}l=r;return i|0}else{if(!i){i=0;break}i=0;k=0;while(1){h=k+b|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(j&1))h=d[j+h>>0]|0;else{if(zf(h,0,1,2)|0){i=-1;break}h=c[5762]|0}i=h<<(k<<3)|i;k=k+1|0;if((k|0)>=(q|0))break a}l=r;return i|0}}while(0);c[5762]=i;b=0;l=r;return b|0}function Af(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=c[5755]|0;if((c[5731]|0)!=0&(j&143|0)==0){e=b&7;switch((b>>>3&24|e)&31){case 4:{g=c[5758]|0;h=d[g>>0]|0;e=g+1|0;c[5758]=e;f=h&7;if((f|0)==5){e=d[g+2>>0]<<8|d[e>>0]|d[g+3>>0]<<16|d[g+4>>0]<<24;c[5758]=g+5}else e=c[22528+(f<<2)>>2]|0;f=h>>>3&7;if((f|0)==4){j=e;return j|0}j=(c[22528+(f<<2)>>2]<<(h>>>6))+e|0;return j|0}case 12:{g=c[5758]|0;e=d[g>>0]|0;f=g+1|0;c[5758]=f;f=a[f>>0]|0;c[5758]=g+2;f=(c[22528+((e&7)<<2)>>2]|0)+f|0;g=e>>>3&7;if((g|0)==4){j=f;return j|0}j=(c[22528+(g<<2)>>2]<<(e>>>6))+f|0;return j|0}case 20:{g=c[5758]|0;e=d[g>>0]|0;f=g+1|0;c[5758]=f;f=d[g+2>>0]<<8|d[f>>0]|d[g+3>>0]<<16|d[g+4>>0]<<24;c[5758]=g+5;f=f+(c[22528+((e&7)<<2)>>2]|0)|0;g=e>>>3&7;if((g|0)==4){j=f;return j|0}j=(c[22528+(g<<2)>>2]<<(e>>>6))+f|0;return j|0}case 5:{b=c[5758]|0;j=d[b+1>>0]<<8|d[b>>0]|d[b+2>>0]<<16|d[b+3>>0]<<24;c[5758]=b+4;return j|0}case 7:case 6:case 3:case 2:case 1:case 0:{j=c[22528+(e<<2)>>2]|0;return j|0}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{b=c[5758]|0;j=a[b>>0]|0;c[5758]=b+1;j=(c[22528+(e<<2)>>2]|0)+j|0;return j|0}default:{b=c[5758]|0;j=d[b+1>>0]<<8|d[b>>0]|d[b+2>>0]<<16|d[b+3>>0]<<24;c[5758]=b+4;j=j+(c[22528+(e<<2)>>2]|0)|0;return j|0}}}if(j&128|0){a:do if((b&199|0)==6){g=c[5758]|0;h=d[g+1>>0]<<8|d[g>>0];c[5758]=g+2;g=3}else{e=b>>6;switch(e|0){case 0:break;case 1:{f=c[5758]|0;e=a[f>>0]|0;f=f+1|0;i=22;break}default:{f=c[5758]|0;e=d[f+1>>0]<<8|d[f>>0];f=f+2|0;i=22}}if((i|0)==22)c[5758]=f;switch(b&7){case 0:{g=3;h=(c[5635]|0)+e+(c[5638]|0)&65535;break a}case 1:{g=3;h=(c[5635]|0)+e+(c[5639]|0)&65535;break a}case 2:{g=2;h=(c[5637]|0)+e+(c[5638]|0)&65535;break a}case 3:{g=2;h=(c[5637]|0)+e+(c[5639]|0)&65535;break a}case 4:{g=3;h=(c[5638]|0)+e&65535;break a}case 5:{g=3;h=(c[5639]|0)+e&65535;break a}case 6:{g=2;h=(c[5637]|0)+e&65535;break a}case 7:{g=3;h=(c[5635]|0)+e&65535;break a}default:{}}}while(0);j=j&15;j=(c[22740+(((j|0)==0?g:j+-1|0)<<4)+4>>2]|0)+h|0;return j|0}e=b&7;switch((b>>>3&24|e)&31){case 4:{e=c[5758]|0;h=d[e>>0]|0;f=e+1|0;c[5758]=f;g=h&7;if((g|0)==5){f=d[e+2>>0]<<8|d[f>>0]|d[e+3>>0]<<16|d[e+4>>0]<<24;c[5758]=e+5;e=0}else{e=g;f=c[22528+(g<<2)>>2]|0}g=h>>>3&7;if((g|0)==4)i=e;else{i=e;f=(c[22528+(g<<2)>>2]<<(h>>>6))+f|0}break}case 12:{e=c[5758]|0;g=d[e>>0]|0;f=e+1|0;c[5758]=f;f=a[f>>0]|0;c[5758]=e+2;e=g&7;f=(c[22528+(e<<2)>>2]|0)+f|0;h=g>>>3&7;if((h|0)==4)i=e;else{i=e;f=(c[22528+(h<<2)>>2]<<(g>>>6))+f|0}break}case 20:{e=c[5758]|0;g=d[e>>0]|0;f=e+1|0;c[5758]=f;f=d[e+2>>0]<<8|d[f>>0]|d[e+3>>0]<<16|d[e+4>>0]<<24;c[5758]=e+5;e=g&7;f=f+(c[22528+(e<<2)>>2]|0)|0;h=g>>>3&7;if((h|0)==4)i=e;else{i=e;f=(c[22528+(h<<2)>>2]<<(g>>>6))+f|0}break}case 5:{i=c[5758]|0;f=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=0;break}case 7:case 6:case 3:case 2:case 1:case 0:{i=e;f=c[22528+(e<<2)>>2]|0;break}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{i=c[5758]|0;f=a[i>>0]|0;c[5758]=i+1;i=e;f=(c[22528+(e<<2)>>2]|0)+f|0;break}default:{i=c[5758]|0;f=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=e;f=f+(c[22528+(e<<2)>>2]|0)|0}}e=j&15;if(!e)e=(i|1|0)==5?2:3;else e=e+-1|0;j=(c[22740+(e<<4)+4>>2]|0)+f|0;return j|0}function Bf(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;k=q+8|0;n=q+4|0;h=q;m=(g|0)==2?(a[22968]|0)==3&1:g;p=1<<f;if(p+-1&d|0){if((f|0)==31){e=0;l=q;return e|0}h=m<<20;g=0;while(1){i=g+d|0;j=e>>>(g<<3);k=c[8411692+((i>>>12|h)<<2)>>2]|0;if(k&1){if(Bf(i,j,0,m)|0){g=-1;i=21;break}}else a[k+i>>0]=j;g=g+1|0;if((g|0)>=(p|0)){g=0;i=21;break}}if((i|0)==21){l=q;return g|0}}if(wf(h,k,n,d,1,m)|0){e=-1;l=q;return e|0}g=c[h>>2]|0;j=Ge(c[4202123]|0,g,0)|0;if(!j){e=0;l=q;return e|0}if(!(c[j+32>>2]|0)){if(!(c[j+76>>2]&p)){e=0;l=q;return e|0}gb[c[j+72>>2]&63](c[j+64>>2]|0,g-(c[j+8>>2]|0)|0,e,f);e=0;l=q;return e|0}h=g-(c[j+8>>2]|0)|0;i=(c[j+40>>2]|0)+h|0;g=c[k>>2]|0;if(g|0?(p=c[j+48>>2]|0,o=p+(h>>>17<<2)|0,p|0):0)c[o>>2]=c[o>>2]|1<<(h>>>12&31);xf(d,i,g,c[n>>2]|0);switch(f|0){case 0:{a[i>>0]=e;e=0;l=q;return e|0}case 1:{b[i>>1]=e;e=0;l=q;return e|0}case 2:{c[i>>2]=e;e=0;l=q;return e|0}default:ra()}return 0}function Cf(a,b){a=a|0;b=b|0;b=b&65535;if(!(c[5732]&1)){c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=b<<4;a=(c[5696]|0)>>>6&65536;c[5729]=(a^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?a>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;a=0;return a|0}if(!(c[5647]&131072)){a=Zg(a,b,0)|0;return a|0}else{c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=b<<4;c[22740+(a<<4)+8>>2]=65535;c[22740+(a<<4)+12>>2]=62208;a=(c[5696]|0)>>>6&65536;c[5729]=(a^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?a>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;a=0;return a|0}return 0}function Df(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0;f=c[5770]|0;g=c[23084+(f+(d>>>12)<<2)>>2]|0;do if((g|d)&3)if(!(zf(d,2,0,2)|0)){f=c[5770]|0;g=23048;break}else{b=-1;return b|0}else g=g+d|0;while(0);h=c[g>>2]|0;g=d+4|0;f=c[23084+(f+(g>>>12)<<2)>>2]|0;do if((f|g)&1)if(!(zf(g,1,0,2)|0)){f=c[5762]|0;break}else{b=-1;return b|0}else f=e[f+g>>1]|0;while(0);if(Cf(a,f)|0){b=-1;return b|0}c[22528+(b<<2)>>2]=h;b=0;return b|0}function Ef(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;switch(a|0){case 0:{c[5641]=d;e=d+b<<24>>24;c[5642]=e;f=0;break}case 1:{e=(d|b)<<24>>24;c[5642]=e;f=12;break}case 2:{f=nf(22528)|0;c[5641]=d;e=d+b+f<<24>>24;c[5642]=e;f=(f|0)==0?0:3;break}case 3:{f=nf(22528)|0;c[5641]=d;e=b-d-f<<24>>24;c[5642]=e;f=(f|0)==0?6:9;break}case 4:{e=(d&b)<<24>>24;c[5642]=e;f=12;break}case 5:{c[5641]=d;e=b-d<<24>>24;c[5642]=e;f=6;break}case 6:{e=(d^b)<<24>>24;c[5642]=e;f=12;break}case 7:{c[5641]=d;c[5642]=b-d<<24>>24;e=b;f=6;break}default:ra()}c[5643]=f;return e|0}function Ff(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;switch(a|0){case 0:{c[5641]=d;e=d+b|0;c[5642]=e;f=2;break}case 1:{e=d|b;c[5642]=e;f=14;break}case 2:{f=nf(22528)|0;c[5641]=d;e=d+b+f|0;c[5642]=e;f=(f|0)==0?2:5;break}case 3:{f=nf(22528)|0;c[5641]=d;e=b-d-f|0;c[5642]=e;f=(f|0)==0?8:11;break}case 4:{e=d&b;c[5642]=e;f=14;break}case 5:{c[5641]=d;e=b-d|0;c[5642]=e;f=8;break}case 6:{e=d^b;c[5642]=e;f=14;break}case 7:{c[5641]=d;c[5642]=b-d;e=b;f=8;break}default:ra()}c[5643]=f;return e|0}function Gf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0;switch(b|0){case 0:{if(!(f&31))return e|0;b=f&7;h=e&255;b=h>>>(8-b|0)|h<<b;if((c[5643]|0)==24){g=c[5641]|0;f=g>>>7&1;g=((c[5642]|0)==0&1)<<6|g&4}else{g=c[5642]|0;f=g>>>31;g=(d[21168+(g&255)>>0]|0)<<2|((g|0)==0&1)<<6}e=f<<7|g|(vf()|0);c[5641]=(b^h)<<4&2048|b&1|e;c[5642]=e>>>6&1^1;c[5643]=24;e=b;return e|0}case 1:{if(!(f&31))return e|0;f=f&7;b=e&255;f=b<<8-f|b>>>f;if((c[5643]|0)==24){h=c[5641]|0;g=h>>>7&1;h=((c[5642]|0)==0&1)<<6|h&4}else{h=c[5642]|0;g=h>>>31;h=(d[21168+(h&255)>>0]|0)<<2|((h|0)==0&1)<<6}e=g<<7|h|(vf()|0);c[5641]=(f^b)<<4&2048|f>>>7&1|e;c[5642]=e>>>6&1^1;c[5643]=24;e=f;return e|0}case 2:{b=a[21456+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&255;g=(nf(22528)|0)<<h+-1|((b<<24>>24==1?0:i>>>(9-h|0))|i<<h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)<<4&2048|i>>>(8-h|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 3:{b=a[21456+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&255;g=(nf(22528)|0)<<8-h|((b<<24>>24==1?0:i<<9-h)|i>>>h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)<<4&2048|i>>>(h+-1|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 6:case 4:{b=f&31;f=e<<b<<24>>24;if(!b)return e|0;c[5641]=e<<b+-1;c[5642]=f;c[5643]=15;e=f;return e|0}case 5:{b=f&31;f=e&255;g=f>>>b<<24>>24;if(!b)return e|0;c[5641]=f>>>(b+-1|0);c[5642]=g;c[5643]=18;e=g;return e|0}case 7:{b=f&31;f=e<<24>>24;g=f>>b;if(!b)return e|0;c[5641]=f>>b+-1;c[5642]=g;c[5643]=18;e=g;return e|0}default:ra()}return 0}function Hf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;switch(a|0){case 0:{a=e&31;if(!a)return b|0;f=b>>>(32-a|0)|b<<a;if((c[5643]|0)==24){e=c[5641]|0;a=e>>>7&1;e=((c[5642]|0)==0&1)<<6|e&4}else{e=c[5642]|0;a=e>>>31;e=(d[21168+(e&255)>>0]|0)<<2|((e|0)==0&1)<<6}g=a<<7|e|(vf()|0);c[5641]=(f^b)>>>20&2048|f&1|g;c[5642]=g>>>6&1^1;c[5643]=24;b=f;return b|0}case 1:{a=e&31;if(!a)return b|0;a=b<<32-a|b>>>a;if((c[5643]|0)==24){f=c[5641]|0;e=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;e=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}g=e<<7|f|(vf()|0);c[5641]=(a^b)>>>20&2048|a>>>31|g;c[5642]=g>>>6&1^1;c[5643]=24;b=a;return b|0}case 2:{f=e&31;if(!f)return b|0;g=(nf(22528)|0)<<f+-1|(((f|0)==1?0:b>>>(33-f|0))|b<<f);if((c[5643]|0)==24){e=c[5641]|0;a=e>>>7&1;e=((c[5642]|0)==0&1)<<6|e&4}else{e=c[5642]|0;a=e>>>31;e=(d[21168+(e&255)>>0]|0)<<2|((e|0)==0&1)<<6}e=a<<7|e|(vf()|0);c[5641]=(g^b)>>>20&2048|b>>>(32-f|0)&1|e;c[5642]=e>>>6&1^1;c[5643]=24;b=g;return b|0}case 3:{a=e&31;if(!a)return b|0;g=(nf(22528)|0)<<32-a|(((a|0)==1?0:b<<33-a)|b>>>a);if((c[5643]|0)==24){f=c[5641]|0;e=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;e=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=e<<7|f|(vf()|0);c[5641]=(g^b)>>>20&2048|b>>>(a+-1|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;b=g;return b|0}case 6:case 4:{a=e&31;e=b<<a;if(!a)return b|0;c[5641]=b<<a+-1;c[5642]=e;c[5643]=17;b=e;return b|0}case 5:{a=e&31;e=b>>>a;if(!a)return b|0;c[5641]=b>>>(a+-1|0);c[5642]=e;c[5643]=20;b=e;return b|0}case 7:{a=e&31;e=b>>a;if(!a)return b|0;c[5641]=b>>a+-1;c[5642]=e;c[5643]=20;b=e;return b|0}default:ra()}return 0}function If(){var a=0,b=0,d=0,e=0,f=0,g=0;d=(c[5636]|0)+-32|0;a=(d&c[5729])+(c[5694]|0)|0;b=7;while(1){f=c[22528+(b<<2)>>2]|0;e=c[8411692+((c[5770]|0)+(a>>>12)<<2)>>2]|0;if((e|a)&3){if(Bf(a,f,2,2)|0){a=-1;g=7;break}}else c[e+a>>2]=f;if(!b)break;else{a=a+4|0;b=b+-1|0}}if((g|0)==7)return a|0;g=c[5729]|0;c[5636]=c[5636]&~g|g&d;g=0;return g|0}function Jf(){var a=0,b=0,d=0,e=0;b=7;d=(c[5729]&c[5636])+(c[5694]|0)|0;while(1){if((b|0)!=4){a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;if((a|d)&3)if(!(zf(d,2,0,2)|0))a=23048;else{a=-1;e=9;break}else a=a+d|0;c[22528+(b<<2)>>2]=c[a>>2]}if(!b)break;else{b=b+-1|0;d=d+4|0}}if((e|0)==9)return a|0;d=c[5636]|0;e=c[5729]|0;c[5636]=d&~e|d+32&e;e=0;return e|0}function Kf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=b&31;e=c[5637]|0;l=(c[5636]|0)+-4|0;f=(c[5729]&l)+(c[5694]|0)|0;d=c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|0;if((d|f)&3){if(Bf(f,e,2,2)|0){l=-1;return l|0}}else c[d+f>>2]=e;a:do switch(b&31){case 0:{b=l;break}case 1:{b=l;h=14;break}default:{b=l;while(1){e=e+-4|0;d=c[5729]|0;f=c[5694]|0;i=(d&e)+f|0;h=c[5770]|0;j=c[23084+((i>>>12)+h<<2)>>2]|0;if(!((j|i)&3)){k=d;d=j+i|0}else{if(zf(i,2,0,2)|0){b=-1;h=21;break}k=c[5729]|0;f=c[5694]|0;h=c[5770]|0;d=23048}i=c[d>>2]|0;b=b+-4|0;f=(k&b)+f|0;d=c[8411692+((f>>>12)+h<<2)>>2]|0;if((d|f)&3){if(Bf(f,i,2,2)|0){b=-1;h=21;break}}else c[d+f>>2]=i;if((g|0)<=2){h=14;break a}else g=g+-1|0}if((h|0)==21)return b|0}}while(0);do if((h|0)==14){b=b+-4|0;d=(c[5729]&b)+(c[5694]|0)|0;e=c[8411692+((d>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((e|d)&3)){c[e+d>>2]=l;break}if(Bf(d,l,2,2)|0){l=-1;return l|0}}while(0);e=b-a|0;b=c[5729]|0;d=e&b;f=d+(c[5694]|0)|0;do if((c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|f)&3)if(!(zf(f,2,1,2)|0)){b=c[5729]|0;d=b&e;break}else{l=-1;return l|0}while(0);c[5637]=l;c[5636]=c[5636]&~b|d;l=0;return l|0}function Lf(){var a=0,b=0,d=0,e=0,f=0;f=c[5637]|0;a=c[5729]|0;d=(a&f)+(c[5694]|0)|0;e=c[23084+((d>>>12)+(c[5770]|0)<<2)>>2]|0;do if((e|d)&3)if(!(zf(d,2,0,2)|0)){b=c[5729]|0;a=23048;break}else{f=-1;return f|0}else{b=a;a=e+d|0}while(0);c[5637]=c[a>>2];c[5636]=c[5636]&~b|b&f+4;f=0;return f|0}function Mf(f,g,h,i){f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+16|0;z=B+4|0;A=B;if((c[5647]|0)>>>17&1|c[5732]&1^1|0){m=c[5636]|0;do if(!f){j=(c[5729]&m+-2)+(c[5694]|0)|0;k=c[5689]|0;f=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((f|j)&1){if(Bf(j,k,1,2)|0){i=-1;l=B;return i|0}}else b[f+j>>1]=k;j=m+-4|0;k=(c[5729]&j)+(c[5694]|0)|0;f=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((f|k)&1)){b[f+k>>1]=i;break}if(Bf(k,i,1,2)|0){i=-1;l=B;return i|0}}else{j=(c[5729]&m+-4)+(c[5694]|0)|0;k=c[5689]|0;f=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((f|j)&3){if(Bf(j,k,2,2)|0){i=-1;l=B;return i|0}}else c[f+j>>2]=k;j=m+-8|0;k=(c[5729]&j)+(c[5694]|0)|0;f=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((f|k)&3)){c[f+k>>2]=i;break}if(Bf(k,i,2,2)|0){i=-1;l=B;return i|0}}while(0);A=c[5729]|0;c[5636]=c[5636]&~A|A&j;c[5640]=h;c[5689]=g;A=g<<4;c[5690]=A;i=(c[5696]|0)>>>6&65536;c[5729]=(i^65536)+-1;c[5731]=(c[5694]|A|c[5698]|c[5686]|0)==0?i>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;i=0;l=B;return i|0}c[z>>2]=0;c[A>>2]=0;p=g&65532;a:do if(!p){c[5746]=13;c[5747]=0;h=-1}else{j=(g>>>1&2^2)+6|0;if((g|7)>>>0>(c[22740+(j<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=p;h=-1;break}k=(c[22740+(j<<4)+4>>2]|0)+(g&-8)|0;j=c[23084+(k>>>12<<2)>>2]|0;if((j|k)&3)if(!(zf(k,2,0,0)|0))j=23048;else{h=-1;break}else j=j+k|0;q=c[j>>2]|0;j=k+4|0;k=c[23084+(j>>>12<<2)>>2]|0;if((k|j)&3)if(!(zf(j,2,0,0)|0))j=23048;else{h=-1;break}else j=k+j|0;o=c[j>>2]|0;r=d[22968]|0;t=c[5636]|0;b:do if(o&4096){if(!(o&2048)){c[5746]=13;c[5747]=p;h=-1;break a}j=o>>>13&3;if(!(o&1024)){if((g&3)>>>0>r>>>0){c[5746]=13;c[5747]=p;h=-1;break a}if((j|0)!=(r|0)){c[5746]=13;c[5747]=p;h=-1;break a}}else if(j>>>0>r>>>0){c[5746]=13;c[5747]=p;h=-1;break a}if(!(o&32768)){c[5746]=11;c[5747]=p;h=-1;break a}c[A>>2]=t;g=((c[5696]|0)>>>6&65536^65536)+-1|0;n=c[5694]|0;do if(!f){j=t+-2|0;c[A>>2]=j;k=(g&j)+n|0;f=c[5689]|0;m=c[8411692+(k>>>12<<2)>>2]|0;if((m|k)&1){if(Bf(k,f,1,0)|0){h=-1;break a}}else{b[m+k>>1]=f;j=c[A>>2]|0}j=j+-2|0;c[A>>2]=j;j=(j&g)+n|0;k=c[8411692+(j>>>12<<2)>>2]|0;if((j|k)&1)if(!(Bf(j,i,1,0)|0))break;else{h=-1;break a}else{b[j+k>>1]=i;break}}else{j=t+-4|0;c[A>>2]=j;k=(g&j)+n|0;f=c[5689]|0;m=c[8411692+(k>>>12<<2)>>2]|0;if((m|k)&3){if(Bf(k,f,2,0)|0){h=-1;break a}}else{c[m+k>>2]=f;j=c[A>>2]|0}j=j+-4|0;c[A>>2]=j;j=(j&g)+n|0;k=c[8411692+(j>>>12<<2)>>2]|0;if((j|k)&3)if(!(Bf(j,i,2,0)|0))break;else{h=-1;break a}else{c[j+k>>2]=i;break}}while(0);j=o&983040|q&65535;j=(o&8388608|0)==0?j:j<<12|4095;if(j>>>0<h>>>0){c[5746]=13;c[5747]=p;h=-1;break a}else{i=c[5729]|0;c[5636]=c[A>>2]&i|c[5636]&~i;A=o&-16777216|q>>>16|o<<16&16711680;c[5689]=p|r;c[5690]=A;c[5691]=j;c[5692]=o;i=(c[5696]|0)>>>6&65536;c[5729]=(i^65536)+-1;c[5731]=(c[5694]|A|c[5698]|c[5686]|0)==0?i>>>16:0;c[5730]=(o&4194304|0)==0?384:0;break}}else{h=o>>>13&3;j=g&3;switch(o>>>8&31){case 5:case 9:case 1:if(h>>>0<r>>>0|h>>>0<j>>>0){c[5746]=13;c[5747]=p;h=-1;break a}else{h=Xg(g&65535,q,o,2,i,0,0)|0;break a}case 12:case 4:{u=o>>>11&3;if(h>>>0<r>>>0|h>>>0<j>>>0){c[5746]=13;c[5747]=p;h=-1;break a}if(!(o&32768)){c[5746]=11;c[5747]=p;h=-1;break a}k=q>>>16;h=o&-65536|q&65535;p=o&31;y=k&65532;if(!y){c[5746]=13;c[5747]=0;h=-1;break a}j=(q>>>17&2^2)+6|0;if((k|7)>>>0>(c[22740+(j<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=y;h=-1;break a}k=(c[22740+(j<<4)+4>>2]|0)+(k&65528)|0;j=c[23084+(k>>>12<<2)>>2]|0;if((j|k)&3)if(!(zf(k,2,0,0)|0))j=23048;else{h=-1;break a}else j=j+k|0;x=c[j>>2]|0;j=k+4|0;k=c[23084+(j>>>12<<2)>>2]|0;if((k|j)&3)if(!(zf(j,2,0,0)|0))j=23048;else{h=-1;break a}else j=k+j|0;w=c[j>>2]|0;if((w&6144|0)!=6144){c[5746]=13;c[5747]=y;h=-1;break a}v=w>>>13&3;if(v>>>0>r>>>0){c[5746]=13;c[5747]=y;h=-1;break a}if(!(w&32768)){c[5746]=11;c[5747]=y;h=-1;break a}c:do if((w&1024|0)==0&v>>>0<r>>>0){if(_g(z,A,v)|0){h=-1;break a}j=c[z>>2]|0;m=j&65532;if(!m){c[5746]=10;c[5747]=0;h=-1;break a}if((j&3|0)!=(v|0)){c[5746]=10;c[5747]=m;h=-1;break a}k=(j>>>1&2^2)+6|0;if((j|7)>>>0>(c[22740+(k<<4)+8>>2]|0)>>>0){c[5746]=10;c[5747]=m;h=-1;break a}k=(c[22740+(k<<4)+4>>2]|0)+(j&-8)|0;j=c[23084+(k>>>12<<2)>>2]|0;if((j|k)&3)if(!(zf(k,2,0,0)|0))j=23048;else{h=-1;break a}else j=j+k|0;j=c[j>>2]|0;k=k+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else{h=-1;break a}else k=f+k|0;k=c[k>>2]|0;if((k>>>13&3|0)!=(v|0)){c[5746]=10;c[5747]=m;h=-1;break a}if((k&6656|0)!=4608){c[5746]=10;c[5747]=m;h=-1;break a}if(!(k&32768)){c[5746]=10;c[5747]=m;h=-1;break a}q=((c[5696]|0)>>>6&65536^65536)+-1|0;r=c[5694]|0;s=(k>>>6&65536^65536)+-1|0;m=k&-16777216|j>>>16|k<<16&16711680;f=c[A>>2]|0;if(u|0){f=f+-4|0;c[A>>2]=f;g=(f&s)+m|0;n=c[5693]|0;o=c[8411692+(g>>>12<<2)>>2]|0;if((o|g)&3){if(Bf(g,n,2,0)|0){h=-1;break a}}else{c[o+g>>2]=n;f=c[A>>2]|0}f=f+-4|0;c[A>>2]=f;f=(f&s)+m|0;g=c[8411692+(f>>>12<<2)>>2]|0;if((f|g)&3){if(Bf(f,t,2,0)|0){h=-1;break a}}else c[f+g>>2]=t;if(!p){o=m;p=s;q=1;f=c[A>>2]|0;r=135;break}o=p;while(1){p=o;o=o+-1|0;f=((o<<2)+t&q)+r|0;g=c[23084+(f>>>12<<2)>>2]|0;if((f|g)&3)if(!(zf(f,2,0,0)|0))f=23048;else{h=-1;break a}else f=f+g|0;n=c[f>>2]|0;f=(c[A>>2]|0)+-4|0;c[A>>2]=f;f=(f&s)+m|0;g=c[8411692+(f>>>12<<2)>>2]|0;if((f|g)&3){if(Bf(f,n,2,0)|0){h=-1;break a}}else c[f+g>>2]=n;if((p|0)<=1){g=s;n=1;r=134;break c}}}f=f+-2|0;c[A>>2]=f;g=(f&s)+m|0;n=c[5693]|0;o=c[8411692+(g>>>12<<2)>>2]|0;if((o|g)&1){if(Bf(g,n,1,0)|0){h=-1;break a}}else{b[o+g>>1]=n;f=c[A>>2]|0}f=f+-2|0;c[A>>2]=f;f=(f&s)+m|0;g=c[8411692+(f>>>12<<2)>>2]|0;if((f|g)&1){if(Bf(f,t,1,0)|0){h=-1;break a}}else b[f+g>>1]=t;if(!p){o=m;p=s;q=1;f=c[A>>2]|0;r=141;break}o=p;while(1){p=o;o=o+-1|0;f=((o<<1)+t&q)+r|0;g=c[23084+(f>>>12<<2)>>2]|0;if(!((f|g)&1))f=e[f+g>>1]|0;else{if(zf(f,1,0,0)|0){h=-1;break a}f=c[5762]|0}g=(c[A>>2]|0)+-2|0;c[A>>2]=g;g=(g&s)+m|0;n=c[8411692+(g>>>12<<2)>>2]|0;if((g|n)&1){if(Bf(g,f,1,0)|0){h=-1;break a}}else b[g+n>>1]=f;if((p|0)<=1){g=s;n=1;r=134;break}}}else{c[A>>2]=t;m=c[5694]|0;g=((c[5696]|0)>>>6&65536^65536)+-1|0;n=0;k=0;j=0;r=134}while(0);if((r|0)==134){f=c[A>>2]|0;if(!u){o=m;p=g;q=n;r=141}else{o=m;p=g;q=n;r=135}}do if((r|0)==135){f=f+-4|0;c[A>>2]=f;m=(p&f)+o|0;g=c[5689]|0;n=c[8411692+(m>>>12<<2)>>2]|0;if((n|m)&3){if(Bf(m,g,2,0)|0){h=-1;break a}}else{c[n+m>>2]=g;f=c[A>>2]|0}f=f+-4|0;c[A>>2]=f;f=(f&p)+o|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((f|m)&3)if(!(Bf(f,i,2,0)|0)){f=q;break}else{h=-1;break a}else{c[f+m>>2]=i;f=q;break}}else if((r|0)==141){f=f+-2|0;c[A>>2]=f;m=(p&f)+o|0;g=c[5689]|0;n=c[8411692+(m>>>12<<2)>>2]|0;if((n|m)&1){if(Bf(m,g,1,0)|0){h=-1;break a}}else{b[n+m>>1]=g;f=c[A>>2]|0}f=f+-2|0;c[A>>2]=f;f=(f&p)+o|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((f|m)&1)if(!(Bf(f,i,1,0)|0)){f=q;break}else{h=-1;break a}else{b[f+m>>1]=i;f=q;break}}while(0);if(!f){k=(c[5696]|0)>>>6&65536;m=k^65536;k=k>>>16;f=m;m=m+-1|0;g=c[5686]|0;n=c[5698]|0;j=c[5694]|0}else{m=c[z>>2]&-4|v;c[z>>2]=m;f=j&65535|k&983040;c[5693]=m;c[5694]=o;c[5695]=(k&8388608|0)==0?f:f<<12|4095;c[5696]=k;k=k>>>6&65536;f=k^65536;m=f+-1|0;c[5729]=m;n=c[5698]|0;g=c[5686]|0;k=k>>>16;c[5731]=(c[5690]|o|n|g|0)==0?k:0;c[5730]=(c[5692]&4194304|0)==0?384:0;j=o}i=w&-16777216|x>>>16|w<<16&16711680;z=w&983040|x&65535;c[5689]=v|y;c[5690]=i;c[5691]=(w&8388608|0)==0?z:z<<12|4095;c[5692]=w;c[5729]=m;c[5731]=(g|i|n|j|0)==0?k:0;c[5730]=(w&4194304|0)==0?384:0;a[22968]=v;c[5770]=(v|0)==3?1048576:0;c[5636]=c[A>>2]&m|c[5636]&0-f;break b}default:{c[5746]=13;c[5747]=p;h=-1;break a}}}while(0);c[5640]=h;h=0}while(0);i=h;l=B;return i|0}function Nf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if(c[5732]&1|0?(c[5647]&131072|0)==0:0){j=a&65532;if(!j){c[5746]=13;c[5747]=0;k=-1;return k|0}f=(a>>>1&2^2)+6|0;if((a|7)>>>0>(c[22740+(f<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}g=(c[22740+(f<<4)+4>>2]|0)+(a&-8)|0;f=c[23084+(g>>>12<<2)>>2]|0;if((f|g)&3)if(!(zf(g,2,0,0)|0))f=23048;else{k=-1;return k|0}else f=f+g|0;i=c[f>>2]|0;f=g+4|0;g=c[23084+(f>>>12<<2)>>2]|0;if((g|f)&3)if(!(zf(f,2,0,0)|0))f=23048;else{k=-1;return k|0}else f=g+f|0;h=c[f>>2]|0;k=d[22968]|0;if(h&4096|0){if(!(h&2048)){c[5746]=13;c[5747]=j;k=-1;return k|0}f=h>>>13&3;if(!(h&1024)){if((a&3)>>>0>k>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}if((f|0)!=(k|0)){c[5746]=13;c[5747]=j;k=-1;return k|0}}else if(f>>>0>k>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}if(!(h&32768)){c[5746]=11;c[5747]=j;k=-1;return k|0}f=h&983040|i&65535;f=(h&8388608|0)==0?f:f<<12|4095;if(f>>>0<b>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}else{i=h&-16777216|i>>>16|h<<16&16711680;c[5689]=j|k;c[5690]=i;c[5691]=f;c[5692]=h;k=(c[5696]|0)>>>6&65536;c[5729]=(k^65536)+-1;c[5731]=(c[5694]|i|c[5698]|c[5686]|0)==0?k>>>16:0;c[5730]=(h&4194304|0)==0?384:0;c[5640]=b;k=0;return k|0}}f=h>>>13&3;g=a&3;a:do switch(h>>>8&15){case 5:case 9:case 1:{if(f>>>0<k>>>0|f>>>0<g>>>0){c[5746]=13;c[5747]=j;break a}if(!(Xg(a&65535,i,h,0,e,0,0)|0)){k=0;return k|0}break}case 12:case 4:{if(f>>>0<k>>>0|f>>>0<g>>>0){c[5746]=13;c[5747]=j;break a}if(!(h&32768)){c[5746]=11;c[5747]=j;break a}e=i>>>16;b=((h&3840|0)==3072?h&-65536:0)|i&65535;f=(i>>>17&2^2)+6|0;if((e|7)>>>0>(c[22740+(f<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=e&65532;break a}g=(c[22740+(f<<4)+4>>2]|0)+(e&65528)|0;f=c[23084+(g>>>12<<2)>>2]|0;if((f|g)&3)if(!(zf(g,2,0,0)|0))f=23048;else break a;else f=f+g|0;h=c[f>>2]|0;f=g+4|0;g=c[23084+(f>>>12<<2)>>2]|0;if((g|f)&3)if(!(zf(f,2,0,0)|0))f=23048;else break a;else f=g+f|0;g=c[f>>2]|0;f=g>>>13&3;if((g&6144|0)!=6144){c[5746]=13;c[5747]=e&65532;break a}j=(g&1024|0)!=0;if(!(j&f>>>0>k>>>0^(j|(f|0)==(k|0)))){c[5746]=13;c[5747]=e&65532;break a}if(!(g&32768)){c[5746]=13;c[5747]=e&65532;break a}f=g&983040|h&65535;f=(g&8388608|0)==0?f:f<<12|4095;if((b|0)>(f|0)){c[5746]=13;c[5747]=0;break a}j=g&-16777216|h>>>16|g<<16&16711680;c[5689]=e&65532|k;c[5690]=j;c[5691]=f;c[5692]=g;k=(c[5696]|0)>>>6&65536;c[5729]=(k^65536)+-1;c[5731]=(c[5694]|j|c[5698]|c[5686]|0)==0?k>>>16:0;c[5730]=(g&4194304|0)==0?384:0;c[5640]=b;k=0;return k|0}default:{c[5746]=13;c[5747]=j}}while(0);k=-1;return k|0}c[5640]=b;c[5689]=a;j=a<<4;c[5690]=j;k=(c[5696]|0)>>>6&65536;c[5729]=(k^65536)+-1;c[5731]=(c[5694]|j|c[5698]|c[5686]|0)==0?k>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;k=0;return k|0}function Of(){var a=0;switch(c[5643]|0){case 6:{a=c[5641]|0;a=(a+(c[5642]|0)&255)>>>0<=(a&255)>>>0&1;return a|0}case 7:{a=c[5641]|0;a=(a+(c[5642]|0)&65535)>>>0<=(a&65535)>>>0&1;return a|0}case 8:{a=c[5641]|0;a=(a+(c[5642]|0)|0)>>>0<=a>>>0&1;return a|0}case 24:{a=(c[5641]&65|0)!=0&1;return a|0}default:{a=nf(22528)|0|(c[5642]|0)==0;return a|0}}return 0}function Pf(){var a=0;switch(c[5643]|0){case 6:{a=c[5641]|0;a=(a+(c[5642]|0)<<24|0)<(a<<24|0)&1;return a|0}case 7:{a=c[5641]|0;a=(a+(c[5642]|0)<<16|0)<(a<<16|0)&1;return a|0}case 8:{a=c[5641]|0;a=(a+(c[5642]|0)|0)<(a|0)&1;return a|0}case 30:{a=((c[5642]|0)+1|0)<1&1;return a|0}case 14:case 13:case 12:{a=(c[5642]|0)>>>31;return a|0}case 24:{a=c[5641]|0;a=(a>>>7^a>>>11)&1;return a|0}default:{a=(c[5642]|0)>>>31^(uf()|0);return a|0}}return 0}function Qf(){var a=0;switch(c[5643]|0){case 6:{a=c[5641]|0;a=(a+(c[5642]|0)<<24|0)<=(a<<24|0)&1;return a|0}case 7:{a=c[5641]|0;a=(a+(c[5642]|0)<<16|0)<=(a<<16|0)&1;return a|0}case 8:{a=c[5641]|0;a=(a+(c[5642]|0)|0)<=(a|0)&1;return a|0}case 30:{a=((c[5642]|0)+1|0)<2&1;return a|0}case 14:case 13:case 12:{a=(c[5642]|0)<1&1;return a|0}case 24:{a=c[5641]|0;a=(a>>>7^a>>>11|a>>>6)&1;return a|0}default:{a=(c[5642]|0)>>>31^(uf()|0)|(c[5642]|0)==0;return a|0}}return 0}function Rf(a,b){a=a|0;b=b|0;if(!((c[5647]|0)>>>17&1|c[5732]&1^1)){b=Yg(a,0,b)|0;return b|0}else{b=Wg(a,0,b)|0;return b|0}return 0}function Sf(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=c[5647]|0;f=d&131072;if(!((c[5732]&1|0)!=0&(f|0)==0))if((f|0)==0|(d&12288|0)==12288){b=Wg(a,1,0)|0;return b|0}else{c[5746]=13;c[5747]=0;b=-1;return b|0}if(!(d&16384)){b=Yg(a,1,0)|0;return b|0}d=c[5714]|0;f=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((f|d)&1)if(!(zf(d,1,0,2)|0)){g=c[5762]|0;break}else{b=-1;return b|0}else g=e[f+d>>1]|0;while(0);if(g&4|0){c[5746]=10;c[5747]=g&65532;b=-1;return b|0}d=(g>>>1&2^2)+6|0;if((g|7)>>>0>(c[22740+(d<<4)+8>>2]|0)>>>0){c[5746]=10;c[5747]=g&65532;b=-1;return b|0}f=(c[22740+(d<<4)+4>>2]|0)+(g&-8)|0;d=c[23084+(f>>>12<<2)>>2]|0;if((d|f)&3)if(!(zf(f,2,0,0)|0))d=23048;else{b=-1;return b|0}else d=d+f|0;a=c[d>>2]|0;d=f+4|0;f=c[23084+(d>>>12<<2)>>2]|0;if((f|d)&3)if(!(zf(d,2,0,0)|0))d=23048;else{b=-1;return b|0}else d=f+d|0;d=c[d>>2]|0;if((d&5888|0)==768){b=Xg(g&65535,a,d,1,b,0,0)|0;return b|0}else{c[5746]=10;c[5747]=g&65532;b=-1;return b|0}return 0}function Tf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[5770]|0;e=c[23084+(d+(b>>>12)<<2)>>2]|0;do if((e|b)&3)if(!(zf(b,2,0,2)|0)){d=c[5770]|0;e=23048;break}else{a=-1;return a|0}else e=e+b|0;while(0);f=c[e>>2]|0;e=b+4|0;d=c[23084+(d+(e>>>12)<<2)>>2]|0;if((d|e)&3)if(!(zf(e,2,0,2)|0))d=23048;else{a=-1;return a|0}else d=d+e|0;a=c[22528+(a<<2)>>2]|0;if(!((a|0)<(f|0)?1:(a|0)>(c[d>>2]|0))){a=0;return a|0}c[5746]=5;c[5747]=0;a=-1;return a|0}function Uf(){var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=c[5755]|0;i=g<<9&65536;j=i+-1|0;f=g&15;k=c[5638]|0;l=c[5639]|0;f=(j&k)+(c[22740+(((f|0)==0?3:f+-1|0)<<4)+4>>2]|0)|0;h=(j&l)+(c[5686]|0)|0;if(g&48){g=c[5633]|0;if(!(g&j)){l=0;return l|0}b=c[5770]|0;e=c[23084+(b+(f>>>12)<<2)>>2]|0;do if(e&1)if(!(zf(f,0,0,2)|0)){e=c[5762]|0;b=c[5770]|0;break}else{l=-1;return l|0}else e=d[e+f>>0]|0;while(0);b=c[8411692+(b+(h>>>12)<<2)>>2]|0;if(b&1){if(Bf(h,e,0,2)|0){l=-1;return l|0}}else a[b+h>>0]=e;i=0-i|0;h=c[5646]|0;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i;l=g+-1&j;c[5633]=l|g&i;if(l|0){l=1;return l|0}}else{b=c[5770]|0;e=c[23084+(b+(f>>>12)<<2)>>2]|0;do if(e&1)if(!(zf(f,0,0,2)|0)){e=c[5762]|0;b=c[5770]|0;break}else{l=-1;return l|0}else e=d[e+f>>0]|0;while(0);b=c[8411692+(b+(h>>>12)<<2)>>2]|0;if(b&1){if(Bf(h,e,0,2)|0){l=-1;return l|0}}else a[b+h>>0]=e;i=0-i|0;h=c[5646]|0;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i}l=0;return l|0}function Vf(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;b=o+4|0;d=o;h=c[5755]|0;j=h&128;a=(j|0)==0;j=j<<9;k=j+-1|0;g=h&15;m=c[5638]|0;n=c[5639]|0;g=(k&m)+(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)|0;i=(k&n)+(c[5686]|0)|0;a:do if(h&48){h=c[5633]|0;if(!(h&k)){n=0;l=o;return n|0}b:do if(a&(c[5646]|0)==1?((g|i)&3|0)==0:0){f=(4096-(g&4095)|0)>>>2;f=h>>>0>f>>>0?f:h;e=(4096-(i&4095)|0)>>>2;f=f>>>0>e>>>0?e:f;do if(!(Qg(b,g,0)|0)){e=c[b>>2]|0;if(e|0){if(Qg(d,i,1)|0)break;b=c[d>>2]|0;if(b|0){if((f|0)>0){a=0;do{c[b+(a<<2)>>2]=c[e+(a<<2)>>2];a=a+1|0}while(a>>>0<f>>>0)}k=f<<2;c[5638]=k+m;c[5639]=k+n;n=h-f|0;c[5633]=n;if(!n)break a;else a=1;l=o;return a|0}}break b}while(0);n=-1;l=o;return n|0}while(0);a=c[5770]|0;b=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((b|g)&3)if(!(zf(g,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{n=-1;l=o;return n|0}else{d=a;a=b+g|0}while(0);b=c[a>>2]|0;a=c[8411692+(d+(i>>>12)<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){n=-1;l=o;return n|0}}else c[a+i>>2]=b;j=0-j|0;i=c[5646]<<2;c[5638]=i+m&k|m&j;c[5639]=i+n&k|n&j;n=h+-1&k;c[5633]=n|h&j;if(n|0){n=1;l=o;return n|0}}else{a=c[5770]|0;b=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((b|g)&3)if(!(zf(g,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{n=-1;l=o;return n|0}else{d=a;a=b+g|0}while(0);b=c[a>>2]|0;a=c[8411692+(d+(i>>>12)<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){n=-1;l=o;return n|0}}else c[a+i>>2]=b;j=0-j|0;i=c[5646]<<2;c[5638]=i+m&k|m&j;c[5639]=i+n&k|n&j}while(0);n=0;l=o;return n|0}function Wf(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0;e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5639]|0;i=(g&h)+(c[5686]|0)|0;if(e&48){b=c[5633]|0;if(!(b&g)){i=0;return i|0}d=c[5632]|0;e=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(e&1){if(Bf(i,d,0,2)|0){i=-1;return i|0}}else a[e+i>>0]=d;f=0-f|0;c[5639]=(c[5646]|0)+h&g|h&f;i=b+-1&g;c[5633]=i|b&f;if(i|0){i=1;return i|0}}else{b=c[5632]|0;d=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(d&1){if(Bf(i,b,0,2)|0){i=-1;return i|0}}else a[d+i>>0]=b;c[5639]=(c[5646]|0)+h&g|h&0-f}i=0;return i|0}function Xf(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;b=k;f=c[5755]|0;a=f&128;g=a<<9;h=g+-1|0;j=c[5639]|0;i=(h&j)+(c[5686]|0)|0;a:do if(f&48){f=c[5633]|0;if(!(f&h)){j=0;l=k;return j|0}do if((i&3|a|0)==0&(c[5646]|0)==1){e=(4096-(i&4095)|0)>>>2;e=f>>>0>e>>>0?e:f;if(Qg(b,i,1)|0){j=-1;l=k;return j|0}d=c[b>>2]|0;if(!d)break;b=c[5632]|0;if((e|0)>0){a=0;do{c[d+(a<<2)>>2]=b;a=a+1|0}while(a>>>0<e>>>0)}c[5639]=(e<<2)+j;j=f-e|0;c[5633]=j;if(!j)break a;else a=1;l=k;return a|0}while(0);a=c[5632]|0;b=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((b|i)&3){if(Bf(i,a,2,2)|0){j=-1;l=k;return j|0}}else c[b+i>>2]=a;i=0-g|0;c[5639]=(c[5646]<<2)+j&h|j&i;j=f+-1&h;c[5633]=j|f&i;if(j|0){j=1;l=k;return j|0}}else{a=c[5632]|0;b=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((b|i)&3){if(Bf(i,a,2,2)|0){j=-1;l=k;return j|0}}else c[b+i>>2]=a;c[5639]=(c[5646]<<2)+j&h|j&0-g}while(0);j=0;l=k;return j|0}function Yf(){var a=0,b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=c[5755]|0;h=f<<9&65536;i=h+-1|0;e=f&15;j=c[5638]|0;k=c[5639]|0;e=(i&j)+(c[22740+(((e|0)==0?3:e+-1|0)<<4)+4>>2]|0)|0;g=(i&k)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&i)){k=0;return k|0}a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if(b&1)if(!(zf(e,0,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=d[b+e>>0]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(g,0,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=d[a+g>>0]|0;while(0);c[5641]=a;a=b-a<<24;c[5642]=a>>24;c[5643]=6;h=0-h|0;b=c[5646]|0;c[5638]=b+j&i|j&h;c[5639]=b+k&i|k&h;b=f+-1&i;c[5633]=b|f&h;a=(a|0)==0;if(!(c[5755]&16)){if(a){k=0;return k|0}}else if(!a){k=0;return k|0}if(b|0){k=1;return k|0}}else{a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if(b&1)if(!(zf(e,0,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=d[b+e>>0]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(g,0,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=d[a+g>>0]|0;while(0);c[5641]=a;c[5642]=b-a<<24>>24;c[5643]=6;h=0-h|0;g=c[5646]|0;c[5638]=g+j&i|j&h;c[5639]=g+k&i|k&h}k=0;return k|0}function Zf(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=c[5755]|0;h=f<<9&65536;i=h+-1|0;e=f&15;j=c[5638]|0;k=c[5639]|0;e=(i&j)+(c[22740+(((e|0)==0?3:e+-1|0)<<4)+4>>2]|0)|0;g=(i&k)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&i)){k=0;return k|0}a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if((b|e)&3)if(!(zf(e,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{k=-1;return k|0}else{d=a;a=b+e|0}while(0);b=c[a>>2]|0;a=c[23084+(d+(g>>>12)<<2)>>2]|0;if((a|g)&3)if(!(zf(g,2,0,2)|0))a=23048;else{k=-1;return k|0}else a=a+g|0;a=c[a>>2]|0;c[5641]=a;a=b-a|0;c[5642]=a;c[5643]=8;h=0-h|0;b=c[5646]<<2;c[5638]=b+j&i|j&h;c[5639]=b+k&i|k&h;b=f+-1&i;c[5633]=b|f&h;a=(a|0)==0;if(!(c[5755]&16)){if(a){k=0;return k|0}}else if(!a){k=0;return k|0}if(b|0){k=1;return k|0}}else{a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if((b|e)&3)if(!(zf(e,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{k=-1;return k|0}else{d=a;a=b+e|0}while(0);b=c[a>>2]|0;a=c[23084+(d+(g>>>12)<<2)>>2]|0;if((a|g)&3)if(!(zf(g,2,0,2)|0))a=23048;else{k=-1;return k|0}else a=a+g|0;g=c[a>>2]|0;c[5641]=g;c[5642]=b-g;c[5643]=8;h=0-h|0;g=c[5646]<<2;c[5638]=g+j&i|j&h;c[5639]=g+k&i|k&h}k=0;return k|0}function _f(){var a=0,b=0,e=0,f=0,g=0,h=0;e=c[5755]|0;f=e<<9&65536;g=f+-1|0;b=e&15;h=c[5638]|0;b=(g&h)+(c[22740+(((b|0)==0?3:b+-1|0)<<4)+4>>2]|0)|0;if(e&48){e=c[5633]|0;if(!(e&g)){h=0;return h|0}a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(b,0,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=d[a+b>>0]|0;while(0);c[5632]=c[5632]&-256|a;f=0-f|0;c[5638]=(c[5646]|0)+h&g|h&f;h=e+-1&g;c[5633]=h|e&f;if(h|0){h=1;return h|0}}else{a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(b,0,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=d[a+b>>0]|0;while(0);c[5632]=c[5632]&-256|a;c[5638]=(c[5646]|0)+h&g|h&0-f}h=0;return h|0}function $f(){var a=0,b=0,d=0,e=0,f=0,g=0;d=c[5755]|0;e=d<<9&65536;f=e+-1|0;b=d&15;g=c[5638]|0;b=(f&g)+(c[22740+(((b|0)==0?3:b+-1|0)<<4)+4>>2]|0)|0;if(d&48){d=c[5633]|0;if(!(d&f)){g=0;return g|0}a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;if((a|b)&3)if(!(zf(b,2,0,2)|0))a=23048;else{g=-1;return g|0}else a=a+b|0;c[5632]=c[a>>2];e=0-e|0;c[5638]=(c[5646]<<2)+g&f|g&e;g=d+-1&f;c[5633]=g|d&e;if(g|0){g=1;return g|0}}else{a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;if((a|b)&3)if(!(zf(b,2,0,2)|0))a=23048;else{g=-1;return g|0}else a=a+b|0;c[5632]=c[a>>2];c[5638]=(c[5646]<<2)+g&f|g&0-e}g=0;return g|0}function ag(){var a=0,b=0,e=0,f=0,g=0,h=0,i=0;b=c[5755]|0;g=b<<9&65536;h=g+-1|0;i=c[5639]|0;e=(h&i)+(c[5686]|0)|0;if(b&48){f=c[5633]|0;if(!(f&h)){i=0;return i|0}a=c[23084+((c[5770]|0)+(e>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(e,0,0,2)|0)){a=c[5762]|0;e=c[5755]|0;break}else{i=-1;return i|0}else{a=d[a+e>>0]|0;e=b}while(0);b=c[5632]|0;c[5641]=a;a=b-a<<24;c[5642]=a>>24;c[5643]=6;g=0-g|0;c[5639]=(c[5646]|0)+i&h|i&g;b=f+-1&h;c[5633]=b|f&g;a=(a|0)==0;if(!(e&16)){if(a){i=0;return i|0}}else if(!a){i=0;return i|0}if(b|0){i=1;return i|0}}else{a=c[23084+((c[5770]|0)+(e>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(e,0,0,2)|0)){a=c[5762]|0;break}else{i=-1;return i|0}else a=d[a+e>>0]|0;while(0);f=c[5632]|0;c[5641]=a;c[5642]=f-a<<24>>24;c[5643]=6;c[5639]=(c[5646]|0)+i&h|i&0-g}i=0;return i|0}function bg(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;a=c[5755]|0;g=a<<9&65536;h=g+-1|0;i=c[5639]|0;d=(h&i)+(c[5686]|0)|0;if(a&48){e=c[5633]|0;if(!(e&h)){i=0;return i|0}b=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((b|d)&3)if(!(zf(d,2,0,2)|0)){f=c[5755]|0;a=23048;break}else{i=-1;return i|0}else{f=a;a=b+d|0}while(0);a=c[a>>2]|0;b=c[5632]|0;c[5641]=a;a=b-a|0;c[5642]=a;c[5643]=8;g=0-g|0;c[5639]=(c[5646]<<2)+i&h|i&g;b=e+-1&h;c[5633]=b|e&g;a=(a|0)==0;if(!(f&16)){if(a){i=0;return i|0}}else if(!a){i=0;return i|0}if(b|0){i=1;return i|0}}else{a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;if((a|d)&3)if(!(zf(d,2,0,2)|0))a=23048;else{i=-1;return i|0}else a=a+d|0;f=c[a>>2]|0;e=c[5632]|0;c[5641]=f;c[5642]=e-f;c[5643]=8;c[5639]=(c[5646]<<2)+i&h|i&0-g}i=0;return i|0}function cg(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[5634]|0;e=d&65535;d=ig(d&65535,0,0)|0;if((d|0)<0){if((c[5746]|0)!=32){j=d;return j|0}b=c[5755]|0;if(b&48){b=(c[5766]|0)+120|0;i=b;j=c[i+4>>2]|0;c[b>>2]=c[i>>2]|8;c[b+4>>2]=j;b=c[5755]|0}j=(c[5766]|0)+120|0;i=j;h=c[i+4>>2]|0;c[j>>2]=c[i>>2]|(b&128^128)+128;c[j+4>>2]=h;j=(c[5766]|0)+120|0;h=j;i=c[h+4>>2]|0;c[j>>2]=c[h>>2]|4;c[j+4>>2]=i;j=d;return j|0}f=c[5755]|0;g=f<<9&65536;h=g+-1|0;i=c[5639]|0;j=(h&i)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&h)){j=0;return j|0}b=j>>>12;if(c[8411692+((c[5770]|0)+b<<2)>>2]&1|0?zf(j,0,1,2)|0:0){j=-1;return j|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,e,0)|0;b=c[8411692+((c[5770]|0)+b<<2)>>2]|0;if(b&1){if(Bf(j,d,0,2)|0){j=-1;return j|0}}else a[b+j>>0]=d;g=0-g|0;c[5639]=(c[5646]|0)+i&h|i&g;j=f+-1&h;c[5633]=j|f&g;if(j|0){j=1;return j|0}}else{b=j>>>12;if(c[8411692+((c[5770]|0)+b<<2)>>2]&1|0?zf(j,0,1,2)|0:0){j=-1;return j|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,e,0)|0;b=c[8411692+((c[5770]|0)+b<<2)>>2]|0;if(b&1){if(Bf(j,d,0,2)|0){j=-1;return j|0}}else a[b+j>>0]=d;c[5639]=(c[5646]|0)+i&h|i&0-g}j=0;return j|0}function dg(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=c[5634]|0;d=b&65535;b=ig(b&65535,2,0)|0;if((b|0)<0){if((c[5746]|0)!=32){i=b;return i|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;h=a;i=c[h+4>>2]|0;c[a>>2]=c[h>>2]|8;c[a+4>>2]=i;a=c[5755]|0}i=(c[5766]|0)+120|0;h=i;g=c[h+4>>2]|0;c[i>>2]=c[h>>2]|(a&128^128)+128;c[i+4>>2]=g;i=(c[5766]|0)+120|0;g=i;h=c[g+4>>2]|0;c[i>>2]=c[g>>2]|4;c[i+4>>2]=h;i=b;return i|0}e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5639]|0;i=(g&h)+(c[5686]|0)|0;if(e&48){e=c[5633]|0;if(!(e&g)){i=0;return i|0}a=i>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|i)&3|0?zf(i,2,1,2)|0:0){i=-1;return i|0}b=Ya[c[16808512>>2]&63](c[4202130]|0,d,2)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){i=-1;return i|0}}else c[a+i>>2]=b;f=0-f|0;c[5639]=(c[5646]<<2)+h&g|h&f;i=e+-1&g;c[5633]=i|e&f;if(i|0){i=1;return i|0}}else{a=i>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|i)&3|0?zf(i,2,1,2)|0:0){i=-1;return i|0}b=Ya[c[16808512>>2]&63](c[4202130]|0,d,2)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){i=-1;return i|0}}else c[a+i>>2]=b;c[5639]=(c[5646]<<2)+h&g|h&0-f}i=0;return i|0}function eg(){var a=0,b=0,e=0,f=0,g=0,h=0,i=0,j=0;b=c[5634]|0;j=b&65535;e=c[5755]&15;e=(e|0)==0?3:e+-1|0;b=ig(b&65535,0,0)|0;if((b|0)<0){if((c[5746]|0)!=32){j=b;return j|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;i=a;j=c[i+4>>2]|0;c[a>>2]=c[i>>2]|8;c[a+4>>2]=j;a=c[5755]|0}h=(c[5766]|0)+120|0;g=h;j=c[g+4>>2]|0;c[h>>2]=c[g>>2]|(a&128^128)+128;c[h+4>>2]=j;h=e<<10|4;j=(c[5766]|0)+120|0;g=j;i=c[g+4>>2]|((h|0)<0)<<31>>31;c[j>>2]=c[g>>2]|h;c[j+4>>2]=i;j=b;return j|0}f=c[5755]|0;g=f<<9&65536;h=g+-1|0;i=c[5638]|0;if(f&48){f=c[5633]|0;if(!(f&h)){j=0;return j|0}a=(c[22740+(e<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if(b&1)if(!(zf(a,0,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=d[b+a>>0]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,0);g=0-g|0;c[5638]=(c[5646]|0)+i&h|i&g;j=f+-1&h;c[5633]=j|f&g;if(j|0){j=1;return j|0}}else{a=(c[22740+(e<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if(b&1)if(!(zf(a,0,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=d[b+a>>0]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,0);c[5638]=(c[5646]|0)+i&h|i&0-g}j=0;return j|0}function fg(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=c[5634]|0;i=b&65535;d=c[5755]&15;d=(d|0)==0?3:d+-1|0;b=ig(b&65535,2,0)|0;if((b|0)<0){if((c[5746]|0)!=32){i=b;return i|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;h=a;i=c[h+4>>2]|0;c[a>>2]=c[h>>2]|8;c[a+4>>2]=i;a=c[5755]|0}g=(c[5766]|0)+120|0;f=g;i=c[f+4>>2]|0;c[g>>2]=c[f>>2]|(a&128^128)+128;c[g+4>>2]=i;g=d<<10|4;i=(c[5766]|0)+120|0;f=i;h=c[f+4>>2]|((g|0)<0)<<31>>31;c[i>>2]=c[f>>2]|g;c[i+4>>2]=h;i=b;return i|0}e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5638]|0;if(e&48){e=c[5633]|0;if(!(e&g)){i=0;return i|0}a=(c[22740+(d<<4)+4>>2]|0)+(g&h)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;if((b|a)&3)if(!(zf(a,2,0,2)|0))a=23048;else{i=-1;return i|0}else a=b+a|0;gb[c[16808516>>2]&63](c[4202130]|0,i,c[a>>2]|0,2);f=0-f|0;c[5638]=(c[5646]<<2)+h&g|h&f;i=e+-1&g;c[5633]=i|e&f;if(i|0){i=1;return i|0}}else{a=(c[22740+(d<<4)+4>>2]|0)+(g&h)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;if((b|a)&3)if(!(zf(a,2,0,2)|0))a=23048;else{i=-1;return i|0}else a=b+a|0;gb[c[16808516>>2]&63](c[4202130]|0,i,c[a>>2]|0,2);c[5638]=(c[5646]<<2)+h&g|h&0-f}i=0;return i|0}function gg(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+160|0;j=u+144|0;s=u+128|0;t=u+16|0;r=u;k=u+112|0;m=u+96|0;n=u+80|0;o=u+64|0;p=u+48|0;q=u+32|0;a:do switch(f|0){case 8:{s=(c[5648]|0)+7|0;t=s&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;s=22608+((g+1+s&7)<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 57:case 41:case 9:{t=c[5648]|0;s=22608+((t+g&7)<<4)|0;c[j>>2]=c[s>>2];c[j+4>>2]=c[s+4>>2];c[j+8>>2]=c[s+8>>2];c[j+12>>2]=c[s+12>>2];t=22608+(t<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2];t=0;l=u;return t|0}case 10:{if(!g){h=c[5732]|0;if(h&12|0){c[5746]=7;c[5747]=0;t=-1;l=u;return t|0}if((h&32|0)==0|(b[11298]&128)==0){t=0;l=u;return t|0}c[5746]=16;c[5747]=0;t=-1;l=u;return t|0}break}case 12:switch(g|0){case 0:{t=22608+(c[5648]<<4)+8|0;b[t>>1]=b[t>>1]^-32768;t=0;l=u;return t|0}case 1:{t=22608+(c[5648]<<4)+8|0;b[t>>1]=b[t>>1]&32767;t=0;l=u;return t|0}case 4:{t=22608+(c[5648]<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[2600];c[j+4>>2]=c[2601];c[j+8>>2]=c[2602];c[j+12>>2]=c[2603];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=0;l=u;return t|0}case 5:{i=c[5648]|0;j=22608+(i<<4)|0;g=c[j>>2]|0;j=c[j+4>>2]|0;i=b[22608+(i<<4)+8>>1]|0;h=b[11298]&-18177|(i&65535)>>>6&512;b[11298]=h;i=i&32767;b:do if(i<<16>>16<32767){switch(i<<16>>16){case 0:break;default:break b}h=h&65535;if((g|0)==0&(j|0)==0){b[11298]=h|16384;t=0;l=u;return t|0}else{b[11298]=h|17408;t=0;l=u;return t|0}}else{switch(i<<16>>16){case 32767:break;default:break b}if((j|0)>=0){t=0;l=u;return t|0}h=h&65535;if((g|0)==0&(j|0)==-2147483648){b[11298]=h|1280;t=0;l=u;return t|0}else{b[11298]=h|256;t=0;l=u;return t|0}}while(0);b[11298]=h|1024;t=0;l=u;return t|0}default:break a}case 13:{if((g|0)!=7){t=(c[5648]|0)+7&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;s=10304+(g<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}break}case 14:switch(g|0){case 0:{c[s>>2]=c[5684];Zh(80,s);r=22608+(c[5648]<<4)|0;c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];Ii(t,j,s);c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];t=0;l=u;return t|0}case 1:{c[t>>2]=c[5684];Zh(80,t);p=c[5648]|0;q=22608+((p+1&7)<<4)|0;p=22608+(p<<4)|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Ri(r,s,j,t);c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 2:{c[j>>2]=c[5684];Zh(80,j);t=(Qi(22608+(c[5648]<<4)|0,j)|0)==0;h=e[11298]|0;if(t){b[11298]=h&64511;t=(c[5648]|0)+7&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;c[t>>2]=c[2576];c[t+4>>2]=c[2577];c[t+8>>2]=c[2578];c[t+12>>2]=c[2579]}else b[11298]=h|1024;t=0;l=u;return t|0}case 3:{c[t>>2]=c[5684];Zh(80,t);p=c[5648]|0;q=22608+((p+1&7)<<4)|0;p=22608+(p<<4)|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Ji(r,s,j,t);c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 4:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Ei(s,j,22736);t=c[5648]|0;r=22608+(t<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];t=t+7&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2];t=0;l=u;return t|0}case 5:{b[11298]=b[11298]&-18177;h=c[5648]|0;q=22608+(h<<4)|0;h=22608+((h+1&7)<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];h=Ki(s,j,t,r,22736)|0;if((h|0)>-1){if(!h){h=c[r>>2]|0;if(!((h&1|0)==0&0==0))b[11298]=b[11298]|512;if(!((h&2|0)==0&0==0))b[11298]=b[11298]|16384;if(!((h&4|0)==0&0==0)){h=256;i=40}}else{h=1024;i=40}if((i|0)==40)b[11298]=b[11298]|h;s=22608+(c[5648]<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 6:{c[5648]=(c[5648]|0)+7&7;b[11298]=b[11298]&-18177;t=0;l=u;return t|0}default:{c[5648]=(c[5648]|0)+1&7;b[11298]=b[11298]&-18177;t=0;l=u;return t|0}}case 15:switch(g|0){case 0:{b[11298]=b[11298]&-18177;h=c[5648]|0;q=22608+(h<<4)|0;h=22608+((h+1&7)<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];h=Ni(s,j,t,r,22736)|0;if((h|0)>-1){if(!h){h=c[r>>2]|0;if(!((h&1|0)==0&0==0))b[11298]=b[11298]|512;if(!((h&2|0)==0&0==0))b[11298]=b[11298]|16384;if(!((h&4|0)==0&0==0)){h=256;i=53}}else{h=1024;i=53}if((i|0)==53)b[11298]=b[11298]|h;s=22608+(c[5648]<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 1:{c[t>>2]=c[5684];Zh(80,t);p=c[5648]|0;q=22608+((p+1&7)<<4)|0;p=22608+(p<<4)|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Si(r,s,j,t);c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 2:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];si(s,j,22736);c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 3:{r=22608+(c[5648]<<4)|0;c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];r=(Oi(j,s,t,22736)|0)<0;h=e[11298]|0;if(r)b[11298]=h|1024;else{b[11298]=h&64511;r=c[5648]|0;q=22608+(r<<4)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];s=r+7&7;c[5648]=s;a[22600+s>>0]=0;s=22608+(s<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 5:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+1&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Fi(t,s,j,22736);c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];t=0;l=u;return t|0}case 4:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];ki(s,j,22736);c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 6:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=(Oi(j,s,0,22736)|0)<0;h=e[11298]|0;if(t)b[11298]=h|1024;else{b[11298]=h&64511;t=22608+(c[5648]<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}t=0;l=u;return t|0}default:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=(Oi(j,0,s,22736)|0)<0;h=e[11298]|0;if(t)b[11298]=h|1024;else{b[11298]=h&64511;t=22608+(c[5648]<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}t=0;l=u;return t|0}}case 7:case 6:case 5:case 4:case 39:case 38:case 37:case 36:case 55:case 54:case 53:case 52:case 49:case 48:case 33:case 32:case 1:case 0:{h=c[5648]|0;i=22608+(h<<4)|0;h=22608+((h+g&7)<<4)|0;c[t>>2]=c[i>>2];c[t+4>>2]=c[i+4>>2];c[t+8>>2]=c[i+8>>2];c[t+12>>2]=c[i+12>>2];c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];switch(f&7){case 0:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];li(k,s,j,22736);c[t>>2]=c[k>>2];c[t+4>>2]=c[k+4>>2];c[t+8>>2]=c[k+8>>2];c[t+12>>2]=c[k+12>>2];break}case 1:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];qi(m,s,j,22736);c[t>>2]=c[m>>2];c[t+4>>2]=c[m+4>>2];c[t+8>>2]=c[m+8>>2];c[t+12>>2]=c[m+12>>2];break}case 4:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];pi(n,s,j,22736);c[t>>2]=c[n>>2];c[t+4>>2]=c[n+4>>2];c[t+8>>2]=c[n+8>>2];c[t+12>>2]=c[n+12>>2];break}case 5:{c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];pi(o,s,j,22736);c[t>>2]=c[o>>2];c[t+4>>2]=c[o+4>>2];c[t+8>>2]=c[o+8>>2];c[t+12>>2]=c[o+12>>2];break}case 6:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];ri(p,s,j,22736);c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];break}default:{c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];ri(q,s,j,22736);c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2]}}if((f|0)>31){c[h>>2]=c[t>>2];c[h+4>>2]=c[t+4>>2];c[h+8>>2]=c[t+8>>2];c[h+12>>2]=c[t+12>>2];if((f|0)>47){t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7}}else{c[i>>2]=c[t>>2];c[i+4>>2]=c[t+4>>2];c[i+8>>2]=c[t+8>>2];c[i+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 34:case 2:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=0;l=u;return t|0}case 50:case 35:case 3:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 21:{if((g|0)==1){q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+1&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,1,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;a[22600+(t+1&7)>>0]=1;c[5648]=t+2&7;t=0;l=u;return t|0}break}case 28:switch(g|0){case 2:{b[11298]=b[11298]&32512;t=0;l=u;return t|0}case 3:{b[11298]=0;c[5648]=0;b[11299]=895;t=22600;c[t>>2]=16843009;c[t+4>>2]=16843009;Yh(0,22736);t=(e[11299]|0)>>>8&255;Zh((t&3)==0?32:(t&3)==2?64:80,22736);t=0;l=u;return t|0}case 4:case 1:case 0:{t=0;l=u;return t|0}default:break a}case 29:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Ug(s,j);t=0;l=u;return t|0}case 30:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Vg(s,j);t=0;l=u;return t|0}case 40:{a[22600+((c[5648]|0)+g&7)>>0]=1;t=0;l=u;return t|0}case 42:{s=c[5648]|0;t=22608+((s+g&7)<<4)|0;s=22608+(s<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 59:case 58:case 11:case 43:{t=c[5648]|0;s=22608+((t+g&7)<<4)|0;r=22608+(t<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 44:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,1,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=0;l=u;return t|0}case 45:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,1,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 51:{if((g|0)==1){q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+1&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;a[22600+(t+1&7)>>0]=1;c[5648]=t+2&7;t=0;l=u;return t|0}break}case 56:{t=c[5648]|0;a[22600+(t+g&7)>>0]=1;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 60:{if(!g){c[5632]=c[5632]&-65536|b[11298]&-14337&65535|c[5648]<<11&63488;t=0;l=u;return t|0}break}case 61:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Ug(s,j);t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 62:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Vg(s,j);t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 19:case 18:case 17:case 16:case 27:case 26:case 25:case 24:{c:do switch(f&3){case 0:{h=nf(22528)|0;break}case 1:{h=(c[5642]|0)==0&1;break}case 2:{h=Of()|0;break}case 3:if((c[5643]|0)==24){h=(c[5641]|0)>>>2&1;break c}else{h=d[21168+(c[5642]&255)>>0]|0;break c}default:{}}while(0);if((h|0)==(f>>>3&1|0)){t=0;l=u;return t|0}s=c[5648]|0;t=22608+(s<<4)|0;s=22608+((s+g&7)<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}default:{}}while(0);c[5746]=6;c[5747]=0;t=-1;l=u;return t|0}function hg(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+224|0;C=D+208|0;r=D+64|0;v=D;j=D+192|0;m=D+176|0;q=D+160|0;n=D+144|0;w=D+128|0;x=D+112|0;z=D+96|0;s=D+80|0;t=D+48|0;u=D+32|0;p=D+16|0;a:do switch(f|0){case 8:case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:case 24:case 23:case 22:case 21:case 20:case 19:case 18:case 17:case 16:case 40:case 39:case 38:case 37:case 36:case 35:case 34:case 33:case 32:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{switch(f>>>4&268435455|0){case 0:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+g|0;ci(j,c[h>>2]|0,22736);c[v>>2]=c[j>>2];c[v+4>>2]=c[j+4>>2];c[v+8>>2]=c[j+8>>2];c[v+12>>2]=c[j+12>>2];break}case 1:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+g|0;$h(m,c[h>>2]|0,22736);c[v>>2]=c[m>>2];c[v+4>>2]=c[m+4>>2];c[v+8>>2]=c[m+8>>2];c[v+12>>2]=c[m+12>>2];break}case 2:{h=c[5770]|0;i=c[23084+(h+(g>>>12)<<2)>>2]|0;do if((i|g)&3)if(!(zf(g,2,0,2)|0)){h=c[5770]|0;i=23048;break}else{g=-1;l=D;return g|0}else i=i+g|0;while(0);j=c[i>>2]|0;i=g+4|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+i|0;di(q,j,c[h>>2]|0,22736);c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];break}default:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+g|0;$h(n,c[h>>2]<<16>>16,22736);c[v>>2]=c[n>>2];c[v+4>>2]=c[n+4>>2];c[v+8>>2]=c[n+8>>2];c[v+12>>2]=c[n+12>>2]}}switch(f&15){case 0:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];li(w,r,C,22736);c[g>>2]=c[w>>2];c[g+4>>2]=c[w+4>>2];c[g+8>>2]=c[w+8>>2];c[g+12>>2]=c[w+12>>2];break a}case 1:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];qi(x,r,C,22736);c[g>>2]=c[x>>2];c[g+4>>2]=c[x+4>>2];c[g+8>>2]=c[x+8>>2];c[g+12>>2]=c[x+12>>2];break a}case 2:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];g=Gi(r,C,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(g+1<<1)>>1];break a}case 3:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];g=Gi(r,C,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(g+1<<1)>>1];g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break a}case 4:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];pi(z,r,C,22736);c[g>>2]=c[z>>2];c[g+4>>2]=c[z+4>>2];c[g+8>>2]=c[z+8>>2];c[g+12>>2]=c[z+12>>2];break a}case 5:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];c[C>>2]=c[g>>2];c[C+4>>2]=c[g+4>>2];c[C+8>>2]=c[g+8>>2];c[C+12>>2]=c[g+12>>2];pi(s,r,C,22736);c[g>>2]=c[s>>2];c[g+4>>2]=c[s+4>>2];c[g+8>>2]=c[s+8>>2];c[g+12>>2]=c[s+12>>2];break a}case 6:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];ri(t,r,C,22736);c[g>>2]=c[t>>2];c[g+4>>2]=c[t+4>>2];c[g+8>>2]=c[t+8>>2];c[g+12>>2]=c[t+12>>2];break a}case 7:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];c[C>>2]=c[g>>2];c[C+4>>2]=c[g+4>>2];c[C+8>>2]=c[g+8>>2];c[C+12>>2]=c[g+12>>2];ri(u,r,C,22736);c[g>>2]=c[u>>2];c[g+4>>2]=c[u+4>>2];c[g+8>>2]=c[u+8>>2];c[g+12>>2]=c[u+12>>2];break a}default:{g=(c[5648]|0)+7&7;c[5648]=g;a[22600+g>>0]=0;g=22608+(g<<4)|0;c[g>>2]=c[v>>2];c[g+4>>2]=c[v+4>>2];c[g+8>>2]=c[v+8>>2];c[g+12>>2]=c[v+12>>2];break a}}}case 11:case 10:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=ii(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 27:case 26:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=ei(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 43:case 42:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=ji(C,22736)|0;j=y;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 59:case 58:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=Ci(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&1){if(Bf(g,h<<16>>16,1,2)|0){g=-1;l=D;return g|0}}else b[i+g>>1]=h;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 25:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=fi(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 41:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=hi(C,22736)|0;j=y;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 57:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=Di(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&1){if(Bf(g,h<<16>>16,1,2)|0){g=-1;l=D;return g|0}}else b[i+g>>1]=h;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 12:{if(Sg(g,(c[5755]|0)>>>8&1^1)|0){g=-1;l=D;return g|0}break}case 13:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,2)|0)){h=c[5762]|0;break}else{g=-1;l=D;return g|0}else h=e[h+g>>1]|0;while(0);g=h&65535;b[11299]=g;switch((g&65535)>>>10&3){case 0:{i=0;break}case 1:{i=1;break}case 2:{i=2;break}case 3:{i=3;break}default:{}}Yh(i,22736);g=(e[11299]|0)>>>8&255;Zh((g&3)==0?32:(g&3)==2?64:80,22736);break}case 14:{if(Tg(g,(c[5755]|0)>>>8&1^1)|0){g=-1;l=D;return g|0}break}case 15:{h=b[11299]|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){b[i+g>>1]=h;break a}if(Bf(g,h&65535,1,2)|0){g=-1;l=D;return g|0}break}case 29:{h=c[5770]|0;i=c[23084+(h+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(!(zf(g,2,0,2)|0)){k=c[5770]|0;o=23048;A=90}}else{k=h;o=i+g|0;A=90}do if((A|0)==90){m=c[o>>2]|0;h=g+4|0;i=c[23084+(k+(h>>>12)<<2)>>2]|0;if(!((i|h)&3))h=i+h|0;else{if(zf(h,2,0,2)|0)break;k=c[5770]|0;h=23048}j=c[h>>2]|0;i=g+8|0;h=c[23084+(k+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0)break;h=c[5762]|0}f=(c[5648]|0)+7&7;c[5648]=f;a[22600+f>>0]=0;g=22608+(f<<4)|0;B=g;c[B>>2]=m;c[B+4>>2]=j;b[22608+(f<<4)+8>>1]=h;g=g+10|0;b[g>>1]=b[C>>1]|0;b[g+2>>1]=b[C+2>>1]|0;b[g+4>>1]=b[C+4>>1]|0;break a}while(0);g=-1;l=D;return g|0}case 31:{k=c[5648]|0;j=22608+(k<<4)|0;h=c[j>>2]|0;j=c[j+4>>2]|0;k=b[22608+(k<<4)+8>>1]|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;h=g+8|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1){if(Bf(h,k&65535,1,2)|0){g=-1;l=D;return g|0}}else b[i+h>>1]=k;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 44:{h=(c[5755]|0)>>>8&1^1;b:do if(!(Sg(g,h)|0)){m=(14<<h)+g|0;n=0;while(1){h=c[5770]|0;i=c[23084+(h+(m>>>12)<<2)>>2]|0;if(!((i|m)&3))i=i+m|0;else{if(zf(m,2,0,2)|0)break b;h=c[5770]|0;i=23048}k=c[i>>2]|0;i=m+4|0;j=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((j|i)&3))i=j+i|0;else{if(zf(i,2,0,2)|0)break b;h=c[5770]|0;i=23048}j=c[i>>2]|0;i=m+8|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0)break b;h=c[5762]|0}f=(c[5648]|0)+n&7;g=22608+(f<<4)|0;B=g;c[B>>2]=k;c[B+4>>2]=j;b[22608+(f<<4)+8>>1]=h;g=g+10|0;b[g>>1]=b[C>>1]|0;b[g+2>>1]=b[C+2>>1]|0;b[g+4>>1]=b[C+4>>1]|0;n=n+1|0;if(n>>>0>=8)break;else m=m+10|0}break a}while(0);g=-1;l=D;return g|0}case 46:{h=(c[5755]|0)>>>8&1^1;if(Tg(g,h)|0){g=-1;l=D;return g|0}k=(14<<h)+g|0;m=0;while(1){n=(c[5648]|0)+m&7;j=22608+(n<<4)|0;h=c[j>>2]|0;j=c[j+4>>2]|0;n=b[22608+(n<<4)+8>>1]|0;i=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((i|k)&3){if(Bf(k,h,2,2)|0){B=-1;A=183;break}}else c[i+k>>2]=h;h=k+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){B=-1;A=183;break}}else c[i+h>>2]=j;h=k+8|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1){if(Bf(h,n&65535,1,2)|0){B=-1;A=183;break}}else b[i+h>>1]=n;m=m+1|0;if(m>>>0>=8){A=139;break}else k=k+10|0}if((A|0)==139){b[11298]=0;c[5648]=0;b[11299]=895;g=22600;c[g>>2]=16843009;c[g+4>>2]=16843009;Yh(0,22736);g=(e[11299]|0)>>>8&255;Zh((g&3)==0?32:(g&3)==2?64:80,22736);break a}else if((A|0)==183){l=D;return B|0}break}case 47:{h=c[5648]<<11|b[11298]&-14337&65535;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){b[i+g>>1]=h;break a}if(Bf(g,h,1,2)|0){g=-1;l=D;return g|0}break}case 60:{j=8;k=0;m=0;while(1){h=j+g|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1))h=d[i+h>>0]|0;else{if(zf(h,0,0,2)|0)break;h=c[5762]|0}B=Dl(k|0,m|0,100,0)|0;f=(h>>4)*10|0;B=xl(B|0,y|0,h&15|0,0)|0;k=xl(B|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;m=y;if(!j){A=149;break}else j=j+-1|0}do if((A|0)==149){h=g+9|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1))h=d[i+h>>0]|0;else{if(zf(h,0,0,2)|0)break;h=c[5762]|0}f=(h&128|0)==0;B=yl(0,0,k|0,m|0)|0;g=(c[5648]|0)+7&7;c[5648]=g;a[22600+g>>0]=0;g=22608+(g<<4)|0;bi(C,f?k:B,f?m:y,22736);c[g>>2]=c[C>>2];c[g+4>>2]=c[C+4>>2];c[g+8>>2]=c[C+8>>2];c[g+12>>2]=c[C+12>>2];break a}while(0);g=-1;l=D;return g|0}case 62:{i=22608+(c[5648]<<4)|0;c[C>>2]=c[i>>2];c[C+4>>2]=c[i+4>>2];c[C+8>>2]=c[i+8>>2];c[C+12>>2]=c[i+12>>2];i=gi(C,22736)|0;h=y;f=(h|0)<0;z=yl(0,0,i|0,h|0)|0;C=y;o=Il(i|0,h|0,56)|0;o=o&128;n=0;i=f?z:i;h=f?C:h;do{if((i|0)==0&(h|0)==0){j=0;i=0;h=0}else{f=Bl(i|0,h|0,100,0)|0;C=y;j=Dl(f|0,C|0,100,0)|0;i=yl(i|0,h|0,j|0,y|0)|0;j=(i|0)/10|0;j=j<<4|i-(j*10|0);i=f;h=C}k=n+g|0;m=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if(m&1){if(Bf(k,j,0,2)|0){B=-1;A=183;break}}else a[m+k>>0]=j;n=n+1|0}while(n>>>0<9);if((A|0)==183){l=D;return B|0}h=g+9|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(i&1){if(Bf(h,o,0,2)|0){g=-1;l=D;return g|0}}else a[i+h>>0]=o;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 61:{h=c[5770]|0;i=c[23084+(h+(g>>>12)<<2)>>2]|0;do if((i|g)&3)if(!(zf(g,2,0,2)|0)){h=c[5770]|0;i=23048;break}else{g=-1;l=D;return g|0}else i=i+g|0;while(0);j=c[i>>2]|0;i=g+4|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+i|0;C=c[h>>2]|0;g=(c[5648]|0)+7&7;c[5648]=g;a[22600+g>>0]=0;g=22608+(g<<4)|0;bi(p,j,C,22736);c[g>>2]=c[p>>2];c[g+4>>2]=c[p+4>>2];c[g+8>>2]=c[p+8>>2];c[g+12>>2]=c[p+12>>2];break}case 63:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=gi(C,22736)|0;j=y;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}default:{c[5746]=6;c[5747]=0;g=-1;l=D;return g|0}}while(0);g=0;l=D;return g|0}function ig(b,f,g){b=b|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=c[5647]|0;i=h>>>12&3;do if(c[5732]&1|0){if((h&131072|0)==0?i>>>0>=(d[22968]|0)>>>0:0)break;j=c[5715]|0;if(!((c[5716]&36608|0)!=35072|j>>>0<103)){h=(c[5714]|0)+102|0;i=c[23084+(h>>>12<<2)>>2]|0;do if((i|h)&1)if(!(zf(h,1,0,0)|0)){h=c[5762]|0;j=c[5715]|0;break}else{g=-1;return g|0}else h=e[i+h>>1]|0;while(0);k=b&65535;h=h+(k>>>3)|0;if((h+1|0)>>>0<=j>>>0){h=(c[5714]|0)+h|0;i=c[23084+(h>>>12<<2)>>2]|0;do if((i|h)&1)if(!(zf(h,1,0,0)|0)){h=c[5762]|0;break}else{g=-1;return g|0}else h=e[i+h>>1]|0;while(0);if(!(h>>>(k&7)&(1<<(1<<f))+-1))break}}c[5746]=13;c[5747]=0;g=-1;return g|0}while(0);h=c[5766]|0;if(!h){g=0;return g|0}if(!(c[h+12>>2]&134217728)){g=0;return g|0}k=b&65535;i=(c[h+64>>2]&-4096)+(k>>>3)|0;h=Ge(c[4202123]|0,i,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0)h=a[(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))>>0]|0;else h=0;j=h&255;h=i+1|0;i=Ge(c[4202123]|0,h,0)|0;if((i|0)!=0?(c[i+32>>2]|0)!=0:0)h=a[(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))>>0]|0;else h=0;if(!(((h&255)<<8|j)>>>(k&7)&(1<<(1<<f))+-1)){g=0;return g|0}c[5746]=32;b=(c[5766]|0)+112|0;c[b>>2]=123;c[b+4>>2]=0;f=1<<f+4|k<<16|g^1;g=(c[5766]|0)+120|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;g=-1;return g|0}function jg(){var a=0,b=0,e=0,f=0,g=0;a=nf(22528)|0;if((c[5643]|0)==24)b=0;else{b=c[5642]|0;a=(d[21168+(b&255)>>0]|0)<<2|a;b=b>>>31<<7}uf()|0;b=b|a|(vf()|0);f=c[5632]|0;e=(b>>>4&1|(f&14)>>>0>9|0)==0;a=e?f:f+6|0;g=a&255;b=(b&1|g>>>0>159|0)==0;a=b?g:a+96&255;c[5632]=a|f&-256;b=(e?0:16)|(d[21168+a>>0]|0)<<2|(b^1)&1|((a|0)==0&1)<<6;c[5641]=b|a&128;c[5642]=b>>>6&1^1;c[5643]=24;return}function kg(){var a=0,b=0,e=0,f=0,g=0,h=0;a=nf(22528)|0;if((c[5643]|0)==24)b=0;else{b=c[5642]|0;a=(d[21168+(b&255)>>0]|0)<<2|a;b=b>>>31<<7}uf()|0;f=b|a|(vf()|0);b=f&1;h=c[5632]|0;e=h&255;f=(f>>>4&1|(h&14)>>>0>9|0)==0;a=f?e:h+250&255;g=(b|e>>>0>153|0)==0;a=g?a:a+160&255;c[5632]=a|h&-256;b=(d[21168+a>>0]|0)<<2|(g^1)&1|(f?0:e>>>0<6|(b|0)!=0?17:16)|((a|0)==0&1)<<6;c[5641]=b|a&128;c[5642]=b>>>6&1^1;c[5643]=24;return}function lg(){var a=0,b=0,e=0,f=0,g=0;a=nf(22528)|0;if((c[5643]|0)==24){g=c[5641]|0;b=g>>>7&1;a=g&4|a|((c[5642]|0)==0&1)<<6}else{g=c[5642]|0;b=g>>>31;a=(d[21168+(g&255)>>0]|0)<<2|a|((g|0)==0&1)<<6}b=b<<7|a|(uf()|0)<<11;b=b|(vf()|0);g=c[5632]|0;e=g>>>8;a=g&15;if(!(b>>>4&1|a>>>0>9)){f=b&-18;b=e}else{f=b|17;b=e+1+((g&254)>>>0>249&1)|0;a=g+6&15}c[5632]=a|g&-65536|b<<8&65280;c[5641]=f;c[5642]=f>>>6&1^1;c[5643]=24;return}function mg(){var a=0,b=0,e=0,f=0,g=0;a=nf(22528)|0;if((c[5643]|0)==24){g=c[5641]|0;b=g>>>7&1;a=g&4|a|((c[5642]|0)==0&1)<<6}else{g=c[5642]|0;b=g>>>31;a=(d[21168+(g&255)>>0]|0)<<2|a|((g|0)==0&1)<<6}b=b<<7|a|(uf()|0)<<11;b=b|(vf()|0);g=c[5632]|0;e=g>>>8;a=g&15;if(!(b>>>4&1|a>>>0>9)){f=b&-18;b=e}else{f=b|17;b=e+255+(((g&254)>>>0<6)<<31>>31)|0;a=g+10&15}c[5632]=a|g&-65536|b<<8&65280;c[5641]=f;c[5642]=f>>>6&1^1;c[5643]=24;return}function ng(a){a=a|0;var b=0,d=0,e=0;if(!a){c[5746]=0;c[5747]=0;a=-1;return a|0}else{d=c[5632]|0;e=d&255;b=(e|0)/(a|0)|0;a=e-(N(b,a)|0)|0;c[5632]=a|d&-65536|b<<8;c[5642]=a<<24>>24;c[5643]=12;a=0;return a|0}return 0}function og(a){a=a|0;var b=0;b=c[5632]|0;a=(N(b>>>8&255,a)|0)+b|0;c[5632]=a&255|b&-65536;c[5642]=a<<24>>24;c[5643]=12;return}function pg(a,f){a=a|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;k=(a&-64|0)==192;do if(!k){g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&1)){j=0;i=e[g+f>>1]|0;break}if(!(zf(f,1,1,2)|0)){j=0;i=c[5762]|0;break}else{f=-1;return f|0}}else{i=a&7;j=i;i=c[22528+(i<<2)>>2]&65535}while(0);h=c[22528+((a>>>3&7)<<2)>>2]|0;g=nf(22528)|0;if((c[5643]|0)==24){l=c[5641]|0;a=l>>>7&1;g=l&4|g|((c[5642]|0)==0&1)<<6}else{l=c[5642]|0;a=l>>>31;g=(d[21168+(l&255)>>0]|0)<<2|g|((l|0)==0&1)<<6}a=a<<7|g|(uf()|0)<<11;a=a|(vf()|0);c[5641]=a;g=h&3;if((i&3)>>>0<g>>>0){a=g|i&-4;do if(!k){g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&1)){b[g+f>>1]=a;break}if(Bf(f,a,1,2)|0){l=-1;return l|0}}else{l=22528+(j<<2)|0;c[l>>2]=c[l>>2]&-65536|a&65535}while(0);g=c[5641]|64}else g=a&-65;c[5641]=g;c[5642]=g>>>6&1^1;c[5643]=24;l=0;return l|0}function qg(a){a=a|0;var b=0;a:do switch(a>>1|0){case 0:{b=uf()|0;break}case 1:{b=nf(22528)|0;break}case 2:{b=(c[5642]|0)==0&1;break}case 3:{b=Of()|0;break}case 4:if((c[5643]|0)==24){b=(c[5641]|0)>>>7&1;break a}else{b=(c[5642]|0)>>>31;break a}case 5:if((c[5643]|0)==24){b=(c[5641]|0)>>>2&1;break a}else{b=d[21168+(c[5642]&255)>>0]|0;break a}case 6:{b=Pf()|0;break}case 7:{b=Qf()|0;break}default:ra()}while(0);return b^a&1|0}function rg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=(b|0)!=0;e=f?10:13;g=a&65535;h=a&65532;do if(!h){c[5710]=0;c[5711]=0}else{if(a&4|0){c[5746]=e;c[5747]=h;h=-1;return h|0}b=a&65528;if((b|7)>>>0>(c[5719]|0)>>>0){c[5746]=e;c[5747]=h;h=-1;return h|0}a=(c[5718]|0)+b|0;b=c[23084+(a>>>12<<2)>>2]|0;if((b|a)&3)if(!(zf(a,2,0,0)|0))b=23048;else{h=-1;return h|0}else b=b+a|0;d=c[b>>2]|0;b=a+4|0;a=c[23084+(b>>>12<<2)>>2]|0;if((a|b)&3)if(!(zf(b,2,0,0)|0))b=23048;else{h=-1;return h|0}else b=a+b|0;b=c[b>>2]|0;if((b&7936|0)!=512){c[5746]=e;c[5747]=h;h=-1;return h|0}if(b&32768|0){c[5710]=b&-16777216|d>>>16|b<<16&16711680;h=b&983040|d&65535;c[5711]=(b&8388608|0)==0?h:h<<12|4095;c[5712]=b;break}c[5746]=f?10:11;c[5747]=h;h=-1;return h|0}while(0);c[5709]=g;h=0;return h|0}function sg(a,b){a=a|0;b=b|0;var e=0,f=0,g=0;do if((a&65532|0)!=0?(e=(a>>>1&2^2)+6|0,(a|7)>>>0<=(c[22740+(e<<4)+8>>2]|0)>>>0):0){e=(c[22740+(e<<4)+4>>2]|0)+(a&-8)|0;if((c[23084+(e>>>12<<2)>>2]|e)&3|0?zf(e,2,0,0)|0:0){b=-1;return b|0}e=e+4|0;f=c[23084+(e>>>12<<2)>>2]|0;if((f|e)&3)if(!(zf(e,2,0,0)|0))e=23048;else{b=-1;return b|0}else e=f+e|0;g=c[e>>2]|0;if(g&4096){e=a&3;f=g>>>13&3;a=d[22968]|0;if(!(g&2048)){if(f>>>0<e>>>0|f>>>0<a>>>0){e=0;break}if((g>>>9&1^1)&b|0){e=0;break}}else{if(b|0){e=0;break}if(!(g&512)){e=1;break}if((g&1024|0)==0?f>>>0<e>>>0|f>>>0<a>>>0:0){e=0;break}}e=1}else e=0}else e=0;while(0);a=nf(22528)|0;if((c[5643]|0)==24){g=c[5641]|0;f=g&4;g=g>>>7&1}else{g=c[5642]|0;f=(d[21168+(g&255)>>0]|0)<<2;g=g>>>31}b=g<<7|(f|a)|(uf()|0)<<11;b=b|(vf()|0);b=(e|0)==0?b&-65:b|64;c[5641]=b;c[5642]=b>>>6&1^1;c[5643]=24;b=0;return b|0}function tg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;if(a[22968]|0?c[5735]&4|0:0){c[5746]=13;c[5747]=0;e=-1;return e|0}e=c[5766]|0;if(e|0?c[e+12>>2]&16384|0:0){c[5746]=32;e=e+112|0;c[e>>2]=110;c[e+4>>2]=0;e=(c[5766]|0)+120|0;c[e>>2]=0;c[e+4>>2]=0;e=-1;return e|0}f=22976;g=c[f>>2]|0;f=c[f+4>>2]|0;e=22976;c[e>>2]=b;c[e+4>>2]=d;d=Wa[c[16808504>>2]&15](c[4202127]|0)|0;b=y;e=22976;c[e>>2]=g;c[e+4>>2]=f;e=c[5766]|0;if(e){g=e+80|0;d=xl(c[g>>2]|0,c[g+4>>2]|0,d|0,b|0)|0;b=y}c[5632]=d;c[5634]=b;g=0;return g|0}function ug(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;a:do if((f&65532|0)!=0?(g=(f>>>1&2^2)+6|0,(f|7)>>>0<=(c[22740+(g<<4)+8>>2]|0)>>>0):0){h=(c[22740+(g<<4)+4>>2]|0)+(f&-8)|0;g=c[23084+(h>>>12<<2)>>2]|0;if((g|h)&3)if(!(zf(h,2,0,0)|0))g=23048;else{a=-1;return a|0}else g=g+h|0;j=c[g>>2]|0;g=h+4|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{a=-1;return a|0}else g=h+g|0;i=c[g>>2]|0;g=f&3;h=i>>>13&3;f=d[22968]|0;if(!(i&4096)){switch(i>>>8&15){case 11:case 9:case 3:case 2:case 1:break;case 12:case 5:case 4:{if(b|0){f=0;i=0;break a}break}default:{f=0;i=0;break a}}if(h>>>0<f>>>0|h>>>0<g>>>0){f=0;i=0;break}}else if((i>>>10&1&i>>>11|0)==0?h>>>0<f>>>0|h>>>0<g>>>0:0){f=0;i=0;break}if(!b){f=1;i=i&15793920;break}else{b=i&983040|j&65535;f=1;i=(i&8388608|0)==0?b:b<<12|4095;break}}else{f=0;i=0}while(0);g=nf(22528)|0;if((c[5643]|0)==24){b=c[5641]|0;h=b>>>7&1;g=b&4|g|((c[5642]|0)==0&1)<<6}else{b=c[5642]|0;h=b>>>31;g=(d[21168+(b&255)>>0]|0)<<2|g|((b|0)==0&1)<<6}g=h<<7|g|(uf()|0)<<11;g=g|(vf()|0);c[5641]=g;do if(f){c[5641]=g|64;g=22528+(e<<2)|0;if(!a){c[g>>2]=c[g>>2]&-65536|i&65535;break}else{c[g>>2]=i;break}}else c[5641]=g&-65;while(0);c[5642]=(c[5641]|0)>>>6&1^1;c[5643]=24;a=0;return a|0}function vg(a,b){a=a|0;b=b|0;switch(a|0){case 3:case 2:case 1:case 0:{c[22944+(a<<2)>>2]=b;return}case 6:{c[5740]=b&57359|-61456;return}case 7:{c[5741]=b&-56321|1024;return}default:return}}function wg(a,b){a=a|0;b=b|0;var d=0;switch(b|0){case 3:case 2:case 1:case 0:{d=22944+(b<<2)|0;break}case 6:{d=22960;break}case 7:{d=22964;break}default:ra()}c[a>>2]=c[d>>2];return}function xg(){var a=0;a=c[5632]|0;if((a|0)>=0)if(!a){c[5632]=1;c[5635]=1752462657;c[5634]=1769238117;c[5633]=909662307;return}else{c[5632]=1347;c[5635]=2048;c[5633]=0;c[5634]=33137;return}switch(a|0){case -2147483648:{c[5632]=-2147483638;c[5635]=1752462657;c[5634]=1769238117;c[5633]=909662307;return}case -2147483647:{c[5632]=1347;c[5635]=0;c[5633]=4;c[5634]=134250865;return}case -2147483640:{c[5632]=8224;c[5635]=0;c[5633]=0;c[5634]=0;return}case -2147483639:case -2147483641:case -2147483642:case -2147483643:case -2147483644:case -2147483645:case -2147483646:{c[5632]=0;c[5633]=0;c[5634]=0;c[5635]=0;return}default:{c[5632]=0;c[5635]=1;c[5633]=0;c[5634]=1;return}}}function yg(b,d){b=b|0;d=d|0;var e=0;if(a[22968]|0?(c[5735]&256|0)==0:0){c[5746]=13;c[5747]=0;e=-1;return e|0}e=c[5766]|0;if(e|0?c[e+12>>2]&32768|0:0){c[5746]=32;e=e+112|0;c[e>>2]=111;c[e+4>>2]=0;e=(c[5766]|0)+120|0;c[e>>2]=0;c[e+4>>2]=0;e=-1;return e|0}if((c[5633]|0)==1073741824){c[5632]=b;c[5634]=d;e=0;return e|0}else{c[5746]=13;c[5747]=0;e=-1;return e|0}return 0}function zg(){var a=0,b=0;a=c[5633]|0;a:do if(!(Rg(a,1)|0)){b=c[5632]|0;if((a|0)<-1073741567)switch(a|0){case -1073741696:{c[5764]=b&4096;a=0;break a}case -1073741568:{c[5702]=b;a=0;break a}default:{a=0;break a}}if((a|0)<-1073741565){switch(a|0){case -1073741567:break;default:{a=0;break a}}c[5706]=b;a=0;break}if((a|0)<-1073676009){switch(a|0){case -1073741565:break;default:{a=0;break a}}c[5763]=b;a=0;break}else{switch(a|0){case -1073676009:break;default:{a=0;break a}}c[5765]=b;a=0;break}}else a=-1;while(0);return a|0}function Ag(){var a=0;a=c[5633]|0;if(Rg(a,0)|0){a=-1;return a|0}a:do if((a|0)>=-1073741567){if((a|0)<-1073741565){switch(a|0){case -1073741567:break;default:{a=0;break a}}a=c[5706]|0;break}if((a|0)<-1073676009){switch(a|0){case -1073741565:break;default:{a=0;break a}}a=c[5763]|0;break}else{switch(a|0){case -1073676009:break;default:{a=0;break a}}a=c[5765]|0;break}}else switch(a|0){case -1073741696:{a=c[5764]|0;break a}case -1073741568:{a=c[5702]|0;break a}default:{a=0;break a}}while(0);c[5632]=a;c[5634]=0;a=0;return a|0}function Bg(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=c[5632]|0;g=c[5634]|0;i=c[5635]|0;k=c[5633]|0;b=c[5770]|0;l=a>>>12;e=c[23084+(b+l<<2)>>2]|0;do if((e|a)&3)if(!(zf(a,2,0,2)|0)){b=c[5770]|0;e=23048;break}else{n=-1;return n|0}else e=e+a|0;while(0);n=c[e>>2]|0;j=a+4|0;h=j>>>12;e=c[23084+(b+h<<2)>>2]|0;do if((e|j)&3)if(!(zf(j,2,0,2)|0)){b=c[5770]|0;e=23048;break}else{n=-1;return n|0}else e=e+j|0;while(0);m=c[e>>2]|0;g=(f|0)==(n|0)&(g|0)==(m|0);e=g?i:n;f=g?k:m;b=c[8411692+(b+l<<2)>>2]|0;if((b|a)&3){if(Bf(a,e,2,2)|0){n=-1;return n|0}}else c[b+a>>2]=e;b=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((b|j)&3){if(Bf(j,f,2,2)|0){n=-1;return n|0}}else c[b+j>>2]=f;b=nf(22528)|0;if((c[5643]|0)==24){a=c[5641]|0;e=a>>>7&1;b=a&4|b|((c[5642]|0)==0&1)<<6}else{a=c[5642]|0;e=a>>>31;b=(d[21168+(a&255)>>0]|0)<<2|b|((a|0)==0&1)<<6}b=e<<7|b|(uf()|0)<<11;b=b|(vf()|0);c[5641]=b;if(g)b=b|64;else{c[5632]=n;c[5634]=m;b=b&-65}c[5641]=b;c[5642]=b>>>6&1^1;c[5643]=24;n=0;return n|0}function Cg(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0;g=c[5770]|0;f=c[23084+(g+(d>>>12)<<2)>>2]|0;do if((f|d)&1)if(!(zf(d,1,0,2)|0)){h=c[5762]|0;f=c[5770]|0;break}else{a=-1;return a|0}else{h=e[f+d>>1]|0;f=g}while(0);g=d+2|0;f=c[23084+(f+(g>>>12)<<2)>>2]|0;do if((f|g)&1)if(!(zf(g,1,0,2)|0)){g=c[5762]|0;break}else{a=-1;return a|0}else g=e[f+g>>1]|0;while(0);f=22528+(b<<2)|0;if(Cf(a,g)|0){a=-1;return a|0}c[f>>2]=c[f>>2]&-65536|h&65535;a=0;return a|0}function Dg(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0;switch(b|0){case 0:{if(!(f&31))return e|0;b=f&15;i=e&65535;b=i>>>(16-b|0)|i<<b;if((c[5643]|0)==24){g=c[5641]|0;f=g>>>7&1;g=((c[5642]|0)==0&1)<<6|g&4}else{g=c[5642]|0;f=g>>>31;g=(d[21168+(g&255)>>0]|0)<<2|((g|0)==0&1)<<6}i=f<<7|g|(vf()|0);c[5641]=(b^e)>>>4&2048|b&1|i;c[5642]=i>>>6&1^1;c[5643]=24;e=b;return e|0}case 1:{if(!(f&31))return e|0;b=f&15;i=e&65535;b=i<<16-b|i>>>b;if((c[5643]|0)==24){g=c[5641]|0;f=g>>>7&1;g=((c[5642]|0)==0&1)<<6|g&4}else{g=c[5642]|0;f=g>>>31;g=(d[21168+(g&255)>>0]|0)<<2|((g|0)==0&1)<<6}i=f<<7|g|(vf()|0);c[5641]=(b^e)>>>4&2048|b>>>15&1|i;c[5642]=i>>>6&1^1;c[5643]=24;e=b;return e|0}case 2:{b=a[21424+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&65535;g=(nf(22528)|0)<<h+-1|((b<<24>>24==1?0:i>>>(17-h|0))|i<<h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)>>>4&2048|i>>>(16-h|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 3:{b=a[21424+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&65535;g=(nf(22528)|0)<<16-h|((b<<24>>24==1?0:i<<17-h)|i>>>h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)>>>4&2048|i>>>(h+-1|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 6:case 4:{b=f&31;f=e<<b<<16>>16;if(!b)return e|0;c[5641]=e<<b+-1;c[5642]=f;c[5643]=16;e=f;return e|0}case 5:{b=f&31;f=e&65535;g=f>>>b<<16>>16;if(!b)return e|0;c[5641]=f>>>(b+-1|0);c[5642]=g;c[5643]=19;e=g;return e|0}case 7:{b=f&31;f=e<<16>>16;g=f>>b;if(!b)return e|0;c[5641]=f>>b+-1;c[5642]=g;c[5643]=19;e=g;return e|0}default:ra()}return 0}function Eg(){var a=0,d=0,e=0,f=0,g=0,h=0;e=(c[5636]|0)+-16|0;a=(e&c[5729])+(c[5694]|0)|0;d=7;while(1){g=c[22528+(d<<2)>>2]|0;f=c[8411692+((c[5770]|0)+(a>>>12)<<2)>>2]|0;if((f|a)&1){if(Bf(a,g,1,2)|0){a=-1;h=7;break}}else b[f+a>>1]=g;if(!d)break;else{a=a+2|0;d=d+-1|0}}if((h|0)==7)return a|0;h=c[5729]|0;c[5636]=c[5636]&~h|h&e;h=0;return h|0}function Fg(){var a=0,b=0,d=0,f=0,g=0;b=7;d=(c[5729]&c[5636])+(c[5694]|0)|0;while(1){if((b|0)!=4){a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;if(!((a|d)&1))a=e[a+d>>1]|0;else{if(zf(d,1,0,2)|0){a=-1;f=10;break}a=c[5762]|0}g=22528+(b<<2)|0;c[g>>2]=c[g>>2]&-65536|a&65535}if(!b)break;else{b=b+-1|0;d=d+2|0}}if((f|0)==10)return a|0;f=c[5636]|0;g=c[5729]|0;c[5636]=f&~g|f+16&g;g=0;return g|0}function Gg(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=d&31;g=c[5637]|0;n=(c[5636]|0)+-2|0;h=(c[5729]&n)+(c[5694]|0)|0;f=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((f|h)&1){if(Bf(h,g,1,2)|0){n=-1;return n|0}}else b[f+h>>1]=g;a:do switch(d&31){case 0:{d=n;break}case 1:{d=n;j=14;break}default:{d=n;while(1){g=g+-2|0;j=c[5729]|0;l=c[5694]|0;f=(j&g)+l|0;k=c[5770]|0;h=c[23084+((f>>>12)+k<<2)>>2]|0;if(!((h|f)&1)){m=e[h+f>>1]|0;f=l}else{if(zf(f,1,0,2)|0){d=-1;j=21;break}m=c[5762]|0;j=c[5729]|0;f=c[5694]|0;k=c[5770]|0}d=d+-2|0;h=(j&d)+f|0;f=c[8411692+((h>>>12)+k<<2)>>2]|0;if((f|h)&1){if(Bf(h,m,1,2)|0){d=-1;j=21;break}}else b[f+h>>1]=m;if((i|0)<=2){j=14;break a}else i=i+-1|0}if((j|0)==21)return d|0}}while(0);do if((j|0)==14){d=d+-2|0;f=(c[5729]&d)+(c[5694]|0)|0;g=c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((g|f)&1)){b[g+f>>1]=n;break}if(Bf(f,n,1,2)|0){n=-1;return n|0}}while(0);g=d-a|0;d=c[5729]|0;f=g&d;h=f+(c[5694]|0)|0;do if((c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|h)&1)if(!(zf(h,1,1,2)|0)){d=c[5729]|0;f=d&g;break}else{n=-1;return n|0}while(0);c[5637]=c[5637]&-65536|n&65535;c[5636]=c[5636]&~d|f;n=0;return n|0}function Hg(){var a=0,b=0,d=0,f=0;f=c[5637]|0;a=c[5729]|0;b=(a&f)+(c[5694]|0)|0;d=c[23084+((b>>>12)+(c[5770]|0)<<2)>>2]|0;do if((d|b)&1)if(!(zf(b,1,0,2)|0)){b=c[5762]|0;d=c[5637]|0;a=c[5729]|0;break}else{f=-1;return f|0}else{b=e[d+b>>1]|0;d=f}while(0);c[5637]=d&-65536|b&65535;c[5636]=c[5636]&~a|a&f+2;f=0;return f|0}function Ig(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0;f=c[5770]|0;d=c[23084+(f+(b>>>12)<<2)>>2]|0;do if((d|b)&1)if(!(zf(b,1,0,2)|0)){d=c[5762]|0;g=c[5770]|0;break}else{a=-1;return a|0}else{d=e[d+b>>1]|0;g=f}while(0);h=d<<16>>16;f=b+2|0;d=c[23084+(g+(f>>>12)<<2)>>2]|0;do if((d|f)&1)if(!(zf(f,1,0,2)|0)){d=c[5762]|0;break}else{a=-1;return a|0}else d=e[d+f>>1]|0;while(0);a=c[22528+(a<<2)>>2]<<16>>16;if(!((a|0)<(h|0)|(a|0)>(d<<16>>16|0))){a=0;return a|0}c[5746]=5;c[5747]=0;a=-1;return a|0}function Jg(){var a=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=c[5755]|0;i=g<<9&65536;j=i+-1|0;f=g&15;k=c[5638]|0;l=c[5639]|0;f=(j&k)+(c[22740+(((f|0)==0?3:f+-1|0)<<4)+4>>2]|0)|0;h=(j&l)+(c[5686]|0)|0;if(g&48){g=c[5633]|0;if(!(g&j)){l=0;return l|0}a=c[5770]|0;d=c[23084+(a+(f>>>12)<<2)>>2]|0;do if((d|f)&1)if(!(zf(f,1,0,2)|0)){d=c[5762]|0;a=c[5770]|0;break}else{l=-1;return l|0}else d=e[d+f>>1]|0;while(0);a=c[8411692+(a+(h>>>12)<<2)>>2]|0;if((a|h)&1){if(Bf(h,d,1,2)|0){l=-1;return l|0}}else b[a+h>>1]=d;i=0-i|0;h=c[5646]<<1;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i;l=g+-1&j;c[5633]=l|g&i;if(l|0){l=1;return l|0}}else{a=c[5770]|0;d=c[23084+(a+(f>>>12)<<2)>>2]|0;do if((d|f)&1)if(!(zf(f,1,0,2)|0)){d=c[5762]|0;a=c[5770]|0;break}else{l=-1;return l|0}else d=e[d+f>>1]|0;while(0);a=c[8411692+(a+(h>>>12)<<2)>>2]|0;if((a|h)&1){if(Bf(h,d,1,2)|0){l=-1;return l|0}}else b[a+h>>1]=d;i=0-i|0;h=c[5646]<<1;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i}l=0;return l|0}function Kg(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0;f=c[5755]|0;h=f<<9&65536;i=h+-1|0;d=f&15;j=c[5638]|0;k=c[5639]|0;d=(i&j)+(c[22740+(((d|0)==0?3:d+-1|0)<<4)+4>>2]|0)|0;g=(i&k)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&i)){k=0;return k|0}a=c[5770]|0;b=c[23084+(a+(d>>>12)<<2)>>2]|0;do if((b|d)&1)if(!(zf(d,1,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=e[b+d>>1]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((a|g)&1)if(!(zf(g,1,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=e[a+g>>1]|0;while(0);c[5641]=a;a=b-a<<16;c[5642]=a>>16;c[5643]=7;h=0-h|0;b=c[5646]<<1;c[5638]=b+j&i|j&h;c[5639]=b+k&i|k&h;b=f+-1&i;c[5633]=b|f&h;a=(a|0)==0;if(!(c[5755]&16)){if(a){k=0;return k|0}}else if(!a){k=0;return k|0}if(b|0){k=1;return k|0}}else{a=c[5770]|0;b=c[23084+(a+(d>>>12)<<2)>>2]|0;do if((b|d)&1)if(!(zf(d,1,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=e[b+d>>1]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((a|g)&1)if(!(zf(g,1,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=e[a+g>>1]|0;while(0);c[5641]=a;c[5642]=b-a<<16>>16;c[5643]=7;h=0-h|0;g=c[5646]<<1;c[5638]=g+j&i|j&h;c[5639]=g+k&i|k&h}k=0;return k|0}function Lg(){var a=0,b=0,d=0,f=0,g=0,h=0;d=c[5755]|0;f=d<<9&65536;g=f+-1|0;b=d&15;h=c[5638]|0;b=(g&h)+(c[22740+(((b|0)==0?3:b+-1|0)<<4)+4>>2]|0)|0;if(d&48){d=c[5633]|0;if(!(d&g)){h=0;return h|0}a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if((a|b)&1)if(!(zf(b,1,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=e[a+b>>1]|0;while(0);c[5632]=c[5632]&-65536|a;f=0-f|0;c[5638]=(c[5646]<<1)+h&g|h&f;h=d+-1&g;c[5633]=h|d&f;if(h|0){h=1;return h|0}}else{a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if((a|b)&1)if(!(zf(b,1,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=e[a+b>>1]|0;while(0);c[5632]=c[5632]&-65536|a;c[5638]=(c[5646]<<1)+h&g|h&0-f}h=0;return h|0}function Mg(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0;b=c[5755]|0;g=b<<9&65536;h=g+-1|0;i=c[5639]|0;d=(h&i)+(c[5686]|0)|0;if(b&48){f=c[5633]|0;if(!(f&h)){i=0;return i|0}a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((a|d)&1)if(!(zf(d,1,0,2)|0)){a=c[5762]|0;d=c[5755]|0;break}else{i=-1;return i|0}else{a=e[a+d>>1]|0;d=b}while(0);b=c[5632]|0;c[5641]=a;a=b-a<<16;c[5642]=a>>16;c[5643]=7;g=0-g|0;c[5639]=(c[5646]<<1)+i&h|i&g;b=f+-1&h;c[5633]=b|f&g;a=(a|0)==0;if(!(d&16)){if(a){i=0;return i|0}}else if(!a){i=0;return i|0}if(b|0){i=1;return i|0}}else{a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((a|d)&1)if(!(zf(d,1,0,2)|0)){a=c[5762]|0;break}else{i=-1;return i|0}else a=e[a+d>>1]|0;while(0);f=c[5632]|0;c[5641]=a;c[5642]=f-a<<16>>16;c[5643]=7;c[5639]=(c[5646]<<1)+i&h|i&0-g}i=0;return i|0}function Ng(){var a=0,d=0,e=0,f=0,g=0,h=0,i=0;e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5639]|0;i=(g&h)+(c[5686]|0)|0;if(e&48){a=c[5633]|0;if(!(a&g)){i=0;return i|0}d=c[5632]|0;e=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((e|i)&1){if(Bf(i,d,1,2)|0){i=-1;return i|0}}else b[e+i>>1]=d;f=0-f|0;c[5639]=(c[5646]<<1)+h&g|h&f;i=a+-1&g;c[5633]=i|a&f;if(i|0){i=1;return i|0}}else{a=c[5632]|0;d=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((d|i)&1){if(Bf(i,a,1,2)|0){i=-1;return i|0}}else b[d+i>>1]=a;c[5639]=(c[5646]<<1)+h&g|h&0-f}i=0;return i|0}function Og(){var a=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;e=n;d=c[5634]|0;g=d&65535;d=ig(d&65535,1,0)|0;if((d|0)<0){if((c[5746]|0)!=32){m=d;l=n;return m|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;k=a;m=c[k+4>>2]|0;c[a>>2]=c[k>>2]|8;c[a+4>>2]=m;a=c[5755]|0}m=(c[5766]|0)+120|0;k=m;j=c[k+4>>2]|0;c[m>>2]=c[k>>2]|(a&128^128)+128;c[m+4>>2]=j;m=(c[5766]|0)+120|0;j=m;k=c[j+4>>2]|0;c[m>>2]=c[j>>2]|4;c[m+4>>2]=k;m=d;l=n;return m|0}h=c[5755]|0;a=h&128;i=a<<9;j=i+-1|0;m=c[5639]|0;k=(j&m)+(c[5686]|0)|0;a:do if(h&48){h=c[5633]|0;if(!(h&j)){m=0;l=n;return m|0}do if((k&1|a|0)==0&(c[5646]|0)==1){f=(4096-(k&4095)|0)>>>1;f=h>>>0>f>>>0?f:h;if(Qg(e,k,1)|0){m=-1;l=n;return m|0}d=c[e>>2]|0;if(!d)break;if(f|0){a=0;do{b[d+(a<<1)>>1]=Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0;a=a+1|0}while(a>>>0<f>>>0)}c[5639]=(f<<1)+m;m=h-f|0;c[5633]=m;if(!m)break a;else a=1;l=n;return a|0}while(0);a=k>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|k)&1|0?zf(k,1,1,2)|0:0){m=-1;l=n;return m|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|k)&1){if(Bf(k,d,1,2)|0){m=-1;l=n;return m|0}}else b[a+k>>1]=d;k=0-i|0;c[5639]=(c[5646]<<1)+m&j|m&k;m=h+-1&j;c[5633]=m|h&k;if(m|0){m=1;l=n;return m|0}}else{a=k>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|k)&1|0?zf(k,1,1,2)|0:0){m=-1;l=n;return m|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|k)&1){if(Bf(k,d,1,2)|0){m=-1;l=n;return m|0}}else b[a+k>>1]=d;c[5639]=(c[5646]<<1)+m&j|m&0-i}while(0);m=0;l=n;return m|0}
+function zi(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;B=l;l=l+32|0;p=B+16|0;n=B;v=e;o=c[v>>2]|0;v=c[v+4>>2]|0;r=e+8|0;q=c[r>>2]|0;r=c[r+4>>2]|0;m=r&65535;s=Il(q|0,r|0,48)|0;s=s&32767;k=f;i=c[k>>2]|0;k=c[k+4>>2]|0;w=f+8|0;j=c[w>>2]|0;w=c[w+4>>2]|0;h=w&65535;x=Il(j|0,w|0,48)|0;x=x&32767;z=w^r;A=Il(j^q|0,z|0,63)|0;A=A&255;do if((s|0)==32767){if((q|o|0)==0&(m|v|0)==0?(t=j|i,u=h|k,(t|0)==0&(u|0)==0|(x|0)!=32767):0){if((t|x|0)==0&(u|0)==0)break;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648|2147418112;l=B;return};c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];ui(b,n,p,g);l=B;return}else{if((x|0)==32767){if(!((j|i|0)==0&(h|k|0)==0)){c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];ui(b,n,p,g);l=B;return}if((q|o|s|0)==0&(m|v|0)==0)break;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648|2147418112;l=B;return}do if(!s){if((q|o|0)==0&(m|v|0)==0){A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648;l=B;return}if(!((q|0)==0&(m|0)==0)){u=m>>>0<1|(m|0)==1&q>>>0<0;f=u?q:m;e=f>>>0<65536;f=e?f<<16:f;e=e?16:0;s=f>>>0<16777216;f=(((u?32:0)|(s?e|8:e)&255)+(d[10416+((s?f<<8:f)>>>24)>>0]|0)<<24)+-251658240|0;s=f>>24;e=Jl(o|0,v|0,s|0)|0;r=y;f=(f|0)==0;u=Jl(q|0,m|0,s|0)|0;p=y;t=Il(o|0,v|0,0-s&63|0)|0;s=1-s|0;m=f?m:y|p;o=e;v=r;q=f?q:t|u;break}s=v>>>0<1|(v|0)==1&o>>>0<0;u=s?o:v;t=u>>>0<65536;u=t?u<<16:u;t=t?16:0;n=u>>>0<16777216;u=(((s?32:0)|(n?t|8:t)&255)+(d[10416+((n?u<<8:u)>>>24)>>0]|0)<<24)+-251658240|0;n=u>>24;if((u|0)<0){q=Il(o|0,v|0,0-n|0)|0;m=y;o=Jl(o|0,v|0,n&63|0)|0;p=y}else{q=Jl(o|0,v|0,n|0)|0;m=y;o=0;p=0}s=-63-n|0;v=p}while(0);do if(!x){if((j|i|0)==0&(h|k|0)==0){A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648;l=B;return}if(!((j|0)==0&(h|0)==0)){t=h>>>0<1|(h|0)==1&j>>>0<0;x=t?j:h;f=x>>>0<65536;x=f?x<<16:x;f=f?16:0;p=x>>>0<16777216;x=(((t?32:0)|(p?f|8:f)&255)+(d[10416+((p?x<<8:x)>>>24)>>0]|0)<<24)+-251658240|0;p=x>>24;f=Jl(i|0,k|0,p|0)|0;t=y;x=(x|0)==0;w=Jl(j|0,h|0,p|0)|0;z=y;u=Il(i|0,k|0,0-p&63|0)|0;p=1-p|0;i=f;k=t;j=x?j:u|w;h=x?h:y|z;break}w=k>>>0<1|(k|0)==1&i>>>0<0;z=w?i:k;x=z>>>0<65536;z=x?z<<16:z;x=x?16:0;j=z>>>0<16777216;z=(((w?32:0)|(j?x|8:x)&255)+(d[10416+((j?z<<8:z)>>>24)>>0]|0)<<24)+-251658240|0;j=z>>24;if((z|0)<0){n=Il(i|0,k|0,0-j|0)|0;h=y;i=Jl(i|0,k|0,j&63|0)|0;k=y}else{n=Jl(i|0,k|0,j|0)|0;h=y;i=0;k=0}p=-63-j|0;j=n}else p=x;while(0);p=p+s|0;D=m|65536;H=Jl(i|0,k|0,16)|0;e=Jl(j|0,h|0,16)|0;u=Il(i|0,k|0,48)|0;r=y;n=Il(i|0,k|0,16)|0;H=H&-65536;z=Dl(H|0,0,o|0,0)|0;x=y;f=Dl(n|0,0,o|0,0)|0;s=y;t=Dl(H|0,0,v|0,0)|0;C=y;K=Dl(n|0,0,v|0,0)|0;E=y;s=xl(f|0,s|0,t|0,C|0)|0;f=y;x=xl(0,s|0,z|0,x|0)|0;z=y;F=Il(j|0,h|0,16)|0;e=u|e&-65536;u=Dl(e|0,r|0,o|0,0)|0;w=y;m=Dl(F|0,0,o|0,0)|0;k=y;i=Dl(e|0,r|0,v|0,0)|0;J=y;G=Dl(F|0,0,v|0,0)|0;I=y;k=xl(i|0,J|0,m|0,k|0)|0;m=y;w=xl(0,k|0,u|0,w|0)|0;u=y;h=xl(w|0,u|0,K|0,E|0)|0;h=xl(h|0,y|0,f|0,(f>>>0<C>>>0|(f|0)==(C|0)&s>>>0<t>>>0)&1|0)|0;h=xl(h|0,y|0,(z>>>0<s>>>0|(z|0)==(s|0)&x>>>0<0)&1|0,0)|0;j=y;s=Dl(e|0,r|0,q|0,0)|0;t=y;C=Dl(F|0,0,q|0,0)|0;f=y;r=Dl(e|0,r|0,D|0,0)|0;e=y;F=Dl(F|0,0,D|0,0)|0;E=y;f=xl(r|0,e|0,C|0,f|0)|0;C=y;t=xl(0,f|0,s|0,t|0)|0;s=y;I=xl(t|0,s|0,G|0,I|0)|0;i=xl(I|0,y|0,m|0,(m>>>0<J>>>0|(m|0)==(J|0)&k>>>0<i>>>0)&1|0)|0;k=xl(i|0,y|0,(u>>>0<k>>>0|(u|0)==(k|0)&w>>>0<0)&1|0,0)|0;w=xl(k|0,y|0,(j>>>0<u>>>0|(j|0)==(u|0)&h>>>0<w>>>0)&1|0,0)|0;u=y;k=Dl(H|0,0,q|0,0)|0;i=y;J=Dl(n|0,0,q|0,0)|0;m=y;H=Dl(H|0,0,D|0,0)|0;I=y;n=Dl(n|0,0,D|0,0)|0;G=y;m=xl(J|0,m|0,H|0,I|0)|0;J=y;G=xl(J|0,(J>>>0<I>>>0|(J|0)==(I|0)&m>>>0<H>>>0)&1|0,n|0,G|0)|0;n=y;i=xl(0,m|0,k|0,i|0)|0;k=y;m=xl(G|0,n|0,(k>>>0<m>>>0|(k|0)==(m|0)&i>>>0<0)&1|0,0)|0;n=y;j=xl(h|0,j|0,i|0,k|0)|0;h=y;i=xl(m|0,n|0,(h>>>0<k>>>0|(h|0)==(k|0)&j>>>0<i>>>0)&1|0,0)|0;i=xl(i|0,y|0,w|0,u|0)|0;k=y;n=xl(i|0,k|0,o|0,v|0)|0;m=y;v=xl(F|0,E|0,q|0,D|0)|0;v=xl(v|0,y|0,C|0,(C>>>0<e>>>0|(C|0)==(e|0)&f>>>0<r>>>0)&1|0)|0;v=xl(v|0,y|0,(s>>>0<f>>>0|(s|0)==(f|0)&t>>>0<0)&1|0,0)|0;v=xl(v|0,y|0,(u>>>0<s>>>0|(u|0)==(s|0)&w>>>0<t>>>0)&1|0,0)|0;w=xl(v|0,y|0,(k>>>0<u>>>0|(k|0)==(u|0)&i>>>0<w>>>0)&1|0,0)|0;i=xl(w|0,y|0,(m>>>0<k>>>0|(m|0)==(k|0)&n>>>0<i>>>0)&1|0,0)|0;k=y;j=j|((x|0)!=0|(z|0)!=0)&1;if(k>>>0>131071|(k|0)==131071&i>>>0>4294967295){J=Jl(n|0,m|0,63)|0;K=y;I=Jl(i|0,k|0,63)|0;o=y;n=Il(n|0,m|0,1)|0;m=o|y;i=Il(i|0,k|0,1)|0;o=p+-16383|0;k=y;n=I|n;j=J|((j|0)!=0|(h|0)!=0)&1;h=K}else o=p+-16384|0;yi(b,A,o,i,k,n,m,j,h,g);l=B;return}while(0);K=g+2|0;a[K>>0]=a[K>>0]|1;K=b;c[K>>2]=0;c[K+4>>2]=0;K=b+8|0;c[K>>2]=0;c[K+4>>2]=-32768;l=B;return}function Ai(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;H=l;l=l+32|0;t=H+16|0;s=H;j=e;h=c[j>>2]|0;j=c[j+4>>2]|0;w=e+8|0;m=c[w>>2]|0;w=c[w+4>>2]|0;i=w&65535;r=Il(m|0,w|0,48)|0;r=r&32767;o=f;k=c[o>>2]|0;o=c[o+4>>2]|0;u=f+8|0;p=c[u>>2]|0;u=c[u+4>>2]|0;q=u&65535;n=Il(p|0,u|0,48)|0;v=n&32767;x=u^w;G=Il(p^m|0,x|0,63)|0;G=G&255;a:do if((r|0)==32767){if(!((m|h|0)==0&(i|j|0)==0)){c[s>>2]=c[e>>2];c[s+4>>2]=c[e+4>>2];c[s+8>>2]=c[e+8>>2];c[s+12>>2]=c[e+12>>2];c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];ui(b,s,t,g);l=H;return}if((v|0)!=32767){G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648|2147418112;l=H;return}if(!((p|k|0)==0&(q|o|0)==0)){c[s>>2]=c[e>>2];c[s+4>>2]=c[e+4>>2];c[s+8>>2]=c[e+8>>2];c[s+12>>2]=c[e+12>>2];c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];ui(b,s,t,g);l=H;return}}else{n=n&32767;b:do if(n<<16>>16>=32767){switch(n<<16>>16){case 32767:break;default:break b}if((p|k|0)==0&(q|o|0)==0){G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648;l=H;return}else{c[s>>2]=c[e>>2];c[s+4>>2]=c[e+4>>2];c[s+8>>2]=c[e+8>>2];c[s+12>>2]=c[e+12>>2];c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];ui(b,s,t,g);l=H;return}}else{switch(n<<16>>16){case 0:break;default:break b}if((p|k|0)==0&(q|o|0)==0){if((m|h|r|0)==0&(i|j|0)==0)break a;G=g+2|0;a[G>>0]=a[G>>0]|4;G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648|2147418112;l=H;return}if(!((p|0)==0&(q|0)==0)){B=q>>>0<1|(q|0)==1&p>>>0<0;E=B?p:q;A=E>>>0<65536;E=A?E<<16:E;A=A?16:0;v=E>>>0<16777216;E=(((B?32:0)|(v?A|8:A)&255)+(d[10416+((v?E<<8:E)>>>24)>>0]|0)<<24)+-251658240|0;v=E>>24;A=Jl(k|0,o|0,v|0)|0;B=y;E=(E|0)==0;D=Jl(p|0,q|0,v|0)|0;F=y;C=Il(k|0,o|0,0-v&63|0)|0;v=1-v|0;k=A;o=B;p=E?p:C|D;q=E?q:y|F;break}D=o>>>0<1|(o|0)==1&k>>>0<0;F=D?k:o;E=F>>>0<65536;F=E?F<<16:F;E=E?16:0;n=F>>>0<16777216;F=(((D?32:0)|(n?E|8:E)&255)+(d[10416+((n?F<<8:F)>>>24)>>0]|0)<<24)+-251658240|0;n=F>>24;if((F|0)<0){p=Il(k|0,o|0,0-n|0)|0;q=y;k=Jl(k|0,o|0,n&63|0)|0;o=y}else{p=Jl(k|0,o|0,n|0)|0;q=y;k=0;o=0}v=-63-n|0}while(0);do if(!r){if((m|h|0)==0&(i|j|0)==0){G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648;l=H;return}if(!((m|0)==0&(i|0)==0)){B=i>>>0<1|(i|0)==1&m>>>0<0;E=B?m:i;A=E>>>0<65536;E=A?E<<16:E;A=A?16:0;r=E>>>0<16777216;E=(((B?32:0)|(r?A|8:A)&255)+(d[10416+((r?E<<8:E)>>>24)>>0]|0)<<24)+-251658240|0;r=E>>24;A=Jl(h|0,j|0,r|0)|0;B=y;E=(E|0)==0;D=Jl(m|0,i|0,r|0)|0;F=y;C=Il(h|0,j|0,0-r&63|0)|0;r=1-r|0;h=A;j=B;m=E?m:C|D;i=E?i:y|F;break}D=j>>>0<1|(j|0)==1&h>>>0<0;F=D?h:j;E=F>>>0<65536;F=E?F<<16:F;E=E?16:0;i=F>>>0<16777216;F=(((D?32:0)|(i?E|8:E)&255)+(d[10416+((i?F<<8:F)>>>24)>>0]|0)<<24)+-251658240|0;i=F>>24;if((F|0)<0){m=Il(h|0,j|0,0-i|0)|0;n=y;h=Jl(h|0,j|0,i&63|0)|0;j=y}else{m=Jl(h|0,j|0,i|0)|0;n=y;h=0;j=0}r=-63-i|0;i=n}while(0);r=r-v|0;t=Jl(h|0,j|0,15)|0;e=y;s=Jl(m|0,i|0,15)|0;n=y;i=Il(h|0,j|0,49)|0;m=y;s=i|s;n=m|n|-2147483648;E=Jl(k|0,o|0,15)|0;F=y;B=Jl(p|0,q|0,15)|0;A=y|-2147483648;C=Il(k|0,o|0,49)|0;B=C|B;C=y|A;if(!(C>>>0<n>>>0|(C|0)==(n|0)&B>>>0<s>>>0)){i=Jl(i|0,m|0,63)|0;m=y;h=Jl(h|0,j|0,14)|0;if(F>>>0>e>>>0|(F|0)==(e|0)&E>>>0>t>>>0|((B|0)!=(s|0)|(C|0)!=(n|0))){D=r+16381|0;f=n}else{h=i|h&-16384;i=m|y&2147483647;z=34}}else{z=Jl(i|0,m|0,63)|0;i=y;h=Jl(h|0,j|0,14)|0;h=z|h&-16384;i=i|y&2147483647;z=34}if((z|0)==34){s=Il(s|0,n|0,1)|0;D=r+16382|0;f=y;t=h;e=i}if(C>>>0>f>>>0|(C|0)==(f|0)&B>>>0>s>>>0){if(A>>>0>f>>>0|(A|0)==(f|0)&0>s>>>0){j=Fl(s|0,f|0,A|0,0)|0;m=0}else{j=-1;m=0}n=Dl(j|0,0,B|0,0)|0;p=y;x=Dl(j|0,0,A|0,0)|0;z=y;h=yl(t|0,e|0,0,n|0)|0;i=y;n=(e>>>0<n>>>0|(e|0)==(n|0)&t>>>0<0)<<31>>31;z=yl(s|0,f|0,x|0,z|0)|0;p=yl(z|0,y|0,p|0,0)|0;n=xl(p|0,y|0,n|0,((n|0)<0)<<31>>31|0)|0;p=y;if((p|0)<0)while(1){m=xl(m|0,j|0,0,-1)|0;j=y;q=xl(h|0,i|0,0,B|0)|0;r=y;n=xl(n|0,p|0,A|0,0)|0;n=xl(n|0,y|0,(r>>>0<i>>>0|(r|0)==(i|0)&q>>>0<h>>>0)&1|0,0)|0;p=y;if((p|0)<0){h=q;i=r}else{h=r;break}}else h=i;if(A>>>0>n>>>0|(A|0)==(n|0)&0>h>>>0){h=Fl(h|0,n|0,A|0,0)|0;i=y}else{h=-1;i=0}m=h|m;r=i|j;w=B;x=0}else{m=-1;r=-1;w=B;x=0}u=Il(k|0,o|0,17)|0;v=E&-32768;k=Dl(m|0,0,v|0,0)|0;h=y;p=Dl(r|0,0,v|0,0)|0;j=y;N=Dl(m|0,0,u|0,0)|0;i=y;o=Dl(r|0,0,u|0,0)|0;O=y;j=xl(p|0,j|0,N|0,i|0)|0;p=y;h=xl(0,j|0,k|0,h|0)|0;k=y;P=Dl(m|0,0,w|0,x|0)|0;z=y;K=Dl(r|0,0,w|0,x|0)|0;I=y;n=Dl(m|0,0,A|0,0)|0;J=y;M=Dl(r|0,0,A|0,0)|0;L=y;I=xl(K|0,I|0,n|0,J|0)|0;K=y;z=xl(0,I|0,P|0,z|0)|0;P=y;O=xl(z|0,P|0,o|0,O|0)|0;N=xl(O|0,y|0,p|0,(p>>>0<i>>>0|(p|0)==(i|0)&j>>>0<N>>>0)&1|0)|0;j=xl(N|0,y|0,(k>>>0<j>>>0|(k|0)==(j|0)&h>>>0<0)&1|0,0)|0;N=y;i=yl(0,0,h|0,k|0)|0;p=y;O=yl(t|0,e|0,j|0,N|0)|0;o=y;q=(P>>>0<I>>>0|(P|0)==(I|0)&z>>>0<0)<<31>>31;z=(N>>>0<P>>>0|(N|0)==(P|0)&j>>>0<z>>>0)<<31>>31;k=((h|0)!=0|(k|0)!=0)&1;h=(o>>>0<0|(o|0)==0&O>>>0<k>>>0)<<31>>31;k=yl(O|0,o|0,k|0,0)|0;o=y;j=(e>>>0<N>>>0|(e|0)==(N|0)&t>>>0<j>>>0)<<31>>31;f=yl(s|0,f|0,M|0,L|0)|0;f=yl(f|0,y|0,K|0,(K>>>0<J>>>0|(K|0)==(J|0)&I>>>0<n>>>0)&1|0)|0;f=xl(f|0,y|0,q|0,((q|0)<0)<<31>>31|0)|0;z=xl(f|0,y|0,z|0,((z|0)<0)<<31>>31|0)|0;j=xl(z|0,y|0,j|0,((j|0)<0)<<31>>31|0)|0;h=xl(j|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;j=y;if((j|0)<0){t=i;s=p;q=k;while(1){m=xl(m|0,r|0,-1,-1)|0;r=y;n=xl(t|0,s|0,E|0,F|0)|0;p=y;O=xl(q|0,o|0,B|0,C|0)|0;N=y;P=(p>>>0<s>>>0|(p|0)==(s|0)&n>>>0<t>>>0)&1;k=xl(O|0,N|0,P|0,0)|0;i=y;O=xl(h|0,j|0,(N>>>0<o>>>0|(N|0)==(o|0)&O>>>0<q>>>0)&1|0,0)|0;h=xl(O|0,y|0,(i>>>0<0|(i|0)==0&k>>>0<P>>>0)&1|0,0)|0;j=y;if((j|0)>=0){o=i;t=k;s=p;f=m;e=r;break}else{t=n;s=p;q=k;o=i}}}else{t=k;n=i;s=p;f=m;e=r}if(C>>>0>o>>>0|(C|0)==(o|0)&B>>>0>t>>>0){if(A>>>0>o>>>0|(A|0)==(o|0)&0>t>>>0){k=Fl(t|0,o|0,A|0,0)|0;i=0}else{k=-1;i=0}m=Dl(k|0,0,w|0,x|0)|0;p=y;O=Dl(k|0,0,A|0,0)|0;P=y;h=yl(n|0,s|0,0,m|0)|0;j=y;m=(s>>>0<m>>>0|(s|0)==(m|0)&n>>>0<0)<<31>>31;P=yl(t|0,o|0,O|0,P|0)|0;p=yl(P|0,y|0,p|0,0)|0;m=xl(p|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;p=y;if((p|0)<0)while(1){i=xl(i|0,k|0,0,-1)|0;k=y;q=xl(h|0,j|0,0,B|0)|0;r=y;m=xl(m|0,p|0,A|0,0)|0;m=xl(m|0,y|0,(r>>>0<j>>>0|(r|0)==(j|0)&q>>>0<h>>>0)&1|0,0)|0;p=y;if((p|0)<0){h=q;j=r}else{h=r;break}}else h=j;if(A>>>0>m>>>0|(A|0)==(m|0)&0>h>>>0){h=Fl(h|0,m|0,A|0,0)|0;j=y}else{h=-1;j=0}i=h|i;h=j|k;if(0<0|0==0&(i&16383)>>>0<5){p=Dl(i|0,0,v|0,0)|0;P=y;m=Dl(h|0,0,v|0,0)|0;z=y;k=Dl(i|0,0,u|0,0)|0;j=y;u=Dl(h|0,0,u|0,0)|0;N=y;z=xl(m|0,z|0,k|0,j|0)|0;m=y;P=xl(0,z|0,p|0,P|0)|0;p=y;v=Dl(i|0,0,w|0,x|0)|0;O=y;J=Dl(h|0,0,w|0,x|0)|0;L=y;M=Dl(i|0,0,A|0,0)|0;K=y;A=Dl(h|0,0,A|0,0)|0;I=y;L=xl(J|0,L|0,M|0,K|0)|0;J=y;O=xl(0,L|0,v|0,O|0)|0;v=y;x=xl(O|0,v|0,u|0,N|0)|0;x=xl(x|0,y|0,m|0,(m>>>0<j>>>0|(m|0)==(j|0)&z>>>0<k>>>0)&1|0)|0;z=xl(x|0,y|0,(p>>>0<z>>>0|(p|0)==(z|0)&P>>>0<0)&1|0,0)|0;x=y;k=yl(0,0,P|0,p|0)|0;j=y;w=yl(n|0,s|0,z|0,x|0)|0;m=y;N=(v>>>0<L>>>0|(v|0)==(L|0)&O>>>0<0)<<31>>31;O=(x>>>0<v>>>0|(x|0)==(v|0)&z>>>0<O>>>0)<<31>>31;p=((P|0)!=0|(p|0)!=0)&1;P=(m>>>0<0|(m|0)==0&w>>>0<p>>>0)<<31>>31;p=yl(w|0,m|0,p|0,0)|0;m=y;n=(s>>>0<x>>>0|(s|0)==(x|0)&n>>>0<z>>>0)<<31>>31;o=yl(t|0,o|0,A|0,I|0)|0;o=yl(o|0,y|0,J|0,(J>>>0<K>>>0|(J|0)==(K|0)&L>>>0<M>>>0)&1|0)|0;o=xl(o|0,y|0,N|0,((N|0)<0)<<31>>31|0)|0;o=xl(o|0,y|0,O|0,((O|0)<0)<<31>>31|0)|0;n=xl(o|0,y|0,n|0,((n|0)<0)<<31>>31|0)|0;n=xl(n|0,y|0,P|0,((P|0)<0)<<31>>31|0)|0;o=y;if((o|0)<0)while(1){i=xl(i|0,h|0,-1,-1)|0;h=y;s=xl(k|0,j|0,E|0,F|0)|0;t=y;O=xl(p|0,m|0,B|0,C|0)|0;N=y;P=(t>>>0<j>>>0|(t|0)==(j|0)&s>>>0<k>>>0)&1;q=xl(O|0,N|0,P|0,0)|0;r=y;n=xl(n|0,o|0,(N>>>0<m>>>0|(N|0)==(m|0)&O>>>0<p>>>0)&1|0,0)|0;n=xl(n|0,y|0,(r>>>0<0|(r|0)==0&q>>>0<P>>>0)&1|0,0)|0;o=y;if((o|0)<0){k=s;j=t;p=q;m=r}else{p=q;m=r;k=s;j=t;break}}i=i|((p|n|k|0)!=0|(m|o|j|0)!=0)&1}}else{i=-1;h=-1}O=Jl(i|0,h|0,49)|0;P=y;M=Jl(f|0,e|0,49)|0;N=y;L=Il(i|0,h|0,15)|0;N=y|N;K=Il(f|0,e|0,15)|0;yi(b,G,D,K,y,L|M,N,O,P,g);l=H;return}while(0);P=g+2|0;a[P>>0]=a[P>>0]|1;P=b;c[P>>2]=0;c[P+4>>2]=0;P=b+8|0;c[P>>2]=0;c[P+4>>2]=-32768;l=H;return}function Bi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+32|0;C=D+12|0;B=D+6|0;p=D;w=b[f+8>>1]|0;m=w&32767;o=m<<16>>16==0;v=f;z=c[v>>2]|0;v=c[v+4>>2]|0;a:do if(o|(v|0)<0){q=m&65535;r=g+8|0;j=c[r>>2]|0;r=c[r+4>>2]|0;u=r&65535;k=g;i=c[k>>2]|0;k=c[k+4>>2]|0;g=Il(j|0,r|0,48)|0;n=g&32767;s=Il(j|0,r|0,63)|0;t=y;A=s&255^(w&65535)>>>15&255;if(m<<16>>16==32767){m=v&2147483647;b:do if((z|0)==0&(m|0)==0){g=g&32767;c:do if(g<<16>>16>=32767){switch(g<<16>>16){case 32767:break;default:break c}if(!((j|i|0)==0&(u|k|0)==0))break b}else{switch(g<<16>>16){case 0:break;default:break c}if((j|i|0)==0&(u|k|0)==0)break a;h=h+2|0;a[h>>0]=a[h>>0]|2}while(0);h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(A&255)<<15|32767;l=D;return}while(0);if(0==0&(r&2147450880|0)==2147418112?!((i|j|0)==0&(k|r&32767|0)==0):0){A=h+2|0;a[A>>0]=a[A>>0]|1}q=Jl(j|0,r|0,16)|0;r=y;i=Il(i|0,k|0,48)|0;r=Il(i|q|0,y|r|0,1)|0;i=y;q=(r|0)==0&(i|0)==0;r=q?0:r;i=q?-1073741824:i|-2147483648;q=Jl(s|0,t|0,15)|0;q=(q|32767)&65535;b[C>>1]=b[p>>1]|0;b[C+2>>1]=b[p+2>>1]|0;b[C+4>>1]=b[p+4>>1]|0;p=f+10|0;b[B>>1]=b[p>>1]|0;b[B+2>>1]=b[p+2>>1]|0;b[B+4>>1]=b[p+4>>1]|0;m=(z|0)==0&(m|0)==0;p=(z|0)==(z|0)&(v|0)==(v&-1073741825|0)&((z|0)!=0|(v&1073741823|0)!=0);n=(r|0)!=0|(i&2147483647|0)!=0;j=(r|0)!=0|(i&1073741823|0)!=0;k=(r|0)==(r|0)&(i|0)==(i&-1073741825|0);o=k&j;g=v|-1073741824;i=i|-1073741824;if(p|o){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(p)if(!o)if(n){h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}else{h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;break}else x=20;else{if(m){h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}if(n&(k&j^1))x=20;else{h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0}}while(0);do if((x|0)==20){if(g>>>0<i>>>0|(g|0)==(i|0)&z>>>0<r>>>0){h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}if(i>>>0<g>>>0|(i|0)==(g|0)&r>>>0<z>>>0){h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;break}if((w&65535)<(q&65535)){h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;break}else{h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}}while(0);l=D;return}if((n|0)==32767){if((j|i|0)==0&(u|k|0)==0){if(o){if((z|0)==0&(v|0)==0)break;h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(A&255)<<15|32767;l=D;return}if(0==0&(r&2147450880|0)==2147418112?!((i|j|0)==0&(k|r&32767|0)==0):0){A=h+2|0;a[A>>0]=a[A>>0]|1}g=Jl(j|0,r|0,16)|0;j=y;i=Il(i|0,k|0,48)|0;i=Il(i|g|0,y|j|0,1)|0;j=y;g=(i|0)==0&(j|0)==0;i=g?0:i;j=g?-1073741824:j|-2147483648;g=Jl(s|0,t|0,15)|0;b[C>>1]=b[B>>1]|0;b[C+2>>1]=b[B+2>>1]|0;b[C+4>>1]=b[B+4>>1]|0;if((i|0)==(i|0)&(j|0)==(j&-1073741825|0)&((i|0)!=0|(j&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=i;c[h+4>>2]=j|-1073741824;b[e+8>>1]=g|32767;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;l=D;return}do if(o){if(!((z|0)==0&(v|0)==0)){C=h+2|0;a[C>>0]=a[C>>0]|2;C=v>>>0<1|(v|0)==1&z>>>0<0;q=C?z:v;o=q>>>0<65536;q=o?q<<16:q;o=o?16:0;p=q>>>0<16777216;q=((C?32:0)|(p?o|8:o)&255)+(d[10416+((p?q<<8:q)>>>24)>>0]|0)<<24>>24;p=Jl(z|0,v|0,q|0)|0;q=1-q|0;o=y;break}if(!((j|i|0)==0&(u|k|0)==0|(n|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=(A&255)<<15;l=D;return}else{p=z;o=v}while(0);do if(!n){if((j|i|0)==0&(u|k|0)==0){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=(A&255)<<15;l=D;return}C=h+2|0;a[C>>0]=a[C>>0]|2;if(!((j|0)==0&(u|0)==0)){x=u>>>0<1|(u|0)==1&j>>>0<0;C=x?j:u;w=C>>>0<65536;C=w?C<<16:C;w=w?16:0;n=C>>>0<16777216;C=(((x?32:0)|(n?w|8:w)&255)+(d[10416+((n?C<<8:C)>>>24)>>0]|0)<<24)+-251658240|0;n=C>>24;w=Jl(i|0,k|0,n|0)|0;x=y;C=(C|0)==0;B=Jl(j|0,u|0,n|0)|0;g=y;z=Il(i|0,k|0,0-n&63|0)|0;n=1-n|0;i=w;k=x;j=C?j:z|B;g=C?u:y|g;break}z=k>>>0<1|(k|0)==1&i>>>0<0;C=z?i:k;B=C>>>0<65536;C=B?C<<16:C;B=B?16:0;j=C>>>0<16777216;C=(((z?32:0)|(j?B|8:B)&255)+(d[10416+((j?C<<8:C)>>>24)>>0]|0)<<24)+-251658240|0;j=C>>24;if((C|0)<0){m=Il(i|0,k|0,0-j|0)|0;g=y;i=Jl(i|0,k|0,j&63|0)|0;k=y}else{m=Jl(i|0,k|0,j|0)|0;g=y;i=0;k=0}n=-63-j|0;j=m}else g=u|65536;while(0);f=Jl(i|0,k|0,15)|0;w=Jl(j|0,g|0,15)|0;B=Il(i|0,k|0,49)|0;u=y;m=Il(i|0,k|0,17)|0;f=f&-32768;z=Dl(f|0,0,p|0,0)|0;t=y;f=Dl(f|0,0,o|0,0)|0;C=y;v=Dl(m|0,0,p|0,0)|0;s=y;m=Dl(m|0,0,o|0,0)|0;r=y;C=xl(f|0,C|0,v|0,s|0)|0;f=y;t=xl(0,C|0,z|0,t|0)|0;z=y;x=Il(j|0,g|0,17)|0;i=w&-32768|B;B=Dl(i|0,u|0,p|0,0)|0;w=y;i=Dl(i|0,u|0,o|0,0)|0;u=y;k=Dl(x|0,0,p|0,0)|0;j=y;x=Dl(x|0,0,o|0,0)|0;p=y;u=xl(i|0,u|0,k|0,j|0)|0;o=y;p=xl(o|0,(o>>>0<j>>>0|(o|0)==(j|0)&u>>>0<k>>>0)&1|0,x|0,p|0)|0;x=y;w=xl(0,u|0,B|0,w|0)|0;B=y;u=xl(p|0,x|0,(B>>>0<u>>>0|(B|0)==(u|0)&w>>>0<0)&1|0,0)|0;x=y;r=xl(w|0,B|0,m|0,r|0)|0;v=xl(r|0,y|0,f|0,(f>>>0<s>>>0|(f|0)==(s|0)&C>>>0<v>>>0)&1|0)|0;t=xl(v|0,y|0,(z>>>0<C>>>0|(z|0)==(C|0)&t>>>0<0)&1|0,0)|0;C=y;w=xl(u|0,x|0,(C>>>0<B>>>0|(C|0)==(B|0)&t>>>0<w>>>0)&1|0,0)|0;B=y;x=(B|0)>0|(B|0)==0&w>>>0>0;u=Jl(w|0,B|0,1)|0;z=y;v=Il(t|0,C|0,63)|0;z=z|y;C=Jl(t|0,C|0,x&1|0)|0;oi(e,a[h+3>>0]|0,A,n+q+(x?-16383:-16382)|0,x?u|v:w,x?z:B,C,y,h);l=D;return}while(0);h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=D;return}function Ci(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(b[d+8>>1]&32767?(c[d+4>>2]|0)>=0:0){e=e+2|0;a[e>>0]=a[e>>0]|1;e=-32768;l=g;return e|0};c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];f=ei(f,e)|0;if((f+32768|0)>>>0>65535){a[e+2>>0]=1;e=-32768;l=g;return e|0}else{e=f&65535;l=g;return e|0}return 0}function Di(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=b[d+8>>1]|0;g=f&32767;j=d;k=c[j>>2]|0;j=c[j+4>>2]|0;do if(!(g<<16>>16))if((k|0)==0&(j|0)==0)d=0;else l=8;else{if((j|0)>=0){l=e+2|0;a[l>>0]=a[l>>0]|1;l=-32768;return l|0}d=g&65535;h=(f&65535)>>>15;i=h&255;if((g&65535)<=16414){if((g&65535)<16383){l=8;break}f=16446-d|0;g=Il(k|0,j|0,f|0)|0;d=i<<24>>24==0?g:0-g|0;if((d>>>31|0)==(h&65535|0)){i=Jl(g|0,y|0,f|0)|0;if(!((i|0)==(k|0)&(y|0)==(j|0))){k=e+2|0;a[k>>0]=a[k>>0]|32}}else{d=i;l=10}}else{d=g<<16>>16!=32767|(k|0)==0&(j&2147483647|0)==0?i:0;l=10}if((l|0)==10){k=e+2|0;a[k>>0]=a[k>>0]|1;d=d<<24>>24==0?2147483647:-2147483648}if((d+32768|0)>>>0>65535){a[e+2>>0]=1;l=-32768;return l|0}}while(0);if((l|0)==8){d=e+2|0;a[d>>0]=a[d>>0]|32;d=0}l=d&65535;return l|0}function Ei(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+32|0;m=v+12|0;s=v+6|0;p=v;i=f;h=c[i>>2]|0;i=c[i+4>>2]|0;r=f+8|0;o=b[r>>1]|0;t=f+10|0;b[s>>1]=b[t>>1]|0;b[s+2>>1]=b[t+2>>1]|0;b[s+4>>1]=b[t+4>>1]|0;n=o&32767;j=n&65535;u=o&-32768;a:do if(!(n<<16>>16)){k=g+2|0;j=a[k>>0]|0;if((h|0)==0&(i|0)==0){a[k>>0]=j|4;c[f>>2]=0;c[f+4>>2]=0;b[r>>1]=u;b[t>>1]=b[p>>1]|0;b[t+2>>1]=b[p+2>>1]|0;b[t+4>>1]=b[p+4>>1]|0;u=e;c[u>>2]=0;c[u+4>>2]=-2147483648;b[e+8>>1]=-1;l=v;return}else q=13}else{if((i|0)>=0){u=g+2|0;a[u>>0]=a[u>>0]|1;b[s>>1]=b[7197]|0;b[s+2>>1]=b[7198]|0;b[s+4>>1]=b[7199]|0;u=f;c[u>>2]=0;c[u+4>>2]=-1073741824;b[r>>1]=-1;Ml(t|0,14394,6)|0;u=e;c[u>>2]=0;c[u+4>>2]=-1073741824;b[e+8>>1]=-1;e=e+10|0;b[e>>1]=b[s>>1]|0;b[e+2>>1]=b[s+2>>1]|0;b[e+4>>1]=b[s+4>>1]|0;l=v;return}k=o&32767;if(k<<16>>16<32767){switch(k<<16>>16){case 0:break;default:break a}k=g+2|0;j=a[k>>0]|0;q=13;break}switch(k<<16>>16){case 32767:break;default:break a}if((h|0)==0&(i&2147483647|0)==0){b[t>>1]=b[s>>1]|0;b[t+2>>1]=b[s+2>>1]|0;b[t+4>>1]=b[s+4>>1]|0;u=e;c[u>>2]=0;c[u+4>>2]=-2147483648;b[e+8>>1]=32767;l=v;return};b[m>>1]=b[s>>1]|0;b[m+2>>1]=b[s+2>>1]|0;b[m+4>>1]=b[s+4>>1]|0;if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&(((h|0)!=0|(i&1073741823|0)!=0)&n<<16>>16==32767)){u=g+2|0;a[u>>0]=a[u>>0]|1};b[s>>1]=b[m>>1]|0;b[s+2>>1]=b[m+2>>1]|0;b[s+4>>1]=b[m+4>>1]|0;u=f;c[u>>2]=h;c[u+4>>2]=i;b[r>>1]=o;b[t>>1]=b[s>>1]|0;b[t+2>>1]=b[s+2>>1]|0;b[t+4>>1]=b[s+4>>1]|0;u=e;c[u>>2]=h;c[u+4>>2]=i;b[e+8>>1]=o;e=e+10|0;b[e>>1]=b[s>>1]|0;b[e+2>>1]=b[s+2>>1]|0;b[e+4>>1]=b[s+4>>1]|0;l=v;return}while(0);if((q|0)==13){a[k>>0]=j|2;o=i>>>0<1|(i|0)==1&h>>>0<0;j=o?h:i;p=j>>>0<65536;j=p?j<<16:j;p=p?16:0;q=j>>>0<16777216;j=((o?32:0)|(q?p|8:p)&255)+(d[10416+((q?j<<8:j)>>>24)>>0]|0)<<24>>24;h=Jl(h|0,i|0,j|0)|0;j=1-j|0;i=y}c[f>>2]=h;c[f+4>>2]=i;b[r>>1]=u|16383;b[t>>1]=b[s>>1]|0;b[t+2>>1]=b[s+2>>1]|0;b[t+4>>1]=b[s+4>>1]|0;h=j+-16383|0;if(!h){h=0;i=0;j=0}else{u=h>>>31;i=(u|0)==0?h:16383-j|0;h=i>>>0<65536;f=h?i<<16:i;h=h?16:0;j=f>>>0<16777216;h=((d[10416+((j?f<<8:f)>>>24)>>0]|0)+((j?h|8:h)&255)<<24)+536870912>>24;i=Jl(i|0,0,h|0)|0;h=(u<<15|16446)-h&65535;j=y}u=e;c[u>>2]=i;c[u+4>>2]=j;b[e+8>>1]=h;l=v;return}function Fi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;B=l;l=l+16|0;v=B+6|0;u=B;x=b[f+8>>1]|0;p=x&32767;q=p<<16>>16==0;if(!(!q?(c[f+4>>2]|0)>=0:0))z=3;if((z|0)==3?(w=b[g+8>>1]|0,s=w&32767,r=s<<16>>16==0,i=g,j=c[i>>2]|0,i=c[i+4>>2]|0,r|(i|0)<0):0){m=f;n=c[m>>2]|0;m=c[m+4>>2]|0;k=p&65535;t=(x&65535)>>>15&255;o=s&65535;A=(w&65535)>>>15&255;if(p<<16>>16==32767){o=m&2147483647;do if((n|0)==0&(o|0)==0){if(s<<16>>16==32767){k=i&2147483647;if(!((j|0)==0&(k|0)==0)){p=j;break}if(A<<24>>24){h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=B;return}}else if(r&((j|0)!=0|(i|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|2};c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}else{p=j;k=i&2147483647}while(0);q=g+10|0;b[v>>1]=b[q>>1]|0;b[v+2>>1]=b[q+2>>1]|0;b[v+4>>1]=b[q+4>>1]|0;q=f+10|0;b[u>>1]=b[q>>1]|0;b[u+2>>1]=b[q+2>>1]|0;b[u+4>>1]=b[q+4>>1]|0;q=(n|0)==0&(o|0)==0;r=(n|0)==(n|0)&(m|0)==(m&-1073741825|0)&((n|0)!=0|(m&1073741823|0)!=0);o=s<<16>>16==32767;p=o&((p|0)!=0|(k|0)!=0);o=(j|0)==(j|0)&(i|0)==(i&-1073741825|0)&(o&((j|0)!=0|(i&1073741823|0)!=0));k=m|-1073741824;i=i|-1073741824;if(r|o){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(r)if(!o)if(p){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else z=20;else{if(q){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(p&(o^1))z=20;else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0}}while(0);do if((z|0)==20){if(k>>>0<i>>>0|(k|0)==(i|0)&n>>>0<j>>>0){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(i>>>0<k>>>0|(i|0)==(k|0)&j>>>0<n>>>0){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}if((x&65535)<(w&65535)){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else{h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}while(0);l=B;return}if(s<<16>>16==32767){if(!((j|0)==0&(i&2147483647|0)==0)){f=g+10|0;b[v>>1]=b[f>>1]|0;b[v+2>>1]=b[f+2>>1]|0;b[v+4>>1]=b[f+4>>1]|0;if((j|0)==(j|0)&(i|0)==(i&-1073741825|0)&((j|0)!=0|(i&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=j;c[h+4>>2]=i|-1073741824;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;l=B;return}if((n|p&65535|0)==0&(m|0)==0)if(!(A<<24>>24)){h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=B;return}else{c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}if(q&((n|0)!=0|(m|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|2}if(!(A<<24>>24)){h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=x|32767;l=B;return}else{h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=x&-32768;l=B;return}}do if(q){if(r&((j|0)!=0|(i|0)!=0)){z=h+2|0;a[z>>0]=a[z>>0]|2}if((n|0)==0&(m|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}w=h+2|0;a[w>>0]=a[w>>0]|2;w=m>>>0<1|(m|0)==1&n>>>0<0;k=w?n:m;x=k>>>0<65536;k=x?k<<16:k;x=x?16:0;z=k>>>0<16777216;k=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?k<<8:k)>>>24)>>0]|0)<<24>>24;n=Jl(n|0,m|0,k|0)|0;m=y;k=1-k|0;if((s&65535)<16383){z=(n|0)==0&(m|0)==0?k+-64|0:k;w=m>>>0<1|(m|0)==1&n>>>0<0;f=w?n:m;x=f>>>0<65536;f=x?f<<16:f;x=x?16:0;A=f>>>0<16777216;f=((w?32:0)|(A?x|8:x)&255)+(d[10416+((A?f<<8:f)>>>24)>>0]|0)|0;A=f<<24>>24;f=Jl(n|0,m|0,((f&255)<<24>>24==0?0:A)|0)|0;oi(e,80,t,z-A|0,f,y,0,0,h);l=B;return}}else if(r){if(!((j|0)==0&(i|0)==0)){w=h+2|0;a[w>>0]=a[w>>0]|2;w=i>>>0<1|(i|0)==1&j>>>0<0;o=w?j:i;x=o>>>0<65536;o=x?o<<16:o;x=x?16:0;z=o>>>0<16777216;o=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?o<<8:o)>>>24)>>0]|0)<<24>>24;j=Jl(j|0,i|0,o|0)|0;o=1-o|0;i=y;break};c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}while(0);if((o|0)>16398){oi(e,80,t,A<<24>>24==0?32767:-16383,n,m,0,0,h);l=B;return}if((o|0)<16383){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}else{f=Il(j|0,i|0,16446-o|0)|0;oi(e,80,t,(A<<24>>24==0?f:0-f|0)+k|0,n,m,0,0,h);l=B;return}}h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=B;return}function Gi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;l=b[e+8>>1]|0;p=l&32767;j=e;k=c[j>>2]|0;j=c[j+4>>2]|0;do if(p<<16>>16)if((j|0)<0)if(p<<16>>16==32767)if((k|0)==0&(j&2147483647|0)==0){n=4-((l&65535)>>>15&65535)|0;break}else{n=Il(k|0,j|0,62)|0;n=(n&1)+1|0;break}else n=6;else n=1;else n=(k|0)==0&(j|0)==0?0:5;while(0);e=b[f+8>>1]|0;r=e&32767;i=c[f>>2]|0;f=c[f+4>>2]|0;do if(r<<16>>16){if((f|0)<0)if(r<<16>>16==32767)if((i|0)==0&(f&2147483647|0)==0){o=4-((e&65535)>>>15&65535)|0;t=15;break}else{o=Il(i|0,f|0,62)|0;o=(o&1)+1|0;t=15;break}else{o=6;t=15}}else{o=(i|0)==0&(f|0)==0?0:5;t=15}while(0);if((t|0)==15?!((n|0)==1|(o|0)==1):0){if((n|0)==2|(o|0)==2){if(g|0){t=2;return t|0}t=h+2|0;a[t>>0]=a[t>>0]|1;t=2;return t|0}m=(n|0)==5;q=(o|0)==5;if(m|q){h=h+2|0;a[h>>0]=a[h>>0]|2}l=(l&65535)>>>15&255;g=(e&65535)>>>15&255;e=(o|0)==0;if(!n)return (e?0:g<<24>>24==0?-1:1)|0;if(!(l<<24>>24==g<<24>>24&(e^1))){t=l<<24>>24==0?1:-1;return t|0}if(m){n=j>>>0<1|(j|0)==1&k>>>0<0;h=n?k:j;o=h>>>0<65536;h=o?h<<16:h;o=o?16:0;p=h>>>0<16777216;h=((n?32:0)|(p?o|8:o)&255)+(d[10416+((p?h<<8:h)>>>24)>>0]|0)<<24>>24;k=Jl(k|0,j|0,h|0)|0;h=1-h|0;j=y}else h=p&65535;if(q){p=f>>>0<1|(f|0)==1&i>>>0<0;g=p?i:f;q=g>>>0<65536;g=q?g<<16:g;q=q?16:0;r=g>>>0<16777216;g=((p?32:0)|(r?q|8:q)&255)+(d[10416+((r?g<<8:g)>>>24)>>0]|0)<<24>>24;i=Jl(i|0,f|0,g|0)|0;g=1-g|0;f=y}else g=r&65535;e=(h|0)==(g|0);if((k|0)==(i|0)&(j|0)==(f|0)&e){t=0;return t|0}do if(!(l<<24>>24))if((h|0)>=(g|0))if(e){s=j>>>0<f>>>0|(j|0)==(f|0)&k>>>0<i>>>0;t=36;break}else break;else{t=-1;return t|0}else if((g|0)>=(h|0))if(e){s=f>>>0<j>>>0|(f|0)==(j|0)&i>>>0<k>>>0;t=36;break}else break;else{t=-1;return t|0}while(0);if((t|0)==36?s:0){t=-1;return t|0}t=1;return t|0}t=h+2|0;a[t>>0]=a[t>>0]|1;t=2;return t|0}function Hi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+144|0;o=v+128|0;n=v+112|0;q=v+80|0;r=v+64|0;s=v+48|0;t=v+32|0;u=v+16|0;p=v;i=v+96|0;c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];zi(i,n,o,g);c[p>>2]=c[i>>2];c[p+4>>2]=c[i+4>>2];c[p+8>>2]=c[i+8>>2];c[p+12>>2]=c[i+12>>2];i=f+-1|0;k=e+(i<<4)|0;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];c[s+8>>2]=c[k+8>>2];c[s+12>>2]=c[k+12>>2];k=r+8|0;m=q+8|0;do{c[n>>2]=c[s>>2];c[n+4>>2]=c[s+4>>2];c[n+8>>2]=c[s+8>>2];c[n+12>>2]=c[s+12>>2];c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];zi(t,n,o,g);c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];j=i;i=i+-1|0;d=q;f=e+(i<<4)|0;h=d+16|0;do{a[d>>0]=a[f>>0]|0;d=d+1|0;f=f+1|0}while((d|0)<(h|0));c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];d=k;d=Il(c[d>>2]|0,c[d+4>>2]|0,63)|0;d=d&255;h=m;h=Il(c[h>>2]|0,c[h+4>>2]|0,63)|0;if(d<<24>>24==(h&255)<<24>>24){c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];vi(u,n,o,d,g)}else{c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];wi(u,n,o,d,g)};c[s>>2]=c[u>>2];c[s+4>>2]=c[u+4>>2];c[s+8>>2]=c[u+8>>2];c[s+12>>2]=c[u+12>>2]}while((j|0)>1);c[b>>2]=c[s>>2];c[b+4>>2]=c[s+4>>2];c[b+8>>2]=c[s+8>>2];c[b+12>>2]=c[s+12>>2];l=v;return}function Ii(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;E=l;l=l+192|0;t=E+176|0;s=E+160|0;w=E+128|0;x=E+112|0;z=E+96|0;A=E+80|0;B=E+64|0;C=E+48|0;D=E+32|0;u=E+16|0;v=E;k=E+144|0;o=b[f+8>>1]|0;m=o&32767;h=f;i=c[h>>2]|0;h=c[h+4>>2]|0;if(!(m<<16>>16==0|(h|0)<0)){g=g+2|0;a[g>>0]=a[g>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=E;return}j=m&65535;n=(o&65535)>>>15;q=n&255;p=o&32767;a:do if(p<<16>>16>=32767){switch(p<<16>>16){case 32767:break;default:{r=15;break a}}if(!((i|0)==0&(h&2147483647|0)==0)){D=f+10|0;b[t>>1]=b[D>>1]|0;b[t+2>>1]=b[D+2>>1]|0;b[t+4>>1]=b[D+4>>1]|0;if((i|0)==(i|0)&(h|0)==(h&-1073741825|0)&(m<<16>>16==32767&((i|0)!=0|(h&1073741823|0)!=0))){g=g+2|0;a[g>>0]=a[g>>0]|1}g=e;c[g>>2]=i;c[g+4>>2]=h;b[e+8>>1]=o;g=e+10|0;b[g>>1]=b[t>>1]|0;b[g+2>>1]=b[t+2>>1]|0;b[g+4>>1]=b[t+4>>1]|0;l=E;return}if(!(q<<24>>24)){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=E;return}else{c[e>>2]=c[3600];c[e+4>>2]=c[3601];c[e+8>>2]=c[3602];c[e+12>>2]=c[3603];l=E;return}}else{switch(p<<16>>16){case 0:break;default:{r=15;break a}}if(!((i|0)==0&(h|0)==0)){B=g+2|0;a[B>>0]=a[B>>0]|34;B=h>>>0<1|(h|0)==1&i>>>0<0;j=B?i:h;C=j>>>0<65536;j=C?j<<16:j;C=C?16:0;D=j>>>0<16777216;j=((B?32:0)|(D?C|8:C)&255)+(d[10416+((D?j<<8:j)>>>24)>>0]|0)<<24>>24;i=Jl(i|0,h|0,j|0)|0;j=1-j|0;h=y;break};c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=E;return}while(0);if((r|0)==15){r=g+2|0;a[r>>0]=a[r>>0]|32;if((m&65535)>=16383)if(o<<16>>16==-16385&((i|0)==0&(h&2147483647|0)==0)){c[e>>2]=c[3608];c[e+4>>2]=c[3609];c[e+8>>2]=c[3610];c[e+12>>2]=c[3611];l=E;return}else{c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=E;return}if((m&65535)>=16315){F=Jl(i|0,h|0,49)|0;o=y;r=Il(i|0,h|0,15)|0;f=y&65535;q=Jl(n&65535|0,0,63)|0;h=y;p=Jl(m&65535|0,0,48)|0;j=v;c[j>>2]=F;c[j+4>>2]=o;j=v+8|0;c[j>>2]=p|q|r;c[j+4>>2]=y|h|f;c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[t>>2]=c[3604];c[t+4>>2]=c[3605];c[t+8>>2]=c[3606];c[t+12>>2]=c[3607];zi(k,s,t,g);c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[u>>2]=c[k>>2];c[u+4>>2]=c[k+4>>2];c[u+8>>2]=c[k+8>>2];c[u+12>>2]=c[k+12>>2];c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];c[C+8>>2]=c[k+8>>2];c[C+12>>2]=c[k+12>>2];c[z>>2]=c[2740];c[z+4>>2]=c[2741];c[z+8>>2]=c[2742];c[z+12>>2]=c[2743];j=x+8|0;f=w+8|0;h=14;do{c[s>>2]=c[z>>2];c[s+4>>2]=c[z+4>>2];c[s+8>>2]=c[z+8>>2];c[s+12>>2]=c[z+12>>2];c[t>>2]=c[C>>2];c[t+4>>2]=c[C+4>>2];c[t+8>>2]=c[C+8>>2];c[t+12>>2]=c[C+12>>2];zi(A,s,t,g);c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=h;h=h+-1|0;k=10736+(h<<4)|0;c[w>>2]=c[k>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[w+12>>2]=c[k+12>>2];c[x>>2]=c[A>>2];c[x+4>>2]=c[A+4>>2];c[x+8>>2]=c[A+8>>2];c[x+12>>2]=c[A+12>>2];k=j;k=Il(c[k>>2]|0,c[k+4>>2]|0,63)|0;k=k&255;F=f;F=Il(c[F>>2]|0,c[F+4>>2]|0,63)|0;if(k<<24>>24==(F&255)<<24>>24){c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];vi(B,s,t,k,g)}else{c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];wi(B,s,t,k,g)};c[z>>2]=c[B>>2];c[z+4>>2]=c[B+4>>2];c[z+8>>2]=c[B+8>>2];c[z+12>>2]=c[B+12>>2]}while(i>>>0>1);c[D>>2]=c[z>>2];c[D+4>>2]=c[z+4>>2];c[D+8>>2]=c[z+8>>2];c[D+12>>2]=c[z+12>>2];c[s>>2]=c[D>>2];c[s+4>>2]=c[D+4>>2];c[s+8>>2]=c[D+8>>2];c[s+12>>2]=c[D+12>>2];c[t>>2]=c[u>>2];c[t+4>>2]=c[u+4>>2];c[t+8>>2]=c[u+8>>2];c[t+12>>2]=c[u+12>>2];zi(v,s,t,g);c[t>>2]=c[v>>2];c[t+4>>2]=c[v+4>>2];c[t+8>>2]=c[v+8>>2];c[t+12>>2]=c[v+12>>2];ti(e,t,g);l=E;return}}Dl(i|0,0,-1073741824,0)|0;C=y;F=Dl(h|0,0,-1073741824,0)|0;w=y;D=Dl(i|0,0,-774932053,0)|0;A=y;t=Dl(h|0,0,-774932053,0)|0;x=y;v=Dl(i|0,0,-1317922825,0)|0;u=y;B=Dl(h|0,0,-1317922825,0)|0;z=y;x=xl(t|0,x|0,v|0,u|0)|0;t=y;z=xl(t|0,(t>>>0<u>>>0|(t|0)==(u|0)&x>>>0<v>>>0)&1|0,B|0,z|0)|0;B=y;A=xl(0,x|0,D|0,A|0)|0;D=y;x=xl(z|0,B|0,(D>>>0<x>>>0|(D|0)==(x|0)&A>>>0<0)&1|0,0)|0;B=y;w=xl(C|0,0,F|0,w|0)|0;w=xl(w|0,y|0,A|0,D|0)|0;F=y;A=xl(x|0,B|0,(F>>>0<D>>>0|(F|0)==(D|0)&w>>>0<A>>>0)&1|0,0)|0;D=y;B=(D|0)>0|(D|0)==0&A>>>0>0;x=Jl(A|0,D|0,1)|0;C=y;z=Il(w|0,F|0,63)|0;C=C|y;F=Jl(w|0,F|0,B&1|0)|0;oi(e,80,q,j+(B<<31>>31)|0,B?x|z:A,B?C:D,F,y,g);l=E;return}function Ji(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;O=l;l=l+240|0;M=O+224|0;L=O+208|0;G=O+32|0;z=O+16|0;A=O;r=O+192|0;s=O+176|0;H=O+160|0;v=O+144|0;x=O+128|0;B=O+112|0;C=O+96|0;D=O+80|0;E=O+64|0;F=O+48|0;t=b[f+8>>1]|0;i=t&32767;q=i<<16>>16==0;if(!(!q?(c[f+4>>2]|0)>=0:0))K=3;if((K|0)==3?(N=b[g+8>>1]|0,j=N&32767,m=j<<16>>16==0,o=g,p=c[o>>2]|0,o=c[o+4>>2]|0,m|(o|0)<0):0){u=f;w=c[u>>2]|0;u=c[u+4>>2]|0;k=i&65535;I=(t&65535)>>>15&255;n=j&65535;J=(N&65535)>>>15&255;if(j<<16>>16==32767){if(!((p|0)==0&(o&2147483647|0)==0)){n=g+10|0;b[M>>1]=b[n>>1]|0;b[M+2>>1]=b[n+2>>1]|0;b[M+4>>1]=b[n+4>>1]|0;n=f+10|0;b[L>>1]=b[n>>1]|0;b[L+2>>1]=b[n+2>>1]|0;b[L+4>>1]=b[n+4>>1]|0;n=i<<16>>16==32767;k=n&((w|0)!=0|(u&2147483647|0)!=0);n=(w|0)==(w|0)&(u|0)==(u&-1073741825|0)&(n&((w|0)!=0|(u&1073741823|0)!=0));g=(p|0)!=0|(o&1073741823|0)!=0;j=(p|0)==(p|0)&(o|0)==(o&-1073741825|0);m=j&g;i=u|-1073741824;f=o|-1073741824;if(n|m){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(n)if(m)K=15;else{h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0}else{if(!k){h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}if(j&g){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0}else K=15}while(0);do if((K|0)==15){if(i>>>0<f>>>0|(i|0)==(f|0)&w>>>0<p>>>0){h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}if(f>>>0<i>>>0|(f|0)==(i|0)&p>>>0<w>>>0){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}if((t&65535)<(N&65535)){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}else{h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}}while(0);l=O;return}if(i<<16>>16!=32767){if(q&((w|0)!=0|(u|0)!=0)){M=h+2|0;a[M>>0]=a[M>>0]|2}f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870;break}case 3:{K=h+2|0;a[K>>0]=a[K>>0]|32;K=61;break}default:{h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=61}}if((K|0)==61){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16383;l=O;return}if(!((w|0)==0&(u&2147483647|0)==0)){j=g+10|0;b[M>>1]=b[j>>1]|0;b[M+2>>1]=b[j+2>>1]|0;b[M+4>>1]=b[j+4>>1]|0;j=f+10|0;b[L>>1]=b[j>>1]|0;b[L+2>>1]=b[j+2>>1]|0;b[L+4>>1]=b[j+4>>1]|0;j=(w|0)==(w|0)&(u|0)==(u&-1073741825|0)&((w|0)!=0|(u&1073741823|0)!=0);g=(p|0)==(p|0)&(o|0)==(o&-1073741825|0)&((p|0)!=0|(o&1073741823|0)!=0);i=u|-1073741824;f=o|-1073741824;if(j|g){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(j){if(!g){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}if(i>>>0<f>>>0|(i|0)==(f|0)&w>>>0<p>>>0){h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}if(f>>>0<i>>>0|(f|0)==(i|0)&p>>>0<w>>>0){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}if((t&65535)<(N&65535)){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}else{h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}}else{h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0}while(0);l=O;return}f=a[h+1>>0]|0;i=f<<24>>24==0;if(!(I<<24>>24)){do if(i){f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870}else{if(f<<24>>24!=3){h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870;break}}else{h=h+2|0;a[h>>0]=a[h>>0]|32}f=560513588;i=-921707870}while(0);h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16382;l=O;return}else{do if(i){f=h+2|0;a[f>>0]=a[f>>0]|32;f=-1727098456;i=-1765022727}else{if(f<<24>>24!=3){h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=-1727098456;i=-1765022727;break}}else{h=h+2|0;a[h>>0]=a[h>>0]|32}f=-1727098457;i=-1765022727}while(0);h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16384;l=O;return}}a:do if(i<<16>>16==32767){if((w|0)==0&(u&2147483647|0)==0){if(!(m&((p|0)!=0|(o|0)!=0)))break;M=h+2|0;a[M>>0]=a[M>>0]|2;break}f=f+10|0;b[M>>1]=b[f>>1]|0;b[M+2>>1]=b[f+2>>1]|0;b[M+4>>1]=b[f+4>>1]|0;f=u|-1073741824;if((w|0)==(w|0)&(u|0)==(u&-1073741825|0)&((w|0)!=0|(u&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1;h=e;c[h>>2]=w;c[h+4>>2]=f;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0}else{h=e;c[h>>2]=w;c[h+4>>2]=f;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0}l=O;return}else{do if(m){if(!((p|0)==0&(o|0)==0)){j=h+2|0;a[j>>0]=a[j>>0]|2;j=o>>>0<1|(o|0)==1&p>>>0<0;n=j?p:o;m=n>>>0<65536;n=m?n<<16:n;m=m?16:0;t=n>>>0<16777216;n=((j?32:0)|(t?m|8:m)&255)+(d[10416+((t?n<<8:n)>>>24)>>0]|0)<<24>>24;p=Jl(p|0,o|0,n|0)|0;n=1-n|0;o=y;break}if(!(q&((w|0)!=0|(u|0)!=0)))break a;M=h+2|0;a[M>>0]=a[M>>0]|2;break a}while(0);do if(q){if(!((w|0)==0&(u|0)==0)){m=h+2|0;f=a[m>>0]|2;a[m>>0]=f;t=u>>>0<1|(u|0)==1&w>>>0<0;k=t?w:u;g=k>>>0<65536;k=g?k<<16:k;g=g?16:0;j=k>>>0<16777216;k=((t?32:0)|(j?g|8:g)&255)+(d[10416+((j?k<<8:k)>>>24)>>0]|0)<<24>>24;j=Jl(w|0,u|0,k|0)|0;k=1-k|0;g=y;break}f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870;break}case 3:{K=h+2|0;a[K>>0]=a[K>>0]|32;K=91;break}default:{h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=91}}if((K|0)==91){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16383;l=O;return}else{f=h+2|0;m=f;f=a[f>>0]|0;j=w;g=u}while(0);i=f|32;a[m>>0]=i;f=(k|0)==(n|0);if((j|0)==(p|0)&(g|0)==(o|0)&f){f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{a[m>>0]=i;f=560513589;i=-921707870;break}case 3:{a[m>>0]=i;K=99;break}default:{a[m>>0]=i;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=99}}if((K|0)==99){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16382;l=O;return}xi(r,0,k+-16|0,j,g,0,0,h);xi(s,0,n+-16|0,p,o,0,0,h);if((k|0)>(n|0)|(g>>>0>o>>>0|(g|0)==(o|0)&j>>>0>p>>>0)&f){c[L>>2]=c[s>>2];c[L+4>>2]=c[s+4>>2];c[L+8>>2]=c[s+8>>2];c[L+12>>2]=c[s+12>>2];c[M>>2]=c[r>>2];c[M+4>>2]=c[r+4>>2];c[M+8>>2]=c[r+8>>2];c[M+12>>2]=c[r+12>>2];Ai(H,L,M,h);j=0}else{c[L>>2]=c[r>>2];c[L+4>>2]=c[r+4>>2];c[L+8>>2]=c[r+8>>2];c[L+12>>2]=c[r+12>>2];c[M>>2]=c[s>>2];c[M+4>>2]=c[s+4>>2];c[M+8>>2]=c[s+8>>2];c[M+12>>2]=c[s+12>>2];Ai(H,L,M,h);j=1}i=H+8|0;f=c[i>>2]|0;i=c[i+4>>2]|0;g=Il(f|0,i|0,48)|0;g=g&32767;if(g>>>0>=16344){do if(i>>>0>1073643519|(i|0)==1073643519&f>>>0>4294967295){c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];wi(z,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];vi(z,L,M,f,h)};c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];vi(A,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];wi(A,L,M,f,h)};c[L>>2]=c[z>>2];c[L+4>>2]=c[z+4>>2];c[L+8>>2]=c[z+8>>2];c[L+12>>2]=c[z+12>>2];c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];Ai(H,L,M,h);i=1;f=0;g=H}else{if(g>>>0<=16380){i=0;f=0;g=H;break};c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];c[M>>2]=c[3616];c[M+4>>2]=c[3617];c[M+8>>2]=c[3618];c[M+12>>2]=c[3619];zi(z,L,M,h);c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3616];c[M+4>>2]=c[3617];c[M+8>>2]=c[3618];c[M+12>>2]=c[3619];vi(A,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3616];c[M+4>>2]=c[3617];c[M+8>>2]=c[3618];c[M+12>>2]=c[3619];wi(A,L,M,f,h)};c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];wi(v,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];vi(v,L,M,f,h)};c[H>>2]=c[v>>2];c[H+4>>2]=c[v+4>>2];c[H+8>>2]=c[v+8>>2];c[H+12>>2]=c[v+12>>2];c[L>>2]=c[v>>2];c[L+4>>2]=c[v+4>>2];c[L+8>>2]=c[v+8>>2];c[L+12>>2]=c[v+12>>2];c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];Ai(H,L,M,h);i=0;f=1;g=H}while(0);c[A>>2]=c[g>>2];c[A+4>>2]=c[g+4>>2];c[A+8>>2]=c[g+8>>2];c[A+12>>2]=c[g+12>>2];c[z>>2]=c[g>>2];c[z+4>>2]=c[g+4>>2];c[z+8>>2]=c[g+8>>2];c[z+12>>2]=c[g+12>>2];c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];Hi(G,M,10976,11,h);c[L>>2]=c[z>>2];c[L+4>>2]=c[z+4>>2];c[L+8>>2]=c[z+8>>2];c[L+12>>2]=c[z+12>>2];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];zi(x,L,M,h);c[g>>2]=c[x>>2];c[g+4>>2]=c[x+4>>2];c[g+8>>2]=c[x+8>>2];c[g+12>>2]=c[x+12>>2];if(f){c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3620];c[M+4>>2]=c[3621];c[M+8>>2]=c[3622];c[M+12>>2]=c[3623];vi(B,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3620];c[M+4>>2]=c[3621];c[M+8>>2]=c[3622];c[M+12>>2]=c[3623];wi(B,L,M,f,h)};c[g>>2]=c[B>>2];c[g+4>>2]=c[B+4>>2];c[g+8>>2]=c[B+8>>2];c[g+12>>2]=c[B+12>>2]}if(i|0){c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3624];c[M+4>>2]=c[3625];c[M+8>>2]=c[3626];c[M+12>>2]=c[3627];vi(C,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3624];c[M+4>>2]=c[3625];c[M+8>>2]=c[3626];c[M+12>>2]=c[3627];wi(C,L,M,f,h)};c[g>>2]=c[C>>2];c[g+4>>2]=c[C+4>>2];c[g+8>>2]=c[C+8>>2];c[g+12>>2]=c[C+12>>2]}}if(j|0){c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];N=G+8|0;K=c[N+4>>2]|0;if((K|0)>-1|(K|0)==-1&(c[N>>2]|0)>>>0>4294967295){c[L>>2]=c[3628];c[L+4>>2]=c[3629];c[L+8>>2]=c[3630];c[L+12>>2]=c[3631];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];wi(D,L,M,0,h)}else{c[L>>2]=c[3628];c[L+4>>2]=c[3629];c[L+8>>2]=c[3630];c[L+12>>2]=c[3631];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];vi(D,L,M,0,h)};c[H>>2]=c[D>>2];c[H+4>>2]=c[D+4>>2];c[H+8>>2]=c[D+8>>2];c[H+12>>2]=c[D+12>>2]}if(I<<24>>24){c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];N=G+8|0;K=c[N+4>>2]|0;if((K|0)>-1|(K|0)==-1&(c[N>>2]|0)>>>0>4294967295){c[L>>2]=c[3632];c[L+4>>2]=c[3633];c[L+8>>2]=c[3634];c[L+12>>2]=c[3635];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];wi(E,L,M,0,h)}else{c[L>>2]=c[3632];c[L+4>>2]=c[3633];c[L+8>>2]=c[3634];c[L+12>>2]=c[3635];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];vi(E,L,M,0,h)};c[H>>2]=c[E>>2];c[H+4>>2]=c[E+4>>2];c[H+8>>2]=c[E+8>>2];c[H+12>>2]=c[E+12>>2]};c[M>>2]=c[H>>2];c[M+4>>2]=c[H+4>>2];c[M+8>>2]=c[H+8>>2];c[M+12>>2]=c[H+12>>2];ti(F,M,h);if(J<<24>>24){h=F+8|0;b[h>>1]=b[h>>1]^-32768};c[e>>2]=c[F>>2];c[e+4>>2]=c[F+4>>2];c[e+8>>2]=c[F+8>>2];c[e+12>>2]=c[F+12>>2];l=O;return}while(0);if(!(I<<24>>24)){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=N&-32768;l=O;return}f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870;break}case 3:{K=h+2|0;a[K>>0]=a[K>>0]|32;K=76;break}default:{h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=76}}if((K|0)==76){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16384;l=O;return}h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=O;return}function Ki(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+32|0;h=g+16|0;i=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];f=Li(i,h,d,e,0,f)|0;l=g;return f|0}function Li(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;R=l;l=l+80|0;x=R+62|0;v=R+56|0;Q=R+24|0;O=R+16|0;o=R+50|0;r=R+44|0;s=R+38|0;w=R+32|0;P=R;n=h;c[n>>2]=0;c[n+4>>2]=0;n=b[e+8>>1]|0;p=n&32767;t=p<<16>>16==0;if(!(!t?(c[e+4>>2]|0)>=0:0))M=3;if((M|0)==3?(z=b[f+8>>1]|0,u=z&32767,C=f,m=c[C>>2]|0,C=c[C+4>>2]|0,u<<16>>16==0|(C|0)<0):0){N=e;L=c[N>>2]|0;N=c[N+4>>2]|0;q=Q;c[q>>2]=L;c[q+4>>2]=N;q=p&65535;G=(n&65535)>>>15;k=G&65535;if(p<<16>>16==32767){p=N&2147483647;if((L|0)==0&(p|0)==0){k=C&2147483647;if(u<<16>>16!=32767|(m|0)==0&(k|0)==0){j=j+2|0;a[j>>0]=a[j>>0]|1;c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];g=-1;l=R;return g|0}else q=m}else{q=m;k=C&2147483647}s=f+10|0;b[x>>1]=b[s>>1]|0;b[x+2>>1]=b[s+2>>1]|0;b[x+4>>1]=b[s+4>>1]|0;s=e+10|0;b[v>>1]=b[s>>1]|0;b[v+2>>1]=b[s+2>>1]|0;b[v+4>>1]=b[s+4>>1]|0;s=(L|0)==0&(p|0)==0;f=(L|0)==(L|0)&(N|0)==(N&-1073741825|0)&((L|0)!=0|(N&1073741823|0)!=0);p=u<<16>>16==32767;q=p&((q|0)!=0|(k|0)!=0);p=(m|0)==(m|0)&(C|0)==(C&-1073741825|0)&(p&((m|0)!=0|(C&1073741823|0)!=0));k=N|-1073741824;r=C|-1073741824;if(f|p){j=j+2|0;a[j>>0]=a[j>>0]|1}do if(f)if(!p)if(q){b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}else{b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L;break}else M=19;else{if(s){b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}if(q&(p^1))M=19;else{b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L}}while(0);do if((M|0)==19){if(k>>>0<r>>>0|(k|0)==(r|0)&L>>>0<m>>>0){b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}if(r>>>0<k>>>0|(r|0)==(k|0)&m>>>0<L>>>0){b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L;break}if((n&65535)<(z&65535)){b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L;break}else{b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}}while(0);j=g;c[j>>2]=m;c[j+4>>2]=k;b[g+8>>1]=n;g=g+10|0;b[g>>1]=b[o>>1]|0;b[g+2>>1]=b[o+2>>1]|0;b[g+4>>1]=b[o+4>>1]|0;g=-1;l=R;return g|0}o=u&65535;p=z&32767;a:do if(p<<16>>16>=32767){switch(p<<16>>16){case 32767:break;default:{f=o;s=C;break a}}if(!((m|0)==0&(C&2147483647|0)==0)){Q=f+10|0;b[x>>1]=b[Q>>1]|0;b[x+2>>1]=b[Q+2>>1]|0;b[x+4>>1]=b[Q+4>>1]|0;if((m|0)==(m|0)&(C|0)==(C&-1073741825|0)&(u<<16>>16==32767&((m|0)!=0|(C&1073741823|0)!=0))){j=j+2|0;a[j>>0]=a[j>>0]|1};b[r>>1]=b[x>>1]|0;b[r+2>>1]=b[x+2>>1]|0;b[r+4>>1]=b[x+4>>1]|0;j=g;c[j>>2]=m;c[j+4>>2]=C|-1073741824;b[g+8>>1]=z;g=g+10|0;b[g>>1]=b[r>>1]|0;b[g+2>>1]=b[r+2>>1]|0;b[g+4>>1]=b[r+4>>1]|0;g=-1;l=R;return g|0}if(!(t&((L|0)!=0|(N|0)!=0))){c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}j=j+2|0;a[j>>0]=a[j>>0]|2;j=N>>>0<1|(N|0)==1&L>>>0<0;o=j?L:N;m=o>>>0<65536;o=m?o<<16:o;m=m?16:0;k=o>>>0<16777216;o=((j?32:0)|(k?m|8:m)&255)+(d[10416+((k?o<<8:o)>>>24)>>0]|0)<<24>>24;k=Jl(L|0,N|0,o|0)|0;m=y;j=Q;c[j>>2]=k;c[j+4>>2]=m;if((N|0)<0){j=g;c[j>>2]=k;c[j+4>>2]=m;b[g+8>>1]=((n&-32768|1)&65535)-o;g=g+10|0;b[g>>1]=b[s>>1]|0;b[g+2>>1]=b[s+2>>1]|0;b[g+4>>1]=b[s+4>>1]|0;g=0;l=R;return g|0}else{c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}}else{switch(p<<16>>16){case 0:break;default:{f=o;s=C;break a}}o=j+2|0;p=a[o>>0]|0;if(!((m|0)==0&(C|0)==0)){a[o>>0]=p|2;z=C>>>0<1|(C|0)==1&m>>>0<0;f=z?m:C;M=f>>>0<65536;f=M?f<<16:f;M=M?16:0;s=f>>>0<16777216;f=((z?32:0)|(s?M|8:M)&255)+(d[10416+((s?f<<8:f)>>>24)>>0]|0)<<24>>24;m=Jl(m|0,C|0,f|0)|0;f=1-f|0;s=y;break}a[o>>0]=p|1;c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];g=-1;l=R;return g|0}while(0);do if(t){if(!((L|0)==0&(N|0)==0)){M=j+2|0;a[M>>0]=a[M>>0]|2;M=N>>>0<1|(N|0)==1&L>>>0<0;q=M?L:N;o=q>>>0<65536;q=o?q<<16:q;o=o?16:0;r=q>>>0<16777216;q=((M?32:0)|(r?o|8:o)&255)+(d[10416+((r?q<<8:q)>>>24)>>0]|0)<<24>>24;r=Jl(L|0,N|0,q|0)|0;o=y;M=Q;c[M>>2]=r;c[M+4>>2]=o;q=1-q|0;break};c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}else{r=L;o=N}while(0);p=q-f|0;M=O;c[M>>2]=0;c[M+4>>2]=0;do if((p|0)<=63){do if((p|0)<0){if((p|0)==-1){L=Jl(r|0,o|0,63)|0;N=y;n=Il(r|0,o|0,1)|0;o=y;M=O;c[M>>2]=L;c[M+4>>2]=N;M=Q;c[M>>2]=n;c[M+4>>2]=o;M=56;break}if((N|0)<0){j=g;c[j>>2]=r;c[j+4>>2]=o;b[g+8>>1]=q+(n&-32768&65535);g=g+10|0;b[g>>1]=b[w>>1]|0;b[g+2>>1]=b[w+2>>1]|0;b[g+4>>1]=b[w+4>>1]|0;g=0;l=R;return g|0}else{c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}}else if(!p){n=r;M=56}else{n=Mi(r,o,m,s,p,Q,O)|0;o=y;M=58}while(0);if((M|0)==56?!(o>>>0<s>>>0|(o|0)==(s|0)&n>>>0<m>>>0):0){o=yl(n|0,o|0,m|0,s|0)|0;n=Q;c[n>>2]=o;c[n+4>>2]=y;n=1;o=0;M=58}if((M|0)==58){N=h;c[N>>2]=n;c[N+4>>2]=o}if((i|0)==0?(D=Jl(m|0,s|0,63)|0,E=y,A=Il(m|0,s|0,1)|0,B=y,I=Q,H=c[I>>2]|0,I=c[I+4>>2]|0,K=O,J=c[K>>2]|0,K=c[K+4>>2]|0,F=(H|0)!=(A|0)|(I|0)!=(B|0),(I>>>0>B>>>0|(I|0)==(B|0)&H>>>0>=A>>>0)&(F|(K>>>0>E>>>0|(K|0)==(E|0)&J>>>0>=D>>>0))):0){p=B>>>0<I>>>0|(B|0)==(I|0)&A>>>0<H>>>0|(A|0)==(H|0)&(B|0)==(I|0)&(E>>>0<K>>>0|(E|0)==(K|0)&D>>>0<J>>>0);if(!(F|((J|0)!=(D|0)|(K|0)!=(E|0)))){n=h;o=c[n>>2]|0;if(!(p|((o&1|0)!=0|0!=0))){m=f;n=0;break}k=(G^1)&65535;M=xl(o|0,c[n+4>>2]|0,1,0)|0;N=h;c[N>>2]=M;c[N+4>>2]=y;if(!p){m=f;n=0;break}}else{if(!p){m=f;n=0;break}N=h;N=xl(c[N>>2]|0,c[N+4>>2]|0,1,0)|0;k=h;c[k>>2]=N;c[k+4>>2]=y;k=(G^1)&65535}n=yl(m|0,s|0,H|0,I|0)|0;N=((J|0)!=0|(K|0)!=0)<<31>>31;N=xl(n|0,y|0,N|0,((N|0)<0)<<31>>31|0)|0;n=y;M=yl(0,0,J|0,K|0)|0;m=O;c[m>>2]=M;c[m+4>>2]=y;m=Q;c[m>>2]=N;c[m+4>>2]=n;m=f;n=0}else{m=f;n=0}}else{n=p&31|32;Mi(r,o,m,s,n,Q,O)|0;m=q-n|0;n=1}while(0);G=k&255;M=Q;I=c[M>>2]|0;M=c[M+4>>2]|0;J=O;e=c[J>>2]|0;J=c[J+4>>2]|0;h=(I|0)==0&(M|0)==0;I=h?e:I;M=h?J:M;e=h?0:e;J=h?0:J;h=h?m+-64|0:m;Q=M>>>0<1|(M|0)==1&I>>>0<0;L=Q?I:M;O=L>>>0<65536;L=O?L<<16:L;O=O?16:0;H=L>>>0<16777216;L=((Q?32:0)|(H?O|8:O)&255)+(d[10416+((H?L<<8:L)>>>24)>>0]|0)|0;H=L<<24>>24;O=Jl(e|0,J|0,H|0)|0;Q=y;L=(L&255)<<24>>24==0;K=Jl(I|0,M|0,H|0)|0;N=y;J=Il(e|0,J|0,0-H&63|0)|0;oi(P,80,G,h-H|0,L?I:J|K,L?M:y|N,O,Q,j);c[g>>2]=c[P>>2];c[g+4>>2]=c[P+4>>2];c[g+8>>2]=c[P+8>>2];c[g+12>>2]=c[P+12>>2];g=n;l=R;return g|0}j=j+2|0;a[j>>0]=a[j>>0]|1;c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];g=-1;l=R;return g|0}function Mi(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;p=Jl(a|0,b|0,f|0)|0;q=y;o=(f|0)==0;n=Il(a|0,b|0,0-f&63|0)|0;n=o?0:n;o=o?0:y;if(o>>>0<e>>>0|(o|0)==(e|0)&n>>>0<d>>>0){if(e>>>0>o>>>0|(e|0)==(o|0)&0>n>>>0){j=Fl(n|0,o|0,e|0,0)|0;a=0}else{a=0;j=-1}i=Dl(j|0,0,d|0,0)|0;k=y;l=Dl(j|0,0,e|0,0)|0;m=y;b=yl(p|0,q|0,0,i|0)|0;f=y;i=(q>>>0<i>>>0|(q|0)==(i|0)&p>>>0<0)<<31>>31;m=yl(n|0,o|0,l|0,m|0)|0;k=yl(m|0,y|0,k|0,0)|0;i=xl(k|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;k=y;if((k|0)<0)while(1){a=xl(a|0,j|0,0,-1)|0;j=y;l=xl(b|0,f|0,0,d|0)|0;m=y;i=xl(i|0,k|0,e|0,0)|0;i=xl(i|0,y|0,(m>>>0<f>>>0|(m|0)==(f|0)&l>>>0<b>>>0)&1|0,0)|0;k=y;if((k|0)<0){b=l;f=m}else{b=m;f=a;break}}else{b=f;f=a}if(e>>>0>i>>>0|(e|0)==(i|0)&0>b>>>0){a=Fl(b|0,i|0,e|0,0)|0;b=y}else{a=-1;b=0}a=a|f;f=d;i=0;b=b|j}else{a=-1;f=d;i=0;b=-1}u=Dl(a|0,0,f|0,i|0)|0;t=y;j=Dl(b|0,0,f|0,i|0)|0;l=y;m=Dl(a|0,0,e|0,0)|0;k=y;s=Dl(b|0,0,e|0,0)|0;r=y;l=xl(j|0,l|0,m|0,k|0)|0;j=y;f=xl(0,l|0,u|0,t|0)|0;t=y;u=yl(p|0,q|0,f|0,t|0)|0;i=g;c[i>>2]=u;c[i+4>>2]=y;i=(t>>>0<l>>>0|(t|0)==(l|0)&f>>>0<0)<<31>>31;f=(q>>>0<t>>>0|(q|0)==(t|0)&p>>>0<f>>>0)<<31>>31;q=yl(n|0,o|0,s|0,r|0)|0;q=yl(q|0,y|0,j|0,(j>>>0<k>>>0|(j|0)==(k|0)&l>>>0<m>>>0)&1|0)|0;i=xl(q|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;f=xl(i|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;i=y;q=h;c[q>>2]=f;c[q+4>>2]=i;if((i|0)>=0){t=b;u=a;y=t;return u|0}do{a=xl(a|0,b|0,-1,-1)|0;b=y;s=g;u=c[s>>2]|0;s=c[s+4>>2]|0;t=xl(u|0,s|0,d|0,e|0)|0;r=y;q=g;c[q>>2]=t;c[q+4>>2]=r;f=xl(f|0,i|0,(r>>>0<s>>>0|(r|0)==(s|0)&t>>>0<u>>>0)&1|0,0)|0;i=y;u=h;c[u>>2]=f;c[u+4>>2]=i}while((i|0)<0);y=b;return a|0}function Ni(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+32|0;h=g+16|0;i=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];f=Li(i,h,d,e,3,f)|0;l=g;return f|0}function Oi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+176|0;E=H+144|0;D=H+128|0;A=H+64|0;B=H+48|0;C=H+32|0;G=H+16|0;s=H+8|0;t=H;w=H+160|0;j=H+170|0;q=H+164|0;z=H+112|0;x=H+96|0;F=H+80|0;r=t;c[r>>2]=0;c[r+4>>2]=0;r=e+8|0;u=b[r>>1]|0;k=u&32767;i=e;m=c[i>>2]|0;i=c[i+4>>2]|0;a:do if(k<<16>>16==0|(i|0)<0){n=s;c[n>>2]=m;c[n+4>>2]=i;n=k&65535;v=(u&65535)>>>15;p=v&65535;o=u&32767;b:do if(o<<16>>16<32767){switch(o<<16>>16){case 0:break;default:break b}if((m|0)==0&(i|0)==0){c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2];if(f|0){c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2]}if(g|0){c[g>>2]=c[3636];c[g+4>>2]=c[3637];c[g+8>>2]=c[3638];c[g+12>>2]=c[3639]}G=0;l=H;return G|0}j=h+2|0;k=a[j>>0]|0;a[j>>0]=k|2;if((i|0)<0){n=i>>>0<65536;k=Jl(i|0,0,16)|0;k=n?k:i;n=n?16:0;o=k>>>0<16777216;n=(d[10416+((o?k<<8:k)>>>24)>>0]|0)+((o?n|8:n)&255)<<24>>24;m=Jl(m|0,i|0,n|0)|0;i=y;o=s;c[o>>2]=m;c[o+4>>2]=i;n=1-n|0;break}a[j>>0]=k|34;if(!f){c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2]}else{a[j>>0]=k|50;c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2];c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2]}if(g|0){c[g>>2]=c[3636];c[g+4>>2]=c[3637];c[g+8>>2]=c[3638];c[g+12>>2]=c[3639]}G=0;l=H;return G|0}else{switch(o<<16>>16){case 32767:break;default:break b}if((m|0)==0&(i&2147483647|0)==0)break a;G=e+10|0;b[E>>1]=b[G>>1]|0;b[E+2>>1]=b[G+2>>1]|0;b[E+4>>1]=b[G+4>>1]|0;if((m|0)==(m|0)&(i|0)==(i&-1073741825|0)&(k<<16>>16==32767&((m|0)!=0|(i&1073741823|0)!=0))){G=h+2|0;a[G>>0]=a[G>>0]|1};b[j>>1]=b[E>>1]|0;b[j+2>>1]=b[E+2>>1]|0;b[j+4>>1]=b[E+4>>1]|0;b[E>>1]=b[j>>1]|0;b[E+2>>1]=b[j+2>>1]|0;b[E+4>>1]=b[j+4>>1]|0;if(f|0){G=f;c[G>>2]=m;c[G+4>>2]=i;b[f+8>>1]=u;G=f+10|0;b[G>>1]=b[E>>1]|0;b[G+2>>1]=b[E+2>>1]|0;b[G+4>>1]=b[E+4>>1]|0}if(g|0){G=g;c[G>>2]=m;c[G+4>>2]=i;b[g+8>>1]=u;G=g+10|0;b[G>>1]=b[E>>1]|0;b[G+2>>1]=b[E+2>>1]|0;b[G+4>>1]=b[E+4>>1]|0}G=0;l=H;return G|0}while(0);c[w>>2]=p;j=n+-16383|0;if((n|0)>16445){G=-1;l=H;return G|0}p=h+2|0;a[p>>0]=a[p>>0]|32;do if((n|0)<16382){if((n|0)>=16316){o=0;n=n+-16|0;j=0;k=0;break}G=e;c[G>>2]=m;c[G+4>>2]=i;b[r>>1]=n+(u&-32768&65535);G=e+10|0;b[G>>1]=b[q>>1]|0;b[G+2>>1]=b[q+2>>1]|0;b[G+4>>1]=b[q+4>>1]|0;c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2];if(f|0){c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2]}if(g|0){c[g>>2]=c[3636];c[g+4>>2]=c[3637];c[g+8>>2]=c[3638];c[g+12>>2]=c[3639]}G=0;l=H;return G|0}else{o=Pi(j,w,s,t)|0;i=s;k=t;n=16367;m=c[i>>2]|0;i=c[i+4>>2]|0;j=c[k>>2]|0;k=c[k+4>>2]|0}while(0);xi(z,0,n,m,i,j,k,h);j=v<<16>>16==0?o:0-o|0;if(f|0){i=c[w>>2]|0;c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];if((j&1|0)==0&0==0){c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(A,E,11328,11,h);c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];c[E>>2]=c[A>>2];c[E+4>>2]=c[A+4>>2];c[E+8>>2]=c[A+8>>2];c[E+12>>2]=c[A+12>>2];zi(C,D,E,h);c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2]}else{c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(B,E,11152,11,h);c[G>>2]=c[B>>2];c[G+4>>2]=c[B+4>>2];c[G+8>>2]=c[B+8>>2];c[G+12>>2]=c[B+12>>2];i=0};c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];ti(D,E,h);if(((j&2|0)==0&0==0?i:(i|0)==0&1)|0){v=D+8|0;b[v>>1]=b[v>>1]^-32768};c[x>>2]=c[D>>2];c[x+4>>2]=c[D+4>>2];c[x+8>>2]=c[D+8>>2];c[x+12>>2]=c[D+12>>2];c[f>>2]=c[x>>2];c[f+4>>2]=c[x+4>>2];c[f+8>>2]=c[x+8>>2];c[f+12>>2]=c[x+12>>2]}if(!g){G=0;l=H;return G|0}i=c[w>>2]|0;j=j+1|0;c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];if((j&1|0)==0&0==0){c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(A,E,11328,11,h);c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];c[E>>2]=c[A>>2];c[E+4>>2]=c[A+4>>2];c[E+8>>2]=c[A+8>>2];c[E+12>>2]=c[A+12>>2];zi(C,D,E,h);c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2]}else{c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(B,E,11152,11,h);c[G>>2]=c[B>>2];c[G+4>>2]=c[B+4>>2];c[G+8>>2]=c[B+8>>2];c[G+12>>2]=c[B+12>>2];i=0};c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];ti(D,E,h);if(((j&2|0)==0&0==0?i:(i|0)==0&1)|0){G=D+8|0;b[G>>1]=b[G>>1]^-32768};c[F>>2]=c[D>>2];c[F+4>>2]=c[D+4>>2];c[F+8>>2]=c[D+8>>2];c[F+12>>2]=c[D+12>>2];c[g>>2]=c[F>>2];c[g+4>>2]=c[F+4>>2];c[g+8>>2]=c[F+8>>2];c[g+12>>2]=c[F+12>>2];G=0;l=H;return G|0}while(0);G=h+2|0;a[G>>0]=a[G>>0]|1;if(f|0){c[f>>2]=c[3596];c[f+4>>2]=c[3597];c[f+8>>2]=c[3598];c[f+12>>2]=c[3599]}if(!g){G=0;l=H;return G|0};c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];G=0;l=H;return G|0}function Pi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;do if((a|0)<0){f=d;a=c[f>>2]|0;f=c[f+4>>2]|0;o=Jl(a|0,f|0,63)|0;p=y;f=Il(a|0,f|0,1)|0;a=y;g=e;c[g>>2]=o;c[g+4>>2]=p;g=d;c[g>>2]=f;c[g+4>>2]=a;g=0}else{g=d;h=c[g>>2]|0;g=c[g+4>>2]|0;if(!a){f=xl(h|0,g|0,-560513588,921707869)|0;a=y;if(!(g>>>0>3373259426|(g|0)==-921707870&h>>>0>560513587)){a=g;f=h;g=0;break}g=d;c[g>>2]=f;c[g+4>>2]=a;g=1;break}o=Jl(h|0,g|0,a|0)|0;p=y;m=Il(h|0,g|0,0-a&63|0)|0;n=y;if(n>>>0<3373259426|(n|0)==-921707870&m>>>0<560513588){if(n>>>0<3373259426|(n|0)==-921707870&m>>>0<0){h=Fl(m|0,n|0,-921707870,0)|0;f=0}else{f=0;h=-1}Dl(h|0,0,560513588,0)|0;j=y;g=Dl(h|0,0,0,560513588)|0;l=y;i=yl(o|0,p|0,g|0,l|0)|0;a=y;g=(p>>>0<l>>>0|(p|0)==(l|0)&o>>>0<g>>>0)<<31>>31;l=Dl(h|0,0,921707870,-1)|0;l=xl(l|0,y|0,m|0,n|0)|0;j=yl(l|0,y|0,j|0,0)|0;g=xl(j|0,y|0,g|0,((g|0)<0)<<31>>31|0)|0;j=y;if((j|0)<0)while(1){f=xl(f|0,h|0,0,-1)|0;h=y;k=xl(i|0,a|0,0,560513588)|0;l=y;g=xl(g|0,j|0,-921707870,0)|0;g=xl(g|0,y|0,(a>>>0>3734453707|(a|0)==-560513589&i>>>0>4294967295)&1|0,0)|0;j=y;if((j|0)<0){i=k;a=l}else{a=l;break}}l=g>>>0<3373259426|(g|0)==-921707870&a>>>0<0;g=Fl(a|0,g|0,-921707870,0)|0;g=(l?g:-1)|f;h=(l?y:0)|h}else{g=-1;h=-1}Dl(g|0,0,-1073741824,0)|0;t=y;u=Dl(h|0,0,-1073741824,0)|0;i=y;f=Dl(g|0,0,0,-1073741824)|0;a=y;v=Dl(g|0,0,560513588,0)|0;k=y;s=Dl(h|0,0,560513588,0)|0;q=y;j=Dl(g|0,0,-921707870,0)|0;r=y;q=xl(s|0,q|0,j|0,r|0)|0;s=y;k=xl(0,q|0,v|0,k|0)|0;v=y;i=xl(t|0,0,u|0,i|0)|0;i=xl(i|0,y|0,k|0,v|0)|0;u=y;t=yl(o|0,p|0,i|0,u|0)|0;l=d;c[l>>2]=t;c[l+4>>2]=y;l=(v>>>0<q>>>0|(v|0)==(q|0)&k>>>0<0)<<31>>31;t=Dl(h|0,0,921707870,-1)|0;k=(u>>>0<v>>>0|(u|0)==(v|0)&i>>>0<k>>>0)<<31>>31;i=(p>>>0<u>>>0|(p|0)==(u|0)&o>>>0<i>>>0)<<31>>31;p=xl(t|0,y|0,m|0,n|0)|0;p=yl(p|0,y|0,s|0,(s>>>0<r>>>0|(s|0)==(r|0)&q>>>0<j>>>0)&1|0)|0;p=xl(p|0,y|0,l|0,((l|0)<0)<<31>>31|0)|0;k=xl(p|0,y|0,k|0,((k|0)<0)<<31>>31|0)|0;i=xl(k|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;k=y;p=e;c[p>>2]=i;c[p+4>>2]=k;if((k|0)<0)while(1){g=xl(g|0,h|0,-1,-1)|0;h=y;r=d;s=c[r>>2]|0;r=c[r+4>>2]|0;j=xl(f|0,a|0,0,-1073741824)|0;l=y;v=(f|0)!=0|(a|0)!=0;t=xl((v?560513589:560513588)|0,(v?-921707870:-921707870)|0,s|0,r|0)|0;u=y;s=xl(i|0,k|0,(r>>>0>921707869|(r|0)==921707869&s>>>0>3734453707)&1|0,0)|0;i=xl(s|0,y|0,(u>>>0<0|(u|0)==0&t>>>0<(v&1)>>>0)&1|0,0)|0;k=y;v=d;c[v>>2]=t;c[v+4>>2]=u;v=e;c[v>>2]=i;c[v+4>>2]=k;if((k|0)>=0){f=j;a=l;break}else{f=j;a=l}}v=e;c[v>>2]=f;c[v+4>>2]=a;f=d;a=c[f+4>>2]|0;f=c[f>>2]|0}while(0);i=e;h=c[i>>2]|0;i=c[i+4>>2]|0;if(a>>>0<1686629713|(a|0)==1686629713&f>>>0<280256794){v=g;v=v&3;return v|0}j=(f|0)!=280256794|(a|0)!=1686629713;if(!(j|(i>>>0>1610612735|(i|0)==1610612735&h>>>0>4294967295))){v=g;v=v&3;return v|0}f=a>>>0>1686629713|(a|0)==1686629713&f>>>0>280256794|(f|0)==280256794&(a|0)==1686629713&(i>>>0>1610612736|(i|0)==1610612736&h>>>0>0);do if(j|((h|0)!=0|(i|0)!=1610612736))if(f){c[b>>2]=(c[b>>2]|0)==0&1;a=g+1|0;break}else{v=g;v=v&3;return v|0}else{if(!((g&1|0)!=0|0!=0|f)){v=g;v=v&3;return v|0}c[b>>2]=(c[b>>2]|0)==0&1;a=g+1|0;if(!f){v=a;v=v&3;return v|0}}while(0);v=d;s=c[v>>2]|0;v=c[v+4>>2]|0;t=e;u=c[t>>2]|0;t=c[t+4>>2]|0;q=yl(0,-1073741824,u|0,t|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;v=yl(560513588,-921707870,s|0,v|0)|0;u=(t>>>0>3221225472|(t|0)==-1073741824&u>>>0>0)<<31>>31;u=xl(v|0,y|0,u|0,((u|0)<0)<<31>>31|0)|0;v=d;c[v>>2]=u;c[v+4>>2]=y;v=a;v=v&3;return v|0}function Qi(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+192|0;B=I+144|0;w=I+128|0;q=I+48|0;r=I+16|0;s=I+8|0;t=I;u=I+160|0;D=I+164|0;h=I+176|0;p=I+170|0;G=I+112|0;z=I+96|0;A=I+80|0;x=I+64|0;F=I+32|0;i=t;c[i>>2]=0;c[i+4>>2]=0;i=e;o=c[i>>2]|0;i=c[i+4>>2]|0;C=e+8|0;v=b[C>>1]|0;E=e+10|0;b[D>>1]=b[E>>1]|0;b[D+2>>1]=b[E+2>>1]|0;b[D+4>>1]=b[E+4>>1]|0;j=v&32767;n=(i|0)<0;a:do if(n|j<<16>>16==0){k=s;c[k>>2]=o;c[k+4>>2]=i;k=j&65535;g=(v&65535)>>>15&65535;m=v&32767;b:do if(m<<16>>16<32767){switch(m<<16>>16){case 0:break;default:{j=o;break b}}if((o|0)==0&(i|0)==0){H=0;l=I;return H|0}h=f+2|0;j=a[h>>0]|0;a[h>>0]=j|2;if(n){k=i>>>0<65536;n=Jl(i|0,0,16)|0;n=k?n:i;k=k?16:0;j=n>>>0<16777216;k=(d[10416+((j?n<<8:n)>>>24)>>0]|0)+((j?k|8:k)&255)<<24>>24;j=Jl(o|0,i|0,k|0)|0;i=y;o=s;c[o>>2]=j;c[o+4>>2]=i;k=1-k|0;break}a[h>>0]=j|50;H=0;l=I;return H|0}else{switch(m<<16>>16){case 32767:break;default:{j=o;break b}}if((o|0)==0&(i&2147483647|0)==0)break a;b[B>>1]=b[D>>1]|0;b[B+2>>1]=b[D+2>>1]|0;b[B+4>>1]=b[D+4>>1]|0;if((o|0)==(o|0)&(i|0)==(i&-1073741825|0)&(((o|0)!=0|(i&1073741823|0)!=0)&j<<16>>16==32767)){H=f+2|0;a[H>>0]=a[H>>0]|1};b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;H=e;c[H>>2]=o;c[H+4>>2]=i;b[C>>1]=v;b[E>>1]=b[h>>1]|0;b[E+2>>1]=b[h+2>>1]|0;b[E+4>>1]=b[h+4>>1]|0;H=0;l=I;return H|0}while(0);c[u>>2]=g;h=k+-16383|0;if((k|0)>16445){H=-1;l=I;return H|0}o=f+2|0;a[o>>0]=a[o>>0]|32;do if((k|0)>=16382){v=((Pi(h,u,s,t)|0)&1|0)==0;xi(G,0,16367,c[s>>2]|0,c[s+4>>2]|0,c[t>>2]|0,c[t+4>>2]|0,f);c[r>>2]=c[G>>2];c[r+4>>2]=c[G+4>>2];c[r+8>>2]=c[G+8>>2];c[r+12>>2]=c[G+12>>2];c[B>>2]=c[r>>2];c[B+4>>2]=c[r+4>>2];c[B+8>>2]=c[r+8>>2];c[B+12>>2]=c[r+12>>2];Hi(q,B,11328,11,f);c[w>>2]=c[G>>2];c[w+4>>2]=c[G+4>>2];c[w+8>>2]=c[G+8>>2];c[w+12>>2]=c[G+12>>2];c[B>>2]=c[q>>2];c[B+4>>2]=c[q+4>>2];c[B+8>>2]=c[q+8>>2];c[B+12>>2]=c[q+12>>2];zi(z,w,B,f);c[B>>2]=c[G>>2];c[B+4>>2]=c[G+4>>2];c[B+8>>2]=c[G+8>>2];c[B+12>>2]=c[G+12>>2];Hi(A,B,11152,11,f);if(v){g=c[u>>2]|0;h=G;H=20;break}else{c[w>>2]=c[A>>2];c[w+4>>2]=c[A+4>>2];c[w+8>>2]=c[A+8>>2];c[w+12>>2]=c[A+12>>2];c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];c[B+8>>2]=c[z+8>>2];c[B+12>>2]=c[z+12>>2];Ai(G,w,B,f);g=(c[u>>2]|0)==0&1;c[u>>2]=g;break}}else{if((k|0)>=16316){xi(G,0,k+-16|0,j,i,0,0,f);c[r>>2]=c[G>>2];c[r+4>>2]=c[G+4>>2];c[r+8>>2]=c[G+8>>2];c[r+12>>2]=c[G+12>>2];c[B>>2]=c[r>>2];c[B+4>>2]=c[r+4>>2];c[B+8>>2]=c[r+8>>2];c[B+12>>2]=c[r+12>>2];Hi(q,B,11328,11,f);c[w>>2]=c[G>>2];c[w+4>>2]=c[G+4>>2];c[w+8>>2]=c[G+8>>2];c[w+12>>2]=c[G+12>>2];c[B>>2]=c[q>>2];c[B+4>>2]=c[q+4>>2];c[B+8>>2]=c[q+8>>2];c[B+12>>2]=c[q+12>>2];zi(z,w,B,f);c[B>>2]=c[G>>2];c[B+4>>2]=c[G+4>>2];c[B+8>>2]=c[G+8>>2];c[B+12>>2]=c[G+12>>2];Hi(A,B,11152,11,f);h=G;H=20;break}H=e;c[H>>2]=j;c[H+4>>2]=i;b[C>>1]=k+(v&-32768&65535);b[E>>1]=b[p>>1]|0;b[E+2>>1]=b[p+2>>1]|0;b[E+4>>1]=b[p+4>>1]|0;H=0;l=I;return H|0}while(0);if((H|0)==20){c[w>>2]=c[z>>2];c[w+4>>2]=c[z+4>>2];c[w+8>>2]=c[z+8>>2];c[w+12>>2]=c[z+12>>2];c[B>>2]=c[A>>2];c[B+4>>2]=c[A+4>>2];c[B+8>>2]=c[A+8>>2];c[B+12>>2]=c[A+12>>2];Ai(x,w,B,f);c[h>>2]=c[x>>2];c[h+4>>2]=c[x+4>>2];c[h+8>>2]=c[x+8>>2];c[h+12>>2]=c[x+12>>2]};c[B>>2]=c[G>>2];c[B+4>>2]=c[G+4>>2];c[B+8>>2]=c[G+8>>2];c[B+12>>2]=c[G+12>>2];ti(F,B,f);f=F;B=c[f>>2]|0;f=c[f+4>>2]|0;H=b[F+8>>1]|0;G=F+10|0;b[D>>1]=b[G>>1]|0;b[D+2>>1]=b[G+2>>1]|0;b[D+4>>1]=b[G+4>>1]|0;G=e;c[G>>2]=B;c[G+4>>2]=f;b[C>>1]=(g|0)==0?H:H^-32768;b[E>>1]=b[D>>1]|0;b[E+2>>1]=b[D+2>>1]|0;b[E+4>>1]=b[D+4>>1]|0;H=0;l=I;return H|0}while(0);H=f+2|0;a[H>>0]=a[H>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];H=0;l=I;return H|0}function Ri(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+160|0;H=I+144|0;G=I+128|0;C=I+80|0;D=I+64|0;r=I+48|0;s=I+32|0;t=I+16|0;p=I;x=I+112|0;z=I+96|0;v=b[f+8>>1]|0;i=v&32767;k=i<<16>>16==0;if(!(!k?(c[f+4>>2]|0)>=0:0))w=3;a:do if((w|0)==3?(E=b[g+8>>1]|0,q=E&32767,o=q<<16>>16==0,A=g,F=c[A>>2]|0,A=c[A+4>>2]|0,o|(A|0)<0):0){u=f;B=c[u>>2]|0;u=c[u+4>>2]|0;j=i&65535;m=(v&65535)>>>15&255;n=(E&65535)>>>15&255^1;if(i<<16>>16==32767){j=u&2147483647;if((B|0)==0&(j|0)==0){i=A&2147483647;if(q<<16>>16!=32767|(F|0)==0&(i|0)==0){if(m<<24>>24)break;if(o){if((F|0)==0&(A|0)==0)break;h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=E|32767;l=I;return}else k=F}else{k=F;i=A&2147483647}n=g+10|0;b[H>>1]=b[n>>1]|0;b[H+2>>1]=b[n+2>>1]|0;b[H+4>>1]=b[n+4>>1]|0;n=f+10|0;b[G>>1]=b[n>>1]|0;b[G+2>>1]=b[n+2>>1]|0;b[G+4>>1]=b[n+4>>1]|0;n=(B|0)==0&(j|0)==0;f=(B|0)==(B|0)&(u|0)==(u&-1073741825|0)&((B|0)!=0|(u&1073741823|0)!=0);j=q<<16>>16==32767;m=j&((k|0)!=0|(i|0)!=0);k=(F|0)==(F|0)&(A|0)==(A&-1073741825|0)&(j&((F|0)!=0|(A&1073741823|0)!=0));j=u|-1073741824;i=A|-1073741824;if(f|k){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(f)if(!k)if(m){h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}else{h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0;break}else w=19;else{if(n){h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}if(m&(k^1))w=19;else{h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0}}while(0);do if((w|0)==19){if(j>>>0<i>>>0|(j|0)==(i|0)&B>>>0<F>>>0){h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}if(i>>>0<j>>>0|(i|0)==(j|0)&F>>>0<B>>>0){h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0;break}if((v&65535)<(E&65535)){h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0;break}else{h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}}while(0);l=I;return}if(q<<16>>16==32767){if(!((F|0)==0&(A&2147483647|0)==0)){G=g+10|0;b[H>>1]=b[G>>1]|0;b[H+2>>1]=b[G+2>>1]|0;b[H+4>>1]=b[G+4>>1]|0;if((F|0)==(F|0)&(A|0)==(A&-1073741825|0)&((F|0)!=0|(A&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=F;c[h+4>>2]=A|-1073741824;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;l=I;return}if(m<<24>>24?!((B|i&65535|0)==0&(u|0)==0):0)break;if(!(k&((B|0)!=0|(u|0)!=0))){if((i&65535)>=16383){if(i<<16>>16==16383&((B|0)==0&(u&2147483647|0)==0))break;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=E|32767;l=I;return}}else{h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(n&255)<<15|32767;l=I;return}do if(!k)if(!(m<<24>>24)){k=u;i=B}else break a;else{if(!((B|0)==0&(u|0)==0)){if(m<<24>>24)break a;w=h+2|0;a[w>>0]=a[w>>0]|2;w=u>>>0<1|(u|0)==1&B>>>0<0;j=w?B:u;k=j>>>0<65536;j=k?j<<16:j;k=k?16:0;i=j>>>0<16777216;j=((w?32:0)|(i?k|8:k)&255)+(d[10416+((i?j<<8:j)>>>24)>>0]|0)<<24>>24;i=Jl(B|0,u|0,j|0)|0;j=1-j|0;k=y;break}if((F|q&65535|0)==0&(A|0)==0)break a;h=h+2|0;a[h>>0]=a[h>>0]|4;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(n&255)<<15|32767;l=I;return}while(0);do if(o){if(!((F|0)==0&(A|0)==0)){F=h+2|0;a[F>>0]=a[F>>0]|2;break}if((j|0)<16383){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=(n&255)<<15;l=I;return}else{h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=E&-32768;l=I;return}}while(0);if((j|0)==16383&((i|0)==0&(k&2147483647|0)==0)){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=E&-32768;l=I;return}B=h+2|0;a[B>>0]=a[B>>0]|32;B=k>>>0>3037000499|(k|0)==-1257966797&i>>>0>4192101507;j=(B?-16382:-16383)+j|0;w=Jl(i|0,k|0,49)|0;A=y;E=Il(i|0,k|0,15)|0;F=y&65535;B=Jl((B<<31>>31)+16383|0,0,48)|0;i=x;c[i>>2]=w;c[i+4>>2]=A;i=x+8|0;c[i>>2]=B|E;c[i+4>>2]=y|F;c[p>>2]=c[x>>2];c[p+4>>2]=c[x+4>>2];c[p+8>>2]=c[x+8>>2];c[p+12>>2]=c[x+12>>2];c[C>>2]=c[x>>2];c[C+4>>2]=c[x+4>>2];c[C+8>>2]=c[x+8>>2];c[C+12>>2]=c[x+12>>2];i=C+8|0;i=Il(c[i>>2]|0,c[i+4>>2]|0,63)|0;i=i&255;if(!(i<<24>>24)){c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];vi(D,G,H,0,h)}else{c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];wi(D,G,H,i,h)};c[C>>2]=c[p>>2];c[C+4>>2]=c[p+4>>2];c[C+8>>2]=c[p+8>>2];c[C+12>>2]=c[p+12>>2];i=C+8|0;i=Il(c[i>>2]|0,c[i+4>>2]|0,63)|0;i=i&255;if(!(i<<24>>24)){c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];wi(r,G,H,0,h)}else{c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];vi(r,G,H,i,h)};c[G>>2]=c[r>>2];c[G+4>>2]=c[r+4>>2];c[G+8>>2]=c[r+8>>2];c[G+12>>2]=c[r+12>>2];c[H>>2]=c[D>>2];c[H+4>>2]=c[D+4>>2];c[H+8>>2]=c[D+8>>2];c[H+12>>2]=c[D+12>>2];Ai(s,G,H,h);c[H>>2]=c[s>>2];c[H+4>>2]=c[s+4>>2];c[H+8>>2]=c[s+8>>2];c[H+12>>2]=c[s+12>>2];Hi(C,H,11504,9,h);c[G>>2]=c[s>>2];c[G+4>>2]=c[s+4>>2];c[G+8>>2]=c[s+8>>2];c[G+12>>2]=c[s+12>>2];c[H>>2]=c[C>>2];c[H+4>>2]=c[C+4>>2];c[H+8>>2]=c[C+8>>2];c[H+12>>2]=c[C+12>>2];zi(t,G,H,h);c[G>>2]=c[t>>2];c[G+4>>2]=c[t+4>>2];c[G+8>>2]=c[t+8>>2];c[G+12>>2]=c[t+12>>2];c[H>>2]=c[3640];c[H+4>>2]=c[3641];c[H+8>>2]=c[3642];c[H+12>>2]=c[3643];zi(x,G,H,h);i=((j|0)<0)<<31>>31;if(!j){i=0;j=0;k=0;m=0}else{u=(i|0)>-1|(i|0)==-1&j>>>0>4294967295;t=yl(0,0,j|0,i|0)|0;t=u?j:t;u=u?i:y;B=u>>>0<1|(u|0)==1&t>>>0<0;A=B?t:u;w=A>>>0<65536;A=w?A<<16:A;w=w?16:0;E=A>>>0<16777216;A=(((B?32:0)|(E?w|8:w)&255)+(d[10416+((E?A<<8:A)>>>24)>>0]|0)&255)+49|0;E=A<<24;w=E>>24;E=(E|0)>1056964608;B=E?t:0;v=E?u:0;t=E?0:t;u=E?0:u;A=(E?w+192|0:A)<<24;E=A>>24;m=Jl(t|0,u|0,E|0)|0;j=y;A=(A|0)==0;F=Jl(B|0,v|0,E|0)|0;k=y;E=Il(t|0,u|0,0-E&63|0)|0;k=A?v:y|k;w=Jl(16494-w|0,0,48)|0;i=xl(w|0,y|0,0,i&-2147483648|0)|0;k=xl(i|0,y|0,(A?B:E|F)|0,k|0)|0;i=m;m=y}F=C;c[F>>2]=i;c[F+4>>2]=j;i=C+8|0;c[i>>2]=k;c[i+4>>2]=m;c[D>>2]=c[x>>2];c[D+4>>2]=c[x+4>>2];c[D+8>>2]=c[x+8>>2];c[D+12>>2]=c[x+12>>2];i=D+8|0;i=Il(c[i>>2]|0,c[i+4>>2]|0,63)|0;i=i&255;F=Il(k|0,m|0,63)|0;if(i<<24>>24==(F&255)<<24>>24){c[G>>2]=c[D>>2];c[G+4>>2]=c[D+4>>2];c[G+8>>2]=c[D+8>>2];c[G+12>>2]=c[D+12>>2];c[H>>2]=c[C>>2];c[H+4>>2]=c[C+4>>2];c[H+8>>2]=c[C+8>>2];c[H+12>>2]=c[C+12>>2];vi(z,G,H,i,h)}else{c[G>>2]=c[D>>2];c[G+4>>2]=c[D+4>>2];c[G+8>>2]=c[D+8>>2];c[G+12>>2]=c[D+12>>2];c[H>>2]=c[C>>2];c[H+4>>2]=c[C+4>>2];c[H+8>>2]=c[C+8>>2];c[H+12>>2]=c[C+12>>2];wi(z,G,H,i,h)};c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];c[H>>2]=c[z>>2];c[H+4>>2]=c[z+4>>2];c[H+8>>2]=c[z+8>>2];c[H+12>>2]=c[z+12>>2];Bi(e,G,H,h);l=I;return}while(0);h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=I;return}function Si(f,g,h,i){f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;M=l;l=l+144|0;L=M+128|0;K=M+112|0;E=M+64|0;w=M+48|0;x=M+32|0;z=M+16|0;A=M;B=M+96|0;v=M+80|0;C=b[g+8>>1]|0;j=C&32767;k=j<<16>>16==0;if(!(!k?(c[g+4>>2]|0)>=0:0))H=3;do if((H|0)==3?(D=b[h+8>>1]|0,r=D&32767,s=r<<16>>16==0,J=h,I=c[J>>2]|0,J=c[J+4>>2]|0,s|(J|0)<0):0){F=g;q=c[F>>2]|0;F=c[F+4>>2]|0;n=j&65535;t=(C&65535)>>>15;G=t&255;m=r&65535;o=(D&65535)>>>15^t;u=o&255;if(j<<16>>16==32767){k=F&2147483647;if((q|0)==0&(k|0)==0){j=J&2147483647;if(r<<16>>16!=32767|(I|0)==0&(j|0)==0){if(G<<24>>24)break;if(s){if((I|0)==0&(J|0)==0)break;i=i+2|0;a[i>>0]=a[i>>0]|2}i=f;c[i>>2]=0;c[i+4>>2]=-2147483648;b[f+8>>1]=D|32767;l=M;return}else m=I}else{m=I;j=J&2147483647}o=h+10|0;b[L>>1]=b[o>>1]|0;b[L+2>>1]=b[o+2>>1]|0;b[L+4>>1]=b[o+4>>1]|0;o=g+10|0;b[K>>1]=b[o>>1]|0;b[K+2>>1]=b[o+2>>1]|0;b[K+4>>1]=b[o+4>>1]|0;o=(q|0)==0&(k|0)==0;p=(q|0)==(q|0)&(F|0)==(F&-1073741825|0)&((q|0)!=0|(F&1073741823|0)!=0);k=r<<16>>16==32767;n=k&((m|0)!=0|(j|0)!=0);m=(I|0)==(I|0)&(J|0)==(J&-1073741825|0)&(k&((I|0)!=0|(J&1073741823|0)!=0));k=F|-1073741824;j=J|-1073741824;if(p|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(p)if(!m)if(n){i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}else{i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0;break}else H=19;else{if(o){i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}if(n&(m^1))H=19;else{i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0}}while(0);do if((H|0)==19){if(k>>>0<j>>>0|(k|0)==(j|0)&q>>>0<I>>>0){i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&I>>>0<q>>>0){i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0;break}if((C&65535)<(D&65535)){i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0;break}else{i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}}while(0);l=M;return}if(r<<16>>16==32767){if(!((I|0)==0&(J&2147483647|0)==0)){K=h+10|0;b[L>>1]=b[K>>1]|0;b[L+2>>1]=b[K+2>>1]|0;b[L+4>>1]=b[K+4>>1]|0;if((I|0)==(I|0)&(J|0)==(J&-1073741825|0)&((I|0)!=0|(J&1073741823|0)!=0)){i=i+2|0;a[i>>0]=a[i>>0]|1}i=f;c[i>>2]=I;c[i+4>>2]=J|-1073741824;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;l=M;return}if(k){if((q|0)==0&(F|0)==0)break;i=i+2|0;a[i>>0]=a[i>>0]|2}i=f;c[i>>2]=0;c[i+4>>2]=-2147483648;b[f+8>>1]=o<<15&65535|32767;l=M;return}do if(k){if(!((q|0)==0&(F|0)==0)){D=i+2|0;a[D>>0]=a[D>>0]|2;D=F>>>0<1|(F|0)==1&q>>>0<0;r=D?q:F;H=r>>>0<65536;r=H?r<<16:r;H=H?16:0;p=r>>>0<16777216;r=((D?32:0)|(p?H|8:H)&255)+(d[10416+((p?r<<8:r)>>>24)>>0]|0)<<24>>24;q=Jl(q|0,F|0,r|0)|0;r=1-r|0;p=y;break}if(s&((I|0)!=0|(J|0)!=0)){i=i+2|0;a[i>>0]=a[i>>0]|2}i=f;c[i>>2]=0;c[i+4>>2]=0;b[f+8>>1]=o<<15;l=M;return}else{r=n;p=F}while(0);do if(s){if(!((I|0)==0&(J|0)==0)){n=i+2|0;o=a[n>>0]|2;a[n>>0]=o;H=J>>>0<1|(J|0)==1&I>>>0<0;m=H?I:J;j=m>>>0<65536;m=j?m<<16:m;j=j?16:0;k=m>>>0<16777216;m=((H?32:0)|(k?j|8:j)&255)+(d[10416+((k?m<<8:m)>>>24)>>0]|0)<<24>>24;k=Jl(I|0,J|0,m|0)|0;m=1-m|0;j=y;break}i=f;c[i>>2]=0;c[i+4>>2]=0;b[f+8>>1]=o<<15;l=M;return}else{o=i+2|0;n=o;o=a[o>>0]|0;k=I;j=J}while(0);a[n>>0]=o|32;if(G<<24>>24!=0&(r|0)>16382){c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];l=M;return}if((r|0)>16379){c[E>>2]=c[g>>2];c[E+4>>2]=c[g+4>>2];c[E+8>>2]=c[g+8>>2];c[E+12>>2]=c[g+12>>2];j=(e[E+8>>1]|0)>>>15&255;if(!(j<<24>>24)){c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3636];c[L+4>>2]=c[3637];c[L+8>>2]=c[3638];c[L+12>>2]=c[3639];mi(B,K,L,0,i)}else{c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3636];c[L+4>>2]=c[3637];c[L+8>>2]=c[3638];c[L+12>>2]=c[3639];ni(B,K,L,j,i)};c[K>>2]=c[B>>2];c[K+4>>2]=c[B+4>>2];c[K+8>>2]=c[B+8>>2];c[K+12>>2]=c[B+12>>2];c[L>>2]=c[h>>2];c[L+4>>2]=c[h+4>>2];c[L+8>>2]=c[h+8>>2];c[L+12>>2]=c[h+12>>2];Ri(f,K,L,i);l=M;return}if((r|0)<16313){Dl(q|0,0,-1073741824,0)|0;F=y;D=Dl(p|0,0,-1073741824,0)|0;B=y;g=Dl(q|0,0,1545072827,0)|0;w=y;C=Dl(p|0,0,1545072827,0)|0;L=y;I=Dl(q|0,0,-1196803287,0)|0;E=y;H=Dl(p|0,0,-1196803287,0)|0;G=y;L=xl(C|0,L|0,I|0,E|0)|0;C=y;G=xl(C|0,(C>>>0<E>>>0|(C|0)==(E|0)&L>>>0<I>>>0)&1|0,H|0,G|0)|0;H=y;w=xl(0,L|0,g|0,w|0)|0;g=y;L=xl(G|0,H|0,(g>>>0<L>>>0|(g|0)==(L|0)&w>>>0<0)&1|0,0)|0;H=y;B=xl(F|0,0,D|0,B|0)|0;B=xl(B|0,y|0,w|0,g|0)|0;D=y;w=xl(L|0,H|0,(D>>>0<g>>>0|(D|0)==(g|0)&B>>>0<w>>>0)&1|0,0)|0;g=y;H=(g|0)>0|(g|0)==0&w>>>0>0;L=Jl(w|0,g|0,1)|0;F=y;G=Il(B|0,D|0,63)|0;w=H?L|G:w;g=H?F|y:g;D=Jl(B|0,D|0,H&1|0)|0;B=y;F=Dl(k|0,0,D|0,0)|0;G=y;D=Dl(j|0,0,D|0,0)|0;L=y;I=Dl(k|0,0,B|0,0)|0;E=y;B=Dl(j|0,0,B|0,0)|0;C=y;L=xl(D|0,L|0,I|0,E|0)|0;D=y;G=xl(0,L|0,F|0,G|0)|0;F=y;K=Dl(k|0,0,w|0,0)|0;J=y;w=Dl(j|0,0,w|0,0)|0;h=y;z=Dl(k|0,0,g|0,0)|0;x=y;g=Dl(j|0,0,g|0,0)|0;A=y;h=xl(w|0,h|0,z|0,x|0)|0;w=y;A=xl(w|0,(w>>>0<x>>>0|(w|0)==(x|0)&h>>>0<z>>>0)&1|0,g|0,A|0)|0;g=y;J=xl(0,h|0,K|0,J|0)|0;K=y;h=xl(A|0,g|0,(K>>>0<h>>>0|(K|0)==(h|0)&J>>>0<0)&1|0,0)|0;g=y;C=xl(J|0,K|0,B|0,C|0)|0;I=xl(C|0,y|0,D|0,(D>>>0<E>>>0|(D|0)==(E|0)&L>>>0<I>>>0)&1|0)|0;G=xl(I|0,y|0,(F>>>0<L>>>0|(F|0)==(L|0)&G>>>0<0)&1|0,0)|0;L=y;J=xl(h|0,g|0,(L>>>0<K>>>0|(L|0)==(K|0)&G>>>0<J>>>0)&1|0,0)|0;K=y;g=(K|0)>0|(K|0)==0&J>>>0>0;h=Jl(J|0,K|0,1)|0;F=y;I=Il(G|0,L|0,63)|0;K=g?F|y:K;L=Jl(G|0,L|0,g&1|0)|0;oi(f,80,u,r+((H^1)&1)+m+(g?-16383:-16382)|0,g?h|I:J,K,L,y,i);l=M;return}g=Jl(q|0,p|0,49)|0;I=y;F=Il(q|0,p|0,15)|0;H=y&65535;G=Jl(t&65535|0,0,63)|0;j=y;J=Jl(r|0,0,48)|0;J=xl(F|G|0,H|j|0,J|0,y|0)|0;j=v;c[j>>2]=g;c[j+4>>2]=I;j=v+8|0;c[j>>2]=J;c[j+4>>2]=y;c[A>>2]=c[v>>2];c[A+4>>2]=c[v+4>>2];c[A+8>>2]=c[v+8>>2];c[A+12>>2]=c[v+12>>2];c[E>>2]=c[v>>2];c[E+4>>2]=c[v+4>>2];c[E+8>>2]=c[v+8>>2];c[E+12>>2]=c[v+12>>2];j=E+8|0;j=Il(c[j>>2]|0,c[j+4>>2]|0,63)|0;j=j&255;if(!(j<<24>>24)){c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3644];c[L+4>>2]=c[3645];c[L+8>>2]=c[3646];c[L+12>>2]=c[3647];vi(w,K,L,0,i)}else{c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3644];c[L+4>>2]=c[3645];c[L+8>>2]=c[3646];c[L+12>>2]=c[3647];wi(w,K,L,j,i)};c[K>>2]=c[A>>2];c[K+4>>2]=c[A+4>>2];c[K+8>>2]=c[A+8>>2];c[K+12>>2]=c[A+12>>2];c[L>>2]=c[w>>2];c[L+4>>2]=c[w+4>>2];c[L+8>>2]=c[w+8>>2];c[L+12>>2]=c[w+12>>2];Ai(x,K,L,i);c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];Hi(E,L,11504,9,i);c[K>>2]=c[x>>2];c[K+4>>2]=c[x+4>>2];c[K+8>>2]=c[x+8>>2];c[K+12>>2]=c[x+12>>2];c[L>>2]=c[E>>2];c[L+4>>2]=c[E+4>>2];c[L+8>>2]=c[E+8>>2];c[L+12>>2]=c[E+12>>2];zi(z,K,L,i);c[K>>2]=c[z>>2];c[K+4>>2]=c[z+4>>2];c[K+8>>2]=c[z+8>>2];c[K+12>>2]=c[z+12>>2];c[L>>2]=c[3640];c[L+4>>2]=c[3641];c[L+8>>2]=c[3642];c[L+12>>2]=c[3643];zi(v,K,L,i);c[K>>2]=c[h>>2];c[K+4>>2]=c[h+4>>2];c[K+8>>2]=c[h+8>>2];c[K+12>>2]=c[h+12>>2];c[L>>2]=c[v>>2];c[L+4>>2]=c[v+4>>2];c[L+8>>2]=c[v+8>>2];c[L+12>>2]=c[v+12>>2];Bi(f,K,L,i);l=M;return}while(0);i=i+2|0;a[i>>0]=a[i>>0]|1;c[f>>2]=c[3596];c[f+4>>2]=c[3597];c[f+8>>2]=c[3598];c[f+12>>2]=c[3599];l=M;return}function Ti(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=Tj(20)|0;j=i+4|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[i>>2]=g;a[i+16>>0]=0;He(d,e,0,1,0,i,28,26,2)|0;He(d,e+1|0,0,7,0,i,29,27,1)|0;if(f|0)He(d,f,0,1,0,i,30,28,1)|0;e=i+8|0;d=c[h>>2]|0;if(d|0){j=Tj(65608)|0;Nl(j+8|0,0,65600)|0;c[j>>2]=i;c[j+4>>2]=d;d=Wa[c[d>>2]&15](d)|0;f=y;g=Fl(d|0,f|0,1008,0)|0;g=g>>>0>2?g:2;c[j+8>>2]=g>>>0<16383?g:16383;c[j+12>>2]=16;c[j+16>>2]=63;g=j+24|0;c[g>>2]=d;c[g+4>>2]=f;c[j+20>>2]=128;g=j+32|0;c[g>>2]=0;b[g+4>>1]=0;a[g+6>>0]=0;a[j+39>>0]=-96;a[j+40>>0]=80;c[j+56>>2]=0;c[j+60>>2]=0;c[j+52>>2]=10;c[j+48>>2]=0;c[j+44>>2]=0;c[e>>2]=j}d=c[h+4>>2]|0;if(!d){h=c[e>>2]|0;j=i+4|0;c[j>>2]=h;return i|0}h=Tj(65608)|0;Nl(h+8|0,0,65600)|0;c[h>>2]=i;c[h+4>>2]=d;f=Wa[c[d>>2]&15](d)|0;g=y;j=Fl(f|0,g|0,1008,0)|0;j=j>>>0>2?j:2;c[h+8>>2]=j>>>0<16383?j:16383;c[h+12>>2]=16;c[h+16>>2]=63;j=h+24|0;c[j>>2]=f;c[j+4>>2]=g;c[h+20>>2]=128;j=h+32|0;c[j>>2]=0;b[j+4>>1]=0;a[j+6>>0]=0;a[h+39>>0]=-96;a[h+40>>0]=80;c[h+56>>2]=0;c[h+60>>2]=0;c[h+52>>2]=10;c[h+48>>2]=0;c[h+44>>2]=0;c[i+12>>2]=h;h=c[e>>2]|0;j=i+4|0;c[j>>2]=h;return i|0}function Ui(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;b=c[a+4>>2]|0;if(!b){e=0;return e|0}f=b+56|0;e=c[f>>2]|0;a=(d[e+1+(b+64)>>0]|0)<<8|(d[b+64+e>>0]|0);e=e+2|0;c[f>>2]=e;if((e|0)<(c[b+60>>2]|0)){f=a;return f|0}db[c[b+52>>2]&15](b);f=a;return f|0}function Vi(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[b+4>>2]|0;if(!b)return;f=b+56|0;d=c[f>>2]|0;a[b+64+d>>0]=e;a[d+1+(b+64)>>0]=e>>>8;e=d+2|0;c[f>>2]=e;if((e|0)<(c[b+60>>2]|0))return;db[c[b+52>>2]&15](b);return}function Wi(a,b,f){a=a|0;b=b|0;f=f|0;f=c[a+4>>2]|0;if(!f){b=0;return b|0}switch(b|0){case 0:{b=d[f+33>>0]|0;return b|0}case 1:{b=e[f+34>>1]|0;return b|0}case 2:{b=d[f+36>>0]|0;return b|0}case 3:{b=d[f+37>>0]|0;return b|0}case 4:{b=d[f+38>>0]|0;return b|0}case 5:{b=d[f+39>>0]|0;return b|0}case -1:{b=255;return b|0}default:{b=d[f+40>>0]|0;a=c[a>>2]|0;fb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);return b|0}}return 0}function Xi(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;h=d+4|0;k=c[h>>2]|0;switch(e|0){case 0:{if(!k)return;a[k+32>>0]=f;return}case 1:{if(!k)return;b[k+34>>1]=f;return}case 2:{if(!k)return;a[k+36>>0]=f;return}case 3:{if(!k)return;a[k+37>>0]=f;return}case 4:{if(!k)return;a[k+38>>0]=f;return}case 5:{g=c[d+8+((f>>>4&1)<<2)>>2]|0;c[h>>2]=g;if(!g)return;a[g+39>>0]=f;return}case -1:return;default:{if(!k)return;switch(f|0){case 236:{Nl(k+68|0,0,1020)|0;b[k+64>>1]=64;h=k+8|0;b[k+66>>1]=c[h>>2];f=k+12|0;b[k+70>>1]=c[f>>2];i=k+16|0;g=c[i>>2]|0;b[k+72>>1]=g<<9;b[k+74>>1]=512;b[k+76>>1]=g;b[k+104>>1]=3;b[k+106>>1]=512;b[k+108>>1]=4;g=0;d=k+118|0;e=19967;while(1){l=a[e>>0]|0;j=l<<24>>24==0;a[(d^1)>>0]=j?32:l;g=g+1|0;if((g|0)==40)break;else{d=d+1|0;e=j?e:e+1|0}}b[k+158>>1]=-32640;b[k+160>>1]=0;b[k+162>>1]=512;b[k+166>>1]=512;b[k+168>>1]=512;l=c[h>>2]|0;b[k+172>>1]=l;j=c[f>>2]|0;b[k+174>>1]=j;g=c[i>>2]|0;b[k+176>>1]=g;g=N(N(j,l)|0,g)|0;b[k+178>>1]=g;b[k+180>>1]=g>>>16;g=c[k+20>>2]|0;if(g|0)b[k+182>>1]=g|256;g=k+24|0;l=c[g>>2]|0;g=c[g+4>>2]|0;b[k+184>>1]=l;g=Il(l|0,g|0,16)|0;b[k+186>>1]=g;b[k+224>>1]=6;b[k+228>>1]=16384;b[k+230>>1]=16384;b[k+232>>1]=16384;b[k+234>>1]=16384;b[k+236>>1]=0;b[k+238>>1]=16384;a[k+40>>0]=88;c[k+52>>2]=11;c[k+56>>2]=0;c[k+60>>2]=512;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 16:case 145:{a[k+33>>0]=0;a[k+40>>0]=80;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 198:{l=b[k+34>>1]|0;g=l&65535;if((l&65535)<=128?(g+65535&g|0)==0:0){c[k+20>>2]=g;a[k+40>>0]=64}else{a[k+40>>0]=65;a[k+33>>0]=4}g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 33:case 32:{c[k+48>>2]=1;aj(k);return}case 49:case 48:{c[k+48>>2]=1;c[k+44>>2]=1;c[k+52>>2]=12;c[k+56>>2]=0;c[k+60>>2]=512;a[k+40>>0]=88;return}case 196:{g=c[k+20>>2]|0;if(g|0){c[k+48>>2]=g;aj(k);return}a[k+40>>0]=65;a[k+33>>0]=4;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 197:{g=c[k+20>>2]|0;if(g|0){c[k+48>>2]=g;l=b[k+34>>1]|0;l=l<<16>>16==0?256:l&65535;l=(l|0)>(g|0)?g:l;c[k+44>>2]=l;c[k+52>>2]=12;c[k+56>>2]=0;c[k+60>>2]=l<<9;a[k+40>>0]=88;return}a[k+40>>0]=65;a[k+33>>0]=4;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 248:{f=k+24|0;f=xl(c[f>>2]|0,c[f+4>>2]|0,-1,-1)|0;g=y;d=k+39|0;e=a[d>>0]|0;h=e&255;if(!(h&64)){j=c[k+16>>2]|0;h=N(j,c[k+12>>2]|0)|0;i=((h|0)<0)<<31>>31;l=Bl(f|0,g|0,h|0,i|0)|0;i=Dl(l|0,y|0,h|0,i|0)|0;i=yl(f|0,g|0,i|0,y|0)|0;g=(i>>>0)/(j>>>0)|0;a[d>>0]=g&15|e&-16&255;e=l&255;g=i-(N(g,j)|0)+1&255;d=l>>>8&255}else{e=Il(f|0,g|0,24)|0;a[d>>0]=e&15|h&240;d=Il(f|0,g|0,16)|0;e=Il(f|0,g|0,8)|0;e=e&255;g=f&255;d=d&255}a[k+38>>0]=d;a[k+37>>0]=e;a[k+36>>0]=g;a[k+40>>0]=64;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}default:{a[k+40>>0]=65;a[k+33>>0]=4;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}}}}}function Yi(a,b,e){a=a|0;b=b|0;e=e|0;a=c[a+4>>2]|0;if(!a){e=0;return e|0}e=d[a+40>>0]|0;return e|0}function Zi(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=d+16|0;e=(a[h>>0]&4)!=0;g=(f&4|0)==0;if(!(g|e)){e=c[d+8>>2]|0;if(e|0){a[e+40>>0]=-112;a[e+33>>0]=1}e=c[d+12>>2]|0;if(!e){f=f&255;a[h>>0]=f;return}a[e+40>>0]=-112;a[e+33>>0]=1;f=f&255;a[h>>0]=f;return}if(!(g&e)){f=f&255;a[h>>0]=f;return}e=c[d+8>>2]|0;if(e|0){a[e+40>>0]=80;g=e+39|0;a[g>>0]=a[g>>0]&-16;b[e+34>>1]=1;a[e+36>>0]=1;a[e+37>>0]=0;a[e+38>>0]=0}e=c[d+12>>2]|0;if(!e){f=f&255;a[h>>0]=f;return}a[e+40>>0]=80;d=e+39|0;a[d>>0]=a[d>>0]&-16;b[e+34>>1]=1;a[e+36>>0]=1;a[e+37>>0]=0;a[e+38>>0]=0;f=f&255;a[h>>0]=f;return}function _i(a){a=a|0;c[a+52>>2]=10;c[a+56>>2]=0;c[a+60>>2]=0;return}function $i(b){b=b|0;c[b+52>>2]=10;c[b+56>>2]=0;c[b+60>>2]=0;a[b+40>>0]=64;return}function aj(e){e=e|0;var f=0,g=0,h=0;f=d[e+39>>0]|0;if(!(f&64)){g=N((d[e+38>>0]|0)<<8|(d[e+37>>0]|0),c[e+12>>2]|0)|0;f=N(g+(f&15)|0,c[e+16>>2]|0)|0;f=(d[e+36>>0]|0)+-1+f|0}else f=(d[e+38>>0]|0)<<16|f<<24&251658240|(d[e+37>>0]|0)<<8|(d[e+36>>0]|0);g=b[e+34>>1]|0;g=g<<16>>16==0?256:g&65535;h=c[e+48>>2]|0;g=(g|0)>(h|0)?h:g;c[e+44>>2]=g;h=c[e+4>>2]|0;f=ab[c[h+4>>2]&3](h,f,((f|0)<0)<<31>>31,e+64|0,g,9,e)|0;if((f|0)<0){a[e+40>>0]=65;a[e+33>>0]=4;f=c[e>>2]|0;if(a[f+16>>0]&2)return;h=c[f>>2]|0;fb[c[h>>2]&15](c[h+4>>2]|0,c[h+8>>2]|0,1);return}if(!f){dj(e,0);return}else{a[e+40>>0]=-48;a[e+33>>0]=0;return}}function bj(b){b=b|0;var e=0,f=0;c[b+52>>2]=10;c[b+56>>2]=0;c[b+60>>2]=0;e=d[b+39>>0]|0;if(!(e&64)){f=N((d[b+38>>0]|0)<<8|(d[b+37>>0]|0),c[b+12>>2]|0)|0;e=N(f+(e&15)|0,c[b+16>>2]|0)|0;e=(d[b+36>>0]|0)+-1+e|0}else e=(d[b+38>>0]|0)<<16|e<<24&251658240|(d[b+37>>0]|0)<<8|(d[b+36>>0]|0);f=c[b+4>>2]|0;e=ab[c[f+8>>2]&3](f,e,((e|0)<0)<<31>>31,b+64|0,c[b+44>>2]|0,10,b)|0;if((e|0)<0){a[b+40>>0]=65;a[b+33>>0]=4;e=c[b>>2]|0;if(a[e+16>>0]&2)return;f=c[e>>2]|0;fb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,1);return}if(!e){cj(b,0);return}else{a[b+40>>0]=-48;return}}function cj(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;n=f+44|0;m=c[n>>2]|0;g=f+39|0;h=a[g>>0]|0;i=h&255;if(!(i&64)){j=f+38|0;q=f+37|0;s=c[f+12>>2]|0;r=N((d[j>>0]|0)<<8|(d[q>>0]|0),s)|0;k=c[f+16>>2]|0;r=N(r+(i&15)|0,k)|0;i=f+36|0;r=(d[i>>0]|0)+-1+r|0;r=xl(r|0,((r|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;o=y;s=N(k,s)|0;p=((s|0)<0)<<31>>31;l=Bl(r|0,o|0,s|0,p|0)|0;p=Dl(l|0,y|0,s|0,p|0)|0;p=yl(r|0,o|0,p|0,y|0)|0;o=(p>>>0)/(k>>>0)|0;a[g>>0]=o&15|h&-16&255;g=q;h=i;i=j;j=l&255;k=p-(N(o,k)|0)+1&255;l=l>>>8&255}else{s=f+38|0;r=f+37|0;h=f+36|0;k=xl((d[s>>0]|0)<<16|i<<24&251658240|(d[r>>0]|0)<<8|(d[h>>0]|0)|0,0,m|0,((m|0)<0)<<31>>31|0)|0;j=y;l=Il(k|0,j|0,24)|0;a[g>>0]=l&15|i&240;l=Il(k|0,j|0,16)|0;j=Il(k|0,j|0,8)|0;g=r;i=s;j=j&255;k=k&255;l=l&255}a[i>>0]=l;a[g>>0]=j;a[h>>0]=k;s=f+34|0;g=(e[s>>1]|0)-m&255;b[s>>1]=g;if(!g)g=80;else{s=c[f+48>>2]|0;g=(g|0)>(s|0)?s:g;c[n>>2]=g;c[f+52>>2]=12;c[f+56>>2]=0;c[f+60>>2]=g<<9;g=88}a[f+40>>0]=g;g=c[f>>2]|0;if(a[g+16>>0]&2)return;s=c[g>>2]|0;fb[c[s>>2]&15](c[s+4>>2]|0,c[s+8>>2]|0,1);return}function dj(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;m=c[f+44>>2]|0;g=f+39|0;h=a[g>>0]|0;i=h&255;if(!(i&64)){j=f+38|0;p=f+37|0;r=c[f+12>>2]|0;q=N((d[j>>0]|0)<<8|(d[p>>0]|0),r)|0;k=c[f+16>>2]|0;q=N(q+(i&15)|0,k)|0;i=f+36|0;q=(d[i>>0]|0)+-1+q|0;q=xl(q|0,((q|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=y;r=N(k,r)|0;o=((r|0)<0)<<31>>31;l=Bl(q|0,n|0,r|0,o|0)|0;o=Dl(l|0,y|0,r|0,o|0)|0;o=yl(q|0,n|0,o|0,y|0)|0;n=(o>>>0)/(k>>>0)|0;a[g>>0]=n&15|h&-16&255;g=p;h=i;i=j;j=l&255;k=o-(N(n,k)|0)+1&255;l=l>>>8&255}else{r=f+38|0;q=f+37|0;h=f+36|0;k=xl((d[r>>0]|0)<<16|i<<24&251658240|(d[q>>0]|0)<<8|(d[h>>0]|0)|0,0,m|0,((m|0)<0)<<31>>31|0)|0;j=y;l=Il(k|0,j|0,24)|0;a[g>>0]=l&15|i&240;l=Il(k|0,j|0,16)|0;j=Il(k|0,j|0,8)|0;g=q;i=r;j=j&255;k=k&255;l=l&255}a[i>>0]=l;a[g>>0]=j;a[h>>0]=k;r=f+34|0;g=(e[r>>1]|0)-m&255;b[r>>1]=g;c[f+52>>2]=(g|0)==0?14:13;c[f+56>>2]=0;c[f+60>>2]=m<<9;g=c[f>>2]|0;if(a[g+16>>0]&2){r=f+40|0;a[r>>0]=88;r=f+33|0;a[r>>0]=0;return}r=c[g>>2]|0;fb[c[r>>2]&15](c[r+4>>2]|0,c[r+8>>2]|0,1);r=f+40|0;a[r>>0]=88;r=f+33|0;a[r>>0]=0;return}function ej(b){b=b|0;a[b+40>>0]=80;a[b+33>>0]=0;c[b+52>>2]=10;c[b+56>>2]=0;c[b+60>>2]=0;return}function fj(a,b){a=a|0;b=b|0;b=Qd(a,19985,b,-32634,28688,0,257)|0;Xd(b,9,0);return b|0}function gj(b,d){b=b|0;d=d|0;var e=0,f=0;e=b+264|0;if((c[e>>2]|0)>255)return;f=b+260|0;a[b+(c[f>>2]|0)>>0]=d;d=(c[f>>2]|0)+1|0;c[f>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}function hj(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0;do if((f|0)>95){if((f|0)>127)return;f=f+-96|0;if(536805416>>>f&1|0)return;g=b+264|0;if((c[g>>2]|0)>255)return;else{f=d[11648+f>>0]|0;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-32;i=(c[h>>2]|0)+1|0;c[h>>2]=(i|0)==256?0:i;c[g>>2]=(c[g>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);break}}else g=b+264|0;while(0);if((c[g>>2]|0)>255)return;i=b+260|0;a[b+(c[i>>2]|0)>>0]=f|((e|0)==0&1)<<7;h=(c[i>>2]|0)+1|0;c[i>>2]=(h|0)==256?0:h;c[g>>2]=(c[g>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}function ij(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=a+264|0;e=c[b>>2]|0;f=a+256|0;g=c[f>>2]|0;if(!e){g=d[a+((g|0)<1?255:g+-1|0)>>0]|0;return g|0}else{h=d[a+g>>0]|0;g=g+1|0;c[f>>2]=(g|0)==256?0:g;c[b>>2]=e+-1;f=a+272|0;g=a+276|0;eb[c[f>>2]&15](c[g>>2]|0,0);eb[c[f>>2]&15](c[g>>2]|0,(c[b>>2]|0)!=0&1);g=h;return g|0}return 0}function jj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+268|0;switch(c[e>>2]|0){case 243:{d=b+264|0;if((c[d>>2]|0)<=255){g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[e>>2]=-1;return}case 237:{d=b+264|0;if((c[d>>2]|0)<=255){g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[e>>2]=-1;return}default:do switch(d|0){case 0:{d=b+264|0;if((c[d>>2]|0)>255)return;g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 5:{d=b+264|0;if((c[d>>2]|0)>255)return;g=b+260|0;a[b+(c[g>>2]|0)>>0]=-2;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 242:{d=b+264|0;if((c[d>>2]|0)>255)return;e=b+260|0;a[b+(c[e>>2]|0)>>0]=-6;f=(c[e>>2]|0)+1|0;c[e>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;f=b+272|0;g=b+276|0;eb[c[f>>2]&15](c[g>>2]|0,1);if((c[d>>2]|0)>255)return;a[b+(c[e>>2]|0)>>0]=-85;h=(c[e>>2]|0)+1|0;c[e>>2]=(h|0)==256?0:h;c[d>>2]=(c[d>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1);if((c[d>>2]|0)>255)return;a[b+(c[e>>2]|0)>>0]=-125;h=(c[e>>2]|0)+1|0;c[e>>2]=(h|0)==256?0:h;c[d>>2]=(c[d>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1);return}case 238:{d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-18;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 244:{c[b+280>>2]=1;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 243:case 237:{c[e>>2]=d;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 245:{c[b+280>>2]=0;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 246:{c[b+280>>2]=1;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 255:{c[b+280>>2]=1;d=b+264|0;if((c[d>>2]|0)>255)return;e=b+260|0;a[b+(c[e>>2]|0)>>0]=-6;f=(c[e>>2]|0)+1|0;c[e>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;f=b+272|0;g=b+276|0;eb[c[f>>2]&15](c[g>>2]|0,1);if((c[d>>2]|0)>255)return;a[b+(c[e>>2]|0)>>0]=-86;h=(c[e>>2]|0)+1|0;c[e>>2]=(h|0)==256?0:h;c[d>>2]=(c[d>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1);return}default:{d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}}while(0)}}function kj(a,b){a=a|0;b=b|0;c[a+284>>2]=b;return}function lj(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;j=a[b+280>>0]|0;if(!(j&32))return;k=b+288|0;m=(c[k>>2]|0)+e|0;c[k>>2]=m;i=b+292|0;l=(c[i>>2]|0)-f|0;c[i>>2]=l;f=b+296|0;g=(c[f>>2]|0)+g|0;c[f>>2]=g;e=b+300|0;if((m|(g|l)|0)==0?(d[e>>0]|0|0)==(h|0):0)return;a[e>>0]=h;if(j&64)return;if((c[b+264>>2]|0)>=240)return;do mj(b);while(!(((c[k>>2]|0)==0?(c[i>>2]|0)==0:0)?(c[f>>2]|0)==0:0));return}function mj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;l=b+288|0;k=c[l>>2]|0;m=b+292|0;j=c[m>>2]|0;n=b+296|0;d=c[n>>2]|0;k=(k|0)>-127?k:-127;k=(k|0)<127?k:127;j=(j|0)>-127?j:-127;j=(j|0)<127?j:127;h=b+300|0;i=b+264|0;if(((c[i>>2]|0)<=255?(e=b+260|0,a[b+(c[e>>2]|0)>>0]=k>>>31<<4|j>>>31<<5|a[h>>0]&7|8,f=(c[e>>2]|0)+1|0,c[e>>2]=(f|0)==256?0:f,c[i>>2]=(c[i>>2]|0)+1,f=b+272|0,g=b+276|0,eb[c[f>>2]&15](c[g>>2]|0,1),(c[i>>2]|0)<=255):0)?(a[b+(c[e>>2]|0)>>0]=k,o=(c[e>>2]|0)+1|0,c[e>>2]=(o|0)==256?0:o,c[i>>2]=(c[i>>2]|0)+1,eb[c[f>>2]&15](c[g>>2]|0,1),(c[i>>2]|0)<=255):0){a[b+(c[e>>2]|0)>>0]=j;o=(c[e>>2]|0)+1|0;c[e>>2]=(o|0)==256?0:o;c[i>>2]=(c[i>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1)}switch(a[b+284>>0]|0){case 3:{d=(d|0)>-127?d:-127;d=(d|0)<127?d:127;if((c[i>>2]|0)<=255){o=b+260|0;a[b+(c[o>>2]|0)>>0]=d;h=(c[o>>2]|0)+1|0;c[o>>2]=(h|0)==256?0:h;c[i>>2]=(c[i>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}break}case 4:{d=(d|0)>-7?d:-7;d=(d|0)<7?d:7;if((c[i>>2]|0)<=255){o=b+260|0;a[b+(c[o>>2]|0)>>0]=d&15|a[h>>0]<<1&48;h=(c[o>>2]|0)+1|0;c[o>>2]=(h|0)==256?0:h;c[i>>2]=(c[i>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}break}default:{}}c[l>>2]=(c[l>>2]|0)-k;c[m>>2]=(c[m>>2]|0)-j;c[n>>2]=(c[n>>2]|0)-d;return}function nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=b+268|0;switch(c[h>>2]|0){case 232:{a[b+281>>0]=d;e=b+264|0;if((c[e>>2]|0)<=255){d=b+260|0;a[b+(c[d>>2]|0)>>0]=-6;g=(c[d>>2]|0)+1|0;c[d>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[h>>2]=-1;return}case 243:{a[b+282>>0]=d;f=b+285|0;switch(a[f>>0]|0){case 3:{if((d|0)==80){a[b+284>>0]=4;e=0;g=49}else{e=0;g=49}break}case 1:{e=(d|0)==100?2:(d|0)==200?3:0;g=49;break}case 2:{if((d|0)==80){a[b+284>>0]=3;e=0;g=49}else{e=0;g=49}break}default:if((d|0)==200){e=1;g=49}}if((g|0)==49)a[f>>0]=e;e=b+264|0;if((c[e>>2]|0)<=255){d=b+260|0;a[b+(c[d>>2]|0)>>0]=-6;g=(c[d>>2]|0)+1|0;c[d>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[h>>2]=-1;return}default:{e=b+283|0;a:do if(!(a[e>>0]|0))do switch(d|0){case 255:break a;case 230:{e=b+280|0;a[e>>0]=a[e>>0]&-17;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 231:{e=b+280|0;a[e>>0]=a[e>>0]|16;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 234:{e=b+280|0;a[e>>0]=a[e>>0]&-65;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 238:{a[e>>0]=1;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 240:{e=b+280|0;a[e>>0]=a[e>>0]|64;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 242:{e=b+264|0;if((c[e>>2]|0)>255)return;f=b+260|0;a[b+(c[f>>2]|0)>>0]=-6;g=(c[f>>2]|0)+1|0;c[f>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;g=b+272|0;d=b+276|0;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+284>>0]|0;b=(c[f>>2]|0)+1|0;c[f>>2]=(b|0)==256?0:b;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);return}case 243:case 232:{c[h>>2]=d;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 233:{e=b+264|0;if((c[e>>2]|0)>255)return;f=b+260|0;a[b+(c[f>>2]|0)>>0]=-6;g=(c[f>>2]|0)+1|0;c[f>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;g=b+272|0;d=b+276|0;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+280>>0]|0;h=(c[f>>2]|0)+1|0;c[f>>2]=(h|0)==256?0:h;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+281>>0]|0;h=(c[f>>2]|0)+1|0;c[f>>2]=(h|0)==256?0:h;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+282>>0]|0;b=(c[f>>2]|0)+1|0;c[f>>2]=(b|0)==256?0:b;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);return}case 235:{e=b+264|0;if((c[e>>2]|0)<=255){h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}mj(b);return}case 244:{e=b+280|0;a[e>>0]=a[e>>0]|32;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 245:{e=b+280|0;a[e>>0]=a[e>>0]&-33;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 246:{a[b+282>>0]=100;a[b+281>>0]=2;a[b+280>>0]=0;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}default:return}while(0);else switch(d|0){case 255:break a;case 236:{a[e>>0]=0;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}default:{e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=d;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}}while(0);a[b+282>>0]=100;a[b+281>>0]=2;a[b+280>>0]=0;e=b+284|0;a[e>>0]=0;f=b+264|0;if((c[f>>2]|0)>255)return;g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;d=(c[g>>2]|0)+1|0;c[g>>2]=(d|0)==256?0:d;c[f>>2]=(c[f>>2]|0)+1;d=b+272|0;h=b+276|0;eb[c[d>>2]&15](c[h>>2]|0,1);if((c[f>>2]|0)>255)return;a[b+(c[g>>2]|0)>>0]=-86;i=(c[g>>2]|0)+1|0;c[g>>2]=(i|0)==256?0:i;c[f>>2]=(c[f>>2]|0)+1;eb[c[d>>2]&15](c[h>>2]|0,1);if((c[f>>2]|0)>255)return;a[b+(c[g>>2]|0)>>0]=a[e>>0]|0;i=(c[g>>2]|0)+1|0;c[g>>2]=(i|0)==256?0:i;c[f>>2]=(c[f>>2]|0)+1;eb[c[d>>2]&15](c[h>>2]|0,1);return}}}function oj(a,b){a=a|0;b=b|0;var d=0;d=Le(288)|0;c[d+272>>2]=a;c[d+276>>2]=b;c[d+268>>2]=-1;c[d+256>>2]=0;c[d+260>>2]=0;c[d+264>>2]=0;return d|0}function pj(a,b){a=a|0;b=b|0;var d=0;d=Le(304)|0;c[d+272>>2]=a;c[d+276>>2]=b;c[d+268>>2]=-1;c[d+256>>2]=0;c[d+260>>2]=0;c[d+264>>2]=0;return d|0}function qj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;if(!(c[a+16>>2]|0)){lj(c[a>>2]|0,b,d,e,f);return}j=a+4|0;if((c[j>>2]|0)>60)return;i=(c[a+20>>2]|0)!=0&1;g=d<<i;h=a+12|0;c[a+24+(c[h>>2]<<2)>>2]=f<<3&16|f<<5&32|f<<1&8;d=(c[h>>2]|0)+1|0;d=(d|0)==64?0:d;c[h>>2]=d;f=c[j>>2]|0;c[j>>2]=f+1;if(((f|0)<=62?(c[a+24+(d<<2)>>2]=b<<i,l=(c[h>>2]|0)+1|0,l=(l|0)==64?0:l,c[h>>2]=l,i=c[j>>2]|0,c[j>>2]=i+1,(i|0)<=62):0)?(c[a+24+(l<<2)>>2]=g,k=(c[h>>2]|0)+1|0,k=(k|0)==64?0:k,c[h>>2]=k,l=c[j>>2]|0,c[j>>2]=l+1,(l|0)<=62):0){c[a+24+(k<<2)>>2]=0-e;l=(c[h>>2]|0)+1|0;c[h>>2]=(l|0)==64?0:l;c[j>>2]=(c[j>>2]|0)+1}lj(c[a>>2]|0,1,0,0,0);return}function rj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;switch((c[b+8>>2]&255)<<24>>24){case 10:{c[b+4>>2]=1447909480;return}case 39:{g=c[b+4>>2]|0;if((g|0)<=6?(h=a+4|0,d=c[h>>2]|0,(d|0)>=(g|0)):0){if((g|0)>0){e=a+8|0;d=0;f=c[e>>2]|0;do{c[b+(d<<2)>>2]=c[a+24+(f<<2)>>2];i=(c[e>>2]|0)+1|0;f=(i|0)==64?0:i;c[e>>2]=f;d=d+1|0}while((d|0)!=(g|0));d=c[h>>2]|0}c[h>>2]=d-g;return}c[a+16>>2]=0;return}case 40:{c[b>>2]=((c[a+16>>2]|0)==0?-65536:0)|c[a+4>>2];return}case 41:{d=c[b+4>>2]|0;if((d|0)>=1279611474)if((d|0)<1396851026){switch(d|0){case 1279611474:break;default:return}c[a+20>>2]=0;return}else{switch(d|0){case 1396851026:break;default:return}c[a+20>>2]=1;return}if((d|0)<1161905490){switch(d|0){case 245:break;default:return}c[a+16>>2]=0;return}switch(d|0){case 1161905490:break;default:return}d=a+4|0;if((c[d>>2]|0)>=64)return;i=a+12|0;c[a+24+(c[i>>2]<<2)>>2]=876762442;h=(c[i>>2]|0)+1|0;c[i>>2]=(h|0)==64?0:h;c[d>>2]=(c[d>>2]|0)+1;c[a+16>>2]=1;return}default:return}}function sj(a){a=a|0;return c[a+20>>2]|0}function tj(a){a=a|0;var b=0;b=Le(280)|0;c[b>>2]=a;return b|0}function uj(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=Le(20)|0;c[i+12>>2]=f;c[i+16>>2]=g;a[i+2>>0]=3;a[i+1>>0]=24;He(e,h,0,1,0,i,31,29,1)|0;He(e,h+4|0,0,1,0,i,32,30,1)|0;g=i+4|0;c[g>>2]=oj(11,i)|0;h=i+8|0;c[h>>2]=pj(12,i)|0;c[b>>2]=c[g>>2];c[d>>2]=c[h>>2];return i|0}function vj(b,d,e){b=b|0;d=d|0;e=e|0;return ij(c[b+((a[b+3>>0]|0)==2?8:4)>>2]|0)|0}function wj(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;switch(a[b>>0]|0){case 0:{jj(c[b+4>>2]|0,f);a[b>>0]=0;return}case 96:{i=b+2|0;a[i>>0]=f;kj(c[b+4>>2]|0,f>>>6&1);e=b+1|0;g=a[e>>0]|0;f=g&-34;a[e>>0]=f;h=a[b+3>>0]|0;do if(h<<24>>24){a[e>>0]=f|1;if(h<<24>>24==2){a[e>>0]=g|33;g=(d[i>>0]|0)>>>1&1;e=0;break}else{g=0;e=(a[i>>0]&17)==1&1;break}}else{g=0;e=0}while(0);i=c[b+12>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,e);i=c[b+16>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,g);a[b>>0]=0;return}case -46:{gj(c[b+4>>2]|0,f);a[b>>0]=0;return}case -45:{gj(c[b+8>>2]|0,f);a[b>>0]=0;return}case -47:{if(!(f&1))Bj();else{a[b>>0]=0;return}break}case -44:{nj(c[b+8>>2]|0,f);a[b>>0]=0;return}default:{a[b>>0]=0;return}}}function xj(a,b,c){a=a|0;b=b|0;c=c|0;return d[a+1>>0]|0|0}function yj(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+16|0;e=j;do switch(f|0){case 32:{gj(c[b+8>>2]|0,d[b+2>>0]|0);l=j;return}case 209:case 212:case 211:case 210:case 96:{a[b>>0]=f;l=j;return}case 167:{b=b+2|0;a[b>>0]=a[b>>0]|32;l=j;return}case 168:{b=b+2|0;a[b>>0]=a[b>>0]&-33;l=j;return}case 169:{gj(c[b+4>>2]|0,0);l=j;return}case 170:{i=b+1|0;a[i>>0]=a[i>>0]|4;gj(c[b+4>>2]|0,85);l=j;return}case 171:{gj(c[b+4>>2]|0,0);l=j;return}case 173:{g=b+2|0;e=a[g>>0]|0;a[g>>0]=e|16;g=b+1|0;f=a[g>>0]|0;h=f&-34;a[g>>0]=h;i=a[b+3>>0]|0;if(i<<24>>24!=0?(a[g>>0]=h|1,i<<24>>24==2):0){a[g>>0]=f|33;e=(e&255)>>>1&1}else e=0;i=c[b+12>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,0);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,e);l=j;return}case 174:{e=b+2|0;i=a[e>>0]|0;a[e>>0]=i&-17;e=b+1|0;g=a[e>>0]|0;f=g&-34;a[e>>0]=f;h=a[b+3>>0]|0;do if(h<<24>>24){a[e>>0]=f|1;if(h<<24>>24==2){a[e>>0]=g|33;g=(i&255)>>>1&1;e=0;break}else{g=0;e=i&1;break}}else{g=0;e=0}while(0);i=c[b+12>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,e);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,g);l=j;return}case 192:{gj(c[b+4>>2]|0,0);l=j;return}case 208:{i=a[b+1>>0]|0;gj(c[b+4>>2]|0,(i&32|i<<4&16|3)&255);l=j;return}case 254:{Bj();break}case 255:case 221:case 223:{l=j;return}default:{b=c[3662]|0;c[e>>2]=f;nl(b,19995,e)|0;l=j;return}}while(0)}function zj(b,e){b=b|0;e=e|0;var f=0,g=0,h=0;f=b+3|0;h=d[f>>0]|0;h=((e|0)==0?h&254:h|1)&255;a[f>>0]=h;f=b+1|0;g=a[f>>0]|0;e=g&-34;a[f>>0]=e;do if(h<<24>>24){a[f>>0]=e|1;if(h<<24>>24==2){a[f>>0]=g|33;e=(d[b+2>>0]|0)>>>1&1;f=0;break}else{e=0;f=(a[b+2>>0]&17)==1&1;break}}else{e=0;f=0}while(0);h=c[b+12>>2]|0;fb[c[h>>2]&15](c[h+4>>2]|0,c[h+8>>2]|0,f);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,e);return}function Aj(b,e){b=b|0;e=e|0;var f=0,g=0,h=0;f=b+3|0;h=d[f>>0]|0;h=((e|0)==0?h&253:h|2)&255;a[f>>0]=h;f=b+1|0;g=a[f>>0]|0;e=g&-34;a[f>>0]=e;do if(h<<24>>24){a[f>>0]=e|1;if(h<<24>>24==2){a[f>>0]=g|33;e=(d[b+2>>0]|0)>>>1&1;f=0;break}else{e=0;f=(a[b+2>>0]&17)==1&1;break}}else{e=0;f=0}while(0);h=c[b+12>>2]|0;fb[c[h>>2]&15](c[h+4>>2]|0,c[h+8>>2]|0,f);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,e);return}function Bj(){rl(20034)|0;Da(1)}function Cj(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;j=Qd(a,20055,-1,4660,4369,0,768)|0;k=Td(j)|0;l=Ud(j)|0;m=Le(17060)|0;c[m>>2]=d;c[d>>2]=e;c[d+4>>2]=f;e=e<<2;c[d+8>>2]=e;e=(N(e,f)|0)+1048575&-1048576;f=d+16|0;c[f>>2]=e;c[m+4>>2]=e>>12;e=c[f>>2]|0;i=k+2568|0;e=$a[c[i>>2]&15](k,0,0,e,((e|0)<0)<<31>>31,6)|0;c[m+8>>2]=e;c[d+12>>2]=c[e+40>>2];c[m+16>>2]=j;e=c[f>>2]|0;a=1;while(1)if(a>>>0<e>>>0)a=a<<1;else break;Vd(j,0,a,0,m,31);if((h|0)>0){e=h+4095&-4096;a=$a[c[i>>2]&15](k,0,0,e,((e|0)<0)<<31>>31,5)|0;c[m+20>>2]=a;Ll(c[a+40>>2]|0,g|0,h|0)|0;a=1;while(1)if(a>>>0<e>>>0)a=a<<1;else break;Vd(j,6,a,0,m,31)}k=$a[c[i>>2]&15](k,655360,0,131072,0,0)|0;c[m+12>>2]=k;c[m+24>>2]=c[k+40>>2];He(l,960,0,16,0,m,33,32,1)|0;He(l,948,0,2,0,m,34,33,1)|0;He(l,980,0,2,0,m,35,34,1)|0;He(l,954,0,1,0,m,36,35,1)|0;He(l,986,0,1,0,m,37,36,1)|0;He(l,462,0,2,0,m,38,37,2)|0;b[m+17038>>1]=-20283;b[m+17058>>1]=(c[f>>2]|0)>>>16;c[d+20>>2]=m;c[d+24>>2]=12;return m|0}function Dj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(!b){Ie(c[a+8>>2]|0,d,0,e);return}else{Ie(c[a+20>>2]|0,d,0,e);return}}function Ej(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+960|0)|0}function Fj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+960|0,c);return}function Gj(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+948|0)|0}function Hj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+948|0,c);return}function Ij(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+980|0)|0}function Jj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+980|0,c);return}function Kj(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+954|0)|0}function Lj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+954|0,c);return}function Mj(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+986|0)|0}function Nj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+986|0,c);return}function Oj(a,d,f){a=a|0;d=d|0;f=f|0;if(!d){a=e[a+17036>>1]|0;return a|0}f=a+17038|0;d=b[a+17036>>1]|0;a:do if(b[a+17046>>1]&2)switch(d<<16>>16){case 1:{a=c[c[a>>2]>>2]|0;return a|0}case 2:{a=c[(c[a>>2]|0)+4>>2]|0;return a|0}case 3:{a=32;return a|0}default:break a}while(0);if((d&65535)>=11){a=0;return a|0}a=e[f+((d&65535)<<1)>>1]|0;return a|0}function Pj(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;k=c[a>>2]|0;if(!d){b[a+17036>>1]=f;return}i=a+17036|0;j=b[i>>1]|0;g=j&65535;switch(j<<16>>16){case 0:{if((f+-45248|0)>>>0>=6)return;b[a+17038+(g<<1)>>1]=f;return}case 4:{if((f&1|0)!=0?(b[a+17046>>1]&1)==0:0){h=a+17040|0;d=b[h>>1]|0;g=d&65535;j=a+17042|0;if(((d&65535)<4097?(l=b[j>>1]|0,(l&65535)<4097):0)?(m=g<<2,l=N(m,l&65535)|0,(l|0)<=(c[k+16>>2]|0)):0){c[k>>2]=g;c[k+4>>2]=e[j>>1];c[k+8>>2]=m;g=b[i>>1]|0;d=b[h>>1]|0}else g=4;b[a+17050>>1]=d;b[a+17052>>1]=b[j>>1]|0;b[a+17054>>1]=0;b[a+17056>>1]=0}else g=4;b[a+17038+((g&65535)<<1)>>1]=f;return}case 9:case 8:case 7:case 6:case 5:case 3:case 2:case 1:{b[a+17038+(g<<1)>>1]=f;return}default:return}}function Qj(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;U=c[f+20>>2]|0;if(!(a[U+54>>0]&32))return;if(a[U+44>>0]&1){Nd(f,g,h,c[U+8>>2]|0,c[U+4>>2]|0);return}S=c[U>>2]|0;T=U+71|0;l=(a[T>>0]|0)<0;n=d[U+75>>0]<<4;m=n&240;n=n&192;k=0;f=0;do{P=d[U+55+k>>0]|0;P=(l?P&15|m:P&63|n)*3|0;R=d[U+348+P>>0]|0;Q=R&1;i=d[P+1+(U+348)>>0]|0;j=i&1;P=d[P+2+(U+348)>>0]|0;O=P&1;i=O<<1|O|P<<2&252|(Q<<1|Q|R<<2&252)<<16|(j<<1|j|i<<2&252)<<8;j=U+1116+(k<<2)|0;if((i|0)!=(c[j>>2]|0)){c[j>>2]=i;f=1}k=k+1|0}while((k|0)!=16);M=c[U+24>>2]|0;O=d[U+100>>0]<<2;v=d[U+93>>0]<<8|d[U+94>>0];u=a[U+90>>0]&31;P=u+1|0;Q=9-(a[U+30>>0]&1)|0;i=a[U+82>>0]|0;R=(i&255)+1|0;r=d[U+88>>0]|0;r=r<<7&256|d[U+99>>0]|r<<3&512;L=((r+1|0)>>>0)/(P>>>0)|0;o=N(R,Q)|0;p=N(L,P)|0;if((c[S>>2]|0)<(o|0))return;q=S+4|0;if(L>>>0>60|((i&255)>131?1:(c[q>>2]|0)<(p|0)))return;i=U+17028|0;j=U+17030|0;if(!((((O|0)==(e[i>>1]|0)?(v|0)==(e[j>>1]|0):0)?(c[U+17020>>2]|0)==(R|0):0)?(c[U+17024>>2]|0)==(L|0):0)){b[i>>1]=O;b[j>>1]=v;c[U+17020>>2]=R;c[U+17024>>2]=L;f=1}i=d[U+95>>0]<<8|d[U+96>>0];j=i-v|0;k=a[U+91>>0]|0;s=k&255;t=a[U+92>>0]|0;l=U+17032|0;m=b[l>>1]|0;n=m&65535;if(!(((j|0)==(n|0)?k<<24>>24==(a[U+17034>>0]|0):0)?t<<24>>24==(a[U+17035>>0]|0):0)){if((m&65535)<7920)b[U+1180+(n<<1)>>1]=-1;if(j>>>0<7920)b[U+1180+(j<<1)>>1]=-1;b[l>>1]=j;a[U+17034>>0]=k;a[U+17035>>0]=t}K=(i<<1)+98304|0;J=((c[S>>2]|0)-o|0)/2|0;I=((c[q>>2]|0)-p|0)/2|0;if(r>>>0<u>>>0)return;F=S+12|0;G=S+8|0;H=J<<2;B=(f|0)==0;C=Q<<2;D=(Q|0)==8;E=(s&32|0)!=0;A=s&31;y=t&31;y=y>>>0<u>>>0?y:u;z=A>>>0>u>>>0|(y|0)<(A|0);y=y-A+1|0;x=0;u=(v<<1)+98304|0;while(1){v=(N(x,P)|0)+I|0;w=N(x,R)|0;r=0;i=R;f=-1;s=(c[F>>2]|0)+(N(c[G>>2]|0,v)|0)+H|0;t=u;while(1){j=b[M+(t&131070)>>1]|0;l=j&65535;k=U+1180+(r+w<<1)|0;if(!(B?j<<16>>16==(b[k>>1]|0):0)){b[k>>1]=j;i=(i|0)<(r|0)?i:r;f=(f|0)>(r|0)?f:r;j=l&255;k=M+(j<<5)|0;q=c[U+1116+(l>>>12<<2)>>2]|0;p=c[U+1116+((l>>>8&15)<<2)>>2]|0;if(D){m=c[G>>2]|0;n=p^q;l=s;j=k;k=P;while(1){o=d[j>>0]|0;c[l>>2]=n&0-(o>>>7)^q;c[l+4>>2]=n&0-(o>>>6&1)^q;c[l+8>>2]=n&0-(o>>>5&1)^q;c[l+12>>2]=n&0-(o>>>4&1)^q;c[l+16>>2]=n&0-(o>>>3&1)^q;c[l+20>>2]=n&0-(o>>>2&1)^q;c[l+24>>2]=n&0-(o>>>1&1)^q;c[l+28>>2]=n&0-(o&1)^q;k=k+-1|0;if(!k)break;else{l=l+m|0;j=j+1|0}}}else{if((j+-176|0)>>>0<48)j=(d[T>>0]|0)>>>2&1;else j=0;n=c[G>>2]|0;o=p^q;m=(j|0)==0;l=s;j=k;k=P;while(1){V=d[j>>0]|0;c[l>>2]=o&0-(V>>>7)^q;c[l+4>>2]=o&0-(V>>>6&1)^q;c[l+8>>2]=o&0-(V>>>5&1)^q;c[l+12>>2]=o&0-(V>>>4&1)^q;c[l+16>>2]=o&0-(V>>>3&1)^q;c[l+20>>2]=o&0-(V>>>2&1)^q;c[l+24>>2]=o&0-(V>>>1&1)^q;V=o&0-(V&1)^q;c[l+28>>2]=V;c[l+32>>2]=m?q:V;k=k+-1|0;if(!k)break;else{l=l+n|0;j=j+1|0}}}if(!(z|(E|(K|0)!=(t|0)))){n=c[G>>2]|0;j=s+(N(n,A)|0)|0;m=p^q;if(D){k=11680;l=y;while(1){V=d[k>>0]|0;c[j>>2]=m&0-(V>>>7)^q;c[j+4>>2]=m&0-(V>>>6&1)^q;c[j+8>>2]=m&0-(V>>>5&1)^q;c[j+12>>2]=m&0-(V>>>4&1)^q;c[j+16>>2]=m&0-(V>>>3&1)^q;c[j+20>>2]=m&0-(V>>>2&1)^q;c[j+24>>2]=m&0-(V>>>1&1)^q;c[j+28>>2]=m&0-(V&1)^q;l=l+-1|0;if(!l)break;else{j=j+n|0;k=k+1|0}}}else{k=11680;l=y;while(1){V=d[k>>0]|0;c[j>>2]=m&0-(V>>>7)^q;c[j+4>>2]=m&0-(V>>>6&1)^q;c[j+8>>2]=m&0-(V>>>5&1)^q;c[j+12>>2]=m&0-(V>>>4&1)^q;c[j+16>>2]=m&0-(V>>>3&1)^q;c[j+20>>2]=m&0-(V>>>2&1)^q;c[j+24>>2]=m&0-(V>>>1&1)^q;V=m&0-(V&1)^q;c[j+28>>2]=V;c[j+32>>2]=V;l=l+-1|0;if(!l)break;else{j=j+n|0;k=k+1|0}}}}}r=r+1|0;if((r|0)==(R|0))break;else{s=s+C|0;t=t+2|0}}if((f|0)>=(i|0)){w=(N(i,Q)|0)+J|0;V=N(f+1-i|0,Q)|0;ib[g&1](S,h,w,v,V,P)}x=x+1|0;if(x>>>0>=L>>>0)break;else u=u+O|0}return}function Rj(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;switch(e&-16|0){case 944:{if(a[b+337>>0]&1)return;break}case 976:{if(!(a[b+337>>0]&1))return;break}default:{}}do switch(e|0){case 960:{e=b+76|0;a:do if(!(c[e>>2]|0))a[b+54>>0]=f&63;else{h=a[b+54>>0]|0;g=h&31;switch(h&31){case 15:case 14:case 13:case 12:case 11:case 10:case 9:case 8:case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:{a[b+55+g>>0]=f&63;break a}case 16:{a[b+55+g>>0]=f&239;break a}case 17:{a[b+55+g>>0]=f;break a}case 18:{a[b+55+g>>0]=f&63;break a}case 19:{a[b+55+g>>0]=f&15;break a}case 20:{a[b+55+g>>0]=f&15;break a}default:break a}}while(0);c[e>>2]=c[e>>2]^1;return}case 962:{a[b+337>>0]=f&239;return}case 964:{a[b+28>>0]=f&7;return}case 965:{h=d[b+28>>0]|0;a[b+29+h>>0]=d[20059+h>>0]&f;return}case 967:{a[b+343>>0]=f;a[b+342>>0]=0;a[b+341>>0]=3;return}case 968:{a[b+344>>0]=f;a[b+342>>0]=0;a[b+341>>0]=0;return}case 969:{e=b+342|0;h=a[e>>0]|0;a[(h&255)+(b+345)>>0]=f;h=h+1<<24>>24;a[e>>0]=h;if(h<<24>>24!=3)return;h=b+344|0;f=a[h>>0]|0;g=((f&255)*3|0)+(b+348)|0;b=b+345|0;a[g>>0]=a[b>>0]|0;a[g+1>>0]=a[b+1>>0]|0;a[g+2>>0]=a[b+2>>0]|0;a[e>>0]=0;a[h>>0]=f+1<<24>>24;return}case 974:{a[b+37>>0]=f&15;return}case 975:{h=d[b+37>>0]|0;a[b+38+h>>0]=d[11712+h>>0]&f;return}case 980:case 948:{a[b+80>>0]=f;return}case 981:case 949:{e=a[b+80>>0]|0;if((a[b+98>>0]|0)<0&(e&255)<8){if(e<<24>>24!=7)return;h=b+88|0;a[h>>0]=f&16|a[h>>0]&-17&255;return}switch(e<<24>>24){case 18:case 13:case 12:case 9:case 7:case 1:{a[(e&255)+(b+81)>>0]=f;return}default:{a[(e&255)+(b+81)>>0]=f;return}}}case 986:case 954:{a[b+338>>0]=f&16;return}default:return}while(0)}function Sj(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;switch(e&-16|0){case 944:{if(a[b+337>>0]&1){b=255;return b|0}break}case 976:{if(!(a[b+337>>0]&1)){b=255;return b|0}break}default:{}}do switch(e|0){case 960:{if(c[b+76>>2]|0){b=0;return b|0}b=d[b+54>>0]|0;return b|0}case 961:{e=a[b+54>>0]&31;if((e&255)>=21){b=0;return b|0}b=d[(e&255)+(b+55)>>0]|0;return b|0}case 962:{b=d[b+339>>0]|0;return b|0}case 964:{b=d[b+28>>0]|0;return b|0}case 965:{b=d[(d[b+28>>0]|0)+(b+29)>>0]|0;return b|0}case 967:{b=d[b+341>>0]|0;return b|0}case 968:{b=d[b+344>>0]|0;return b|0}case 969:{f=b+343|0;g=a[f>>0]|0;h=b+342|0;i=a[h>>0]|0;e=d[((g&255)*3|0)+(i&255)+(b+348)>>0]|0;b=i+1<<24>>24;a[h>>0]=b;if(b<<24>>24!=3){i=e;return i|0}a[h>>0]=0;a[f>>0]=g+1<<24>>24;i=e;return i|0}case 970:{i=d[b+338>>0]|0;return i|0}case 972:{i=d[b+337>>0]|0;return i|0}case 974:{i=d[b+37>>0]|0;return i|0}case 975:{i=d[(d[b+37>>0]|0)+(b+38)>>0]|0;return i|0}case 980:case 948:{i=d[b+80>>0]|0;return i|0}case 981:case 949:{i=d[(d[b+80>>0]|0)+(b+81)>>0]|0;return i|0}case 986:case 954:{h=b+340|0;i=a[h>>0]^9;a[h>>0]=i;c[b+76>>2]=0;i=i&255;return i|0}default:{i=0;return i|0}}while(0);return 0}
+function Pg(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0,j=0;b=c[5634]|0;j=b&65535;d=c[5755]&15;d=(d|0)==0?3:d+-1|0;b=ig(b&65535,1,0)|0;if((b|0)<0){if((c[5746]|0)!=32){j=b;return j|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;i=a;j=c[i+4>>2]|0;c[a>>2]=c[i>>2]|8;c[a+4>>2]=j;a=c[5755]|0}h=(c[5766]|0)+120|0;g=h;j=c[g+4>>2]|0;c[h>>2]=c[g>>2]|(a&128^128)+128;c[h+4>>2]=j;h=d<<10|4;j=(c[5766]|0)+120|0;g=j;i=c[g+4>>2]|((h|0)<0)<<31>>31;c[j>>2]=c[g>>2]|h;c[j+4>>2]=i;j=b;return j|0}f=c[5755]|0;g=f<<9&65536;h=g+-1|0;i=c[5638]|0;if(f&48){f=c[5633]|0;if(!(f&h)){j=0;return j|0}a=(c[22740+(d<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if((b|a)&1)if(!(zf(a,1,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=e[b+a>>1]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,1);g=0-g|0;c[5638]=(c[5646]<<1)+i&h|i&g;j=f+-1&h;c[5633]=j|f&g;if(j|0){j=1;return j|0}}else{a=(c[22740+(d<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if((b|a)&1)if(!(zf(a,1,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=e[b+a>>1]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,1);c[5638]=(c[5646]<<1)+i&h|i&0-g}j=0;return j|0}function Qg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m+8|0;k=m+4|0;g=m;h=(a[22968]|0)==3&1;i=(e|0)!=0;f=h<<20|d>>>12;f=c[(i?8411692+(f<<2)|0:23084+(f<<2)|0)>>2]|0;if(f&1){if(wf(g,j,k,d,e,h)|0){b=-1;l=m;return b|0}f=c[g>>2]|0;h=Ge(c[4202123]|0,f,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0){e=f-(c[h+8>>2]|0)|0;f=c[h+48>>2]|0;g=(f|0)==0;if(i){f=f+(e>>>17<<2)|0;if(!g)c[f>>2]=c[f>>2]|1<<(e>>>12&31)}else if(!g?(c[f+(e>>>17<<2)>>2]&1<<(e>>>12&31)|0)==0:0)c[j>>2]=0;f=(c[h+40>>2]|0)+e|0;xf(d,f,c[j>>2]|0,c[k>>2]|0)}else f=0}else f=f+d|0;c[b>>2]=f;b=0;l=m;return b|0}function Rg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=c[5766]|0;if(!e){d=0;return d|0}if(!(c[e+12>>2]&268435456)){d=0;return d|0}a:do if(b>>>0>=8192){f=b&-8192;if((f|0)<-1073676288){switch(f|0){case -1073741824:break;default:break a}f=b+1073750016|0;g=7;break}else{switch(f|0){case -1073676288:break;default:break a}f=b+1073758208|0;g=7;break}}else{f=b;g=7}while(0);do if((g|0)==7){e=(c[e+72>>2]&-4096)+(f>>>2)|0;b=Ge(c[4202123]|0,e,0)|0;if((b|0)!=0?(c[b+32>>2]|0)!=0:0)e=a[(c[b+40>>2]|0)+(e-(c[b+8>>2]|0))>>0]|0;else e=0;if(!(1<<(f<<1&6)+d&(e&255))){d=0;return d|0}else{e=c[5766]|0;break}}while(0);c[5746]=32;g=e+112|0;c[g>>2]=124;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=d;c[g+4>>2]=((d|0)<0)<<31>>31;d=-1;return d|0}function Sg(d,f){d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=2<<f;g=c[5770]|0;f=c[23084+(g+(d>>>12)<<2)>>2]|0;do if((f|d)&1)if(!(zf(d,1,0,2)|0)){k=c[5762]|0;g=c[5770]|0;break}else{l=-1;return l|0}else k=e[f+d>>1]|0;while(0);f=j+d|0;h=c[23084+(g+(f>>>12)<<2)>>2]|0;do if((h|f)&1)if(!(zf(f,1,0,2)|0)){i=c[5762]|0;g=c[5770]|0;break}else{l=-1;return l|0}else i=e[h+f>>1]|0;while(0);h=(j<<1)+d|0;f=c[23084+(g+(h>>>12)<<2)>>2]|0;do if((f|h)&1)if(!(zf(h,1,0,2)|0)){f=c[5762]|0;break}else{l=-1;return l|0}else f=e[f+h>>1]|0;while(0);k=k&65535;b[11299]=k;c[5648]=i>>>11&7;b[11298]=i&51199;a[22600]=(f&3|0)==3&1;a[22601]=(f&12|0)==12&1;a[22602]=(f&48|0)==48&1;a[22603]=(f&192|0)==192&1;a[22604]=(f&768|0)==768&1;a[22605]=(f&3072|0)==3072&1;a[22606]=(f&12288|0)==12288&1;a[22607]=(f&49152|0)==49152&1;switch((k&65535)>>>10&3){case 0:{l=0;break}case 1:{l=1;break}case 2:{l=2;break}case 3:{l=3;break}default:{}}Yh(l,22736);l=(e[11299]|0)>>>8&255;Zh((l&3)==0?32:(l&3)==2?64:80,22736);l=0;return l|0}function Tg(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=b[11298]&-14337;l=c[5648]<<11;f=0;j=7;while(1){i=f<<2;do if(!(a[22600+j>>0]|0)){h=22608+(j<<4)|0;g=c[h>>2]|0;h=c[h+4>>2]|0;f=b[22608+(j<<4)+8>>1]|0;if((g|0)==0&(h|0)==0&(f&32767)==0){n=i|1;break}a:do if(f<<16>>16<0)if(f<<16>>16<-1)switch(f<<16>>16){case -32768:break a;default:{m=7;break a}}else switch(f<<16>>16){case -1:break a;default:{m=7;break a}}else if(f<<16>>16<32767)switch(f<<16>>16){case 0:break a;default:{m=7;break a}}else switch(f<<16>>16){case 32767:break a;default:{m=7;break a}}while(0);if((m|0)==7?(m=0,!((h|0)>-1|(h|0)==-1&g>>>0>4294967295)):0){n=i;break}n=i|2}else n=i|3;while(0);if(!j)break;else{f=n;j=j+-1|0}}j=l|k&65535;f=b[11299]|0;g=f&65535;h=c[8411692+((c[5770]|0)+(d>>>12)<<2)>>2]|0;i=h|d;do if(!e){if(i&1){if(Bf(d,g,1,2)|0){d=-1;return d|0}}else b[h+d>>1]=f;f=d+2|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,j,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=j;f=d+4|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,n,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=n;f=d+6|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,0,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=0;f=d+8|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,0,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=0;f=d+10|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,0,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=0;f=d+12|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&1)){b[g+f>>1]=0;break}if(Bf(f,0,1,2)|0){d=-1;return d|0}}else{if(i&3){if(Bf(d,g,2,2)|0){d=-1;return d|0}}else c[h+d>>2]=g;f=d+4|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,j,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=j;f=d+8|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,n,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=n;f=d+12|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,0,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=0;f=d+16|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,0,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=0;f=d+20|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,0,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=0;f=d+24|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&3)){c[g+f>>2]=0;break}if(Bf(f,0,2,2)|0){d=-1;return d|0}}while(0);d=0;return d|0}function Ug(a,b){a=a|0;b=b|0;var f=0,g=0,h=0;g=l;l=l+32|0;f=g+16|0;h=g;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[h+12>>2]=c[a+12>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];b=Gi(h,f,1,22736)|0;a=nf(22528)|0;if((c[5643]|0)==24){h=c[5641]|0;f=h>>>7&1;a=h&4|a|((c[5642]|0)==0&1)<<6}else{h=c[5642]|0;f=h>>>31;a=(d[21168+(h&255)>>0]|0)<<2|a|((h|0)==0&1)<<6}f=f<<7|a|(uf()|0)<<11;f=(f|(vf()|0))&-70;h=e[15280+(b+1<<1)>>1]|0;c[5641]=f|h;c[5642]=h>>>6&1^1;c[5643]=24;l=g;return}function Vg(a,b){a=a|0;b=b|0;var f=0,g=0,h=0;g=l;l=l+32|0;f=g+16|0;h=g;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[h+12>>2]=c[a+12>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];b=Gi(h,f,0,22736)|0;a=nf(22528)|0;if((c[5643]|0)==24){h=c[5641]|0;f=h>>>7&1;a=h&4|a|((c[5642]|0)==0&1)<<6}else{h=c[5642]|0;f=h>>>31;a=(d[21168+(h&255)>>0]|0)<<2|a|((h|0)==0&1)<<6}f=f<<7|a|(uf()|0)<<11;f=(f|(vf()|0))&-70;h=e[15280+(b+1<<1)>>1]|0;c[5641]=f|h;c[5642]=h>>>6&1^1;c[5643]=24;l=g;return}function Wg(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=c[5636]|0;i=c[5694]|0;h=i+(k&65535)|0;f=c[23084+(h>>>12<<2)>>2]|0;g=f|h;if((a|0)==1){if(g&3)if(!(zf(h,2,0,0)|0))f=23048;else{b=-1;return b|0}else f=f+h|0;j=c[f>>2]|0;f=(k+4&65535)+i|0;g=c[23084+(f>>>12<<2)>>2]|0;if((g|f)&3)if(!(zf(f,2,0,0)|0))f=23048;else{b=-1;return b|0}else f=g+f|0;g=k+8|0;f=c[f>>2]&65535;if(!b){i=g;g=0;h=j}else{g=(g&65535)+i|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{b=-1;return b|0}else g=h+g|0;i=k+12|0;g=c[g>>2]|0;h=j}}else{do if(g&1)if(!(zf(h,1,0,0)|0)){j=c[5762]|0;break}else{b=-1;return b|0}else j=e[f+h>>1]|0;while(0);f=(k+2&65535)+i|0;g=c[23084+(f>>>12<<2)>>2]|0;do if((g|f)&1)if(!(zf(f,1,0,0)|0)){f=c[5762]|0;break}else{b=-1;return b|0}else f=e[g+f>>1]|0;while(0);g=k+4|0;if(!b){i=g;g=0;h=j}else{g=(g&65535)+i|0;h=c[23084+(g>>>12<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,0)|0)){g=c[5762]|0;break}else{b=-1;return b|0}else g=e[h+g>>1]|0;while(0);i=k+6|0;h=j}}k=c[5729]|0;c[5636]=c[5636]&~k|k&i+d;c[5689]=f;f=f<<4;c[5690]=f;c[5640]=h;if(b|0){d=c[5647]|0;b=(d&131072|0)==0?2454272:2441984;b=(a|0)==0?b&29440:b;c[5641]=g&2261;c[5642]=g>>>6&1^1;c[5643]=24;c[5646]=1-(g>>>9&2);c[5647]=d&~b|b&g}b=(c[5696]|0)>>>6&65536;c[5729]=(b^65536)+-1;c[5731]=(c[5694]|f|c[5698]|c[5686]|0)==0?b>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;b=0;return b|0}function Xg(f,g,h,i,j,k,m){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=l;l=l+64|0;H=J+32|0;I=J;p=c[5766]|0;if(p|0?c[p+12>>2]&536870912|0:0){c[5746]=32;I=p+112|0;c[I>>2]=125;c[I+4>>2]=0;I=(c[5766]|0)+120|0;c[I>>2]=f&65535;c[I+4>>2]=0;I=(c[5766]|0)+128|0;c[I>>2]=m;c[I+4>>2]=0;switch(i|0){case 0:{n=0;o=64;E=5;break}case 1:{n=0;o=16;E=5;break}default:{}}if((E|0)==5){m=(c[5766]|0)+128|0;H=m;I=c[H+4>>2]|o;c[m>>2]=c[H>>2]|n;c[m+4>>2]=I}if(k|0){m=(c[5766]|0)+128|0;k=m;I=c[k+4>>2]|4096;c[m>>2]=c[k>>2];c[m+4>>2]=I}if(!(c[5647]&65536)){m=-1;l=J;return m|0}m=(c[5766]|0)+128|0;k=m;I=c[k+4>>2]|65536;c[m>>2]=c[k>>2];c[m+4>>2]=I;m=-1;l=J;return m|0}n=h>>>8&15;if((n|0)==5){if(!(h&32768)){c[5746]=11;c[5747]=f&-4&65535;m=-1;l=J;return m|0}p=g>>>16;f=p&65535;if(g&262144|0){c[5746]=10;c[5747]=p&65532;m=-1;l=J;return m|0}n=(g>>>17&2^2)+6|0;if((p|7)>>>0>(c[22740+(n<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=p&65532;m=-1;l=J;return m|0}g=(c[22740+(n<<4)+4>>2]|0)+(p&65528)|0;n=c[23084+(g>>>12<<2)>>2]|0;if((n|g)&3)if(!(zf(g,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=n+g|0;o=c[n>>2]|0;n=g+4|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;g=c[n>>2]|0;if(g&4096|0){c[5746]=13;c[5747]=p&65532;m=-1;l=J;return m|0}if((g&1792|0)==256){n=g>>>8&15;h=g;g=o}else{c[5746]=13;c[5747]=p&65532;m=-1;l=J;return m|0}}if(!(h&32768)){c[5746]=11;c[5747]=f&-4&65535;m=-1;l=J;return m|0}D=(n&8|0)!=0;C=h&983040|g&65535;C=(h&8388608|0)==0?C:C<<12|4095;z=g>>>16;B=h&-16777216|z|h<<16&16711680;A=f&65535;if((A&4|0)!=0|(C|0)<((D?103:43)|0)){c[5746]=10;c[5747]=A&65532;m=-1;l=J;return m|0}x=(c[5716]&2048|0)!=0;v=x?103:43;if(D){n=B+28|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;s=c[n>>2]|0;n=B+32|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;r=c[n>>2]|0;n=B+36|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;q=c[n>>2]|0;p=B+40|0;o=0;do{f=H+(o<<2)|0;n=p+(o<<2)|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{y=-1;E=173;break}else n=g+n|0;c[f>>2]=c[n>>2];o=o+1|0}while(o>>>0<8);if((E|0)==173){l=J;return y|0}n=B+72|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[I>>2]=n;o=I+4|0;n=B+76|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+8|0;n=B+80|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+12|0;n=B+84|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+16|0;n=B+88|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+20|0;n=B+92|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;n=B+96|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){g=c[5762]|0;break}else{m=-1;l=J;return m|0}else g=e[g+n>>1]|0;while(0);n=B+100|0;if(((c[23084+(n>>>12<<2)>>2]|n)&3|0)!=0?(zf(n,2,0,0)|0)!=0:0){m=-1;l=J;return m|0}else{w=g;u=q}}else{n=B+14|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){r=c[5762]|0;break}else{m=-1;l=J;return m|0}else r=e[g+n>>1]|0;while(0);n=B+16|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){q=c[5762]|0;break}else{m=-1;l=J;return m|0}else q=e[g+n>>1]|0;while(0);p=B+18|0;o=0;do{f=H+(o<<2)|0;n=p+(o<<1)|0;g=c[23084+(n>>>12<<2)>>2]|0;if(!((g|n)&1))n=e[g+n>>1]|0;else{if(zf(n,1,0,0)|0){y=-1;E=173;break}n=c[5762]|0}c[f>>2]=n|-65536;o=o+1|0}while(o>>>0<8);if((E|0)==173){l=J;return y|0}n=B+34|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[I>>2]=n;o=I+4|0;n=B+38|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+8|0;n=B+42|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+12|0;n=B+46|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;n=B+42|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[I+16>>2]=0;c[I+20>>2]=0;s=0;w=n;u=q}t=c[5714]|0;f=t>>>12;n=c[23084+(f<<2)>>2]|0;do if(n&1)if(!(zf(t,0,0,0)|0)){p=c[5762]|0;break}else{m=-1;l=J;return m|0}else p=d[n+t>>0]|0;while(0);q=t+v|0;o=q>>>12;n=c[23084+(o<<2)>>2]|0;do if(n&1)if(!(zf(q,0,0,0)|0)){g=c[5762]|0;break}else{m=-1;l=J;return m|0}else g=d[n+q>>0]|0;while(0);n=c[8411692+(f<<2)>>2]|0;if(n&1){if(Bf(t,p,0,0)|0){m=-1;l=J;return m|0}}else a[n+t>>0]=p;n=c[8411692+(o<<2)>>2]|0;if(n&1){if(Bf(q,g,0,0)|0){m=-1;l=J;return m|0}}else a[n+q>>0]=g;p=(i|0)==1;do if(i>>>0<2){f=(c[5718]|0)+4+(c[5713]&-8)|0;o=f>>>12;n=c[23084+(o<<2)>>2]|0;if((f|n)&3)if(!(zf(f,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=f+n|0;g=c[n>>2]&-513;n=c[8411692+(o<<2)>>2]|0;if(!((n|f)&3)){c[n+f>>2]=g;break}if(Bf(f,g,2,0)|0){m=-1;l=J;return m|0}}while(0);o=sf()|0;o=p?o&-16385:o;do if(!x){n=t+14|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&1){if(Bf(n,j,1,0)|0){m=-1;l=J;return m|0}}else b[g+n>>1]=j;n=t+16|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&1){if(Bf(n,o,1,0)|0){m=-1;l=J;return m|0}}else b[g+n>>1]=o;g=t+18|0;n=0;do{o=g+(n<<1)|0;p=c[22528+(n<<2)>>2]|0;f=c[8411692+(o>>>12<<2)>>2]|0;if((f|o)&1){if(Bf(o,p,1,0)|0){y=-1;E=173;break}}else b[f+o>>1]=p;n=n+1|0}while(n>>>0<8);if((E|0)==173){l=J;return y|0}n=t+34|0;g=c[5685]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+38|0;g=c[5689]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+42|0;g=c[5693]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+46|0;g=c[5697]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if(!((o|n)&1)){b[o+n>>1]=g;break}if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else{n=t+32|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&3){if(Bf(n,j,2,0)|0){m=-1;l=J;return m|0}}else c[g+n>>2]=j;n=t+36|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&3){if(Bf(n,o,2,0)|0){m=-1;l=J;return m|0}}else c[g+n>>2]=o;g=t+40|0;n=0;do{o=g+(n<<2)|0;p=c[22528+(n<<2)>>2]|0;f=c[8411692+(o>>>12<<2)>>2]|0;if((f|o)&3){if(Bf(o,p,2,0)|0){y=-1;E=173;break}}else c[f+o>>2]=p;n=n+1|0}while(n>>>0<8);if((E|0)==173){l=J;return y|0}n=t+72|0;g=c[5685]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+76|0;g=c[5689]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+80|0;g=c[5693]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+84|0;g=c[5697]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+88|0;g=c[5701]|0;o=c[8411692+(n>>>12<<2)>>2]|0;do if(!((o|n)&1))b[o+n>>1]=g;else{if(!(Bf(n,g,1,0)|0))break;else y=-1;l=J;return y|0}while(0);n=t+92|0;g=c[5705]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if(!((o|n)&1)){b[o+n>>1]=g;break}if(!(Bf(n,g,1,0)|0))break;else y=-1;l=J;return y|0}while(0);if((i|0)!=2)if((i|2|0)==2){G=u;E=137}else F=u;else{n=c[5713]|0;g=c[8411692+(B>>>12<<2)>>2]|0;if((g|z)&1){if(Bf(B,n,1,0)|0){m=-1;l=J;return m|0}}else b[g+B>>1]=n;G=u|16384;E=137}do if((E|0)==137){p=(A&65528|4)+(c[5718]|0)|0;o=p>>>12;n=c[23084+(o<<2)>>2]|0;if((n|p)&3)if(!(zf(p,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=n+p|0;g=c[n>>2]|512;n=c[8411692+(o<<2)>>2]|0;if(!((n|p)&3)){c[n+p>>2]=g;F=G;break}if(!(Bf(p,g,2,0)|0))F=G;else{m=-1;l=J;return m|0}}while(0);G=c[5732]|8;c[5732]=G;c[5713]=A;c[5714]=B;c[5715]=C;c[5716]=h&-513;if(D&(G|0)<0){c[5734]=s;g=c[5769]|0;if((g|0)>0){n=0;do{G=c[16800300+(n<<2)>>2]|0;c[23084+(G<<2)>>2]=-1;c[8411692+(G<<2)>>2]=-1;G=G+1048576|0;c[23084+(G<<2)>>2]=-1;c[8411692+(G<<2)>>2]=-1;n=n+1|0}while((n|0)!=(g|0))}c[5769]=0}c[5640]=r;g=D?2585344:29440;c[5641]=F&2261;c[5642]=F>>>6&1^1;c[5643]=24;c[5646]=1-(F>>>9&2);c[5647]=c[5647]&~g|F&g;c[5632]=c[H>>2];c[5633]=c[H+4>>2];c[5634]=c[H+8>>2];c[5635]=c[H+12>>2];c[5636]=c[H+16>>2];c[5637]=c[H+20>>2];c[5638]=c[H+24>>2];c[5639]=c[H+28>>2];g=(F&131072|0)==0;if(g){n=c[I+4>>2]&3;a[22968]=n;c[5770]=(n|0)==3?1048576:0;n=0;do{c[22740+(n<<4)>>2]=c[I+(n<<2)>>2];c[22740+(n<<4)+4>>2]=0;c[22740+(n<<4)+8>>2]=0;c[22740+(n<<4)+12>>2]=0;H=(c[5696]|0)>>>6&65536;c[5729]=(H^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?H>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;n=n+1|0}while((n|0)!=6)}else{n=0;do{H=c[I+(n<<2)>>2]|0;c[22740+(n<<4)>>2]=H;c[22740+(n<<4)+4>>2]=H<<4;c[22740+(n<<4)+8>>2]=65535;c[22740+(n<<4)+12>>2]=62208;H=(c[5696]|0)>>>6&65536;c[5729]=(H^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?H>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;n=n+1|0}while((n|0)!=6);a[22968]=3;c[5770]=1048576}c[5709]=w&-5;c[5710]=0;c[5711]=0;c[5712]=0;if(rg(w,1)|0){m=-1;l=J;return m|0}do if(g){if(Zg(1,c[I+4>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(2,c[I+8>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(0,c[I>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(3,c[I+12>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(4,c[I+16>>2]|0,1)|0){m=-1;l=J;return m|0}if(!(Zg(5,c[I+20>>2]|0,1)|0))break;else y=-1;l=J;return y|0}while(0);if(k|0){g=((c[5696]|0)>>>6&65536^65536)+-1|0;o=c[5694]|0;n=c[5636]|0;do if(D){n=n+-4|0;g=(g&n)+o|0;o=c[8411692+(g>>>12<<2)>>2]|0;if(!((o|g)&3)){c[o+g>>2]=m;break}if(!(Bf(g,m,2,0)|0))break;else y=-1;l=J;return y|0}else{n=n+-2|0;g=(g&n)+o|0;o=c[8411692+(g>>>12<<2)>>2]|0;if(!((o|g)&1)){b[o+g>>1]=m;break}if(!(Bf(g,m,1,0)|0))break;else y=-1;l=J;return y|0}while(0);m=c[5729]|0;c[5636]=c[5636]&~m|m&n}if(r>>>0<=(c[5691]|0)>>>0){m=0;l=J;return m|0}c[5746]=13;c[5747]=0;m=-1;l=J;return m|0}function Yg(b,d,f){b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=((c[5696]|0)>>>6&65536^65536)+-1|0;q=c[5636]|0;w=c[5694]|0;l=(b|0)==1;g=(v&q)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;i=g|h;if(l){if(i&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=g+h|0;p=c[g>>2]|0;g=(v&q+4)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))h=23048;else{d=-1;return d|0}else h=h+g|0;g=q+8|0;j=c[h>>2]&65535;if(d){g=(v&g)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;o=c[g>>2]|0;g=q+12|0;if(o&131072){g=(v&g)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;n=c[g>>2]|0;g=(v&q+16)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;m=c[g>>2]|0;g=(v&q+20)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;l=c[g>>2]|0;g=(v&q+24)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;k=c[g>>2]|0;g=(v&q+28)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;i=c[g>>2]|0;g=(v&q+32)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;d=c[g>>2]|0;c[5641]=o&2261;c[5642]=o>>>6&1^1;c[5643]=24;c[5646]=1-(o>>>9&2);c[5647]=c[5647]&-4092673|o&4092672;c[5689]=j;c[5690]=j<<4;c[5691]=65535;c[5692]=62208;a[22968]=3;c[5770]=1048576;b=m&65535;c[5693]=b;c[5694]=b<<4;c[5695]=65535;c[5696]=62208;b=l&65535;c[5685]=b;c[5686]=b<<4;c[5687]=65535;c[5688]=62208;b=k&65535;c[5697]=b;c[5698]=b<<4;c[5699]=65535;c[5700]=62208;b=i&65535;c[5701]=b;c[5702]=b<<4;c[5703]=65535;c[5704]=62208;d=d&65535;c[5705]=d;c[5706]=d<<4;c[5707]=65535;c[5708]=62208;c[5729]=65535;c[5731]=0;c[5730]=384;c[5640]=p&65535;c[5636]=n;d=0;return d|0}}else o=0}else{do if(i&1)if(!(zf(g,1,0,0)|0)){i=c[5762]|0;break}else{d=-1;return d|0}else i=e[g+h>>1]|0;while(0);g=(v&q+2)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,0)|0)){j=c[5762]|0;break}else{d=-1;return d|0}else j=e[h+g>>1]|0;while(0);g=q+4|0;if(!d){p=i;o=0}else{g=(v&g)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,0)|0)){h=c[5762]|0;break}else{d=-1;return d|0}else h=e[h+g>>1]|0;while(0);g=q+6|0;p=i;o=h}}k=j&65532;if(!k){c[5746]=13;c[5747]=0;d=-1;return d|0}h=(j>>>1&2^2)+6|0;if((j|7)>>>0>(c[22740+(h<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=k;d=-1;return d|0}i=(c[22740+(h<<4)+4>>2]|0)+(j&-8)|0;h=c[23084+(i>>>12<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,0)|0))h=23048;else{d=-1;return d|0}else h=h+i|0;r=c[h>>2]|0;h=i+4|0;i=c[23084+(h>>>12<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,0)|0))h=23048;else{d=-1;return d|0}else h=i+h|0;q=c[h>>2]|0;if((q&6144|0)!=6144){c[5746]=13;c[5747]=k;d=-1;return d|0}t=a[22968]|0;u=t&255;s=j&3;if(s>>>0<u>>>0){c[5746]=13;c[5747]=k;d=-1;return d|0}h=q>>>13&3;if(!(q&1024)){if((h|0)!=(s|0)){c[5746]=13;c[5747]=k;d=-1;return d|0}}else if(h>>>0>s>>>0){c[5746]=13;c[5747]=k;d=-1;return d|0}if(!(q&32768)){c[5746]=11;c[5747]=k;d=-1;return d|0}h=g+f|0;if((s|0)==(u|0)){w=q&-16777216|r>>>16|q<<16&16711680;f=q&983040|r&65535;c[5689]=j;c[5690]=w;c[5691]=(q&8388608|0)==0?f:f<<12|4095;c[5692]=q;f=(c[5696]|0)>>>6&65536;g=(f^65536)+-1|0;c[5729]=g;c[5731]=(c[5694]|w|c[5698]|c[5686]|0)==0?f>>>16:0;c[5730]=(q&4194304|0)==0?384:0}else{g=(h&v)+w|0;i=c[23084+(g>>>12<<2)>>2]|0;k=i|g;do if(!l){do if(k&1)if(!(zf(g,1,0,0)|0)){i=c[5762]|0;break}else{d=-1;return d|0}else i=e[i+g>>1]|0;while(0);g=(h+2&v)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if(!((h|g)&1)){n=i;k=e[h+g>>1]|0;break}if(!(zf(g,1,0,0)|0)){n=i;k=c[5762]|0;break}else{d=-1;return d|0}}else{if(k&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=i+g|0;i=c[g>>2]|0;g=(h+4&v)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;n=i;k=c[g>>2]&65535}while(0);l=k&65532;if(!l){c[5746]=13;c[5747]=0;d=-1;return d|0}if((k&3|0)!=(s|0)){c[5746]=13;c[5747]=l;d=-1;return d|0}g=(k>>>1&2^2)+6|0;if((k|7)>>>0>(c[22740+(g<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=l;d=-1;return d|0}h=(c[22740+(g<<4)+4>>2]|0)+(k&-8)|0;g=c[23084+(h>>>12<<2)>>2]|0;if((g|h)&3)if(!(zf(h,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=g+h|0;i=c[g>>2]|0;g=h+4|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;g=c[g>>2]|0;if((g&6656|0)!=4608){c[5746]=13;c[5747]=l;d=-1;return d|0}if((g>>>13&3|0)!=(s|0)){c[5746]=13;c[5747]=l;d=-1;return d|0}if(!(g&32768)){c[5746]=11;c[5747]=l;d=-1;return d|0}w=g&-16777216|i>>>16|g<<16&16711680;m=g&983040|i&65535;c[5693]=k;c[5694]=w;c[5695]=(g&8388608|0)==0?m:m<<12|4095;c[5696]=g;m=g>>>6&65536;g=(m^65536)+-1|0;h=c[5698]|0;i=c[5686]|0;m=m>>>16;l=q&-16777216|r>>>16|q<<16&16711680;k=q&983040|r&65535;c[5689]=j;c[5690]=l;c[5691]=(q&8388608|0)==0?k:k<<12|4095;c[5692]=q;c[5729]=g;l=w|l;j=h|l;c[5731]=(j|i|0)==0?m:0;k=(q&4194304|0)==0?384:0;c[5730]=k;a[22968]=s;c[5770]=(s|0)==3?1048576:0;w=c[5688]|0;if((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0){c[5685]=0;c[5686]=0;c[5687]=0;c[5688]=0;c[5729]=g;c[5731]=(j|0)==0?m:0;c[5730]=k;i=0}w=c[5700]|0;if((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0){c[5697]=0;c[5698]=0;c[5699]=0;c[5700]=0;c[5729]=g;c[5731]=(l|i|0)==0?m:0;c[5730]=k;h=0}do if(c[5701]&65532|0){w=c[5704]|0;if(!((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0))break;c[5701]=0;c[5702]=0;c[5703]=0;c[5704]=0;c[5729]=g;c[5731]=(h|l|i|0)==0?m:0;c[5730]=k}while(0);do if(c[5705]&65532|0){w=c[5708]|0;if(!((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0))break;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=0;c[5729]=g;c[5731]=(h|l|i|0)==0?m:0;c[5730]=k}while(0);h=n+f|0}c[5636]=c[5636]&~g|g&h;c[5640]=p;if(!d){d=0;return d|0}d=t<<24>>24==0?2453760:2441472;f=c[5647]|0;d=(f>>>12&3)>>>0<u>>>0?d:d|512;d=(b|0)==0?d&29440:d;c[5641]=o&2261;c[5642]=o>>>6&1^1;c[5643]=24;c[5646]=1-(o>>>9&2);c[5647]=f&~d|d&o;d=0;return d|0}function Zg(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=(e|0)==0?13:10;k=d[22968]|0;m=b&65532;if(!m)if((a+-1|0)>>>0<2){c[5746]=l;c[5747]=0;b=-1;return b|0}else{c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=0;c[22740+(a<<4)+8>>2]=0;c[22740+(a<<4)+12>>2]=0;b=(c[5696]|0)>>>6&65536;c[5729]=(b^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?b>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;b=0;return b|0}e=(b>>>1&2^2)+6|0;if((b|7)>>>0>(c[22740+(e<<4)+8>>2]|0)>>>0){c[5746]=l;c[5747]=m;b=-1;return b|0}f=(c[22740+(e<<4)+4>>2]|0)+(b&-8)|0;e=c[23084+(f>>>12<<2)>>2]|0;if((e|f)&3)if(!(zf(f,2,0,0)|0))e=23048;else{b=-1;return b|0}else e=e+f|0;n=c[e>>2]|0;j=f+4|0;i=j>>>12;e=c[23084+(i<<2)>>2]|0;if((e|j)&3)if(!(zf(j,2,0,0)|0))e=23048;else{b=-1;return b|0}else e=e+j|0;e=c[e>>2]|0;if(!(e&4096)){c[5746]=l;c[5747]=m;b=-1;return b|0}g=b&3;h=e>>>13&3;switch(a|0){case 1:{if(!(e&2048)){c[5746]=l;c[5747]=m;b=-1;return b|0}f=(e&1024|0)!=0;if(!(f|(h|0)==(g|0))){c[5746]=l;c[5747]=m;b=-1;return b|0}if(f&h>>>0>g>>>0){c[5746]=l;c[5747]=m;b=-1;return b|0}break}case 2:{if((e&2560|0)!=512){c[5746]=l;c[5747]=m;b=-1;return b|0}if(!((g|0)==(k|0)&(h|0)==(k|0))){c[5746]=l;c[5747]=m;b=-1;return b|0}break}default:{if((e&2560|0)==2048){c[5746]=l;c[5747]=m;b=-1;return b|0}if((e&3072|0)!=3072?h>>>0<k>>>0|h>>>0<g>>>0:0){c[5746]=l;c[5747]=m;b=-1;return b|0}}}if(!(e&32768))if((a|0)==2){c[5746]=12;c[5747]=m;b=-1;return b|0}else{c[5746]=11;c[5747]=m;b=-1;return b|0}do if(!(e&256)){e=e|256;f=c[8411692+(i<<2)>>2]|0;if(!((f|j)&3)){c[f+j>>2]=e;break}if(Bf(j,e,2,0)|0){b=-1;return b|0}}while(0);m=e&983040|n&65535;c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=e&-16777216|n>>>16|e<<16&16711680;c[22740+(a<<4)+8>>2]=(e&8388608|0)==0?m:m<<12|4095;c[22740+(a<<4)+12>>2]=e;b=(c[5696]|0)>>>6&65536;c[5729]=(b^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?b>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;b=0;return b|0}function _g(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0;i=l;l=l+32|0;h=i+16|0;g=i;f=c[5716]|0;if(!(f&32768)){j=c[3662]|0;c[g>>2]=19603;c[g+4>>2]=379;c[g+8>>2]=19641;nl(j,19558,g)|0;ra()}if((f&1792|0)!=256){j=c[3662]|0;c[h>>2]=19603;c[h+4>>2]=382;c[h+8>>2]=19653;nl(j,19558,h)|0;ra()}h=f>>>11&1;f=(d<<2|2)<<h;if(((4<<h)+-1+f|0)>>>0>(c[5715]|0)>>>0){j=c[5713]&65532;c[5746]=10;c[5747]=j;j=-1;l=i;return j|0}d=(c[5714]|0)+f|0;f=c[23084+(d>>>12<<2)>>2]|0;g=f|d;do if(!h){if(!(g&1)){h=e[f+d>>1]|0;f=2;break}if(!(zf(d,1,0,0)|0)){h=c[5762]|0;f=2;break}else{j=-1;l=i;return j|0}}else{if(g&3)if(!(zf(d,2,0,0)|0))f=23048;else{j=-1;l=i;return j|0}else f=f+d|0;h=c[f>>2]|0;f=4}while(0);f=d+f|0;g=c[23084+(f>>>12<<2)>>2]|0;do if((g|f)&1)if(!(zf(f,1,0,0)|0)){f=c[5762]|0;break}else{j=-1;l=i;return j|0}else f=e[g+f>>1]|0;while(0);c[a>>2]=f;c[b>>2]=h;j=0;l=i;return j|0}function $g(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=c[(c[5766]|0)+176>>2]&-32|d>>>27&24;h=Ge(c[4202123]|0,g,0)|0;do if((((((h|0)!=0?(c[h+32>>2]|0)!=0:0)?(i=c[(c[h+40>>2]|0)+(g-(c[h+8>>2]|0))>>2]|0,!((i&1|0)==0&0==0)):0)?(k=i&-4096|d>>>18&4088,j=Ge(c[4202123]|0,k,0)|0,(j|0)!=0):0)?(c[j+32>>2]|0)!=0:0)?(n=(c[j+40>>2]|0)+(k-(c[j+8>>2]|0))|0,l=c[n>>2]|0,n=c[n+4>>2]|0,!((l&1|0)==0&0==0)):0)if(!(n>>>0>0|(n|0)==0&l>>>0>4294967295)){if((l&128|0)==0&0==0){if((l&32|0)==0&0==0){g=l|32;h=Ge(c[4202123]|0,k,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0)c[(c[h+40>>2]|0)+(k-(c[h+8>>2]|0))>>2]=g}else g=l;i=g&-4096|d>>>9&4088;g=Ge(c[4202123]|0,i,0)|0;if(!g){g=0;break}if(!(c[g+32>>2]|0)){g=0;break}j=(c[g+40>>2]|0)+(i-(c[g+8>>2]|0))|0;h=c[j>>2]|0;j=c[j+4>>2]|0;if((h&1|0)==0&0==0){g=0;break}if(j>>>0>0|(j|0)==0&h>>>0>4294967295){g=8;break}m=4095;k=i;g=h&l}else{m=2097151;g=l;h=l;j=n}if((g&4|0)!=0?(o=g>>>1&1,((o^1)&e|0)==0):0){g=Il(h|0,j|0,6)|0;i=((g&1^1)&e|0)!=0;if((h&32|0)==0&0==0|i){f=h|96;e=Il(f|0,j|0,6)|0;h=i?f:h|32;g=i?e:g;i=Ge(c[4202123]|0,k,0)|0;if((i|0)!=0?(c[i+32>>2]|0)!=0:0)c[(c[i+40>>2]|0)+(k-(c[i+8>>2]|0))>>2]=h}c[a>>2]=h&~m|m&d;c[b>>2]=g&o;d=0;return d|0}else g=1}else g=8;else g=0;while(0);c[5746]=32;o=(c[5766]|0)+112|0;c[o>>2]=1024;c[o+4>>2]=0;o=(c[5766]|0)+120|0;c[o>>2]=e<<1|g|4;c[o+4>>2]=0;o=Jl(1,0,f+32|0)|0;b=(c[5766]|0)+120|0;e=b;a=c[e+4>>2]|y;c[b>>2]=c[e>>2]|o;c[b+4>>2]=a;b=(c[5766]|0)+128|0;c[b>>2]=d;c[b+4>>2]=0;d=-1;return d|0}function ah(b,d){b=b|0;d=d|0;var e=0;a[b+443>>0]=d;e=b+441|0;if(!((d|0)!=0&(a[e>>0]|0)!=0))return;d=c[b+536>>2]|0;if(!d)d=(c[b+60>>2]|0)>>>9&(a[b+544>>0]&1)&((a[b+442>>0]^1)&255);else{if(!(c[d+96>>2]&16777216))d=c[b+60>>2]|0;else d=c[(c[b+540>>2]|0)+1392>>2]|0;d=d>>>9&1}if(!d)return;a[e>>0]=0;return}function bh(a,b,d){a=a|0;b=b|0;d=d|0;switch(b|0){case 8:{c[a+32>>2]=d;return}case 9:{c[a+400>>2]=d;return}case 10:{c[a+404>>2]=d;return}case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:{c[a+(b<<2)>>2]=d;return}default:return}}function ch(a,b){a=a|0;b=b|0;switch(b|0){case 8:{a=c[a+32>>2]|0;break}case 9:{a=c[a+400>>2]|0;break}case 10:{a=c[a+404>>2]|0;break}case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:{a=c[a+(b<<2)>>2]|0;break}default:a=0}return a|0}function dh(a,d,f){a=a|0;d=d|0;f=f|0;if(d>>>0>9)return;c[a+212+(d<<4)+4>>2]=c[f+4>>2];c[a+212+(d<<4)+8>>2]=c[f+8>>2];if((d|1|0)!=9){c[a+212+(d<<4)>>2]=e[f>>1];c[a+212+(d<<4)+12>>2]=(b[f+2>>1]&-3841&65535)<<8}f=(c[a+256>>2]|0)>>>6&65536;c[a+388>>2]=(f^65536)+-1;c[a+396>>2]=(c[a+248>>2]|c[a+232>>2]|c[a+264>>2]|c[a+216>>2]|0)==0?f>>>16:0;c[a+392>>2]=(c[a+240>>2]&4194304|0)==0?384:0;return}function eh(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16785968>>2]=b;c[a+16785972>>2]=d;return}function fh(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16785976>>2]=b;c[a+16785980>>2]=d;return}function gh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+16785984>>2]=b;c[a+16785988>>2]=d;c[a+16785992>>2]=e;return}function hh(a){a=a|0;a=a+448|0;y=c[a+4>>2]|0;return c[a>>2]|0}function ih(a){a=a|0;return d[a+441>>0]|0|0}function jh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=a+548|0;e=c[d>>2]|0;if((e|0)<=0){c[d>>2]=0;return}b=0;do{f=c[a+16777772+(b<<2)>>2]|0;c[a+556+(f<<2)>>2]=-1;c[a+8389164+(f<<2)>>2]=-1;f=f+1048576|0;c[a+556+(f<<2)>>2]=-1;c[a+8389164+(f<<2)>>2]=-1;b=b+1|0}while((b|0)!=(e|0));c[d>>2]=0;return}function kh(d){d=d|0;var f=0,g=0;f=0;do{g=f>>>4^f;g=g>>>2^g;a[21168+f>>0]=(g>>>1^g)&1^1;f=f+1|0}while((f|0)!=256);f=0;do{a[21424+f>>0]=(f>>>0)%17|0;f=f+1|0}while((f|0)!=32);f=0;do{a[21456+f>>0]=(f>>>0)%9|0;f=f+1|0}while((f|0)!=32);c[4202123]=d;c[4202126]=6;c[4202127]=22528;c[4202128]=18;c[4202129]=16;c[4202130]=22528;c[5641]=0;c[5642]=0;c[5643]=0;c[5644]=0;c[5645]=0;c[5646]=1;c[5647]=2;c[5732]=1610612752;c[5733]=0;c[5734]=0;c[5735]=0;a[23072]=1;c[5740]=-61456;c[5741]=1024;c[5743]=-1;c[5746]=-1;c[5748]=-1;Nl(23084,-1,16777216)|0;c[5769]=0;a[22968]=0;c[5770]=0;c[5687]=65535;c[5695]=65535;c[5699]=65535;c[5703]=65535;c[5707]=65535;c[5711]=65535;c[5712]=32768;c[5715]=65535;c[5716]=32768;c[5719]=65535;c[5723]=65535;c[5689]=61440;c[5690]=-65536;c[5691]=65535;c[5692]=0;g=((c[5696]|0)>>>6&65536^65536)+-1|0;c[5640]=65520;c[5729]=g;c[5731]=0;c[5730]=384;b[11298]=0;c[5648]=0;b[11299]=895;g=22600;c[g>>2]=16843009;c[g+4>>2]=16843009;Yh(0,22736);g=(e[11299]|0)>>>8&255;Zh((g&3)==0?32:(g&3)==2?64:80,22736);return 22528}function lh(a){a=a|0;a=a+448|0;y=c[a+4>>2]|0;return c[a>>2]|0}function mh(a,b,c){a=a|0;b=b|0;c=c|0;return -1}function nh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function oh(a){a=a|0;return}function ph(a){a=a|0;c[a+188>>2]=1;return}function qh(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;A=l;l=l+64|0;r=A+40|0;q=A+32|0;g=A+24|0;z=A+52|0;m=A+48|0;p=A+44|0;t=A;f=c[e+8>>2]|0;if(fk(f,19670)|0){c[g>>2]=f;_e(19673,g);z=0;l=A;return z|0}f=e+16|0;x=f;w=c[x+4>>2]|0;if(!(w>>>0>0|(w|0)==0&(c[x>>2]|0)>>>0>1048575))ja(19698,19723,1972,19737);x=Le(280)|0;c[x>>2]=c[e+4>>2];u=f;s=c[u+4>>2]|0;v=x+24|0;n=v;c[n>>2]=c[u>>2];c[n+4>>2]=s;n=x+36|0;c[n>>2]=Ae()|0;s=Ae()|0;u=x+32|0;c[u>>2]=s;s=kh(s)|0;w=x+40|0;c[w>>2]=s;fh(s,7,x);gh(c[w>>2]|0,19,17,x);c[(c[u>>2]|0)+2584>>2]=x;c[(c[u>>2]|0)+2588>>2]=10;s=c[u>>2]|0;i=f;i=xl(c[i>>2]|0,c[i+4>>2]|0,-786432,-1)|0;$a[c[s+2568>>2]&15](s,786432,0,i,y,0)|0;i=c[u>>2]|0;$a[c[i+2568>>2]&15](i,0,0,655360,0,0)|0;He(c[n>>2]|0,128,0,2,0,x,20,18,1)|0;He(c[n>>2]|0,146,0,2,0,x,21,19,1)|0;i=c[e+204>>2]|0;if((i|0)>0){j=c[e+200>>2]|0;if(i&65535|0)ja(19753,19723,2018,19737);f=0-i|0;g=c[u>>2]|0;$a[c[g+2568>>2]&15](g,f,0,i,((i|0)<0)<<31>>31,1)|0;g=Ge(c[u>>2]|0,f,0)|0;if((g|0)!=0?(c[g+32>>2]|0)!=0:0)f=(c[g+40>>2]|0)+(f-(c[g+8>>2]|0))|0;else f=0;Ll(f|0,j|0,i|0)|0;h=(i|0)<131072?i:131072;f=1048576-h|0;g=Ge(c[u>>2]|0,f,((f|0)<0)<<31>>31)|0;if((g|0)!=0?(c[g+32>>2]|0)!=0:0)f=(c[g+40>>2]|0)+(f-(c[g+8>>2]|0))|0;else f=0;Ll(f|0,j+i+(0-h)|0,h|0)|0}i=x+48|0;s=x+44|0;c[s>>2]=Gh(c[n>>2]|0,32,160,1232,1233,8,x,i)|0;eh(c[w>>2]|0,8,x);g=c[n>>2]|0;f=Le(112)|0;c[f+104>>2]=i;h=f+100|0;c[h>>2]=9;o=f+108|0;c[o>>2]=x;c[f>>2]=f;a[f+13>>0]=3;a[f+15>>0]=1;sa(1,z|0)|0;j=c[z>>2]|0;j=Dl(j|0,((j|0)<0)<<31>>31|0,1193182,0)|0;k=y;B=c[z+4>>2]|0;B=Dl(B|0,((B|0)<0)<<31>>31|0,1193182,0)|0;B=Fl(B|0,y|0,1e9,0)|0;k=xl(B|0,y|0,j|0,k|0)|0;j=f+16|0;c[j>>2]=k;c[j+4>>2]=y;j=f+24|0;c[j>>2]=0;c[j+4>>2]=0;c[f+4>>2]=65536;c[f+32>>2]=f;a[f+45>>0]=3;a[f+47>>0]=1;j=Wa[c[h>>2]&15](c[o>>2]|0)|0;k=f+48|0;c[k>>2]=j;c[k+4>>2]=y;k=f+56|0;c[k>>2]=0;c[k+4>>2]=0;c[f+36>>2]=65536;c[f+64>>2]=f;a[f+77>>0]=3;a[f+79>>0]=0;o=Wa[c[h>>2]&15](c[o>>2]|0)|0;h=f+80|0;c[h>>2]=o;c[h+4>>2]=y;h=f+88|0;c[h>>2]=0;c[h+4>>2]=0;c[f+68>>2]=65536;a[f+96>>0]=0;He(g,64,0,4,0,f,22,20,1)|0;He(g,97,0,1,0,f,23,21,1)|0;c[x+240>>2]=f;f=c[n>>2]|0;g=c[e+28>>2]|0;h=Le(148)|0;c[h+136>>2]=g;a[h>>0]=0;a[h+11>>0]=38;a[h+12>>0]=2;a[h+13>>0]=0;a[h+14>>0]=-128;Nh(h,1);c[h+132>>2]=x+144;He(f,112,0,2,0,h,24,22,1)|0;f=x+248|0;c[f>>2]=h;g=v;g=xl(c[g>>2]|0,c[g+4>>2]|0,-1048576,1023)|0;g=Il(g|0,y|0,10)|0;g=(g|0)<65535?g:65535;a[h+49>>0]=g;a[h+50>>0]=(g&65535)>>>8;h=v;g=c[h>>2]|0;h=c[h+4>>2]|0;if(h>>>0>0|(h|0)==0&g>>>0>16777215){o=xl(g|0,h|0,-16777216,65535)|0;o=Il(o|0,y|0,16)|0;o=(o|0)<65535?o:65535;B=c[f>>2]|0;a[B+53>>0]=o;a[B+54>>0]=(o&65535)>>>8}a[(c[f>>2]|0)+21>>0]=6;o=x+244|0;c[o>>2]=_d(p,m,c[u>>2]|0,c[n>>2]|0,i)|0;f=e+44|0;c[x+12>>2]=c[f>>2];c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t>>2]=c[p>>2];f=c[f>>2]|0;if(f|0)c[x+8>>2]=cc(t,f)|0;i=e+96|0;g=c[i>>2]|0;if((g|0)>0){j=z+4|0;k=x+216|0;f=0;do{h=c[e+48+(f*12|0)>>2]|0;if((h|0)!=0?(fk(h,19796)|0)!=0:0){if(!(fk(h,19803)|0)){h=f+1|0;c[z>>2]=c[e+48+(f*12|0)+8>>2];c[j>>2]=0;if((h|0)<(g|0)){c[j>>2]=c[e+48+(h*12|0)+8>>2];f=f+2|0}else f=h;Ti(c[n>>2]|0,496,1014,k,z)|0;fj(c[p>>2]|0,(c[m>>2]|0)+1|0)|0}}else{Db(t,c[e+48+(f*12|0)+8>>2]|0)|0;f=f+1|0}g=c[i>>2]|0}while((f|0)<(g|0))}g=e+164|0;if((c[g>>2]|0)>0){f=0;do{kc(t,c[e+100+(f<<4)+12>>2]|0,c[e+100+(f<<4)+4>>2]|0)|0;f=f+1|0}while((f|0)<(c[g>>2]|0))}f=e+32|0;do if(c[f>>2]|0){g=Le(28)|0;c[x+16>>2]=g;f=c[f>>2]|0;if(!(fk(f,19807)|0)){Cj(c[p>>2]|0,g,c[e+36>>2]|0,c[e+40>>2]|0,c[e+212>>2]|0,c[e+216>>2]|0)|0;break}if(!(fk(f,19811)|0)){Od(c[u>>2]|0,-264241152,0,g,c[e+36>>2]|0,c[e+40>>2]|0)|0;break}else{c[q>>2]=f;_e(19820,q);Da(1)}}while(0);f=c[e+192>>2]|0;do if(f|0){if(!(fk(f,19796)|0)){c[x+256>>2]=hc(t,0)|0;c[x+260>>2]=hc(t,2)|0;break}if(!(fk(f,19852)|0)){B=x+268|0;c[x+264>>2]=uj(x+276|0,B,c[n>>2]|0,x+60|0,x+192|0,96)|0;He(c[n>>2]|0,22104,0,1,0,x,25,23,4)|0;c[x+272>>2]=tj(c[B>>2]|0)|0;break}else{c[r>>2]=f;_e(19856,r);Da(1)}}while(0);g=e+180|0;if((c[g>>2]|0)>0){h=x+4|0;f=0;do{B=e+168+(f*12|0)+8|0;Vb(t,c[B>>2]|0)|0;c[h>>2]=c[B>>2];f=f+1|0}while((f|0)<(c[g>>2]|0))}m=c[e+224>>2]|0;if(m|0){h=c[e+228>>2]|0;k=c[e+184>>2]|0;k=(k|0)==0?16809164:k;if((h|0)<1024){B=c[3662]|0;ll(19886,17,1,B)|0;Da(1)}if((a[m+510>>0]|0)!=85){B=c[3662]|0;ll(19904,21,1,B)|0;Da(1)}if((a[m+511>>0]|0)!=-86){B=c[3662]|0;ll(19904,21,1,B)|0;Da(1)}j=m+497|0;i=a[j>>0]|0;i=i<<24>>24==0?2560:((i&255)<<9)+512|0;if((h|0)<(i|0)){B=c[3662]|0;ll(19886,17,1,B)|0;Da(1)}if(Zk(m+514|0,19926,4)|0){ll(19931,15,1,c[3662]|0)|0;Da(1)}f=Ge(c[u>>2]|0,1048576,0)|0;if((f|0)!=0?(c[f+32>>2]|0)!=0:0)g=(c[f+40>>2]|0)+(1048576-(c[f+8>>2]|0))|0;else g=0;f=h-i|0;e=((f|0)<0)<<31>>31;B=v;B=xl(c[B>>2]|0,c[B+4>>2]|0,-1048576,-1)|0;t=y;if(t>>>0<e>>>0|(t|0)==(e|0)&B>>>0<f>>>0){ll(19947,15,1,c[3662]|0)|0;Da(1)}Ll(g|0,m+i|0,f|0)|0;f=Ge(c[u>>2]|0,589824,0)|0;do if(!f)g=0;else{if(!(c[f+32>>2]|0)){g=0;break}g=(c[f+40>>2]|0)+(589824-(c[f+8>>2]|0))|0}while(0);Nl(g|0,0,4256)|0;Ll(g+497|0,j|0,(d[m+513>>0]|0)+17|0)|0;hk(g+2176|0,k)|0;B=g+498|0;a[B>>0]=0;a[B+1>>0]=0;B=g+552|0;a[B>>0]=128;a[B+1>>0]=8;a[B+2>>0]=9;a[B+3>>0]=0;B=v;B=Il(c[B>>2]|0,c[B+4>>2]|0,10)|0;B=B+-1024|0;f=g+480|0;a[f>>0]=B;a[f+1>>0]=B>>8;a[f+2>>0]=B>>16;a[f+3>>0]=B>>24;a[g+528>>0]=1;a[g+14>>0]=0;a[g+7>>0]=0;f=c[x+16>>2]|0;if(f|0){a[g+15>>0]=35;B=g+22|0;a[B>>0]=32;a[B+1>>0]=0;a[g+38>>0]=8;a[g+39>>0]=16;a[g+40>>0]=8;a[g+41>>0]=8;a[g+42>>0]=8;a[g+43>>0]=0;a[g+44>>0]=8;a[g+45>>0]=24;B=c[f>>2]&65535;v=g+18|0;a[v>>0]=B;a[v+1>>0]=B>>8;v=c[f+4>>2]&65535;B=g+20|0;a[B>>0]=v;a[B+1>>0]=v>>8;B=c[f+8>>2]&65535;v=g+36|0;a[v>>0]=B;a[v+1>>0]=B>>8;v=c[f+16>>2]|0;B=g+28|0;a[B>>0]=v;a[B+1>>0]=v>>8;a[B+2>>0]=v>>16;a[B+3>>0]=v>>24;B=g+24|0;a[B>>0]=-264241152;a[B+1>>0]=-264241152>>8;a[B+2>>0]=-264241152>>16;a[B+3>>0]=-264241152>>24}B=g+4240|0;f=B;a[f>>0]=255;a[f+1>>0]=255;a[f+2>>0]=0;a[f+3>>0]=0;B=B+4|0;a[B>>0]=0;a[B+1>>0]=155;a[B+2>>0]=207;a[B+3>>0]=0;B=g+4248|0;f=B;a[f>>0]=255;a[f+1>>0]=255;a[f+2>>0]=0;a[f+3>>0]=0;B=B+4|0;a[B>>0]=0;a[B+1>>0]=147;a[B+2>>0]=207;a[B+3>>0]=0;B=ch(c[w>>2]|0,9)|0;bh(c[w>>2]|0,9,B|1);B=z+4|0;c[B>>2]=594048;f=z+8|0;c[f>>2]=31;dh(c[w>>2]|0,8,z);b[z>>1]=16;c[B>>2]=0;c[f>>2]=-1;f=z+2|0;b[f>>1]=-16229;dh(c[w>>2]|0,1,z);b[z>>1]=24;b[f>>1]=-16237;dh(c[w>>2]|0,0,z);dh(c[w>>2]|0,2,z);dh(c[w>>2]|0,3,z);dh(c[w>>2]|0,4,z);dh(c[w>>2]|0,5,z);bh(c[w>>2]|0,8,1048576);bh(c[w>>2]|0,6,589824);ge(c[o>>2]|0,z,19963);f=c[s>>2]|0;if(f|0){B=c[f>>2]|0;a[B+12>>0]=a[B+13>>0]&a[z>>0];B=c[f+4>>2]|0;a[B+12>>0]=a[B+13>>0]&a[z+1>>0]}}B=x;l=A;return B|0}function rh(a){a=a|0;Fe(c[a+32>>2]|0);Fe(c[a+36>>2]|0);Uj(a);return}function sh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;g=c[b+248>>2]|0;if(a[g+12>>0]&64?(sa(1,f|0)|0,j=c[f>>2]<<15,k=c[f+4>>2]|0,k=Jl(k|0,((k|0)<0)<<31>>31|0,15)|0,k=Fl(k|0,y|0,1e9,0)|0,e=g+140|0,(j-(c[e>>2]|0)+k|0)>-1):0){k=g+13|0;a[k>>0]=a[k>>0]|-64;k=c[g+132>>2]|0;fb[c[k>>2]&15](c[k+4>>2]|0,c[k+8>>2]|0,1);c[e>>2]=(c[e>>2]|0)+(c[g+144>>2]|0)}j=c[b+240>>2]|0;h=c[j>>2]|0;h=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;g=j+16|0;g=yl(h|0,y|0,c[g>>2]|0,c[g+4>>2]|0)|0;h=y;k=j+24|0;f=k;e=c[f>>2]|0;f=c[f+4>>2]|0;if((a[j+13>>0]&-2)<<24>>24==2){i=j+4|0;n=c[i>>2]|0;f=yl(e|0,f|0,g|0,h|0)|0;f=xl(f|0,y|0,n|0,0)|0;e=y;if((e|0)<0|(e|0)==0&f>>>0<1){j=j+104|0;n=c[j>>2]|0;fb[c[n>>2]&15](c[n+4>>2]|0,c[n+8>>2]|0,1);j=c[j>>2]|0;fb[c[j>>2]&15](c[j+4>>2]|0,c[j+8>>2]|0,0);j=k;j=xl(c[j>>2]|0,c[j+4>>2]|0,c[i>>2]|0,0)|0;n=k;c[n>>2]=j;c[n+4>>2]=y;n=0;k=(n|0)>(d|0);n=k?d:n;d=b+40|0;d=c[d>>2]|0;d=ih(d)|0;d=(d|0)==0;n=d?0:n;l=m;return n|0}}else if((e|0)==0&(f|0)==0){f=yl(c[j+4>>2]|0,0,g|0,h|0)|0;e=y;if((e|0)<0|(e|0)==0&f>>>0<1){n=j+104|0;j=c[n>>2]|0;fb[c[j>>2]&15](c[j+4>>2]|0,c[j+8>>2]|0,1);n=c[n>>2]|0;fb[c[n>>2]&15](c[n+4>>2]|0,c[n+8>>2]|0,0);n=k;c[n>>2]=g;c[n+4>>2]=h;n=0;k=(n|0)>(d|0);n=k?d:n;d=b+40|0;d=c[d>>2]|0;d=ih(d)|0;d=(d|0)==0;n=d?0:n;l=m;return n|0}}else{f=1193182;e=0}n=Fl(f|0,e|0,1193,0)|0;k=(n|0)>(d|0);n=k?d:n;d=b+40|0;d=c[d>>2]|0;d=ih(d)|0;d=(d|0)==0;n=d?0:n;l=m;return n|0}function th(a,b){a=a|0;b=b|0;of(c[a+40>>2]|0,b);return}function uh(a){a=a|0;if(c[a+260>>2]|0){a=1;return a|0}a=c[a+272>>2]|0;if(!a){a=0;return a|0}a=sj(a)|0;return a|0}function vh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+260>>2]|0;if(g|0){gc(g,b,d,e,f)|0;return}a=c[a+272>>2]|0;if(!a)return;qj(a,b,d,e,f);return}function wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+256>>2]|0;if(e|0){ec(e,b,d)|0;return}a=c[a+276>>2]|0;if(!a)return;hj(a,b,d&65535);return}function xh(a){a=a|0;a=hh(c[a+40>>2]|0)|0;return a|0}function yh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Ge(c[a+36>>2]|0,b,0)|0;if(!e){d=-1;return d|0}a=b-(c[e+8>>2]|0)|0;b=c[e+76>>2]|0;if(b&1<<d|0){d=Ya[c[e+68>>2]&63](c[e+64>>2]|0,a,d)|0;return d|0}if((d|0)!=1|(b&1|0)==0){d=-1;return d|0}b=e+68|0;e=e+64|0;d=(Ya[c[b>>2]&63](c[e>>2]|0,a,0)|0)&255;d=(Ya[c[b>>2]&63](c[e>>2]|0,a+1|0,0)|0)<<8&65280|d;return d|0}function zh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Ge(c[a+36>>2]|0,b,0)|0;if(!f)return;a=b-(c[f+8>>2]|0)|0;b=c[f+76>>2]|0;if(b&1<<e|0){gb[c[f+72>>2]&63](c[f+64>>2]|0,a,d,e);return}if((e|0)!=1|(b&1|0)==0)return;b=f+72|0;e=f+64|0;gb[c[b>>2]&63](c[e>>2]|0,a,d&255,0);gb[c[b>>2]&63](c[e>>2]|0,a+1|0,d>>>8&255,0);return}function Ah(a,b,d){a=a|0;b=b|0;d=d|0;jh(c[a+40>>2]|0,b,d);return}function Bh(a,b,c){a=a|0;b=b|0;c=c|0;return 255}function Ch(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Dh(a,b,c){a=a|0;b=b|0;c=c|0;return 2}function Eh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Fh(a,b){a=a|0;b=b|0;ah(c[a+40>>2]|0,b);return}function Gh(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0;k=Le(24)|0;Ke(j,11,k,0);Ke(j+12|0,11,k,1);Ke(j+24|0,11,k,2);Ke(j+36|0,11,k,3);Ke(j+48|0,11,k,4);Ke(j+60|0,11,k,5);Ke(j+72|0,11,k,6);Ke(j+84|0,11,k,7);Ke(j+96|0,11,k,8);Ke(j+108|0,11,k,9);Ke(j+120|0,11,k,10);Ke(j+132|0,11,k,11);Ke(j+144|0,11,k,12);Ke(j+156|0,11,k,13);Ke(j+168|0,11,k,14);Ke(j+180|0,11,k,15);c[k+12>>2]=h;c[k+16>>2]=i;j=Le(24)|0;a[j+13>>0]=-8;c[j+16>>2]=9;c[j+20>>2]=k;He(b,d,((d|0)<0)<<31>>31,2,0,j,26,24,1)|0;He(b,f,((f|0)<0)<<31>>31,1,0,j,27,25,1)|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[k>>2]=j;j=Le(24)|0;a[j+13>>0]=-34;c[j+16>>2]=9;c[j+20>>2]=k;He(b,e,((e|0)<0)<<31>>31,2,0,j,26,24,1)|0;He(b,g,((g|0)<0)<<31>>31,1,0,j,27,25,1)|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[k+4>>2]=j;c[k+8>>2]=0;return k|0}function Hh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=c[b+44>>2]|0;j=c[n>>2]|0;k=j+1|0;l=a[k>>0]|0;m=l&~a[j+2>>0];b=m&255;if(m<<24>>24){h=j+4|0;e=d[h>>0]|0;i=7;while(1)if(!(1<<(i+e&7)&b))i=i+-1|0;else break;if((i|0)>=0){f=j+3|0;m=a[f>>0]|0;g=m&255;if(!(m<<24>>24))b=-1;else{b=7;while(1)if(!(1<<(b+e&7)&g))b=b+-1|0;else break}if((i|0)>-1&(i|0)>(b|0)){if(a[j+9>>0]|0){if(a[j+10>>0]|0)a[h>>0]=i+1&7}else a[f>>0]=1<<i|g;b=1<<i;if(!(b&d[j+12>>0]))a[k>>0]=(b^255)&(l&255);if((i|0)!=2){l=i;m=a[(c[n>>2]|0)+5>>0]|0;m=m&255;m=l+m|0;Sh(n);return m|0}m=n+4|0;j=c[m>>2]|0;k=j+1|0;l=a[k>>0]|0;i=l&~a[j+2>>0];e=i&255;if(i<<24>>24){i=j+4|0;f=d[i>>0]|0;b=7;while(1)if(!(1<<(b+f&7)&e))b=b+-1|0;else break;if((b|0)>=0){g=j+3|0;e=a[g>>0]|0;h=e&255;if(!(e<<24>>24))e=-1;else{e=7;while(1)if(!(1<<(e+f&7)&h))e=e+-1|0;else break}if((b|0)>-1&(b|0)>(e|0)){if(a[j+9>>0]|0){if(a[j+10>>0]|0)a[i>>0]=b+1&7}else a[g>>0]=1<<b|h;e=1<<b;if(!(e&d[j+12>>0]))a[k>>0]=(e^255)&(l&255)}else b=7}else b=7}else b=7;l=b;m=a[(c[m>>2]|0)+5>>0]|0;m=m&255;m=l+m|0;Sh(n);return m|0}}}l=d[j+5>>0]|0;m=7;m=m&255;m=l+m|0;Sh(n);return m|0}function Ih(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;e=b;sa(1,e|0)|0;d=c[e>>2]|0;d=Dl(d|0,((d|0)<0)<<31>>31|0,1193182,0)|0;a=y;e=c[e+4>>2]|0;e=Dl(e|0,((e|0)<0)<<31>>31|0,1193182,0)|0;e=Fl(e|0,y|0,1e9,0)|0;a=xl(e|0,y|0,d|0,a|0)|0;l=b;return a|0}function Jh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;e=d&3;if((e|0)==3){f=255;return f|0}f=b+(e<<5)+12|0;d=a[f>>0]|0;if((d&255)>=4){b=c[b+(e<<5)+8>>2]|0;a[f>>0]=d^1;f=(d&1)==0?b&255:b>>>8;return f|0}g=c[b+(e<<5)>>2]|0;g=Wa[c[g+100>>2]&15](c[g+108>>2]|0)|0;d=b+(e<<5)+16|0;d=yl(g|0,y|0,c[d>>2]|0,c[d+4>>2]|0)|0;switch(a[b+(e<<5)+13>>0]|0){case 5:case 4:case 1:case 0:{d=(c[b+(e<<5)+4>>2]|0)-d&65535;break}default:{g=c[b+(e<<5)+4>>2]|0;d=g-(Gl(d|0,y|0,g|0,0)|0)|0}}e=a[f>>0]|0;d=((e&1)==0?d:d>>>8)&255;e=e&255;if(!(e&2)){g=d;return g|0}a[f>>0]=e^1;g=d;return g|0}function Kh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=d&3;if((f|0)==3){f=e>>>6;if((f|0)==3)return;d=e>>>4&3;if(d|0){a[b+(f<<5)+13>>0]=e>>>1&7;a[b+(f<<5)+14>>0]=e&1;a[b+(f<<5)+12>>0]=d+255;return}e=c[b+(f<<5)>>2]|0;e=Wa[c[e+100>>2]&15](c[e+108>>2]|0)|0;d=b+(f<<5)+16|0;d=yl(e|0,y|0,c[d>>2]|0,c[d+4>>2]|0)|0;switch(a[b+(f<<5)+13>>0]|0){case 5:case 4:case 1:case 0:{d=(c[b+(f<<5)+4>>2]|0)-d&65535;break}default:{e=c[b+(f<<5)+4>>2]|0;d=e-(Gl(d|0,y|0,e|0,0)|0)|0}}c[b+(f<<5)+8>>2]=d;a[b+(f<<5)+12>>0]=4;return}g=b+(f<<5)|0;i=b+(f<<5)+12|0;d=a[i>>0]|0;switch(d<<24>>24){case 0:{h=c[g>>2]|0;i=b+(f<<5)+16|0;c[i>>2]=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;c[i+4>>2]=y;i=b+(f<<5)+24|0;c[i>>2]=0;c[i+4>>2]=0;c[b+(f<<5)+4>>2]=(e|0)==0?65536:e;return}case 1:{e=e<<8;h=c[g>>2]|0;i=b+(f<<5)+16|0;c[i>>2]=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;c[i+4>>2]=y;i=b+(f<<5)+24|0;c[i>>2]=0;c[i+4>>2]=0;c[b+(f<<5)+4>>2]=(e|0)==0?65536:e;return}case 3:case 2:{h=b+(f<<5)+8|0;if(!(d&1))c[h>>2]=e;else{d=c[h>>2]&255|e<<8;h=c[g>>2]|0;h=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;e=b+(f<<5)+16|0;c[e>>2]=h;c[e+4>>2]=y;e=b+(f<<5)+24|0;c[e>>2]=0;c[e+4>>2]=0;c[b+(f<<5)+4>>2]=(d|0)==0?65536:d;d=a[i>>0]|0}a[i>>0]=d^1;return}default:return}}function Lh(b,e,f){b=b|0;e=e|0;f=f|0;var g=0;f=c[b+64>>2]|0;f=Wa[c[f+100>>2]&15](c[f+108>>2]|0)|0;e=b+80|0;e=yl(f|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;f=y;switch(a[b+77>>0]|0){case 4:case 5:{e=(f|0)==0?(e|0)==(c[b+68>>2]|0):0;break}case 1:{e=(f|0)<0|((f|0)==0?e>>>0<(c[b+68>>2]|0)>>>0:0);break}case 2:{e=((e|0)!=0|(f|0)!=0)&((El(e|0,f|0,c[b+68>>2]|0,0)|0)==0&(y|0)==0);break}case 3:{g=c[b+68>>2]|0;e=El(e|0,f|0,g|0,0)|0;f=y;e=(f|0)<0|(f|0)==0&e>>>0<g>>>1>>>0;break}default:e=(f|0)>0|((f|0)==0?e>>>0>=(c[b+68>>2]|0)>>>0:0)}return (e&1)<<5|d[b+79>>0]|d[b+96>>0]<<1|0}function Mh(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;a[b+96>>0]=d>>>1&1;a[b+79>>0]=d&1;return}function Nh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;n=l;l=l+64|0;m=n+48|0;j=n+4|0;e=n;Oa(m|0,0)|0;c[e>>2]=c[m>>2];if(!(c[b+136>>2]|0))Pa(e|0,j|0)|0;else Qa(e|0,j|0)|0;e=c[j>>2]|0;g=a[b+12>>0]|0;k=(g&4)==0;if(k){i=(e>>>0)/10|0;h=c[j+4>>2]|0;f=(h>>>0)/10|0;f=f<<4|h-(f*10|0);e=i<<4|e-(i*10|0)}else f=c[j+4>>2]|0;a[b+1>>0]=e;a[b+3>>0]=f;e=c[j+8>>2]|0;if(!(g&2)){f=(e|0)%12|0;if(k){i=(f>>>0)/10|0;f=i<<4|f-(i*10|0)}g=b+5|0;a[g>>0]=f;if((e|0)>11)a[g>>0]=f|128}else{if(k){i=(e>>>0)/10|0;e=i<<4|e-(i*10|0)}a[b+5>>0]=e}e=c[j+24>>2]|0;if(k){o=(e>>>0)/10|0;p=c[j+12>>2]|0;g=(p>>>0)/10|0;q=(c[j+16>>2]|0)+1|0;i=(q>>>0)/10|0;f=c[j+20>>2]|0;j=(f|0)%100|0;h=(j>>>0)/10|0;h=h<<4|j-(h*10|0);i=i<<4|q-(i*10|0);g=g<<4|p-(g*10|0);e=o<<4|e-(o*10|0)}else{f=c[j+20>>2]|0;h=(f|0)%100|0;i=(c[j+16>>2]|0)+1|0;g=c[j+12>>2]|0}a[b+7>>0]=e;a[b+8>>0]=g;a[b+9>>0]=i;a[b+10>>0]=h;if(!d){m=m+4|0;m=c[m>>2]|0;m=(m|0)<244;q=b+11|0;o=a[q>>0]|0;o=o&255;p=o&127;o=o|128;p=m?o:p;p=p&255;a[q>>0]=p;l=n;return}e=((f|0)/100|0)+19|0;if(k){q=(e>>>0)/10|0;e=q<<4|e-(q*10|0)}q=e&255;a[b+51>>0]=q;a[b+56>>0]=q;m=m+4|0;m=c[m>>2]|0;m=(m|0)<244;q=b+11|0;o=a[q>>0]|0;o=o&255;p=o&127;o=o|128;p=m?o:p;p=p&255;a[q>>0]=p;l=n;return}function Oh(b,e,f){b=b|0;e=e|0;f=f|0;a:do if(!e)e=-1;else{f=a[b>>0]|0;e=f&255;switch(f<<24>>24){case 10:case 9:case 8:case 7:case 6:case 4:case 2:case 0:{Nh(b,0);e=a[b+1+(d[b>>0]|0)>>0]|0;break a}case 12:{e=a[b+1+e>>0]|0;a[b+13>>0]=0;b=c[b+132>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,0);break a}default:{e=a[b+1+e>>0]|0;break a}}}while(0);return e&255|0}function Ph(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=l;l=l+16|0;g=h;if(!d){a[b>>0]=e&127;l=h;return}d=a[b>>0]|0;f=d&255;switch(d<<24>>24){case 10:{d=b+11|0;f=(e&127|a[d>>0]&-128&255)&255;a[d>>0]=f;f=f&15;d=f&255;if(!((a[b+12>>0]&64)!=0&f<<24>>24!=0)){l=h;return}i=b+144|0;c[i>>2]=1<<((f&255)<3?d+7|0:d)+-1;sa(1,g|0)|0;d=c[g>>2]<<15;e=c[g+4>>2]|0;e=Fl(Jl(e|0,((e|0)<0)<<31>>31|0,15)|0,y|0,1e9,0)|0;g=c[i>>2]|0;c[b+140>>2]=g+d+e&0-g;l=h;return}case 11:{a[b+1+f>>0]=e;f=a[b+11>>0]&15;d=f&255;if(!(f<<24>>24!=0&(a[b+12>>0]&64)!=0)){l=h;return}i=b+144|0;c[i>>2]=1<<((f&255)<3?d+7|0:d)+-1;sa(1,g|0)|0;e=c[g>>2]<<15;g=c[g+4>>2]|0;g=Fl(Jl(g|0,((g|0)<0)<<31>>31|0,15)|0,y|0,1e9,0)|0;i=c[i>>2]|0;c[b+140>>2]=i+e+g&0-i;l=h;return}default:{a[b+1+f>>0]=e;l=h;return}}}function Qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;g=k;h=a+40|0;i=ch(c[h>>2]|0,0)|0;c[g>>2]=i;j=g+4|0;c[j>>2]=ch(c[h>>2]|0,3)|0;b=g+8|0;c[b>>2]=ch(c[h>>2]|0,1)|0;d=g+12|0;c[d>>2]=ch(c[h>>2]|0,2)|0;e=g+16|0;c[e>>2]=ch(c[h>>2]|0,6)|0;f=g+20|0;c[f>>2]=ch(c[h>>2]|0,7)|0;if((i|0)!=1447909480){a=i;l=k;return a|0}rj(c[a+272>>2]|0,g);bh(c[h>>2]|0,0,c[g>>2]|0);bh(c[h>>2]|0,3,c[j>>2]|0);bh(c[h>>2]|0,1,c[b>>2]|0);bh(c[h>>2]|0,2,c[d>>2]|0);bh(c[h>>2]|0,6,c[e>>2]|0);bh(c[h>>2]|0,7,c[f>>2]|0);a=c[g>>2]|0;l=k;return a|0}function Rh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Sh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0;e=c[b+4>>2]|0;h=a[e+1>>0]&~a[e+2>>0];f=h&255;do if(h<<24>>24){g=d[e+4>>0]|0;h=7;while(1)if(!(1<<(h+g&7)&f))h=h+-1|0;else break;if((h|0)>=0){e=a[e+3>>0]|0;f=e&255;if(!(e<<24>>24))e=-1;else{e=7;while(1)if(!(1<<(e+g&7)&f))e=e+-1|0;else break}if((h|0)>-1&(h|0)>(e|0)){e=c[b>>2]|0;if(!(a[e+12>>0]&4)){f=d[e>>0]|0;if(!(f&4)){h=e+1|0;a[h>>0]=a[h>>0]|4}a[e>>0]=f|4}else{h=e+1|0;a[h>>0]=a[h>>0]|4;a[e>>0]=a[e>>0]|4}e=c[b>>2]|0;if(!(a[e+12>>0]&4)){a[e>>0]=a[e>>0]&-5;break}else{h=e+1|0;a[h>>0]=a[h>>0]&-5;a[e>>0]=a[e>>0]&-5;break}}}}while(0);e=c[b>>2]|0;h=a[e+1>>0]&~a[e+2>>0];f=h&255;if(h<<24>>24){g=d[e+4>>0]|0;h=7;while(1)if(!(1<<(h+g&7)&f))h=h+-1|0;else break;if((h|0)>=0){e=a[e+3>>0]|0;f=e&255;if(!(e<<24>>24))e=-1;else{e=7;while(1)if(!(1<<(e+g&7)&f))e=e+-1|0;else break}if((h|0)>(e|0)){f=c[b+12>>2]|0;e=c[b+16>>2]|0;if((h|0)>-1){eb[f&15](e,1);return}}else i=25}else i=25}else i=25;if((i|0)==25){f=c[b+12>>2]|0;e=c[b+16>>2]|0}eb[f&15](e,0);return}function Th(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;h=c[b+(e>>3<<2)>>2]|0;g=1<<(e&7);e=(f|0)!=0;do if(g&(d[h+12>>0]|0))if(e){f=h+1|0;a[f>>0]=g|(d[f>>0]|0);f=h;e=g|(d[h>>0]|0);break}else{e=~g;f=h+1|0;a[f>>0]=(d[f>>0]|0)&e;f=h;e=(d[h>>0]|0)&e;break}else{if(!e){f=h;e=(g^255)&(d[h>>0]|0);break}e=d[h>>0]|0;if(!(g&e)){f=h+1|0;a[f>>0]=g|(d[f>>0]|0)}f=h;e=g|e}while(0);a[f>>0]=e;Sh(b);return}function Uh(b,c,e){b=b|0;c=c|0;e=e|0;do if(!(c&1))if(!(a[b+6>>0]|0)){b=b+1|0;break}else{b=b+3|0;break}else b=b+2|0;while(0);return d[b>>0]|0}function Vh(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;if(e&1|0){e=b+8|0;switch(a[e>>0]|0){case 0:{a[b+2>>0]=f;db[c[b+16>>2]&15](c[b+20>>2]|0);return}case 1:{a[b+5>>0]=f&248;a[e>>0]=2;return}case 2:if(!(a[b+11>>0]|0)){a[e>>0]=0;return}else{a[e>>0]=3;return}case 3:{a[b+9>>0]=f>>>1&1;a[e>>0]=0;return}default:return}}if(f&16|0){c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;a[b+8>>0]=1;a[b+11>>0]=f&1;if(f&2|0)ra();if(!(f&8))return;else ra()}if(f&8|0){if(f&2|0)a[b+6>>0]=f&1;if(!(f&64))return;a[b+7>>0]=f>>>5&1;return}switch(f|0){case 128:case 0:{a[b+10>>0]=f>>>7;return}case 160:case 32:{g=b+3|0;j=a[g>>0]|0;h=j&255;if(j<<24>>24){i=d[b+4>>0]|0;e=7;while(1){j=1<<(e+i&7);if(!(j&h))e=e+-1|0;else break}if((e|0)>-1)a[g>>0]=(j^255)&h}if((f|0)!=160)return;f=b+4|0;a[f>>0]=(a[f>>0]|0)+1&7;return}case 103:case 102:case 101:case 100:case 99:case 98:case 97:case 96:{b=b+3|0;a[b>>0]=(1<<(f&7)^255)&d[b>>0];return}case 199:case 198:case 197:case 196:case 195:case 194:case 193:case 192:{a[b+4>>0]=f+1&7;return}case 231:case 230:case 229:case 228:case 227:case 226:case 225:case 224:{j=b+3|0;a[j>>0]=(1<<(f&7)^255)&d[j>>0];a[b+4>>0]=f+1&7;return}default:return}}function Wh(a,b,c){a=a|0;b=b|0;c=c|0;return d[a+12>>0]|0|0}function Xh(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;a[b+12>>0]=(d[b+13>>0]|0)&e;return}function Yh(b,c){b=b|0;c=c|0;a[c+1>>0]=b;return}function Zh(b,c){b=b|0;c=c|0;a[c+3>>0]=b;return}function _h(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=a[e+1>>0]|0;i=f<<24>>24==0;do if(!i)if(f<<24>>24!=3)if(!(b<<24>>24)){h=f<<24>>24==1?0:127;break}else{h=f<<24>>24==2?0:127;break}else h=0;else h=64;while(0);f=d&127;a:do if((c&65535)>>>0>252){do if((c|0)<=253){if((c|0)==253)if(((h&255)+d|0)<0)break;else{g=f;c=253;f=d;break a}if((c|0)>=0){g=f;f=d;break a}if((c|0)>-32)f=d>>>(0-c|0)|(d<<(c&31)|0)!=0;else f=(d|0)!=0&1;j=f&127;g=j&255;if((j|0)==0|(((h&255)+d|0)>-1|((c|0)!=-1|(a[e>>0]|0)==1))^1){c=0;break a}c=e+2|0;a[c>>0]=a[c>>0]|16;c=0;break a}while(0);i=e+2|0;a[i>>0]=a[i>>0]|40;i=(b&255)<<31|2139095040;j=(h<<24>>24==0)<<31>>31;j=i+j|0;return j|0}else{g=f;f=d}while(0);if(g<<24>>24){j=e+2|0;a[j>>0]=a[j>>0]|32}j=(f+(h&255)|0)>>>7&~(i&g<<24>>24==64&1);i=j|(b&255)<<31;j=(j|0)==0?0:c<<23;j=i+j|0;return j|0}function $h(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0;if(!e){e=0;i=0;g=0;f=a;h=f;c[h>>2]=i;f=f+4|0;c[f>>2]=g;f=a+8|0;b[f>>1]=e;return}g=e>>>31;e=(g|0)==0?e:0-e|0;h=e>>>0<65536;f=h?e<<16:e;h=h?16:0;i=f>>>0<16777216;h=((d[10416+((i?f<<8:f)>>>24)>>0]|0)+((i?h|8:h)&255)<<24)+536870912>>24;e=Jl(e|0,0,h|0)|0;h=(g<<15|16446)-h&65535;g=y;i=a;f=i;c[f>>2]=e;i=i+4|0;c[i>>2]=g;i=a+8|0;b[i>>1]=h;return}function ai(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=a[f+1>>0]|0;m=g<<24>>24==0;do if(!m)if(g<<24>>24!=3)if(!(b<<24>>24)){l=g<<24>>24==1?0:1023;break}else{l=g<<24>>24==2?0:1023;break}else l=0;else l=512;while(0);g=d&1023;a:do if((c&65535)>>>0>2044){do if((c|0)<=2045){if((c|0)==2045){xl(l|0,0,d|0,e|0)|0;if((y|0)<0)break;else{c=2045;h=e;k=17;break a}}if((c|0)>=0){h=e;k=17;break a}k=(c|0)!=-1|(a[f>>0]|0)==1;i=xl(l|0,0,d|0,e|0)|0;j=y;if((c|0)>-64){g=Il(d|0,e|0,0-c|0)|0;h=y;d=Jl(d|0,e|0,c&63|0)|0;d=g|((d|0)!=0|(y|0)!=0)&1}else{h=0;d=((d|0)!=0|(e|0)!=0)&1}g=d&1023;if(!(((j|0)>-1|(j|0)==-1&i>>>0>4294967295|k)&(g|0)!=0)){c=0;k=17;break a}i=f+2|0;k=a[i>>0]|16;a[i>>0]=k;c=0;j=d;d=k;k=19;break a}while(0);m=f+2|0;a[m>>0]=a[m>>0]|40;m=((l|0)==0)<<31>>31;f=Jl(b&255|0,0,63)|0;l=y|2146435072;b=m;m=((m|0)<0)<<31>>31;m=xl(f|0,l|0,b|0,m|0)|0;b=y;y=b;return m|0}else{h=e;k=17}while(0);if((k|0)==17)if(!g)g=0;else{k=f+2|0;i=k;j=d;d=a[k>>0]|0;k=19}if((k|0)==19){a[i>>0]=d|32;d=j}k=xl(d|0,h|0,l|0,0)|0;k=Il(k|0,y|0,10)|0;e=~(m&(g|0)==512&1);k=k&e;e=y&((e|0)<0)<<31>>31;l=(k|0)==0&(e|0)==0;b=Jl(b&255|0,0,63)|0;m=y;f=Jl(c|0,0,52)|0;f=l?0:f;l=l?0:y;b=k|b;m=e|m;m=xl(f|0,l|0,b|0,m|0)|0;b=y;y=b;return m|0}function bi(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;if((e|0)==0&(f|0)==0){f=0;i=0;e=0;g=a;h=g;c[h>>2]=i;g=g+4|0;c[g>>2]=e;g=a+8|0;b[g>>1]=f;return}j=Il(e|0,f|0,63)|0;i=y;l=(j|0)==0&(i|0)==0;g=yl(0,0,e|0,f|0)|0;g=l?e:g;e=l?f:y;l=e>>>0<1|(e|0)==1&g>>>0<0;h=l?g:e;k=h>>>0<65536;h=k?h<<16:h;k=k?16:0;f=h>>>0<16777216;h=((l?32:0)|(f?k|8:k)&255)+(d[10416+((f?h<<8:h)>>>24)>>0]|0)<<24>>24;e=Jl(g|0,e|0,h|0)|0;g=y;i=Jl(j|0,i|0,15)|0;h=(i|16446)-h&65535;i=a;f=i;c[f>>2]=e;i=i+4|0;c[i>>2]=g;i=a+8|0;b[i>>1]=h;return}function ci(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=f&8388607;i=f>>>23;j=f>>>31;a:do switch((i&255)<<24>>24){case -1:{if(!h){h=j<<15|32767;f=0;g=-2147483648;break a}if(!((f&4194303|0)==0|(f&2143289344|0)!=2139095040)){i=g+2|0;a[i>>0]=a[i>>0]|1}i=Jl(f|0,0,40)|0;g=(f&8388607|0)==0&0==0;h=j<<15|32767;f=g?0:i;g=g?-1073741824:y|-2147483648;break}case 0:if(!h){h=j<<15;f=0;g=0;break a}else{k=h>>>0<65536;i=k?f<<16:h;k=k?16:0;f=i>>>0<16777216;k=((d[10416+((f?i<<8:i)>>>24)>>0]|0)+((f?k|8:k)&255)<<24)+-134217728>>24;f=1-k|0;h=h<<k;k=10;break a}default:{f=i&255;k=10}}while(0);if((k|0)==10){g=Jl(h|8388608|0,0,40)|0;h=(j<<15|16256)+f|0;f=g;g=y}k=e;c[k>>2]=f;c[k+4>>2]=g;b[e+8>>1]=h;return}function di(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;i=g&1048575;j=Il(f|0,g|0,52)|0;k=Il(f|0,g|0,63)|0;l=y;a:do switch(j&2047){case 2047:{if((f|0)==0&(i|0)==0){i=Jl(k|0,l|0,15)|0;i=i|32767;f=0;g=-2147483648;break a}if(!((f|0)==0&(g&524287|0)==0|(0!=0|(g&2146959360|0)!=2146435072))){j=h+2|0;a[j>>0]=a[j>>0]|1}f=Jl(f|0,g|0,11)|0;g=y|-2147483648;i=Jl(k|0,l|0,15)|0|32767;break}case 0:if((f|0)==0&(i|0)==0){i=Jl(k|0,l|0,15)|0;i=i&32768;f=0;g=0;break a}else{h=i>>>0<1|(i|0)==1&f>>>0<0;m=h?f:i;j=m>>>0<65536;g=j?m<<16:m;j=j?16:0;m=g>>>0<16777216;g=(((h?32:0)|(m?j|8:j)&255)+(d[10416+((m?g<<8:g)>>>24)>>0]|0)<<24)+-184549376>>24;f=Jl(f|0,i|0,g|0)|0;g=1-g|0;i=y;m=10;break a}default:{g=j&2047;m=10}}while(0);if((m|0)==10){f=Jl(f|0,i|0,11)|0;m=y|-2147483648;i=Jl(k|0,l|0,15)|0;i=(i&32768|15360)+g|0;g=m}m=e;c[m>>2]=f;c[m+4>>2]=g;b[e+8>>1]=i;return}function ei(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;g=d;f=c[g>>2]|0;g=c[g+4>>2]|0;k=b[d+8>>1]|0;d=k&32767;k=(k&65535)>>>15&255;k=d<<16>>16==32767?((f|0)==0&(g&2147483647|0)==0?k:0):k;d=16439-(d&65535)|0;d=(d|0)>1?d:1;do if(d)if((d|0)<64){i=Il(f|0,g|0,d|0)|0;j=y;f=Jl(f|0,g|0,0-d&63|0)|0;f=i|((f|0)!=0|(y|0)!=0)&1;g=j;break}else{f=((f|0)!=0|(g|0)!=0)&1;g=0;break}while(0);d=a[e+1>>0]|0;i=d<<24>>24==0;do if(!i)if(d<<24>>24!=3)if(!(k<<24>>24)){h=d<<24>>24==1;d=h?0:127;h=h?0:0;break}else{h=d<<24>>24==2;d=h?0:127;h=h?0:0;break}else{d=0;h=0}else{d=64;h=0}while(0);j=f&127;h=xl(d|0,h|0,f|0,g|0)|0;g=y;d=Il(h|0,g|0,7)|0;d=d&~(i&j<<24>>24==64&1);d=k<<24>>24==0?d:0-d|0;do if(!(g>>>0>127|(g|0)==127&h>>>0>4294967295)){if(d|0?(d>>>31|0)!=(k&255|0):0){d=-2147483648;f=1;break}if(!(j<<24>>24)){e=d;return e|0}else f=32}else{d=-2147483648;f=1}while(0);e=e+2|0;a[e>>0]=a[e>>0]|f;e=d;return e|0}function fi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=d;j=c[k>>2]|0;k=c[k+4>>2]|0;i=b[d+8>>1]|0;f=i&32767;g=f&65535;i=(i&65535)>>>15;d=i&255;if((f&65535)<=16414){if((f&65535)<16383){if(!((j|0)!=0|(k|0)!=0|f<<16>>16!=0)){e=0;return e|0}e=e+2|0;a[e>>0]=a[e>>0]|32;e=0;return e|0}f=16446-g|0;g=Il(j|0,k|0,f|0)|0;h=d<<24>>24==0?g:0-g|0;if((h>>>31|0)==(i&65535|0)){i=Jl(g|0,y|0,f|0)|0;if((i|0)==(j|0)&(y|0)==(k|0)){e=h;return e|0}e=e+2|0;a[e>>0]=a[e>>0]|32;e=h;return e|0}}else d=(j|0)==0&(k&2147483647|0)==0|f<<16>>16!=32767?d:0;e=e+2|0;a[e>>0]=a[e>>0]|1;e=d<<24>>24==0?2147483647:-2147483648;return e|0}function gi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=d;f=c[h>>2]|0;h=c[h+4>>2]|0;d=b[d+8>>1]|0;m=(d&65535)>>>15;j=m&255;d=16446-(d&32767)|0;do if((d|0)<1)if(!d){k=0;l=0;g=f;d=h;n=6}else{g=1;f=0;d=-2147483648}else if((d|0)<64){k=Jl(f|0,h|0,0-d&63|0)|0;l=y;g=Il(f|0,h|0,d|0)|0;d=y;n=6;break}else{l=(d|0)==64;k=l?f:((f|0)!=0|(h|0)!=0)&1;l=l?h:0;g=0;d=0;n=6;break}while(0);do if((n|0)==6){f=a[e+1>>0]|0;i=f<<24>>24==0;h=Il(k|0,l|0,63)|0;do if(!i){if(f<<24>>24!=3)if(!(j<<24>>24)){f=((k|0)!=0|(l|0)!=0)&f<<24>>24==2&1;n=11;break}else{f=((k|0)!=0|(l|0)!=0)&f<<24>>24==1&1;n=11;break}}else{f=h&255;n=11}while(0);if((n|0)==11)if(f<<24>>24){d=xl(g|0,d|0,1,0)|0;f=y;if((d|0)==0&(f|0)==0){g=1;f=0;d=-2147483648;break}n=~((k|0)==0&(l&2147483647|0)==0&i&1);g=d&n;d=f&((n|0)<0)<<31>>31}n=j<<24>>24==0;f=yl(0,0,g|0,d|0)|0;f=n?g:f;d=n?d:y;if(!((f|0)==0&(d|0)==0)?(n=Il(f|0,d|0,63)|0,(n|0)!=(m&65535|0)):0){g=1;f=0;d=-2147483648;break}if((k|0)==0&(l|0)==0){n=d;e=f;y=n;return e|0}else g=32}while(0);n=e+2|0;a[n>>0]=a[n>>0]|g;n=d;e=f;y=n;return e|0}function hi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=d;h=c[i>>2]|0;i=c[i+4>>2]|0;g=b[d+8>>1]|0;d=g&32767;f=d&65535;if((d&65535)>16445){h=-2147483648;i=0;y=h;return i|0}if((d&65535)<16383){if((h|d&65535|0)==0&(i|0)==0){h=0;i=0;y=h;return i|0}h=e+2|0;a[h>>0]=a[h>>0]|32;h=0;i=0;y=h;return i|0}else{d=Il(h|0,i|0,16446-f|0)|0;f=y;i=Jl(h|0,i|0,g+2&63|0)|0;if(!((i|0)==0&(y|0)==0)){i=e+2|0;a[i>>0]=a[i>>0]|32}e=g<<16>>16>-1;i=yl(0,0,d|0,f|0)|0;h=e?f:y;i=e?d:i;y=h;return i|0}return 0}function ii(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=d;h=c[i>>2]|0;i=c[i+4>>2]|0;g=b[d+8>>1]|0;d=g&32767;f=d&65535;g=(g&65535)>>>15;if(d<<16>>16!=32767){j=Il(h|0,i|0,33)|0;i=j|((h|0)!=0|(i&1|0)!=0)&1;i=_h(g&255,d<<16>>16!=0|((i|0)!=0|(y|0)!=0)?f+-16257|0:f,i,e)|0;return i|0}if((h|0)==0&(i&2147483647|0)==0){j=(g&65535)<<31|2139095040;return j|0}if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&((h|0)!=0|(i&1073741823|0)!=0)){j=e+2|0;a[j>>0]=a[j>>0]|1}if(0==0&(i&2147483392|0)==0){j=-4194304;return j|0}j=Il(h|0,i|0,40)|0;j=(g&65535)<<31|j|2139095040;return j|0}function ji(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=d;h=c[i>>2]|0;i=c[i+4>>2]|0;g=b[d+8>>1]|0;d=g&32767;f=d&65535;g=(g&65535)>>>15;if(d<<16>>16!=32767){j=Il(h|0,i|0,1)|0;i=ai(g&255,(h|0)!=0|(i|0)!=0|d<<16>>16!=0?f+-15361|0:f,j|h&1,y,e)|0;h=y;y=h;return i|0}if((h|0)==0&(i&2147483647|0)==0){j=Jl(g&65535|0,0,63)|0;i=y|2146435072;y=i;return j|0}if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&((h|0)!=0|(i&1073741823|0)!=0)){j=e+2|0;a[j>>0]=a[j>>0]|1}e=Il(h|0,i|0,11)|0;f=y;i=(h&-2048|0)==0&(i&2147483647|0)==0;j=Jl(g&65535|0,0,63)|0;y=i?-524288:f|y|2146435072;return (i?0:e|j)|0}function ki(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;g=q+6|0;o=q;p=b[e+8>>1]|0;k=p&32767;j=k&65535;if((k&65535)>16445){if(k<<16>>16==32767?(i=e,h=c[i>>2]|0,i=c[i+4>>2]|0,!((h|0)==0&(i&2147483647|0)==0)):0){o=e+10|0;b[g>>1]=b[o>>1]|0;b[g+2>>1]=b[o+2>>1]|0;b[g+4>>1]=b[o+4>>1]|0;if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&((h|0)!=0|(i&1073741823|0)!=0)){f=f+2|0;a[f>>0]=a[f>>0]|1}f=d;c[f>>2]=h;c[f+4>>2]=i|-1073741824;b[d+8>>1]=p;p=d+10|0;b[p>>1]=b[g>>1]|0;b[p+2>>1]=b[g+2>>1]|0;b[p+4>>1]=b[g+4>>1]|0;l=q;return};c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];l=q;return}if((k&65535)>=16383){j=Jl(1,0,16446-j|0)|0;k=y;h=xl(j|0,k|0,-1,-1)|0;i=y;n=e;m=c[n>>2]|0;n=c[n+4>>2]|0;g=e+10|0;b[o>>1]=b[g>>1]|0;b[o+2>>1]=b[g+2>>1]|0;b[o+4>>1]=b[g+4>>1]|0;g=a[f+1>>0]|0;switch(g<<24>>24){case 0:{g=xl(m|0,n|0,Il(j|0,k|0,1)|0,y|0)|0;e=y;h=(g&h|0)==0&(e&i|0)==0;g=(h?~j:-1)&g;h=(h?~k:-1)&e;break}case 3:{g=m;h=n;break}default:{g=((p&65535)>>>15&65535|0)==(g<<24>>24==2|0);g=xl((g?0:h)|0,(g?0:i)|0,m|0,n|0)|0;h=y}}e=yl(0,0,j|0,k|0)|0;e=g&e;i=h&y;g=(e|0)==0&(i|0)==0;h=g?0:e;i=g?-2147483648:i;if(!((h|0)==(m|0)&(i|0)==(n|0))){f=f+2|0;a[f>>0]=a[f>>0]|32}f=d;c[f>>2]=h;c[f+4>>2]=i;b[d+8>>1]=p+(g&1)<<16>>16;p=d+10|0;b[p>>1]=b[o>>1]|0;b[p+2>>1]=b[o+2>>1]|0;b[p+4>>1]=b[o+4>>1]|0;l=q;return}if(k<<16>>16==0?(o=e,(c[o>>2]|0)==0?(c[o+4>>2]&2147483647|0)==0:0):0){c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];l=q;return}g=f+2|0;a[g>>0]=a[g>>0]|32;g=(p&65535)>>>15&255;switch(a[f+1>>0]|0){case 0:{if(k<<16>>16==16382?(f=e,!((c[f>>2]|0)==0?(c[f+4>>2]&2147483647|0)==0:0)):0){f=d;c[f>>2]=0;c[f+4>>2]=-2147483648;b[d+8>>1]=p&-32768|16383;l=q;return}break}case 1:if(!(g<<24>>24)){p=d;c[p>>2]=0;c[p+4>>2]=0;b[d+8>>1]=0;l=q;return}else{p=d;c[p>>2]=0;c[p+4>>2]=-2147483648;b[d+8>>1]=-16385;l=q;return}case 2:if(!(g<<24>>24)){p=d;c[p>>2]=0;c[p+4>>2]=-2147483648;b[d+8>>1]=16383;l=q;return}else{p=d;c[p>>2]=0;c[p+4>>2]=0;b[d+8>>1]=-32768;l=q;return}default:{}}f=d;c[f>>2]=0;c[f+4>>2]=0;b[d+8>>1]=p&-32768;l=q;return}function li(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+32|0;h=j+16|0;g=j;i=(e[b+8>>1]|0)>>>15&255;if(i<<24>>24==((e[d+8>>1]|0)>>>15&255)<<24>>24){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];mi(a,g,h,i,f);l=j;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ni(a,g,h,i,f);l=j;return}}function mi(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;A=l;l=l+16|0;r=A+6|0;q=A;u=f;x=c[u>>2]|0;u=c[u+4>>2]|0;s=b[f+8>>1]|0;k=s&32767;m=k&65535;v=g;w=c[v>>2]|0;v=c[v+4>>2]|0;t=b[g+8>>1]|0;o=t&32767;p=o&65535;j=m-p|0;do if((j|0)<=0)if((j|0)<0){if(o<<16>>16!=32767){g=j+(k<<16>>16==0&1)|0;f=0-g|0;if(!g){f=w;k=v;n=x;o=u;j=0;g=0;m=p;z=75;break}if((g|0)>-64){j=Jl(x|0,u|0,g&63|0)|0;g=y;n=Il(x|0,u|0,f|0)|0;f=w;k=v;o=y;m=p;z=75;break}else{g=(f|0)==64;f=w;k=v;n=0;o=0;j=g?x:((x|0)!=0|(u|0)!=0)&1;g=g?u:0;m=p;z=75;break}}if((w|0)==0&(v&2147483647|0)==0){i=e;c[i>>2]=0;c[i+4>>2]=-2147483648;b[e+8>>1]=(h&255)<<15|32767;l=A;return}n=g+10|0;b[r>>1]=b[n>>1]|0;b[r+2>>1]=b[n+2>>1]|0;b[r+4>>1]=b[n+4>>1]|0;n=f+10|0;b[q>>1]=b[n>>1]|0;b[q+2>>1]=b[n+2>>1]|0;b[q+4>>1]=b[n+4>>1]|0;n=k<<16>>16==32767;o=((x|0)!=0|(u&2147483647|0)!=0)&n;n=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&(((x|0)!=0|(u&1073741823|0)!=0)&n);j=(w|0)!=0|(v&1073741823|0)!=0;k=(w|0)==(w|0)&(v|0)==(v&-1073741825|0);m=k&j;g=u|-1073741824;f=v|-1073741824;if(n|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(n)if(m)z=37;else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0}else{if(!o){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(k&j){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0}else z=37}while(0);do if((z|0)==37){if(g>>>0<f>>>0|(g|0)==(f|0)&x>>>0<w>>>0){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(f>>>0<g>>>0|(f|0)==(g|0)&w>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}if((s&65535)<(t&65535)){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}}while(0);l=A;return}else{if(k<<16>>16!=32767){f=xl(w|0,v|0,x|0,u|0)|0;g=y;if(k<<16>>16){k=g;j=0;g=0;z=76;break}x=g>>>0<1|(g|0)==1&f>>>0<0;m=x?f:g;j=m>>>0<65536;m=j?m<<16:m;j=j?16:0;k=m>>>0<16777216;m=((x?32:0)|(k?j|8:j)&255)+(d[10416+((k?m<<8:m)>>>24)>>0]|0)<<24>>24;f=Jl(f|0,g|0,m|0)|0;m=1-m|0;k=y;j=0;g=0;break}if((w|x|0)==0&((v|u)&2147483647|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=A;return}m=g+10|0;b[r>>1]=b[m>>1]|0;b[r+2>>1]=b[m+2>>1]|0;b[r+4>>1]=b[m+4>>1]|0;m=f+10|0;b[q>>1]=b[m>>1]|0;b[q+2>>1]=b[m+2>>1]|0;b[q+4>>1]=b[m+4>>1]|0;m=(x|0)==0&(u&2147483647|0)==0;n=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&((x|0)!=0|(u&1073741823|0)!=0);j=o<<16>>16==32767;k=((w|0)!=0|(v&2147483647|0)!=0)&j;j=(w|0)==(w|0)&(v|0)==(v&-1073741825|0)&(((w|0)!=0|(v&1073741823|0)!=0)&j);g=u|-1073741824;f=v|-1073741824;if(n|j){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(n)if(!j)if(k){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else z=63;else{if(m){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(k&(j^1))z=63;else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0}}while(0);do if((z|0)==63){if(g>>>0<f>>>0|(g|0)==(f|0)&x>>>0<w>>>0){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(f>>>0<g>>>0|(f|0)==(g|0)&w>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}if((s&65535)<(t&65535)){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}}while(0);l=A;return}else{if(k<<16>>16!=32767){f=j+((o<<16>>16==0)<<31>>31)|0;if(!f){f=w;k=v;n=x;o=u;j=0;g=0;z=75;break}if((f|0)<64){j=Jl(w|0,v|0,0-f&63|0)|0;g=y;f=Il(w|0,v|0,f|0)|0;k=y;n=x;o=u;z=75;break}else{g=(f|0)==64;f=0;k=0;n=x;o=u;j=g?w:((w|0)!=0|(v|0)!=0)&1;g=g?v:0;z=75;break}}if((x|0)==0&(u&2147483647|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=A;return}m=g+10|0;b[r>>1]=b[m>>1]|0;b[r+2>>1]=b[m+2>>1]|0;b[r+4>>1]=b[m+4>>1]|0;m=f+10|0;b[q>>1]=b[m>>1]|0;b[q+2>>1]=b[m+2>>1]|0;b[q+4>>1]=b[m+4>>1]|0;m=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&((x|0)!=0|(u&1073741823|0)!=0);j=o<<16>>16==32767;k=((w|0)!=0|(v&2147483647|0)!=0)&j;j=(w|0)==(w|0)&(v|0)==(v&-1073741825|0)&(((w|0)!=0|(v&1073741823|0)!=0)&j);g=u|-1073741824;f=v|-1073741824;if(m|j){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(m)if(!j)if(k){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else z=13;else if(k&(j^1))z=13;else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0}while(0);do if((z|0)==13){if(g>>>0<f>>>0|(g|0)==(f|0)&x>>>0<w>>>0){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(f>>>0<g>>>0|(f|0)==(g|0)&w>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}if((s&65535)<(t&65535)){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}}while(0);l=A;return}while(0);if((z|0)==75){f=xl(f|0,k|0,n|0,o|0)|0;k=y;if((k|0)>=0)z=76}if((z|0)==76){x=Jl(f|0,k|0,63)|0;z=y;f=Il(f|0,k|0,1)|0;m=m+1|0;k=y|-2147483648;j=x|((j|0)!=0|(g|0)!=0)&1;g=z}oi(e,a[i+3>>0]|0,h,m,f,k,j,g,i);l=A;return}function ni(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;A=l;l=l+32|0;u=A+12|0;t=A+6|0;o=A;j=f;n=c[j>>2]|0;j=c[j+4>>2]|0;w=b[f+8>>1]|0;q=w&32767;r=q&65535;p=g;x=c[p>>2]|0;p=c[p+4>>2]|0;v=b[g+8>>1]|0;s=v&32767;k=s&65535;m=r-k|0;a:do if((m|0)>0){if(q<<16>>16!=32767){m=m+((s<<16>>16==0)<<31>>31)|0;k=0-m&63;if(!m){m=r;k=x;o=p;f=0;p=0;z=84;break}if((m|0)<64){f=Jl(x|0,p|0,k|0)|0;z=y;k=Il(x|0,p|0,m|0)|0;m=r;o=y;p=z;z=84;break}if((m|0)==64){m=r;k=0;o=0;f=x;z=84;break}if((m|0)<128){w=Il(x|0,p|0,m&63|0)|0;z=y;f=Jl(x|0,p|0,k|0)|0;m=r;k=0;o=0;f=w|((f|0)!=0|(y|0)!=0)&1;p=z;z=84;break}else{m=r;k=0;o=0;f=((x|0)!=0|(p|0)!=0)&1;p=0;z=84;break}}if((n|0)==0&(j&2147483647|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=A;return}m=g+10|0;b[u>>1]=b[m>>1]|0;b[u+2>>1]=b[m+2>>1]|0;b[u+4>>1]=b[m+4>>1]|0;f=f+10|0;b[t>>1]=b[f>>1]|0;b[t+2>>1]=b[f+2>>1]|0;b[t+4>>1]=b[f+4>>1]|0;f=(n|0)==(n|0)&(j|0)==(j&-1073741825|0)&((n|0)!=0|(j&1073741823|0)!=0);m=s<<16>>16==32767;o=((x|0)!=0|(p&2147483647|0)!=0)&m;m=(x|0)==(x|0)&(p|0)==(p&-1073741825|0)&(((x|0)!=0|(p&1073741823|0)!=0)&m);k=j|-1073741824;j=p|-1073741824;if(f|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(f)if(!m)if(o){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else z=68;else if(o&(m^1))z=68;else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0}while(0);do if((z|0)==68){if(k>>>0<j>>>0|(k|0)==(j|0)&n>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<n>>>0){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}if((w&65535)<(v&65535)){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}}while(0);l=A;return}else{do if((m|0)>=0){m=w&32767;b:do if(m<<16>>16<32767){switch(m<<16>>16){case 0:break;default:{m=r;break b}}m=1;k=1}else{switch(m<<16>>16){case 32767:break;default:{m=r;break b}}if((x|n|0)==0&((p|j)&2147483647|0)==0){i=i+2|0;a[i>>0]=a[i>>0]|1;i=e;c[i>>2]=0;c[i+4>>2]=-1073741824;b[e+8>>1]=-1;i=e+10|0;b[i>>1]=b[o>>1]|0;b[i+2>>1]=b[o+2>>1]|0;b[i+4>>1]=b[o+4>>1]|0;l=A;return}h=g+10|0;b[u>>1]=b[h>>1]|0;b[u+2>>1]=b[h+2>>1]|0;b[u+4>>1]=b[h+4>>1]|0;f=f+10|0;b[t>>1]=b[f>>1]|0;b[t+2>>1]=b[f+2>>1]|0;b[t+4>>1]=b[f+4>>1]|0;f=q<<16>>16==32767;h=((n|0)!=0|(j&2147483647|0)!=0)&f;f=(n|0)==(n|0)&(j|0)==(j&-1073741825|0)&(((n|0)!=0|(j&1073741823|0)!=0)&f);m=s<<16>>16==32767;o=((x|0)!=0|(p&2147483647|0)!=0)&m;m=(x|0)==(x|0)&(p|0)==(p&-1073741825|0)&(((x|0)!=0|(p&1073741823|0)!=0)&m);k=j|-1073741824;j=p|-1073741824;if(f|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(f)if(!m)if(o){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else z=15;else{if(!h){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(o&(m^1))z=15;else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0}}while(0);do if((z|0)==15){if(k>>>0<j>>>0|(k|0)==(j|0)&n>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<n>>>0){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}if((w&65535)<(v&65535)){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}}while(0);l=A;return}while(0);if(p>>>0<j>>>0|(p|0)==(j|0)&x>>>0<n>>>0){k=x;o=p;f=0;p=0;z=84;break a}if(j>>>0<p>>>0|(j|0)==(p|0)&n>>>0<x>>>0){m=n;o=j;n=0;j=0}else{i=((a[i+1>>0]|0)==1&1)<<15&65535;z=e;c[z>>2]=0;c[z+4>>2]=0;b[e+8>>1]=i;l=A;return}}else{if(s<<16>>16!=32767){f=m+(q<<16>>16==0&1)|0;m=0-f|0;o=f&63;if(!f){m=n;o=j;n=0;j=0;break}if((f|0)>-64){v=Jl(n|0,j|0,o|0)|0;w=y;m=Il(n|0,j|0,m|0)|0;o=y;n=v;j=w;break}if((m|0)==64){m=0;o=0;break}if((f|0)>-128){v=Il(n|0,j|0,m&63|0)|0;w=y;n=Jl(n|0,j|0,o|0)|0;m=0;o=0;n=v|((n|0)!=0|(y|0)!=0)&1;j=w;break}else{m=0;o=0;n=((n|0)!=0|(j|0)!=0)&1;j=0;break}}if((x|0)==0&(p&2147483647|0)==0){i=e;c[i>>2]=0;c[i+4>>2]=-2147483648;b[e+8>>1]=((h^1)&255)<<15|32767;l=A;return}h=g+10|0;b[u>>1]=b[h>>1]|0;b[u+2>>1]=b[h+2>>1]|0;b[u+4>>1]=b[h+4>>1]|0;h=f+10|0;b[t>>1]=b[h>>1]|0;b[t+2>>1]=b[h+2>>1]|0;b[t+4>>1]=b[h+4>>1]|0;h=q<<16>>16==32767;q=((n|0)!=0|(j&2147483647|0)!=0)&h;h=(n|0)==(n|0)&(j|0)==(j&-1073741825|0)&(((n|0)!=0|(j&1073741823|0)!=0)&h);m=(x|0)!=0|(p&1073741823|0)!=0;o=(x|0)==(x|0)&(p|0)==(p&-1073741825|0);f=o&m;k=j|-1073741824;j=p|-1073741824;if(h|f){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(h)if(f)z=39;else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0}else{if(!q){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(o&m){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0}else z=39}while(0);do if((z|0)==39){if(k>>>0<j>>>0|(k|0)==(j|0)&n>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<n>>>0){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}if((w&65535)<(v&65535)){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}}while(0);l=A;return}while(0);o=yl(x|0,p|0,m|0,o|0)|0;m=((n|0)!=0|(j|0)!=0)<<31>>31;m=xl(o|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;h=h^1;o=k;k=m;m=y}while(0);if((z|0)==84){o=yl(n|0,j|0,k|0,o|0)|0;k=((f|0)!=0|(p|0)!=0)<<31>>31;k=xl(o|0,y|0,k|0,((k|0)<0)<<31>>31|0)|0;o=m;n=f;j=p;m=y}f=yl(0,0,n|0,j|0)|0;s=y;p=a[i+3>>0]|0;q=(k|0)==0&(m|0)==0;r=q?f:k;v=q?s:m;f=q?0:f;s=q?0:s;q=q?o+-64|0:o;z=v>>>0<1|(v|0)==1&r>>>0<0;u=z?r:v;x=u>>>0<65536;u=x?u<<16:u;x=x?16:0;g=u>>>0<16777216;u=((z?32:0)|(g?x|8:x)&255)+(d[10416+((g?u<<8:u)>>>24)>>0]|0)|0;g=u<<24>>24;x=Jl(f|0,s|0,g|0)|0;z=y;u=(u&255)<<24>>24==0;t=Jl(r|0,v|0,g|0)|0;w=y;s=Il(f|0,s|0,0-g&63|0)|0;oi(e,p,h,q-g|0,u?r:s|t,u?v:y|w,x,z,i);l=A;return}function oi(d,e,f,g,h,i,j,k,l){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=a[l+1>>0]|0;t=s<<24>>24==0;a:do switch(e<<24>>24){case 32:{p=-1;q=255;e=0;n=128;r=3;break}case 64:{p=2047;q=0;e=1024;n=0;r=3;break}default:{e=Il(j|0,k|0,63)|0;do if(!t)if(s<<24>>24!=3)if(!(f<<24>>24)){e=((j|0)!=0|(k|0)!=0)&s<<24>>24==2&1;break}else{e=((j|0)!=0|(k|0)!=0)&s<<24>>24==1&1;break}else e=0;else e=e&255;while(0);if((g+-1|0)>>>0>32764){if((g|0)>32766){h=0;i=0;break a}m=(h|0)!=-1|(i|0)!=-1;if(!((g|0)!=32766|m|e<<24>>24==0)){h=0;i=0;break a}if((g|0)<1){o=m|e<<24>>24!=0&((g|0)==0&(a[l>>0]|0)!=1)^1;g=1-g|0;e=0-g&63;do if(g)if((g|0)<64){n=Jl(h|0,i|0,e|0)|0;q=y;h=Il(h|0,i|0,g|0)|0;n=n|((j|0)!=0|(k|0)!=0)&1;k=q;i=y;break}else{q=(g|0)==64;n=q?((j|0)!=0|(k|0)!=0)&1|h:((j|h|0)!=0|(k|i|0)!=0)&1;k=q?i:0;h=0;i=0;break}else n=j;while(0);m=(n|0)!=0|(k|0)!=0;if(!(o&m)){if(!((n|0)==0&(k|0)==0)){e=l+2|0;g=e;e=a[e>>0]|0;r=46}}else{g=l+2|0;e=a[g>>0]|16;a[g>>0]=e;r=46}if((r|0)==46)a[g>>0]=e|32;do if(!t)if(!(f<<24>>24)){g=s<<24>>24==2&m&1;break}else{g=s<<24>>24==1&m&1;break}else{g=Il(n|0,k|0,63)|0;g=g&255}while(0);if(!(g<<24>>24))g=0;else{h=xl(h|0,i|0,1,0)|0;l=y;i=~(t&((n|0)==0&(k&2147483647|0)==0)&1);g=Il(h|0,l|0,63)|0;h=h&i;i=l&((i|0)<0)<<31>>31}t=g+((f&255)<<15)|0;r=h;l=i;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}}if(!((j|0)==0&(k|0)==0)){l=l+2|0;a[l>>0]=a[l>>0]|32}do if(e<<24>>24){i=xl(h|0,i|0,1,0)|0;e=y;if((i|0)==0&(e|0)==0){g=g+1|0;h=0;i=-2147483648;break}else{t=~((j|0)==0&(k&2147483647|0)==0&t&1);h=i&t;i=e&((t|0)<0)<<31>>31;break}}else g=(h|0)==0&(i|0)==0?0:g;while(0);t=g+((f&255)<<15)|0;r=h;l=i;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}}while(0);do if((r|0)==3){m=((j|0)!=0|(k|0)!=0)&1|h;do if(!t)if(s<<24>>24!=3)if(!(f<<24>>24)){o=s<<24>>24==1;j=o?0:p;o=o?0:q;break}else{o=s<<24>>24==2;j=o?0:p;o=o?0:q;break}else{j=0;o=0}else{j=e;o=n}while(0);h=p&m;e=q&i;if((g+-1|0)>>>0>32764){if((g|0)>32766){h=p;i=q;break}k=xl(j|0,o|0,m|0,i|0)|0;n=y;if((g|0)==32766&(n>>>0<i>>>0|(n|0)==(i|0)&k>>>0<m>>>0)){h=p;i=q;break}if((g|0)<1){k=i>>>0<n>>>0|(i|0)==(n|0)&m>>>0<=k>>>0|((g|0)!=0|(a[l>>0]|0)==1);h=1-g|0;do if(h)if((h|0)<64){r=Il(m|0,i|0,h|0)|0;s=y;m=Jl(m|0,i|0,0-h&63|0)|0;m=r|((m|0)!=0|(y|0)!=0)&1;i=s;break}else{m=((m|0)!=0|(i|0)!=0)&1;i=0;break}while(0);h=m&p;g=i&q;e=(h|0)!=0|(g|0)!=0;if(k&e){s=l+2|0;a[s>>0]=a[s>>0]|16}if(e){l=l+2|0;a[l>>0]=a[l>>0]|32}o=xl(m|0,i|0,j|0,o|0)|0;j=y;n=Il(o|0,j|0,63)|0;r=xl(p|0,q|0,1,0)|0;l=y;s=Jl(h|0,g|0,1)|0;s=t&((s|0)==(r|0)&(y|0)==(l|0));t=(f&255)<<15|n;r=o&~((s?r:0)|p);l=j&~((s?l:0)|q);t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}}if(!((h|0)==0&(e|0)==0)){l=l+2|0;a[l>>0]=a[l>>0]|32}k=xl(j|0,o|0,m|0,i|0)|0;n=y;s=n>>>0<o>>>0|(n|0)==(o|0)&k>>>0<j>>>0;r=xl(p|0,q|0,1,0)|0;l=y;j=Jl(h|0,e|0,1)|0;t=t&((j|0)==(r|0)&(y|0)==(l|0));r=(s?0:k)&~((t?r:0)|p);l=(s?-2147483648:n)&~((t?l:0)|q);t=((r|0)==0&(l|0)==0?0:(s&1)+g|0)+((f&255)<<15)|0;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}while(0);t=l+2|0;a[t>>0]=a[t>>0]|40;if((s<<24>>24!=3?!(f<<24>>24!=0&s<<24>>24==2):0)?!(f<<24>>24==0&s<<24>>24==1):0){t=(f&255)<<15|32767;r=0;l=-2147483648;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}t=(f&255)<<15|32766;r=~h;l=~i;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}function pi(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+32|0;h=j+16|0;g=j;i=(e[b+8>>1]|0)>>>15&255;if(i<<24>>24==((e[d+8>>1]|0)>>>15&255)<<24>>24){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ni(a,g,h,i,f);l=j;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];mi(a,g,h,i,f);l=j;return}}function qi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;A=l;l=l+32|0;v=A+12|0;u=A+6|0;q=A;m=f;n=c[m>>2]|0;m=c[m+4>>2]|0;w=b[f+8>>1]|0;p=w&32767;o=p&65535;i=g;j=c[i>>2]|0;i=c[i+4>>2]|0;x=b[g+8>>1]|0;t=x&32767;k=t&65535;r=x^w;s=(r&65535)>>>15&255;do if(p<<16>>16==32767){o=m&2147483647;if((n|0)==0&(o|0)==0){k=i&2147483647;if((j|0)==0&(k|0)==0|t<<16>>16!=32767){if((j|t&65535|0)==0&(i|0)==0)break;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=r|32767;l=A;return}else p=j}else{p=j;k=i&2147483647}q=g+10|0;b[v>>1]=b[q>>1]|0;b[v+2>>1]=b[q+2>>1]|0;b[v+4>>1]=b[q+4>>1]|0;q=f+10|0;b[u>>1]=b[q>>1]|0;b[u+2>>1]=b[q+2>>1]|0;b[u+4>>1]=b[q+4>>1]|0;q=(n|0)==0&(o|0)==0;f=(n|0)==(n|0)&(m|0)==(m&-1073741825|0)&((n|0)!=0|(m&1073741823|0)!=0);o=t<<16>>16==32767;p=((p|0)!=0|(k|0)!=0)&o;o=(j|0)==(j|0)&(i|0)==(i&-1073741825|0)&(((j|0)!=0|(i&1073741823|0)!=0)&o);k=m|-1073741824;i=i|-1073741824;if(f|o){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(f)if(!o)if(p){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else z=15;else{if(q){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(p&(o^1))z=15;else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0}}while(0);do if((z|0)==15){if(k>>>0<i>>>0|(k|0)==(i|0)&n>>>0<j>>>0){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(i>>>0<k>>>0|(i|0)==(k|0)&j>>>0<n>>>0){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}if((w&65535)<(x&65535)){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else{h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}while(0);l=A;return}else{if(t<<16>>16==32767){if((j|0)==0&(i&2147483647|0)==0){if((n|p&65535|0)==0&(m|0)==0)break;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=r|32767;l=A;return}z=g+10|0;b[v>>1]=b[z>>1]|0;b[v+2>>1]=b[z+2>>1]|0;b[v+4>>1]=b[z+4>>1]|0;if((j|0)==(j|0)&(i|0)==(i&-1073741825|0)&((j|0)!=0|(i&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=j;c[h+4>>2]=i|-1073741824;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;l=A;return}do if(!(p<<16>>16)){if(!((n|0)==0&(m|0)==0)){w=m>>>0<1|(m|0)==1&n>>>0<0;o=w?n:m;x=o>>>0<65536;o=x?o<<16:o;x=x?16:0;z=o>>>0<16777216;o=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?o<<8:o)>>>24)>>0]|0)<<24>>24;n=Jl(n|0,m|0,o|0)|0;o=1-o|0;m=y;break}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=r&-32768;l=A;return}while(0);do if(!(t<<16>>16)){if(!((j|0)==0&(i|0)==0)){w=i>>>0<1|(i|0)==1&j>>>0<0;k=w?j:i;x=k>>>0<65536;k=x?k<<16:k;x=x?16:0;z=k>>>0<16777216;k=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?k<<8:k)>>>24)>>0]|0)<<24>>24;j=Jl(j|0,i|0,k|0)|0;k=1-k|0;i=y;break}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=r&-32768;l=A;return}while(0);z=Dl(j|0,0,n|0,0)|0;r=y;v=Dl(i|0,0,n|0,0)|0;w=y;u=Dl(j|0,0,m|0,0)|0;g=y;x=Dl(i|0,0,m|0,0)|0;t=y;w=xl(v|0,w|0,u|0,g|0)|0;v=y;t=xl(v|0,(v>>>0<g>>>0|(v|0)==(g|0)&w>>>0<u>>>0)&1|0,x|0,t|0)|0;x=y;r=xl(0,w|0,z|0,r|0)|0;z=y;w=xl(t|0,x|0,(z>>>0<w>>>0|(z|0)==(w|0)&r>>>0<0)&1|0,0)|0;x=y;t=(x|0)>0|(x|0)==0&w>>>0>0;u=Jl(w|0,x|0,1)|0;g=y;v=Il(r|0,z|0,63)|0;x=t?g|y:x;z=Jl(r|0,z|0,t&1|0)|0;oi(e,a[h+3>>0]|0,s,k+o+(t?-16383:-16382)|0,t?u|v:w,x,z,y,h);l=A;return}while(0);h=h+2|0;a[h>>0]=a[h>>0]|1;h=e;c[h>>2]=0;c[h+4>>2]=-1073741824;b[e+8>>1]=-1;h=e+10|0;b[h>>1]=b[q>>1]|0;b[h+2>>1]=b[q+2>>1]|0;b[h+4>>1]=b[q+4>>1]|0;l=A;return}function ri(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;A=l;l=l+32|0;v=A+12|0;s=A+6|0;n=A;j=f;i=c[j>>2]|0;j=c[j+4>>2]|0;t=b[f+8>>1]|0;p=t&32767;k=p&65535;u=g;x=c[u>>2]|0;u=c[u+4>>2]|0;w=b[g+8>>1]|0;o=w&32767;q=w^t;z=(q&65535)>>>15&255;a:do if(p<<16>>16==32767){if(!((i|0)==0&(j&2147483647|0)==0)){n=g+10|0;b[v>>1]=b[n>>1]|0;b[v+2>>1]=b[n+2>>1]|0;b[v+4>>1]=b[n+4>>1]|0;n=f+10|0;b[s>>1]=b[n>>1]|0;b[s+2>>1]=b[n+2>>1]|0;b[s+4>>1]=b[n+4>>1]|0;n=(i|0)==(i|0)&(j|0)==(j&-1073741825|0)&((i|0)!=0|(j&1073741823|0)!=0);f=o<<16>>16==32767;m=((x|0)!=0|(u&2147483647|0)!=0)&f;f=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&(((x|0)!=0|(u&1073741823|0)!=0)&f);k=j|-1073741824;j=u|-1073741824;if(n|f){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(n)if(!f)if(m){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}else{h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}else r=12;else if(m&(f^1))r=12;else{h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0}while(0);do if((r|0)==12){if(k>>>0<j>>>0|(k|0)==(j|0)&i>>>0<x>>>0){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<i>>>0){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}if((t&65535)<(w&65535)){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}else{h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}while(0);l=A;return}if(o<<16>>16!=32767){h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=q|32767;l=A;return}if(!((x|0)==0&(u&2147483647|0)==0)){m=g+10|0;b[v>>1]=b[m>>1]|0;b[v+2>>1]=b[m+2>>1]|0;b[v+4>>1]=b[m+4>>1]|0;m=f+10|0;b[s>>1]=b[m>>1]|0;b[s+2>>1]=b[m+2>>1]|0;b[s+4>>1]=b[m+4>>1]|0;m=(i|0)==(i|0)&(j|0)==(j&-1073741825|0)&((i|0)!=0|(j&1073741823|0)!=0);f=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&((x|0)!=0|(u&1073741823|0)!=0);k=j|-1073741824;j=u|-1073741824;if(m|f){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(m){if(!f){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(k>>>0<j>>>0|(k|0)==(j|0)&i>>>0<x>>>0){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<i>>>0){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}if((t&65535)<(w&65535)){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}else{h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}else{h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0}while(0);l=A;return}}else{f=o&65535;m=w&32767;b:do if(m<<16>>16<32767){switch(m<<16>>16){case 0:break;default:break b}if(!((x|0)==0&(u|0)==0)){t=u>>>0<1|(u|0)==1&x>>>0<0;f=t?x:u;v=f>>>0<65536;f=v?f<<16:f;v=v?16:0;w=f>>>0<16777216;f=((t?32:0)|(w?v|8:v)&255)+(d[10416+((w?f<<8:f)>>>24)>>0]|0)<<24>>24;x=Jl(x|0,u|0,f|0)|0;f=1-f|0;u=y;break}if((i|p&65535|0)==0&(j|0)==0)break a;h=h+2|0;a[h>>0]=a[h>>0]|4;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=q|32767;l=A;return}else{switch(m<<16>>16){case 32767:break;default:break b}if((x|0)==0&(u&2147483647|0)==0){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=q&-32768;l=A;return}z=g+10|0;b[v>>1]=b[z>>1]|0;b[v+2>>1]=b[z+2>>1]|0;b[v+4>>1]=b[z+4>>1]|0;if((x|0)==(x|0)&(u|0)==(u&-1073741825|0)&(((x|0)!=0|(u&1073741823|0)!=0)&o<<16>>16==32767)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=x;c[h+4>>2]=u|-1073741824;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;l=A;return}while(0);do if(!(p<<16>>16)){if(!((i|0)==0&(j|0)==0)){t=j>>>0<1|(j|0)==1&i>>>0<0;k=t?i:j;v=k>>>0<65536;k=v?k<<16:k;v=v?16:0;w=k>>>0<16777216;k=((t?32:0)|(w?v|8:v)&255)+(d[10416+((w?k<<8:k)>>>24)>>0]|0)<<24>>24;i=Jl(i|0,j|0,k|0)|0;k=1-k|0;j=y;break}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=q&-32768;l=A;return}while(0);w=u>>>0>j>>>0|(u|0)==(j|0)&x>>>0>i>>>0;r=Jl(i|0,j|0,63)|0;s=y;p=Il(i|0,j|0,(w^1)&1|0)|0;q=y;r=w?0:r;s=w?0:s;w=k-f+(w?16382:16383)|0;if(u>>>0>q>>>0|(u|0)==(q|0)&x>>>0>p>>>0){if(u>>>0>q>>>0|(u|0)==(q|0)&0>p>>>0){f=Fl(p|0,q|0,u|0,0)|0;k=0}else{f=-1;k=0}m=Dl(f|0,0,x|0,0)|0;n=y;t=Dl(f|0,0,u|0,0)|0;v=y;i=yl(r|0,s|0,0,m|0)|0;j=y;m=(s>>>0<m>>>0|(s|0)==(m|0)&r>>>0<0)<<31>>31;v=yl(p|0,q|0,t|0,v|0)|0;n=yl(v|0,y|0,n|0,0)|0;m=xl(n|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;n=y;if((n|0)<0)while(1){k=xl(k|0,f|0,0,-1)|0;f=y;g=xl(i|0,j|0,0,x|0)|0;o=y;m=xl(m|0,n|0,u|0,0)|0;m=xl(m|0,y|0,(o>>>0<j>>>0|(o|0)==(j|0)&g>>>0<i>>>0)&1|0,0)|0;n=y;if((n|0)<0){i=g;j=o}else{i=o;break}}else i=j;if(u>>>0>m>>>0|(u|0)==(m|0)&0>i>>>0){i=Fl(i|0,m|0,u|0,0)|0;j=y}else{i=-1;j=0}k=i|k;t=x;v=0;n=j|f}else{k=-1;t=x;v=0;n=-1}F=Dl(k|0,0,t|0,v|0)|0;i=y;C=Dl(n|0,0,t|0,v|0)|0;j=y;o=Dl(k|0,0,u|0,0)|0;B=y;E=Dl(n|0,0,u|0,0)|0;D=y;j=xl(C|0,j|0,o|0,B|0)|0;C=y;i=xl(0,j|0,F|0,i|0)|0;F=y;m=yl(r|0,s|0,i|0,F|0)|0;g=y;f=(F>>>0<j>>>0|(F|0)==(j|0)&i>>>0<0)<<31>>31;i=(s>>>0<F>>>0|(s|0)==(F|0)&r>>>0<i>>>0)<<31>>31;s=yl(p|0,q|0,E|0,D|0)|0;s=yl(s|0,y|0,C|0,(C>>>0<B>>>0|(C|0)==(B|0)&j>>>0<o>>>0)&1|0)|0;f=xl(s|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;i=xl(f|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;f=y;if((f|0)<0){j=k;o=m;while(1){j=xl(j|0,n|0,-1,-1)|0;n=y;m=xl(o|0,g|0,x|0,u|0)|0;k=y;i=xl(i|0,f|0,(k>>>0<g>>>0|(k|0)==(g|0)&m>>>0<o>>>0)&1|0,0)|0;f=y;if((f|0)>=0){g=k;s=j;r=n;break}else{o=m;g=k}}}else{s=k;r=n}if(u>>>0>g>>>0|(u|0)==(g|0)&x>>>0>m>>>0){if(u>>>0>g>>>0|(u|0)==(g|0)&0>m>>>0){f=Fl(m|0,g|0,u|0,0)|0;j=0}else{f=-1;j=0}n=Dl(f|0,0,t|0,v|0)|0;o=y;E=Dl(f|0,0,u|0,0)|0;F=y;i=yl(0,0,0,n|0)|0;k=y;n=(0!=0|(n|0)!=0)<<31>>31;F=yl(m|0,g|0,E|0,F|0)|0;o=yl(F|0,y|0,o|0,0)|0;n=xl(o|0,y|0,n|0,((n|0)<0)<<31>>31|0)|0;o=y;if((o|0)<0)while(1){j=xl(j|0,f|0,0,-1)|0;f=y;p=xl(i|0,k|0,0,x|0)|0;q=y;n=xl(n|0,o|0,u|0,0)|0;n=xl(n|0,y|0,(q>>>0<k>>>0|(q|0)==(k|0)&p>>>0<i>>>0)&1|0,0)|0;o=y;if((o|0)<0){i=p;k=q}else{i=q;break}}else i=k;if(u>>>0>n>>>0|(u|0)==(n|0)&0>i>>>0){i=Fl(i|0,n|0,u|0,0)|0;k=y}else{i=-1;k=0}j=i|j;i=k|f;F=Jl(j|0,i|0,1)|0;E=y;if(E>>>0<0|(E|0)==0&F>>>0<9){f=Dl(j|0,0,t|0,v|0)|0;q=y;B=Dl(i|0,0,t|0,v|0)|0;D=y;E=Dl(j|0,0,u|0,0)|0;C=y;t=Dl(i|0,0,u|0,0)|0;v=y;D=xl(B|0,D|0,E|0,C|0)|0;B=y;q=xl(0,D|0,f|0,q|0)|0;f=y;n=yl(0,0,q|0,f|0)|0;k=y;F=(f>>>0<D>>>0|(f|0)==(D|0)&q>>>0<0)<<31>>31;f=((q|0)!=0|(f|0)!=0)<<31>>31;m=yl(m|0,g|0,t|0,v|0)|0;m=yl(m|0,y|0,B|0,(B>>>0<C>>>0|(B|0)==(C|0)&D>>>0<E>>>0)&1|0)|0;m=xl(m|0,y|0,F|0,((F|0)<0)<<31>>31|0)|0;f=xl(m|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;m=y;if((m|0)<0)while(1){j=xl(j|0,i|0,-1,-1)|0;i=y;g=xl(n|0,k|0,x|0,u|0)|0;o=y;f=xl(f|0,m|0,(o>>>0<k>>>0|(o|0)==(k|0)&g>>>0<n>>>0)&1|0,0)|0;m=y;if((m|0)<0){n=g;k=o}else{n=g;k=o;break}}j=j|((n|f|0)!=0|(k|m|0)!=0)&1}}else{j=-1;i=-1}oi(e,a[h+3>>0]|0,z,w,s,r,j,i,h);l=A;return}while(0);F=h+2|0;a[F>>0]=a[F>>0]|1;F=e;c[F>>2]=0;c[F+4>>2]=-1073741824;b[e+8>>1]=-1;F=e+10|0;b[F>>1]=b[n>>1]|0;b[F+2>>1]=b[n+2>>1]|0;b[F+4>>1]=b[n+4>>1]|0;l=A;return}function si(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;x=l;l=l+16|0;j=x+6|0;k=x;q=g;p=c[q>>2]|0;q=c[q+4>>2]|0;m=b[g+8>>1]|0;n=m&32767;i=n&65535;o=(m&65535)>>>15&255;do if(n<<16>>16==32767){if((p|0)==0&(q&2147483647|0)==0){if(o<<24>>24)break;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];l=x;return}w=g+10|0;b[j>>1]=b[w>>1]|0;b[j+2>>1]=b[w+2>>1]|0;b[j+4>>1]=b[w+4>>1]|0;if((p|0)==(p|0)&(q|0)==(q&-1073741825|0)&((p|0)!=0|(q&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=f;c[h>>2]=p;c[h+4>>2]=q|-1073741824;b[f+8>>1]=m;h=f+10|0;b[h>>1]=b[j>>1]|0;b[h+2>>1]=b[j+2>>1]|0;b[h+4>>1]=b[j+4>>1]|0;l=x;return}else{if(o<<24>>24){if(!((p|n&65535|0)==0&(q|0)==0))break;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];l=x;return}do if(!(n<<16>>16)){if(!((p|0)==0&(q|0)==0)){u=q>>>0<1|(q|0)==1&p>>>0<0;i=u?p:q;v=i>>>0<65536;i=v?i<<16:i;v=v?16:0;w=i>>>0<16777216;i=((u?32:0)|(w?v|8:v)&255)+(d[10416+((w?i<<8:i)>>>24)>>0]|0)<<24>>24;p=Jl(p|0,q|0,i|0)|0;i=1-i|0;q=y;break}h=f;c[h>>2]=0;c[h+4>>2]=0;b[f+8>>1]=0;l=x;return}while(0);w=(i+-16383>>1)+16383|0;j=Il(p|0,q|0,59)|0;j=j&15;k=i&1;i=Il(p|0,q|0,49)|0;if(!k){i=(i|32768)-(e[10704+(j<<1)>>1]|0)|0;i=i+((q>>>0)/(i>>>0)|0)|0;i=i>>>0>131071?-32768:i<<15;if(i>>>0>q>>>0){j=q;r=20}else n=q>>1}else{i=i+16384-(e[10672+(j<<1)>>1]|0)|0;j=Il(p|0,q|0,33)|0;i=(i<<15)+(((q>>>0)/(i>>>0)|0)<<14)|0;r=20}if((r|0)==20){n=Jl(j|0,0,31)|0;n=Fl(n|0,y|0,i|0,0)|0;n=(i>>>1)+n|0}o=k|2;r=Jl(p|0,q|0,0-o&63|0)|0;s=y;o=Il(p|0,q|0,o|0)|0;p=y;if(n>>>0>p>>>0|(n|0)==(p|0)&0>o>>>0){j=Fl(o|0,p|0,n|0,0)|0;i=Dl(j|0,0,n|0,0)|0;i=yl(o|0,p|0,i|0,y|0)|0;k=y;if((k|0)<0){g=0;do{g=xl(g|0,j|0,0,-1)|0;j=y;i=xl(i|0,k|0,n|0,0)|0;k=y}while((k|0)<0);m=g;g=j}else{m=0;g=j}if(n>>>0>i>>>0|(n|0)==(i|0)&0>s>>>0){i=Fl(s|0,i|0,n|0,0)|0;k=y}else{i=-1;k=0}j=i|m;i=k|g}else{j=-1;i=-1}m=Jl(n|0,0,30)|0;j=xl(j|0,i|0,m|0,y|0)|0;m=y;k=Jl(j|0,m|0,1)|0;i=y;E=Dl(j|0,0,j|0,0)|0;D=y;g=Dl(m|0,0,j|0,0)|0;u=y;C=Dl(m|0,0,m|0,0)|0;B=y;v=Jl(g|0,u|0,1)|0;t=y;z=Il(g|0,u|0,31)|0;A=Jl(g|0,u|0,33)|0;F=y;D=xl(A|0,F|0,E|0,D|0)|0;E=y;q=yl(r|0,s|0,D|0,E|0)|0;n=y;A=(E>>>0<F>>>0|(E|0)==(F|0)&D>>>0<A>>>0)<<31>>31;s=(s>>>0<E>>>0|(s|0)==(E|0)&r>>>0<D>>>0)<<31>>31;o=yl(o|0,p|0,C|0,B|0)|0;o=xl(o|0,y|0,A|0,((A|0)<0)<<31>>31|0)|0;o=xl(o|0,y|0,s|0,((s|0)<0)<<31>>31|0)|0;o=yl(o|0,y|0,z|0,(t>>>0<u>>>0|(t|0)==(u|0)&v>>>0<g>>>0)&1|0)|0;g=y;if((g|0)<0){p=n;while(1){j=xl(j|0,m|0,-1,-1)|0;m=y;k=xl(k|0,i|0,-2,-1)|0;i=y;E=Il(j|0,m|0,63)|0;F=y;r=xl(k|1|0,i|0,q|0,p|0)|0;n=y;F=xl(E|0,F|0,o|0,g|0)|0;o=xl(F|0,y|0,(n>>>0<p>>>0|(n|0)==(p|0)&r>>>0<q>>>0)&1|0,0)|0;g=y;if((g|0)>=0){v=i;u=k;q=r;break}else{q=r;p=n}}}else{v=i;u=k}if(v>>>0>n>>>0|(v|0)==(n|0)&u>>>0>q>>>0){if(v>>>0>n>>>0|(v|0)==(n|0)&0>q>>>0){g=Fl(q|0,n|0,v|0,0)|0;j=0}else{g=-1;j=0}s=u&-2;m=Dl(g|0,0,s|0,0)|0;o=y;E=Dl(g|0,0,v|0,0)|0;F=y;i=yl(0,0,0,m|0)|0;k=y;m=(0!=0|(m|0)!=0)<<31>>31;F=yl(q|0,n|0,E|0,F|0)|0;o=yl(F|0,y|0,o|0,0)|0;m=xl(o|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;o=y;if((o|0)<0)while(1){j=xl(j|0,g|0,0,-1)|0;g=y;p=xl(i|0,k|0,0,u|0)|0;r=y;m=xl(m|0,o|0,v|0,0)|0;m=xl(m|0,y|0,(r>>>0<k>>>0|(r|0)==(k|0)&p>>>0<i>>>0)&1|0,0)|0;o=y;if((o|0)<0){i=p;k=r}else{i=r;break}}else i=k;if(v>>>0>m>>>0|(v|0)==(m|0)&0>i>>>0){i=Fl(i|0,m|0,v|0,0)|0;k=y}else{i=-1;k=0}j=i|j;i=k|g;F=i&1073741823;if(F>>>0<0|(F|0)==0&(j&-2)>>>0<6){F=(j|0)==0&(i|0)==0;j=F?1:j;i=F?0:i;F=Dl(j|0,0,s|0,0)|0;o=y;A=Dl(i|0,0,s|0,0)|0;C=y;D=Dl(j|0,0,v|0,0)|0;B=y;t=Dl(i|0,0,v|0,0)|0;z=y;C=xl(A|0,C|0,D|0,B|0)|0;A=y;o=xl(0,C|0,F|0,o|0)|0;F=y;m=yl(0,0,o|0,F|0)|0;G=y;E=(F>>>0<C>>>0|(F|0)==(C|0)&o>>>0<0)<<31>>31;F=((o|0)!=0|(F|0)!=0)<<31>>31;o=Dl(j|0,0,j|0,0)|0;g=y;s=Dl(i|0,0,j|0,0)|0;p=y;L=Dl(i|0,0,i|0,0)|0;K=y;H=Jl(s|0,p|0,1)|0;k=y;I=Il(s|0,p|0,31)|0;r=Jl(s|0,p|0,33)|0;J=y;g=xl(r|0,J|0,o|0,g|0)|0;o=y;r=xl(L|0,K|0,(o>>>0<J>>>0|(o|0)==(J|0)&g>>>0<r>>>0)&1|0,0)|0;s=xl(r|0,y|0,I|0,(k>>>0<p>>>0|(k|0)==(p|0)&H>>>0<s>>>0)&1|0)|0;H=y;p=yl(0,0,g|0,o|0)|0;k=y;I=yl(m|0,G|0,s|0,H|0)|0;r=y;o=((g|0)!=0|(o|0)!=0)&1;g=(r>>>0<0|(r|0)==0&I>>>0<o>>>0)<<31>>31;o=yl(I|0,r|0,o|0,0)|0;r=y;m=(H>>>0>G>>>0|(H|0)==(G|0)&s>>>0>m>>>0)<<31>>31;z=yl(q|0,n|0,t|0,z|0)|0;D=yl(z|0,y|0,A|0,(A>>>0<B>>>0|(A|0)==(B|0)&C>>>0<D>>>0)&1|0)|0;E=xl(D|0,y|0,E|0,((E|0)<0)<<31>>31|0)|0;F=xl(E|0,y|0,F|0,((F|0)<0)<<31>>31|0)|0;m=xl(F|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;g=xl(m|0,y|0,g|0,((g|0)<0)<<31>>31|0)|0;m=y;if((m|0)<0){s=r;while(1){j=xl(j|0,i|0,-1,-1)|0;i=y;t=Jl(j|0,i|0,1)|0;n=y;J=Il(j|0,i|0,63)|0;K=y|v;n=xl(t|1|0,n|0,p|0,k|0)|0;t=y;K=xl(J|u|0,K|0,o|0,s|0)|0;J=y;L=(t>>>0<k>>>0|(t|0)==(k|0)&n>>>0<p>>>0)&1;r=xl(K|0,J|0,L|0,0)|0;q=y;g=xl(g|0,m|0,(J>>>0<s>>>0|(J|0)==(s|0)&K>>>0<o>>>0)&1|0,0)|0;g=xl(g|0,y|0,(q>>>0<0|(q|0)==0&r>>>0<L>>>0)&1|0,0)|0;m=y;if((m|0)<0){p=n;k=t;o=r;s=q}else{o=r;k=t;break}}}else{q=r;n=p}j=j|((o|g|n|0)!=0|(q|m|k|0)!=0)&1}}else{j=-1;i=-1}K=Jl(j|0,i|0,1)|0;L=y;J=Il(j|0,i|0,63)|0;oi(f,a[h+3>>0]|0,0,w,J|u,y|v,K,L,h);l=x;return}while(0);L=h+2|0;a[L>>0]=a[L>>0]|1;L=f;c[L>>2]=0;c[L+4>>2]=-1073741824;b[f+8>>1]=-1;L=f+10|0;b[L>>1]=b[k>>1]|0;b[L+2>>1]=b[k+2>>1]|0;b[L+4>>1]=b[k+4>>1]|0;l=x;return}function ti(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=f;h=c[j>>2]|0;j=c[j+4>>2]|0;f=f+8|0;i=c[f>>2]|0;f=c[f+4>>2]|0;o=f&65535;k=Il(i|0,f|0,48)|0;l=Il(i|0,f|0,63)|0;m=y;p=l&255;n=k&32767;a:do if(n<<16>>16<32767){switch(n<<16>>16){case 0:break;default:{q=16;break a}}if((i|h|0)==0&(o|j|0)==0){q=Jl(l|0,m|0,15)|0;g=e;c[g>>2]=0;c[g+4>>2]=0;b[e+8>>1]=q&32768;return}if(!((i|0)==0&(o|0)==0)){r=o>>>0<1|(o|0)==1&i>>>0<0;n=r?i:o;s=n>>>0<65536;n=s?n<<16:n;s=s?16:0;l=n>>>0<16777216;n=(((r?32:0)|(l?s|8:s)&255)+(d[10416+((l?n<<8:n)>>>24)>>0]|0)<<24)+-251658240|0;l=n>>24;s=Jl(h|0,j|0,l|0)|0;r=y;n=(n|0)==0;m=Jl(i|0,o|0,l|0)|0;f=y;k=Il(h|0,j|0,0-l&63|0)|0;l=1-l|0;h=s;j=r;i=n?i:k|m;f=n?o:y|f;break}o=j>>>0<1|(j|0)==1&h>>>0<0;s=o?h:j;r=s>>>0<65536;s=r?s<<16:s;r=r?16:0;i=s>>>0<16777216;s=(((o?32:0)|(i?r|8:r)&255)+(d[10416+((i?s<<8:s)>>>24)>>0]|0)<<24)+-251658240|0;i=s>>24;if((s|0)<0){k=Il(h|0,j|0,0-i|0)|0;f=y;h=Jl(h|0,j|0,i&63|0)|0;j=y}else{k=Jl(h|0,j|0,i|0)|0;f=y;h=0;j=0}l=-63-i|0;i=k}else{switch(n<<16>>16){case 32767:break;default:{q=16;break a}}if((i|h|0)==0&(o|j|0)==0){s=Jl(l|0,m|0,15)|0;r=e;c[r>>2]=0;c[r+4>>2]=-2147483648;b[e+8>>1]=s|32767;return}if(0==0&(f&2147450880|0)==2147418112?!((i|h|0)==0&(f&32767|j|0)==0):0){s=g+2|0;a[s>>0]=a[s>>0]|1}g=Jl(i|0,f|0,16)|0;p=y;q=Il(h|0,j|0,48)|0;p=Il(g|q|0,p|y|0,1)|0;q=y;g=(p|0)==0&(q|0)==0;s=Jl(l|0,m|0,15)|0;r=e;c[r>>2]=g?0:p;c[r+4>>2]=g?-1073741824:q|-2147483648;b[e+8>>1]=s|32767;return}while(0);if((q|0)==16){l=k&32767;f=o|65536}r=Jl(h|0,j|0,15)|0;s=y;n=Jl(i|0,f|0,15)|0;q=y;o=Il(h|0,j|0,49)|0;oi(e,80,p,l,n|o,q|y,r,s,g);return}function ui(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=d+8|0;g=h;r=c[g>>2]|0;g=c[g+4>>2]|0;q=Jl(r|0,g|0,1)|0;p=y;if(p>>>0>4294836223|(p|0)==-131073&q>>>0>4294967295){l=d;l=(c[l>>2]|r|0?1:(c[l+4>>2]|g&65535|0)!=0)&1}else l=0;if(0==0&(g&2147450880|0)==2147418112){n=d;n=(c[n>>2]|r|0?1:(c[n+4>>2]|g&32767|0)!=0)&1}else n=0;m=e+8|0;i=m;q=c[i>>2]|0;i=c[i+4>>2]|0;p=Jl(q|0,i|0,1)|0;o=y;if(o>>>0>4294836223|(o|0)==-131073&p>>>0>4294967295){k=e;k=(c[k>>2]|q|0?1:(c[k+4>>2]|i&65535|0)!=0)&1}else k=0;if(0==0&(i&2147450880|0)==2147418112){j=e;j=(c[j>>2]|q|0?1:(c[j+4>>2]|i&32767|0)!=0)&1}else j=0;p=g|32768;o=h;c[o>>2]=r;c[o+4>>2]=p;o=i|32768;c[m>>2]=q;c[m+4>>2]=o;if(j|n|0){m=f+2|0;a[m>>0]=a[m>>0]|1}if(!n){if(!(l<<24>>24)){c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}if(j|k^1|0){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}}else if(!j)if(!k){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}else{c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}g=Jl(r|0,p|0,1)|0;h=y;j=d;i=c[j>>2]|0;j=c[j+4>>2]|0;k=Jl(q|0,o|0,1)|0;l=y;m=e;f=c[m>>2]|0;m=c[m+4>>2]|0;n=(g|0)!=(k|0)|(h|0)!=(l|0);if(!((h>>>0>l>>>0|(h|0)==(l|0)&g>>>0>=k>>>0)&(n|(j>>>0>m>>>0|(j|0)==(m|0)&i>>>0>=f>>>0)))){c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}if(!((l>>>0>h>>>0|(l|0)==(h|0)&k>>>0>=g>>>0)&(n|(m>>>0>j>>>0|(m|0)==(j|0)&f>>>0>=i>>>0)))){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}if(p>>>0<o>>>0|(p|0)==(o|0)&r>>>0<q>>>0){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}else{c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}}function vi(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+32|0;h=x+16|0;g=x;w=b;q=c[w>>2]|0;w=c[w+4>>2]|0;k=b+8|0;m=c[k>>2]|0;k=c[k+4>>2]|0;s=k&65535;k=Il(m|0,k|0,48)|0;k=k&32767;u=d;v=c[u>>2]|0;u=c[u+4>>2]|0;t=d+8|0;j=c[t>>2]|0;t=c[t+4>>2]|0;o=t&65535;t=Il(j|0,t|0,48)|0;t=t&32767;n=k-t|0;do if((n|0)<=0){if((n|0)>=0){if((k|0)!=32767){b=xl(v|0,u|0,q|0,w|0)|0;i=y;g=xl(j|0,o|0,m|0,s|0)|0;g=xl(g|0,y|0,(i>>>0<w>>>0|(i|0)==(w|0)&b>>>0<q>>>0)&1|0,0)|0;h=y;if(k|0){j=b;d=h|131072;b=0;h=0;p=37;break}e=Jl(e&255|0,0,63)|0;f=a;c[f>>2]=b;c[f+4>>2]=i;f=a+8|0;c[f>>2]=g|e;c[f+4>>2]=h|y;l=x;return}if((m|q|v|j|0)==0?(s|w|u|o|0)==0:0){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];l=x;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ui(a,g,h,f);l=x;return}}if((t|0)==32767)if((j|v|0)==0&(o|u|0)==0){e=Jl(e&255|0,0,63)|0;f=a;c[f>>2]=0;c[f+4>>2]=0;f=a+8|0;c[f>>2]=e;c[f+4>>2]=y|2147418112;l=x;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ui(a,g,h,f);l=x;return}g=(k|0)==0;m=g?m:m;d=g?s:s|65536;g=n+(g&1)|0;h=0-g|0;b=g&63;if(!g){k=t;g=d;d=u;u=q;t=w;n=j;b=0;h=0;p=36}else{do if((g|0)<=-64)if((h|0)!=64)if((g|0)>-128){p=Jl(m|0,d|0,b|0)|0;n=y;b=Il(m|0,d|0,h&63|0)|0;r=q;s=w;q=p;p=0;g=0;i=y;h=n;break}else{h=(h|0)==128;r=q;s=w;q=h?m:((m|0)!=0|(d|0)!=0)&1;p=0;g=0;b=0;i=0;h=h?d:0;break}else{r=0;s=0;p=0;g=0;b=m;i=d;h=w}else{g=Jl(q|0,w|0,b|0)|0;n=y;k=Jl(m|0,d|0,b|0)|0;i=y;b=Il(q|0,w|0,h|0)|0;i=i|y;p=Il(m|0,d|0,h|0)|0;r=0;s=0;q=g;g=y;b=k|b;h=n}while(0);k=t;d=u;u=b;t=i;n=j;m=p;b=q|((r|0)!=0|(s|0)!=0)&1;p=36}}else{if((k|0)==32767)if((m|q|0)==0&(s|w|0)==0){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];l=x;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ui(a,g,h,f);l=x;return}if(!t){g=n+-1|0;if(!g){g=s;d=u;u=q;t=w;n=j;b=0;h=0;p=36;break}else{h=1;i=o}}else{g=n;h=0;i=o|65536}h=h-n&63;do if((g|0)>=64)if((g|0)!=64)if((g|0)<128){t=Jl(j|0,i|0,h|0)|0;h=y;b=Il(j|0,i|0,g&63|0)|0;n=0;o=0;d=y;r=v;p=u;i=t;break}else{t=(g|0)==128;n=0;o=0;b=0;d=0;h=t?i:0;r=v;p=u;i=t?j:((j|0)!=0|(i|0)!=0)&1;break}else{n=0;o=0;b=j;d=i;h=u;r=0;p=0;i=v}else{t=Jl(v|0,u|0,h|0)|0;r=y;h=Jl(j|0,i|0,h|0)|0;d=y;b=Il(v|0,u|0,g|0)|0;d=d|y;n=Il(j|0,i|0,g|0)|0;o=y;b=h|b;h=r;r=0;p=0;i=t}while(0);g=s;v=b;u=q;t=w;b=i|((r|0)!=0|(p|0)!=0)&1;p=36}while(0);if((p|0)==36){j=xl(v|0,d|0,u|0,t|0)|0;i=y;g=xl(n|0,o|0,m|0,g|65536|0)|0;g=xl(g|0,y|0,(i>>>0<t>>>0|(i|0)==(t|0)&j>>>0<u>>>0)&1|0,0)|0;d=y;if(d>>>0<131072|(d|0)==131072&g>>>0<0)k=k+-1|0;else p=37}if((p|0)==37){v=Jl(j|0,i|0,63)|0;w=y;u=Jl(g|0,d|0,63)|0;t=y;j=Il(j|0,i|0,1)|0;i=y|t;g=Il(g|0,d|0,1)|0;d=y;j=j|u;b=v|((b|0)!=0|(h|0)!=0)&1;h=w}yi(a,e,k,g,d,j,i,b,h,f);l=x;return}function wi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;x=l;l=l+32|0;p=x+16|0;n=x;r=d;v=c[r>>2]|0;r=c[r+4>>2]|0;t=d+8|0;i=c[t>>2]|0;t=c[t+4>>2]|0;m=Il(i|0,t|0,48)|0;h=m&32767;o=e;A=c[o>>2]|0;o=c[o+4>>2]|0;z=e+8|0;j=c[z>>2]|0;z=c[z+4>>2]|0;k=Il(j|0,z|0,48)|0;k=k&32767;q=h-k|0;s=Jl(v|0,r|0,14)|0;u=y;t=Jl(i|0,t|0,14)|0;i=y&1073741823;r=Il(v|0,r|0,50)|0;r=t&-16384|r;i=i|y;t=Jl(A|0,o|0,14)|0;v=y;z=Jl(j|0,z|0,14)|0;j=y&1073741823;o=Il(A|0,o|0,50)|0;o=z&-16384|o;j=j|y;do if((q|0)>0){if((h|0)==32767)if((r|s|0)==0&(i|u|0)==0){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];l=x;return}else{c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ui(b,n,p,g);l=x;return}if(!k){k=q+-1|0;if(!k){n=t;m=v;k=o}else{m=k;k=1;w=34}}else{m=q;k=0;j=j|1073741824;w=34}do if((w|0)==34){k=k-q&63;if((m|0)<64){w=Jl(o|0,j|0,k|0)|0;A=y;z=Il(t|0,v|0,m|0)|0;A=A|y;n=Jl(t|0,v|0,k|0)|0;n=w|z|((n|0)!=0|(y|0)!=0)&1;k=Il(o|0,j|0,m|0)|0;m=A;j=y;break}if((m|0)==64){n=o|((t|0)!=0|(v|0)!=0)&1;m=j;k=0;j=0;break}if((m|0)<128){A=Il(o|0,j|0,m&63|0)|0;m=y;n=Jl(o|0,j|0,k|0)|0;n=A|((n|t|0)!=0|(y|v|0)!=0)&1;k=0;j=0;break}else{n=((o|t|0)!=0|(j|v|0)!=0)&1;m=0;k=0;j=0;break}}while(0);p=n;n=r;i=i|1073741824;w=42}else{if((q|0)>=0){m=m&32767;a:do if(m<<16>>16>=32767){switch(m<<16>>16){case 32767:break;default:break a}if((r|s|t|o|0)==0?(i|u|v|j|0)==0:0){A=g+2|0;a[A>>0]=a[A>>0]|1;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=-32768;l=x;return}else{c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ui(b,n,p,g);l=x;return}}else{switch(m<<16>>16){case 0:break;default:break a}h=1;k=1}while(0);if(j>>>0<i>>>0|(j|0)==(i|0)&o>>>0<r>>>0){p=t;m=v;n=r;k=o;w=42;break}if(!(i>>>0<j>>>0|(i|0)==(j|0)&r>>>0<o>>>0)){if(v>>>0<u>>>0|(v|0)==(u|0)&t>>>0<s>>>0){p=t;m=v;n=r;k=o;w=42;break}if(!(u>>>0<v>>>0|(u|0)==(v|0)&s>>>0<t>>>0)){z=Jl((a[g+1>>0]|0)==1|0,0,63)|0;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=z;c[A+4>>2]=y;l=x;return}else{h=k;m=s;n=u;k=r}}else{h=k;m=s;n=u;k=r}}else{if((k|0)==32767)if((o|t|0)==0&(j|v|0)==0){z=Jl((f^1)&255|0,0,63)|0;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=z;c[A+4>>2]=y|2147418112;l=x;return}else{c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ui(b,n,p,g);l=x;return}h=(h|0)==0;p=h?r:r;i=h?i:i|1073741824;h=q+(h&1)|0;m=0-h|0;n=h&63;do if(h){if((h|0)>-64){r=Jl(p|0,i|0,n|0)|0;A=y;z=Il(s|0,u|0,m|0)|0;A=A|y;n=Jl(s|0,u|0,n|0)|0;n=r|z|((n|0)!=0|(y|0)!=0)&1;p=Il(p|0,i|0,m|0)|0;m=n;n=A;i=y;break}if((m|0)==64){m=p|((s|0)!=0|(u|0)!=0)&1;n=i;p=0;i=0;break}if((h|0)>-128){z=Il(p|0,i|0,m&63|0)|0;A=y;m=Jl(p|0,i|0,n|0)|0;m=z|((m|s|0)!=0|(y|u|0)!=0)&1;n=A;p=0;i=0;break}else{m=((p|s|0)!=0|(i|u|0)!=0)&1;n=0;p=0;i=0;break}}else{m=s;n=u}while(0);h=k;j=j|1073741824;k=p}z=yl(t|0,v|0,m|0,n|0)|0;A=y;j=yl(o|0,j|0,k|0,i|0)|0;i=(v>>>0<n>>>0|(v|0)==(n|0)&t>>>0<m>>>0)<<31>>31;i=xl(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;f=f^1;j=y;k=z;m=A}while(0);if((w|0)==42){z=yl(s|0,u|0,p|0,m|0)|0;A=y;j=yl(n|0,i|0,k|0,j|0)|0;i=(u>>>0<m>>>0|(u|0)==(m|0)&s>>>0<p>>>0)<<31>>31;i=xl(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;j=y;k=z;m=A}xi(b,f,h+-15|0,i,j,k,m,g);l=x;return}function xi(a,b,c,e,f,g,h,i){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=(e|0)==0&(f|0)==0;p=o?g:e;q=o?h:f;j=o?0:g;m=o?0:h;o=o?c+-64|0:c;k=q>>>0<1|(q|0)==1&p>>>0<0;g=k?p:q;l=g>>>0<65536;g=l?g<<16:g;l=l?16:0;n=g>>>0<16777216;g=(((k?32:0)|(n?l|8:l)&255)+(d[10416+((n?g<<8:g)>>>24)>>0]|0)<<24)+-251658240|0;n=g>>24;if((g|0)>-16777216){l=Jl(j|0,m|0,n|0)|0;c=y;h=(g|0)==0;g=Jl(p|0,q|0,n|0)|0;k=y;j=Il(j|0,m|0,0-n&63|0)|0;j=h?p:j|g;k=h?q:y|k;m=c;p=0;q=0;o=o-n|0;yi(a,b,o,j,k,l,m,p,q,i);return}e=0-n|0;f=n&63;do if((g|0)<=-1073741824)if((e|0)!=64)if((g|0)==-2147483648){e=(e|0)==128;k=j;l=m;j=e?p:((p|0)!=0|(q|0)!=0)&1;h=0;c=0;f=0;g=0;e=e?q:0;break}else{h=Jl(p|0,q|0,f|0)|0;r=y;f=Il(p|0,q|0,e&63|0)|0;k=j;l=m;j=h;h=0;c=0;g=y;e=r;break}else{k=0;l=0;h=0;c=0;f=p;g=q;e=m}else{c=Jl(j|0,m|0,f|0)|0;r=y;s=Jl(p|0,q|0,f|0)|0;g=y;f=Il(j|0,m|0,e|0)|0;g=g|y;h=Il(p|0,q|0,e|0)|0;k=0;l=0;j=c;c=y;f=s|f;e=r}while(0);m=c;p=f;q=g;r=j|((k|0)!=0|(l|0)!=0)&1;s=e;o=o-n|0;yi(a,b,o,h,m,p,q,r,s,i);return}function yi(b,d,e,f,g,h,i,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=a[l+1>>0]|0;t=s<<24>>24==0;m=Il(j|0,k|0,63)|0;do if(!t)if(s<<24>>24!=3)if(!(d<<24>>24)){m=((j|0)!=0|(k|0)!=0)&s<<24>>24==2&1;break}else{m=((j|0)!=0|(k|0)!=0)&s<<24>>24==1&1;break}else m=0;else m=m&255;while(0);a:do if(e>>>0>32764){do if((e|0)<=32765){if((e|0)==32765)if((f|0)!=-1|(g|0)!=131071|((h|0)!=-1|(i|0)!=-1)|m<<24>>24==0){e=32765;o=m;n=f;m=g;break a}else break;if((e|0)>=0){o=m;n=f;m=g;break a}do if(!(m<<24>>24!=0&((e|0)==-1&(a[l>>0]|0)!=1))){m=0-e|0;n=e&63;if((e|0)<=-64)if((m|0)!=64){h=j|h;i=k|i;if((e|0)>-128){o=Jl(f|0,g|0,n|0)|0;q=y;g=Il(f|0,g|0,m&63|0)|0;j=h;k=i;e=1;n=0;m=0;h=g;i=y;break}else{q=(m|0)==128;j=h;k=i;o=q?f:((f|0)!=0|(g|0)!=0)&1;q=q?g:0;e=1;n=0;m=0;h=0;i=0;break}}else{o=h;q=i;e=1;n=0;m=0;h=f;i=g}else{p=1;r=19}}else{p=g>>>0<131071|(g|0)==131071&f>>>0<4294967295|(f|0)==-1&(g|0)==131071&((h|0)!=-1|(i|0)!=-1);n=e&63;m=0-e|0;r=19}while(0);if((r|0)==19){o=Jl(h|0,i|0,n|0)|0;q=y;r=Jl(f|0,g|0,n|0)|0;n=y;h=Il(h|0,i|0,m|0)|0;i=n|y;n=Il(f|0,g|0,m|0)|0;e=p;m=y;h=r|h}j=o|((j|0)!=0|(k|0)!=0)&1;k=(j|0)!=0|(q|0)!=0;if(e&k){g=l+2|0;a[g>>0]=a[g>>0]|16}if(t){o=Il(o|0,q|0,63)|0;e=0;o=o&255;k=q;break a}if(!(d<<24>>24)){e=0;o=s<<24>>24==2&k&1;k=q;break a}else{e=0;o=s<<24>>24==1&k&1;k=q;break a}}while(0);l=l+2|0;a[l>>0]=a[l>>0]|40;if((s<<24>>24!=3?!(d<<24>>24!=0&s<<24>>24==2):0)?!(d<<24>>24==0&s<<24>>24==1):0){t=Jl(d&255|0,0,63)|0;s=0;g=0;l=y|2147418112;d=b;f=d;c[f>>2]=s;d=d+4|0;c[d>>2]=g;d=b+8|0;b=d;c[b>>2]=t;d=d+4|0;c[d>>2]=l;return}Jl(d&255|0,0,63)|0;s=-1;g=-1;t=-1;l=y|2147418111;d=b;f=d;c[f>>2]=s;d=d+4|0;c[d>>2]=g;d=b+8|0;b=d;c[b>>2]=t;d=d+4|0;c[d>>2]=l;return}else{o=m;n=f;m=g}while(0);if(!((j|0)==0&(k|0)==0)){l=l+2|0;a[l>>0]=a[l>>0]|32}if(!(o<<24>>24))e=(h|n|0)==0&(i|m|0)==0?0:e;else{g=xl(h|0,i|0,1,0)|0;l=y;n=xl(n|0,m|0,(h|0)==-1&(i|0)==-1&1|0,0)|0;i=~(t&((j|0)==0&(k&2147483647|0)==0)&1);m=y;h=g&i;i=l&((i|0)<0)<<31>>31}l=Jl(d&255|0,0,63)|0;g=y;s=Jl(e|0,0,48)|0;t=y;g=xl(n|0,m|0,l|0,g|0)|0;t=xl(g|0,y|0,s|0,t|0)|0;s=h;g=i;l=y;d=b;f=d;c[f>>2]=s;d=d+4|0;c[d>>2]=g;d=b+8|0;b=d;c[b>>2]=t;d=d+4|0;c[d>>2]=l;return}
+function ne(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+240|0;u=y+224|0;m=y+216|0;i=y+208|0;j=y+200|0;s=y+192|0;p=y+184|0;o=y+176|0;n=y+168|0;h=y+160|0;q=y;w=y+212|0;x=y+152|0;v=y+136|0;k=y+144|0;r=y+128|0;e=c[d>>2]|0;c[w>>2]=e;a:while(1){f=a[e>>0]|0;b:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break a;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break b;default:{}}e=e+1|0}}case 42:break;default:break a}e=e+2|0;c:while(1)switch(a[e>>0]|0){case 0:break b;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break c;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;if(!(f<<24>>24)){me(b,18018,h);l=y;return}d:do if((g+-48|0)>>>0<10){u=jl(e,w,0)|0;v=x;c[v>>2]=1;c[v+4>>2]=u}else switch(f<<24>>24){case 34:{oe(x,w);break d}case 123:{e=e+1|0;c[w>>2]=e;i=Le(12)|0;c[x>>2]=2;c[x+4>>2]=i;i=k+4|0;h=q+1|0;j=q;e:while(1){f=a[e>>0]|0;f:do if(!(fl(f<<24>>24)|0)){g:do if(f<<24>>24==47){switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break f;default:{}}e=e+1|0}}case 42:break;default:break g}e=e+2|0;h:while(1)switch(a[e>>0]|0){case 0:break f;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break h;else e=f;break}default:e=e+1|0}e=e+2|0;break f}while(0);c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;switch(f<<24>>24){case 125:{t=38;break e}case 34:{oe(k,w);e=c[i>>2]|0;if((c[k>>2]|0)==7){t=40;break e}break}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){t=48;break e}a[q>>0]=f;e=e+1|0;g=a[e>>0]|0;t=g<<24>>24;if((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26)))){f=e;e=h;do{if((e-j|0)>126){t=48;break e}a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;t=g<<24>>24}while((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26))))}else{f=e;e=h}c[w>>2]=f;a[e>>0]=0;t=gk(q)|0;e=Tj(t+5|0)|0;c[e>>2]=t;Ll(e+4|0,q|0,t+1|0)|0}}if(!(c[e>>2]|0)){t=48;break e}f=c[w>>2]|0;i:while(1){g=a[f>>0]|0;j:do if(!(fl(g<<24>>24)|0)){if(g<<24>>24!=47)break i;switch(a[f+1>>0]|0){case 47:{f=f+2|0;while(1){switch(a[f>>0]|0){case 10:case 0:break j;default:{}}f=f+1|0}}case 42:break;default:break i}f=f+2|0;k:while(1)switch(a[f>>0]|0){case 0:break j;case 42:{g=f+1|0;if((a[g>>0]|0)==47)break k;else f=g;break}default:f=f+1|0}f=f+2|0}else f=f+1|0;while(0)}c[w>>2]=f;if((a[f>>0]|0)!=58){t=65;break e}c[w>>2]=f+1;ne(v,w);c[m>>2]=c[x>>2];c[m+4>>2]=c[x+4>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];ie(m,e+4|0,u)|0;e=c[w>>2]|0;l:while(1){f=a[e>>0]|0;m:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break l;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break m;default:{}}e=e+1|0}}case 42:break;default:break l}e=e+2|0;n:while(1)switch(a[e>>0]|0){case 0:break m;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break n;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 125:break f;case 44:break;default:{t=83;break e}}e=e+1|0;c[w>>2]=e}else e=e+1|0;while(0)}if((t|0)==38){c[w>>2]=e+1;break d}else if((t|0)==40){c[b>>2]=7;c[b+4>>2]=e;l=y;return}else if((t|0)==48){me(b,18041,n);l=y;return}else if((t|0)==65){me(b,18063,o);l=y;return}else if((t|0)==83){me(b,18076,p);l=y;return}break}case 91:{e=e+1|0;c[w>>2]=e;n=Le(12)|0;c[x>>2]=3;c[x+4>>2]=n;o=n+8|0;p=n+4|0;m=n+8|0;q=n+8|0;j=0;o:while(1){p:while(1){f=a[e>>0]|0;q:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break p;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break q;default:{}}e=e+1|0}}case 42:break;default:break p}e=e+2|0;r:while(1)switch(a[e>>0]|0){case 0:break q;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break r;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;if((a[e>>0]|0)==93){t=101;break}ne(r,w);i=r;h=c[i>>2]|0;i=c[i+4>>2]|0;k=v;c[k>>2]=h;c[k+4>>2]=i;k=j+1|0;e=c[n>>2]|0;if(e>>>0<=j>>>0){if((e|0)==(j|0)){e=c[p>>2]|0;if((e|0)>(j|0)){f=k;g=c[m>>2]|0;e=j}else{e=(e*3|0)/2|0;e=(k|0)>(e|0)?k:e;g=Vj(c[q>>2]|0,e<<3)|0;c[q>>2]=g;c[p>>2]=e;e=c[n>>2]|0;f=e+1|0}c[n>>2]=f;e=g+(e<<3)|0;t=109}}else{e=(c[o>>2]|0)+(j<<3)|0;c[u>>2]=c[e>>2];c[u+4>>2]=c[e+4>>2];je(u);e=(c[o>>2]|0)+(j<<3)|0;t=109}if((t|0)==109){t=0;j=e;c[j>>2]=h;c[j+4>>2]=i}e=c[w>>2]|0;s:while(1){f=a[e>>0]|0;t:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break s;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break t;default:{}}e=e+1|0}}case 42:break;default:break s}e=e+2|0;u:while(1)switch(a[e>>0]|0){case 0:break t;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break u;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 44:{e=e+1|0;c[w>>2]=e;break}case 93:break;default:break o}j=k}if((t|0)==101){c[w>>2]=e+1;break d}me(b,18097,s);l=y;return}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){me(b,18159,i);l=y;return}a[q>>0]=f;f=e+1|0;e=q+1|0;g=a[f>>0]|0;v=g<<24>>24;v:do if((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26)))){h=q;while(1){if((e-h|0)>126)break v;a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;v=g<<24>>24;if(!((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26))))){t=134;break}}}else t=134;while(0);if((t|0)==134){c[w>>2]=f;a[e>>0]=0;if(!(fk(q,18118)|0)){v=x;c[v>>2]=5;c[v+4>>2]=0;break d}if(!(fk(q,18123)|0)){v=x;c[v>>2]=4;c[v+4>>2]=1;break d}if(!(fk(q,18128)|0)){v=x;c[v>>2]=4;c[v+4>>2]=0;break d}}c[j>>2]=q;me(b,18134,j);l=y;return}}while(0);c[d>>2]=c[w>>2];d=x;w=c[d+4>>2]|0;x=b;c[x>>2]=c[d>>2];c[x+4>>2]=w;l=y;return}function oe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+4144|0;r=s+4128|0;q=s+4120|0;p=s+4112|0;o=s+4104|0;n=s+4096|0;m=s;j=m+4095|0;e=(c[d>>2]|0)+1|0;k=m;a:while(1){h=e+1|0;i=a[e>>0]|0;f=i<<24>>24;b:do switch(i<<24>>24){case 0:case 10:{e=3;break a}case 34:{e=23;break a}case 92:{g=e+2|0;f=a[h>>0]|0;switch(f|0){case 92:case 34:case 39:{e=g;break b}case 110:{f=10;e=g;break b}case 114:{f=13;e=g;break b}case 116:{f=9;e=g;break b}case 120:{g=a[g>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=12;break a}else{i=h+-87|0;break}else{i=h+-55|0;break}else i=f;while(0);g=a[e+3>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=17;break a}else{f=h+-87|0;break}else{f=h+-55|0;break}while(0);f=f|i<<4;e=e+4|0;break b}default:{e=19;break a}}}default:e=h}while(0);if(k>>>0>=j>>>0){e=21;break}a[k>>0]=f;k=k+1|0}if((e|0)==3){me(b,18180,n);l=s;return}else if((e|0)==12){me(b,18200,o);l=s;return}else if((e|0)==17){me(b,18200,p);l=s;return}else if((e|0)==19){me(b,18218,q);l=s;return}else if((e|0)==21){me(b,18238,r);l=s;return}else if((e|0)==23){a[k>>0]=0;c[d>>2]=h;q=gk(m)|0;r=Tj(q+5|0)|0;c[r>>2]=q;Ll(r+4|0,m|0,q+1|0)|0;c[b>>2]=0;c[b+4>>2]=r;l=s;return}}function pe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;k=n+24|0;m=n+16|0;i=n+20|0;j=n+8|0;g=n;c[i>>2]=d;ne(g,i);h=c[g>>2]|0;g=c[g+4>>2]|0;f=j;c[f>>2]=h;c[f+4>>2]=g;if((h|0)==7){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return}d=c[i>>2]|0;a:while(1){e=a[d>>0]|0;b:do if(!(fl(e<<24>>24)|0)){if(e<<24>>24!=47){f=19;break a}switch(a[d+1>>0]|0){case 47:{d=d+2|0;while(1){switch(a[d>>0]|0){case 10:case 0:break b;default:{}}d=d+1|0}}case 42:break;default:{f=8;break a}}d=d+2|0;c:while(1)switch(a[d>>0]|0){case 0:break b;case 42:{e=d+1|0;if((a[e>>0]|0)==47)break c;else d=e;break}default:d=d+1|0}d=d+2|0}else d=d+1|0;while(0)}if((f|0)==8)c[i>>2]=d;else if((f|0)==19?(c[i>>2]=d,e<<24>>24==0):0){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return};c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];je(k);me(b,18254,m);l=n;return}function qe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+16|0;g=f;h=Tj(e+1|0)|0;Ll(h|0,d|0,e|0)|0;a[h+e>>0]=0;pe(g,h);d=g;g=c[d>>2]|0;d=c[d+4>>2]|0;Uj(h);e=b;c[e>>2]=g;c[e+4>>2]=d;l=f;return}function re(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=Le(16)|0;h=Le(1168)|0;j=h+8|0;hk(j,b)|0;i=Rk(j,47)|0;a[((i|0)==0?j:i+1|0)>>0]=0;i=h+1064|0;c[i>>2]=i;c[h+1068>>2]=i;c[h+4>>2]=d;c[h+1036>>2]=e;c[h+1040>>2]=f;c[h>>2]=g;c[g+12>>2]=h;c[g>>2]=5;c[g+4>>2]=2;c[g+8>>2]=3;nd(b,0,0,g,12,1)|0;return g|0}function se(a){a=a|0;a=(c[a+12>>2]|0)+1048|0;y=c[a+4>>2]|0;return c[a>>2]|0}function te(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=0;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1096|0;g=h;g=xl(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return ze(a,1)|0}function ue(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=1;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1112|0;g=h;g=xl(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return ze(a,1)|0}function ve(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=l;l=l+1280|0;B=G+128|0;E=G+1248|0;D=G+1240|0;C=G+1232|0;o=G+1224|0;n=G+1216|0;k=G+1200|0;i=G+1184|0;h=G+1176|0;g=G+1168|0;j=G+1256|0;x=G+1160|0;z=G+1152|0;f=G+1208|0;m=G+1192|0;A=G;v=G+1264|0;u=a+12|0;w=c[u>>2]|0;if((b|0)<0){t=c[3662]|0;c[g>>2]=0-b;nl(t,18287,g)|0;Da(1)}qe(f,d,e);r=f;t=c[r>>2]|0;r=c[r+4>>2]|0;s=x;c[s>>2]=t;c[s+4>>2]=r;if((t|0)==7){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[h>>2]=le(B)|0;_e(18992,h);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if(($e(B,18330,j)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}s=c[j>>2]|0;t=s<<1;b=w+1056|0;c[b>>2]=t;if((s|0)>=1?(t+-1&t|0)==0:0){a=w+1060|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if(($e(B,18361,a)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}a=c[a>>2]|0;if((a|0)<1){_e(18369,k);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}s=c[b>>2]|0;s=Dl(s|0,((s|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;t=y;r=w+1048|0;c[r>>2]=s;c[r+4>>2]=t;c[w+1072>>2]=0;r=(c[w+4>>2]|0)/(c[j>>2]|0)|0;c[w+1076>>2]=(r|0)>1?r:1;c[w+1136>>2]=-1;c[w+1080>>2]=8;t=xl(s|0,t|0,7,0)|0;t=Bl(t|0,y|0,8,0)|0;c[w+1088>>2]=t;c[w+1084>>2]=Le(t<<2)|0;t=w+1160|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((af(B,18386,t,1)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}if((c[t>>2]|0)>32){_e(18405,n);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];he(m,B,18437);b=m;a=c[b>>2]|0;b=c[b+4>>2]|0;s=z;c[s>>2]=a;c[s+4>>2]=b;if((a|0)!=6){if((a|0)!=3){_e(18446,o);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}q=c[b>>2]|0;a:do if((q|0)>0){p=v+4|0;r=w+1064|0;s=w+1068|0;o=0;b:while(1){b=q-o|0;n=c[t>>2]|0;n=(b|0)<(n|0)?b:n;b=(n|0)>0;c:do if(b){a=0;do{c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];ke(v,B,a+o|0);if((c[v>>2]|0)!=1)break b;c[A+(a<<2)>>2]=c[p>>2];a=a+1|0}while((a|0)<(n|0));if((n|0)==1){d=c[A>>2]|0;b=c[s>>2]|0;d:do if((b|0)!=(r|0)){a=b;while(1){if((c[a+12>>2]|0)==(d|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break d}if((b|0)==(a|0))if(!b)break;else break c;else{j=c[a>>2]|0;k=a+4|0;m=c[k>>2]|0;c[j+4>>2]=m;c[m>>2]=j;c[a>>2]=0;c[k>>2]=0;m=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[k>>2]=m;c[m>>2]=a;break c}}while(0);k=c[u>>2]|0;m=we(k,d)|0;j=k+1104|0;i=j;i=xl(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[j>>2]=i;c[j+4>>2]=y;c[D>>2]=k+8;c[D+4>>2]=d;nk(B,1024,18488,D)|0;nd(B,0,0,m,13,1)|0}else F=35}else F=35;while(0);if((F|0)==35){F=0;j=(o|0)/(c[t>>2]|0)|0;k=c[u>>2]|0;m=Tj(140)|0;c[m>>2]=k;c[m+4>>2]=j;c[m+8>>2]=n;do if(b){g=k+1064|0;h=k+1068|0;i=m+12|0;a=0;f=0;do{e=c[A+(f<<2)>>2]|0;d=c[h>>2]|0;e:do if((d|0)!=(g|0)){b=d;while(1){if((c[b+12>>2]|0)==(e|0))break;b=c[b+4>>2]|0;if((b|0)==(g|0)){F=44;break e}}if((d|0)==(b|0))if(!d){F=44;break}else{b=0;break}else{H=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;c[H+4>>2]=e;c[e>>2]=H;c[b>>2]=0;c[d>>2]=0;e=c[h>>2]|0;c[h>>2]=b;c[b>>2]=g;c[d>>2]=e;c[e>>2]=b;b=0;break}}else F=44;while(0);if((F|0)==44){F=0;b=we(k,e)|0;a=1}c[i+(f<<2)>>2]=b;f=f+1|0}while((f|0)!=(n|0));if(!a){F=48;break}c[E>>2]=k+8;c[E+4>>2]=j;nk(B,1024,18502,E)|0;nd(B,0,0,m,14,1)|0}else F=48;while(0);if((F|0)==48){F=0;Uj(m)}}o=n+o|0;if((q|0)<=(o|0))break a}_e(18466,C);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}while(0)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);a=c[w+1036>>2]|0;if(!a){l=G;return}db[a&15](c[w+1040>>2]|0);l=G;return}_e(18341,i);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}function we(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=a+1072|0;d=c[h>>2]|0;i=a+1076|0;g=a+1064|0;a:do if((d|0)>=(c[i>>2]|0)?(e=c[g>>2]|0,(e|0)!=(g|0)):0)do{f=e;e=c[e>>2]|0;if((c[f+16>>2]|0)==1){c[h>>2]=d+-1;Ia(f+20|0);j=c[f>>2]|0;d=c[f+4>>2]|0;c[j+4>>2]=d;c[d>>2]=j;Uj(f);d=c[h>>2]|0;if((d|0)<(c[i>>2]|0))break a}}while((e|0)!=(g|0));while(0);j=Le(28)|0;c[j+8>>2]=a;c[j+12>>2]=b;c[j+16>>2]=0;b=j+20|0;Ga(b|0);Ja(b|0,c[a+1056>>2]<<9|0)|0;b=a+1068|0;i=c[b>>2]|0;c[b>>2]=j;c[j>>2]=g;c[j+4>>2]=i;c[i>>2]=j;c[h>>2]=(c[h>>2]|0)+1;return j|0}function xe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((b|0)<0){g=c[3662]|0;c[f>>2]=c[a+12>>2];nl(g,18660,f)|0;Da(1)}g=c[a+8>>2]|0;if((c[g+1056>>2]<<9|0)!=(e|0))ja(18685,18580,366,18714);b=c[g>>2]|0;f=a+16|0;if(c[f>>2]|0)ja(18617,18580,346,18644);La(a+20|0,0,d|0,e|0);c[f>>2]=1;if((c[a+12>>2]|0)!=(c[g+1136>>2]|0)){l=h;return}ze(b,0)|0;l=h;return}function ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;if((b|0)<0){k=c[3662]|0;c[f>>2]=c[a+4>>2];nl(k,18516,f)|0;Da(1)}j=c[(c[a>>2]|0)+1056>>2]<<9;k=a+8|0;b=c[k>>2]|0;if((N(j,b)|0)!=(e|0))ja(18541,18580,252,18592);if((b|0)<=0){Uj(a);l=m;return}f=a+12|0;b=0;while(1){e=c[f+(b<<2)>>2]|0;if(e|0){g=c[e+8>>2]|0;h=c[g>>2]|0;i=e+16|0;if(c[i>>2]|0){b=9;break}n=d+(N(b,j)|0)|0;La(e+20|0,0,n|0,c[g+1056>>2]<<9|0);c[i>>2]=1;if((c[e+12>>2]|0)==(c[g+1136>>2]|0))ze(h,0)|0}b=b+1|0;if((b|0)>=(c[k>>2]|0)){b=13;break}}if((b|0)==9)ja(18617,18580,346,18644);else if((b|0)==13){Uj(a);l=m;return}}function ze(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+1040|0;C=E+1024|0;B=E;w=a+12|0;x=c[w>>2]|0;z=x+1144|0;A=x+1140|0;a=c[A>>2]|0;d=(c[z>>2]|0)-a|0;a:do if(d|0){m=x+1128|0;n=x+1080|0;o=x+1084|0;p=x+1056|0;q=x+1136|0;r=x+1064|0;s=x+1068|0;t=x+1120|0;u=x+1156|0;v=x+1092|0;b:while(1){i=m;h=c[i>>2]|0;i=c[i+4>>2]|0;e=c[n>>2]|0;f=((e|0)<0)<<31>>31;k=Fl(h|0,i|0,e|0,f|0)|0;g=y;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;do if(!j){e=c[p>>2]|0;f=((e|0)<0)<<31>>31;g=Fl(h|0,i|0,e|0,f|0)|0;f=Dl(g|0,y|0,e|0,f|0)|0;f=yl(h|0,i|0,f|0,y|0)|0;e=e-f|0;d=(d|0)<(e|0)?d:e;c[q>>2]=g;e=c[s>>2]|0;if((e|0)==(r|0))break b;a=e;while(1){if((c[a+12>>2]|0)==(g|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break b}if((e|0)==(a|0)){if(!e)break b}else{h=c[a>>2]|0;i=a+4|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[a>>2]=0;c[i>>2]=0;j=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[i>>2]=j;c[j>>2]=a}if(!(c[a+16>>2]|0)){a=1;D=23;break b}if(!(c[t>>2]|0)){Ha(a+20|0,f<<9|0,(c[u>>2]|0)+(c[A>>2]<<9)|0,d<<9|0);a=(c[A>>2]|0)+d|0;c[A>>2]=a;j=m;j=xl(c[j>>2]|0,c[j+4>>2]|0,d|0,((d|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y;c[q>>2]=-1;break}else{h=Le(8)|0;i=c[n>>2]<<9;j=Tj(i)|0;Ga(h|0);Ja(h|0,i|0)|0;c[(c[o>>2]|0)+(k<<2)>>2]=h;k=N(c[n>>2]|0,k)|0;Ha(a+20|0,((c[p>>2]|0)+-1&k)<<9|0,j|0,i|0);La(h|0,0,j|0,i|0);Uj(j);c[v>>2]=(c[v>>2]|0)+1;a=c[A>>2]|0;break}}else{f=Dl(k|0,g|0,e|0,f|0)|0;f=yl(h|0,i|0,f|0,y|0)|0;e=e-f|0;e=(d|0)<(e|0)?d:e;f=f<<9;a=(c[u>>2]|0)+(a<<9)|0;d=e<<9;if(!(c[t>>2]|0))Ha(j|0,f|0,a|0,d|0);else La(j|0,f|0,a|0,d|0);a=(c[A>>2]|0)+e|0;c[A>>2]=a;j=m;j=xl(c[j>>2]|0,c[j+4>>2]|0,e|0,((e|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y}while(0);d=(c[z>>2]|0)-a|0;if(!d)break a}if((D|0)==23){l=E;return a|0}b=c[w>>2]|0;D=we(b,g)|0;A=b+1104|0;z=A;z=xl(c[z>>2]|0,c[z+4>>2]|0,1,0)|0;c[A>>2]=z;c[A+4>>2]=y;c[C>>2]=b+8;c[C+4>>2]=g;nk(B,1024,18488,C)|0;nd(B,0,0,D,13,1)|0;D=1;l=E;return D|0}while(0);if(b|0){D=0;l=E;return D|0}eb[c[x+1148>>2]&15](c[x+1152>>2]|0,0);D=0;l=E;return D|0}function Ae(){var a=0;a=Le(2592)|0;c[a+2568>>2]=9;c[a+2572>>2]=7;c[a+2576>>2]=2;c[a+2580>>2]=5;return a|0}function Be(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;i=c[a>>2]|0;if((i|0)>=32)ja(18729,18770,85,18778);if(!(((e|0)!=0|(f|0)!=0)&((e&4095|0)==0&0==0)))ja(18797,18770,86,18778);c[a>>2]=i+1;h=a+8+(i*80|0)|0;c[h>>2]=a;c[a+8+(i*80|0)+32>>2]=1;c[a+8+(i*80|0)+36>>2]=g&-5;j=a+8+(i*80|0)+8|0;c[j>>2]=b;c[j+4>>2]=d;b=a+8+(i*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(g&4|0)==0;j=a+8+(i*80|0)+24|0;c[j>>2]=b?e:0;c[j+4>>2]=b?f:0;j=a+8+(i*80|0)+40|0;c[j>>2]=0;b=a+8+(i*80|0)+48|0;c[b>>2]=0;d=Le(e)|0;c[j>>2]=d;if(!d){ll(18847,29,1,c[3662]|0)|0;Da(1)}if(!(g&2))return h|0;f=Il(e|0,f|0,12)|0;f=(f+31|0)>>>5<<2;g=a+8+(i*80|0)+44|0;c[g>>2]=f;j=a+8+(i*80|0)+60|0;c[j>>2]=0;c[a+8+(i*80|0)+52>>2]=Le(f)|0;c[a+8+(i*80|0)+56>>2]=Le(c[g>>2]|0)|0;c[b>>2]=c[a+8+(i*80|0)+52+(c[j>>2]<<2)>>2];return h|0}function Ce(a,b){a=a|0;b=b|0;Uj(c[b+40>>2]|0);return}function De(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=b+48|0;i=c[h>>2]|0;f=b+44|0;d=c[f>>2]|0;g=d>>>2;a:do if(g){e=0;while(1){if(c[i+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>=g>>>0)break a}g=b+24|0;if(!((c[g>>2]|0)==0&(c[g+4>>2]|0)==0)){fb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);d=c[f>>2]|0}}while(0);f=b+60|0;g=c[f>>2]^1;c[f>>2]=g;b=c[b+52+(g<<2)>>2]|0;c[h>>2]=b;Nl(b|0,0,d|0)|0;return i|0}function Ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=b+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!f){if(g)return;if(c[b+32>>2]|0)fb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);e=b+8|0;c[e>>2]=0;c[e+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;return}if(!g?(f=b+8|0,(c[f>>2]|0)==(d|0)?(c[f+4>>2]|0)==(e|0):0):0)return;if(!(c[b+32>>2]|0))a=b+16|0;else{f=b+16|0;fb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[f>>2]|0);a=f}b=b+8|0;c[b>>2]=d;c[b+4>>2]=e;d=a;e=c[d+4>>2]|0;c[h>>2]=c[d>>2];c[h+4>>2]=e;return}function Fe(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)<=0){Uj(a);return}e=a+2572|0;d=0;do{if(c[a+8+(d*80|0)+32>>2]|0){eb[c[e>>2]&15](a,a+8+(d*80|0)|0);b=c[a>>2]|0}d=d+1|0}while((d|0)<(b|0));Uj(a);return}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=c[a>>2]|0;if((h|0)<=0){i=0;return i|0}e=0;while(1){f=a+8+(e*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(j=a+8+(e*80|0)+24|0,g=xl(c[j>>2]|0,c[j+4>>2]|0,g|0,f|0)|0,f=y,f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0):0)break;e=e+1|0;if((e|0)>=(h|0)){e=0;i=7;break}}if((i|0)==7)return e|0;j=a+8+(e*80|0)|0;return j|0}function He(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;k=c[a>>2]|0;if((k|0)>=32)ja(18729,18770,197,18877);if(f>>>0<1|(f|0)==1&e>>>0<0){c[a>>2]=k+1;l=a+8+(k*80|0)|0;c[l>>2]=a;m=a+8+(k*80|0)+8|0;c[m>>2]=b;c[m+4>>2]=d;b=a+8+(k*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(j&16|0)==0;d=a+8+(k*80|0)+24|0;c[d>>2]=b?e:0;c[d+4>>2]=b?f:0;c[a+8+(k*80|0)+32>>2]=0;c[a+8+(k*80|0)+64>>2]=g;c[a+8+(k*80|0)+68>>2]=h;c[a+8+(k*80|0)+72>>2]=i;c[a+8+(k*80|0)+76>>2]=j;return l|0}else ja(18897,18770,198,18877);return 0}function Ie(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[a>>2]|0;if(c[a+32>>2]|0){hb[c[f+2580>>2]&7](f,a,b,d,e);return}h=a+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!e){if(g)return;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;d=h;c[d>>2]=0;c[d+4>>2]=0;return}f=a+8|0;if(!g?(e=f,(c[e>>2]|0)==(b|0)?(c[e+4>>2]|0)==(d|0):0):0)return;e=f;c[e>>2]=b;c[e+4>>2]=d;a=a+16|0;b=c[a+4>>2]|0;d=h;c[d>>2]=c[a>>2];c[d+4>>2]=b;return}function Je(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;i=c[a>>2]|0;if((i|0)<=0){k=0;return k|0}h=0;while(1){f=a+8+(h*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(l=a+8+(h*80|0)+24|0,l=xl(c[l>>2]|0,c[l+4>>2]|0,g|0,f|0)|0,m=y,m>>>0>d>>>0|(m|0)==(d|0)&l>>>0>b>>>0):0)break;f=h+1|0;if((f|0)<(i|0))h=f;else{f=0;k=11;break}}if((k|0)==11)return f|0;if(!(c[a+8+(h*80|0)+32>>2]|0)){m=0;return m|0}f=yl(b|0,d|0,g|0,f|0)|0;if(e|0?(m=c[a+8+(h*80|0)+48>>2]|0,j=m+(f>>>17<<2)|0,m|0):0)c[j>>2]=c[j>>2]|1<<(f>>>12&31);m=(c[a+8+(h*80|0)+40>>2]|0)+f|0;return m|0}function Ke(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;return}function Le(a){a=a|0;var b=0;b=Tj(a)|0;if(!b){b=0;return b|0}Nl(b|0,0,a|0)|0;return b|0}function Me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=a[d>>0]|0;a:do if(f<<24>>24){while(1){if((a[b>>0]|0)!=f<<24>>24){b=0;break}b=b+1|0;d=d+1|0;f=a[d>>0]|0;if(!(f<<24>>24))break a}return b|0}while(0);if(!e){e=1;return e|0}c[e>>2]=b;e=1;return e|0}function Ne(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function Oe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+4|0;i=c[h>>2]|0;j=i+1|0;g=b+8|0;k=c[g>>2]|0;f=(k*3|0)>>>1;f=(j|0)>(f|0)?j:f;e=c[b>>2]|0;if(j>>>0>k>>>0){e=Vj(e,f)|0;c[b>>2]=e;c[g>>2]=f}a[e+i>>0]=d;if(j>>>0<=(c[h>>2]|0)>>>0)return;c[h>>2]=j;return}function Pe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+4|0;h=c[g>>2]|0;i=gk(b)|0;j=i+h|0;f=a+8|0;k=c[f>>2]|0;e=(k*3|0)>>>1;e=(j|0)>(e|0)?j:e;d=c[a>>2]|0;if(j>>>0>k>>>0){d=Vj(d,e)|0;c[a>>2]=d;c[f>>2]=e}Ll(d+h|0,b|0,i|0)|0;if(j>>>0<=(c[g>>2]|0)>>>0)return;c[g>>2]=j;return}function Qe(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;if(!((a|0)!=0&(e|0)!=0)){h=-1;return h|0}switch(b|0){case 128:case 192:case 256:break;default:{h=-2;return h|0}}g=(b|0)==128;do if(!g){f=e+240|0;if((b|0)==192){c[f>>2]=12;break}else{c[f>>2]=14;break}}else c[e+240>>2]=10;while(0);f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);c[e>>2]=f;c[e+4>>2]=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);c[e+8>>2]=(d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0);c[e+12>>2]=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(g){a=0;do{g=c[e+12>>2]|0;f=c[16+((g>>>16&255)<<2)>>2]&-16777216^f^c[16+((g>>>8&255)<<2)>>2]&16711680^c[16+((g&255)<<2)>>2]&65280^c[16+(g>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];h=e;e=e+16|0;c[e>>2]=f;b=c[h+4>>2]^f;c[h+20>>2]=b;b=c[h+8>>2]^b;c[h+24>>2]=b;c[h+28>>2]=b^g;a=a+1|0}while((a|0)!=10);f=0;return f|0}c[e+16>>2]=(d[a+17>>0]|0)<<16|(d[a+16>>0]|0)<<24|(d[a+18>>0]|0)<<8|(d[a+19>>0]|0);c[e+20>>2]=(d[a+21>>0]|0)<<16|(d[a+20>>0]|0)<<24|(d[a+22>>0]|0)<<8|(d[a+23>>0]|0);if((b|0)==192){a=0;while(1){h=c[e+20>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+24|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+28>>2]=g;g=c[e+8>>2]^g;c[e+32>>2]=g;g=c[e+12>>2]^g;c[e+36>>2]=g;a=a+1|0;if((a|0)==8){f=0;break}g=c[e+16>>2]^g;c[e+40>>2]=g;c[e+44>>2]=g^h;e=b}return f|0}c[e+24>>2]=(d[a+25>>0]|0)<<16|(d[a+24>>0]|0)<<24|(d[a+26>>0]|0)<<8|(d[a+27>>0]|0);c[e+28>>2]=(d[a+29>>0]|0)<<16|(d[a+28>>0]|0)<<24|(d[a+30>>0]|0)<<8|(d[a+31>>0]|0);if((b|0)!=256){h=0;return h|0}a=0;while(1){h=c[e+28>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+32|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+36>>2]=g;g=c[e+8>>2]^g;c[e+40>>2]=g;g=c[e+12>>2]^g;c[e+44>>2]=g;a=a+1|0;if((a|0)==7){f=0;break}g=c[16+(g>>>24<<2)>>2]&-16777216^c[e+16>>2]^c[16+((g>>>16&255)<<2)>>2]&16711680^c[16+((g>>>8&255)<<2)>>2]&65280^c[16+((g&255)<<2)>>2]&255;c[e+48>>2]=g;g=c[e+20>>2]^g;c[e+52>>2]=g;g=c[e+24>>2]^g;c[e+56>>2]=g;c[e+60>>2]=g^h;e=b}return f|0}function Re(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=Qe(a,b,d)|0;if((a|0)<0){d=a;return d|0}e=d+240|0;a=c[e>>2]|0;if((a|0)<=0){d=0;return d|0}a=a<<2;b=0;do{f=d+(b<<2)|0;g=c[f>>2]|0;h=d+(a<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|1)<<2)|0;g=c[h>>2]|0;f=d+((a|1)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;f=d+((b|2)<<2)|0;g=c[f>>2]|0;h=d+((a|2)<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|3)<<2)|0;g=c[h>>2]|0;f=d+((a|3)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;b=b+4|0;a=a+-4|0}while((b|0)<(a|0));if((c[e>>2]|0)<=1){h=0;return h|0}a=d;b=1;do{h=a;a=a+16|0;g=c[a>>2]|0;c[a>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];g=h+20|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];g=h+24|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];h=h+28|0;g=c[h>>2]|0;c[h>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];b=b+1|0}while((b|0)<(c[e>>2]|0));a=0;return a|0}function Se(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[6208+((h>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((i>>>8&255)<<2)>>2]^c[8256+((b&255)<<2)>>2]^c[n+16>>2];l=c[6208+((i>>>16&255)<<2)>>2]^c[5184+(h>>>24<<2)>>2]^c[7232+((b>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[n+20>>2];m=c[6208+((b>>>16&255)<<2)>>2]^c[5184+(i>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((h&255)<<2)>>2]^c[n+24>>2];g=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(b>>>24<<2)>>2]^c[7232+((h>>>8&255)<<2)>>2]^c[8256+((i&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[6208+((m>>>16&255)<<2)>>2]^c[5184+(l>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((k&255)<<2)>>2]^c[n+36>>2];q=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(m>>>24<<2)>>2]^c[7232+((k>>>8&255)<<2)>>2]^c[8256+((l&255)<<2)>>2]^c[n+40>>2];k=c[6208+((k>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((l>>>8&255)<<2)>>2]^c[8256+((m&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[6208+((l>>>16&255)<<2)>>2]^c[5184+(i<<2)>>2]^c[7232+((m>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[16+((l>>>16&255)<<2)>>2]&16711680|c[16+(i<<2)>>2]&-16777216|c[16+((m>>>8&255)<<2)>>2]&65280|c[16+((g&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[16+((m>>>16&255)<<2)>>2]&16711680|c[16+(l>>>24<<2)>>2]&-16777216|c[16+((g>>>8&255)<<2)>>2]&65280|c[16+((k&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[16+((g>>>16&255)<<2)>>2]&16711680|c[16+(m>>>24<<2)>>2]&-16777216|c[16+((k>>>8&255)<<2)>>2]&65280|c[16+((l&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[16+((k>>>16&255)<<2)>>2]&16711680|c[16+(g>>>24<<2)>>2]&-16777216|c[16+((l>>>8&255)<<2)>>2]&65280|c[16+((m&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Te(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[2112+((b>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((i>>>8&255)<<2)>>2]^c[4160+((h&255)<<2)>>2]^c[n+16>>2];l=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(h>>>24<<2)>>2]^c[3136+((b>>>8&255)<<2)>>2]^c[4160+((i&255)<<2)>>2]^c[n+20>>2];m=c[2112+((h>>>16&255)<<2)>>2]^c[1088+(i>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((b&255)<<2)>>2]^c[n+24>>2];g=c[2112+((i>>>16&255)<<2)>>2]^c[1088+(b>>>24<<2)>>2]^c[3136+((h>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[2112+((k>>>16&255)<<2)>>2]^c[1088+(l>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((m&255)<<2)>>2]^c[n+36>>2];q=c[2112+((l>>>16&255)<<2)>>2]^c[1088+(m>>>24<<2)>>2]^c[3136+((k>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+40>>2];k=c[2112+((m>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((l>>>8&255)<<2)>>2]^c[4160+((k&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(i<<2)>>2]^c[3136+((m>>>8&255)<<2)>>2]^c[4160+((l&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[9280+((g>>>16&255)<<2)>>2]&16711680|c[9280+(i<<2)>>2]&-16777216|c[9280+((m>>>8&255)<<2)>>2]&65280|c[9280+((l&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[9280+((k>>>16&255)<<2)>>2]&16711680|c[9280+(l>>>24<<2)>>2]&-16777216|c[9280+((g>>>8&255)<<2)>>2]&65280|c[9280+((m&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[9280+((l>>>16&255)<<2)>>2]&16711680|c[9280+(m>>>24<<2)>>2]&-16777216|c[9280+((k>>>8&255)<<2)>>2]&65280|c[9280+((g&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[9280+((m>>>16&255)<<2)>>2]&16711680|c[9280+(g>>>24<<2)>>2]&-16777216|c[9280+((l>>>8&255)<<2)>>2]&65280|c[9280+((k&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Ue(b,c,d,e,f,g){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=l;l=l+16|0;T=U;h=d>>>0>15;if(!g){if(h){i=d+-16|0;j=i&-16;A=j+16|0;g=b+A|0;k=f+1|0;m=f+2|0;n=f+3|0;o=f+4|0;p=f+5|0;q=f+6|0;r=f+7|0;s=f+8|0;t=f+9|0;u=f+10|0;v=f+11|0;w=f+12|0;x=f+13|0;y=f+14|0;z=f+15|0;h=b;b=c;while(1){S=T;Q=h;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Te(h,b,e);a[b>>0]=a[b>>0]^a[f>>0];S=b+1|0;a[S>>0]=a[S>>0]^a[k>>0];S=b+2|0;a[S>>0]=a[S>>0]^a[m>>0];S=b+3|0;a[S>>0]=a[S>>0]^a[n>>0];S=b+4|0;a[S>>0]=a[S>>0]^a[o>>0];S=b+5|0;a[S>>0]=a[S>>0]^a[p>>0];S=b+6|0;a[S>>0]=a[S>>0]^a[q>>0];S=b+7|0;a[S>>0]=a[S>>0]^a[r>>0];S=b+8|0;a[S>>0]=a[S>>0]^a[s>>0];S=b+9|0;a[S>>0]=a[S>>0]^a[t>>0];S=b+10|0;a[S>>0]=a[S>>0]^a[u>>0];S=b+11|0;a[S>>0]=a[S>>0]^a[v>>0];S=b+12|0;a[S>>0]=a[S>>0]^a[w>>0];S=b+13|0;a[S>>0]=a[S>>0]^a[x>>0];S=b+14|0;a[S>>0]=a[S>>0]^a[y>>0];S=b+15|0;a[S>>0]=a[S>>0]^a[z>>0];S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{h=h+16|0;b=b+16|0}}d=i-j|0;h=c+A|0}else{g=b;h=c}if(!d){l=U;return}S=T;Q=g;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Te(T,T,e);c=0;do{a[h+c>>0]=a[f+c>>0]^a[T+c>>0];c=c+1|0}while((c|0)!=(d|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}if(h){O=d+-16|0;i=O&-16;P=i+16|0;h=b+P|0;j=f+1|0;k=T+1|0;m=f+2|0;n=T+2|0;o=f+3|0;p=T+3|0;q=f+4|0;r=T+4|0;s=f+5|0;t=T+5|0;u=f+6|0;v=T+6|0;w=f+7|0;x=T+7|0;y=f+8|0;z=T+8|0;A=f+9|0;B=T+9|0;C=f+10|0;D=T+10|0;E=f+11|0;F=T+11|0;G=f+12|0;H=T+12|0;I=f+13|0;J=T+13|0;K=f+14|0;L=T+14|0;M=f+15|0;N=T+15|0;g=b;b=c;while(1){a[T>>0]=a[f>>0]^a[g>>0];a[k>>0]=a[j>>0]^a[g+1>>0];a[n>>0]=a[m>>0]^a[g+2>>0];a[p>>0]=a[o>>0]^a[g+3>>0];a[r>>0]=a[q>>0]^a[g+4>>0];a[t>>0]=a[s>>0]^a[g+5>>0];a[v>>0]=a[u>>0]^a[g+6>>0];a[x>>0]=a[w>>0]^a[g+7>>0];a[z>>0]=a[y>>0]^a[g+8>>0];a[B>>0]=a[A>>0]^a[g+9>>0];a[D>>0]=a[C>>0]^a[g+10>>0];a[F>>0]=a[E>>0]^a[g+11>>0];a[H>>0]=a[G>>0]^a[g+12>>0];a[J>>0]=a[I>>0]^a[g+13>>0];a[L>>0]=a[K>>0]^a[g+14>>0];a[N>>0]=a[M>>0]^a[g+15>>0];Se(T,b,e);S=f;Q=b;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{g=g+16|0;b=b+16|0}}d=O-i|0;c=c+P|0}else h=b;if(!d){l=U;return}g=0;do{a[T+g>>0]=a[f+g>>0]^a[h+g>>0];g=g+1|0}while((g|0)!=(d|0));if(d>>>0<16)Ll(T+d|0,f+d|0,16-d|0)|0;Se(T,T,e);S=c;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}function Ve(a){a=a|0;var b=0;c[a+40>>2]=0;b=a;c[b>>2]=0;c[b+4>>2]=0;c[a+8>>2]=1779033703;c[a+12>>2]=-1150833019;c[a+16>>2]=1013904242;c[a+20>>2]=-1521486534;c[a+24>>2]=1359893119;c[a+28>>2]=-1694144372;c[a+32>>2]=528734635;c[a+36>>2]=1541459225;return}function We(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=a+40|0;e=c[g>>2]|0;if(e>>>0>64)ra();i=a;f=c[i>>2]|0;i=c[i+4>>2]|0;h=xl(f|0,i|0,d|0,0)|0;j=y;if(j>>>0<i>>>0|(j|0)==(i|0)&h>>>0<f>>>0)ra();if(!d)return;f=a+44|0;while(1){if(!(d>>>0>63&(e|0)==0)){i=64-e|0;i=(d|0)<(i|0)?d:i;Ll(a+44+e|0,b|0,i|0)|0;j=(c[g>>2]|0)+i|0;c[g>>2]=j;e=b+i|0;d=d-i|0;if((j|0)==64){Xe(a,f);i=a;i=xl(c[i>>2]|0,c[i+4>>2]|0,512,0)|0;j=a;c[j>>2]=i;c[j+4>>2]=y;c[g>>2]=0}}else{Xe(a,b);j=a;j=xl(c[j>>2]|0,c[j+4>>2]|0,512,0)|0;e=a;c[e>>2]=j;c[e+4>>2]=y;e=b+64|0;d=d+-64|0}if(!d)break;b=e;e=c[g>>2]|0}return}function Xe(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+288|0;f=i+256|0;g=i;h=a+8|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];c[f+24>>2]=c[h+24>>2];c[f+28>>2]=c[h+28>>2];e=0;do{j=b+(e<<2)|0;c[g+(e<<2)>>2]=(d[j+1>>0]|0)<<16|(d[j>>0]|0)<<24|(d[j+2>>0]|0)<<8|(d[j+3>>0]|0);e=e+1|0}while((e|0)!=16);e=16;b=c[g>>2]|0;do{j=c[g+(e+-2<<2)>>2]|0;k=b;b=c[g+(e+-15<<2)>>2]|0;c[g+(e<<2)>>2]=k+(c[g+(e+-7<<2)>>2]|0)+((j>>>19|j<<13)^j>>>10^(j>>>17|j<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);j=f+28|0;q=f+16|0;r=c[q>>2]|0;b=f+24|0;s=c[b>>2]|0;v=f+20|0;e=c[v>>2]|0;k=(c[j>>2]|0)+1116352408+(c[g>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((e^s)&r^s)|0;t=c[f>>2]|0;u=f+4|0;o=c[u>>2]|0;w=f+8|0;n=c[w>>2]|0;m=f+12|0;p=k+(c[m>>2]|0)|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((o|t)&n|o&t)+k|0;c[j>>2]=k;s=s+1899447441+(c[g+4>>2]|0)+(p&(e^r)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=e+-1245643825+(c[g+8>>2]|0)+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=r+-373957723+(c[g+12>>2]|0)+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=p+961987163+(c[g+16>>2]|0)+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=n+1508970993+(c[g+20>>2]|0)+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+24>>2]|0)+-1841331548+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+28>>2]|0)+-1424204075+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+32>>2]|0)+-670586216+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+36>>2]|0)+310598401+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+40>>2]|0)+607225278+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+44>>2]|0)+1426881987+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+48>>2]|0)+1925078388+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+52>>2]|0)+-2132889090+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+56>>2]|0)+-1680079193+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+60>>2]|0)+-1046744716+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+64>>2]|0)+-459576895+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+68>>2]|0)+-272742522+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+72>>2]|0)+264347078+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+76>>2]|0)+604807628+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+80>>2]|0)+770255983+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+84>>2]|0)+1249150122+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+88>>2]|0)+1555081692+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+92>>2]|0)+1996064986+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+96>>2]|0)+-1740746414+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+100>>2]|0)+-1473132947+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+104>>2]|0)+-1341970488+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+108>>2]|0)+-1084653625+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+112>>2]|0)+-958395405+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+116>>2]|0)+-710438585+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+120>>2]|0)+113926993+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+124>>2]|0)+338241895+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+128>>2]|0)+666307205+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+132>>2]|0)+773529912+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+136>>2]|0)+1294757372+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+140>>2]|0)+1396182291+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+144>>2]|0)+1695183700+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+148>>2]|0)+1986661051+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+152>>2]|0)+-2117940946+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+156>>2]|0)+-1838011259+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+160>>2]|0)+-1564481375+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+164>>2]|0)+-1474664885+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+168>>2]|0)+-1035236496+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+172>>2]|0)+-949202525+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+176>>2]|0)+-778901479+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+180>>2]|0)+-694614492+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+184>>2]|0)+-200395387+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+188>>2]|0)+275423344+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+192>>2]|0)+430227734+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+196>>2]|0)+506948616+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+200>>2]|0)+659060556+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+204>>2]|0)+883997877+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+208>>2]|0)+958139571+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+212>>2]|0)+1322822218+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+216>>2]|0)+1537002063+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+220>>2]|0)+1747873779+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+224>>2]|0)+1955562222+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+228>>2]|0)+2024104815+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+232>>2]|0)+-2067236844+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+236>>2]|0)+-1933114872+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+240>>2]|0)+-1866530822+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+244>>2]|0)+-1538233109+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+248>>2]|0)+-1090935817+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;k=(c[g+252>>2]|0)+-965641998+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;g=k+r|0;c[q>>2]=g;k=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+k|0;c[f>>2]=k;c[h>>2]=k+(c[h>>2]|0);k=a+12|0;c[k>>2]=o+(c[k>>2]|0);k=a+16|0;c[k>>2]=n+(c[k>>2]|0);k=a+20|0;c[k>>2]=(c[m>>2]|0)+(c[k>>2]|0);k=a+24|0;c[k>>2]=g+(c[k>>2]|0);k=a+28|0;c[k>>2]=e+(c[k>>2]|0);k=a+32|0;c[k>>2]=(c[b>>2]|0)+(c[k>>2]|0);k=a+36|0;c[k>>2]=(c[j>>2]|0)+(c[k>>2]|0);l=i;return}function Ye(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=d+40|0;e=c[h>>2]|0;if(e>>>0>63)ra();i=d;i=xl(c[i>>2]|0,c[i+4>>2]|0,e<<3|0,0)|0;g=d;c[g>>2]=i;c[g+4>>2]=y;g=d+44|0;c[h>>2]=e+1;a[d+44+e>>0]=-128;e=c[h>>2]|0;if(e>>>0<=56){if((e|0)!=56)f=9}else{if(e>>>0<64)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<64);Xe(d,g);c[h>>2]=0;e=0;f=9}if((f|0)==9)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<56);h=d;i=c[h>>2]|0;h=c[h+4>>2]|0;f=Il(i|0,h|0,56)|0;a[d+100>>0]=f;f=Il(i|0,h|0,48)|0;a[d+101>>0]=f;f=Il(i|0,h|0,40)|0;a[d+102>>0]=f;a[d+103>>0]=h;a[d+104>>0]=i>>>24;a[d+105>>0]=i>>>16;a[d+106>>0]=i>>>8;a[d+107>>0]=i;Xe(d,g);i=c[d+8>>2]|0;a[b>>0]=i>>>24;a[b+1>>0]=i>>>16;a[b+2>>0]=i>>>8;a[b+3>>0]=i;i=c[d+12>>2]|0;a[b+4>>0]=i>>>24;a[b+5>>0]=i>>>16;a[b+6>>0]=i>>>8;a[b+7>>0]=i;i=c[d+16>>2]|0;a[b+8>>0]=i>>>24;a[b+9>>0]=i>>>16;a[b+10>>0]=i>>>8;a[b+11>>0]=i;i=c[d+20>>2]|0;a[b+12>>0]=i>>>24;a[b+13>>0]=i>>>16;a[b+14>>0]=i>>>8;a[b+15>>0]=i;i=c[d+24>>2]|0;a[b+16>>0]=i>>>24;a[b+17>>0]=i>>>16;a[b+18>>0]=i>>>8;a[b+19>>0]=i;i=c[d+28>>2]|0;a[b+20>>0]=i>>>24;a[b+21>>0]=i>>>16;a[b+22>>0]=i>>>8;a[b+23>>0]=i;i=c[d+32>>2]|0;a[b+24>>0]=i>>>24;a[b+25>>0]=i>>>16;a[b+26>>0]=i>>>8;a[b+27>>0]=i;i=c[d+36>>2]|0;a[b+28>>0]=i>>>24;a[b+29>>0]=i>>>16;a[b+30>>0]=i>>>8;a[b+31>>0]=i;return}function Ze(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+112|0;f=e;c[f+40>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[f+8>>2]=1779033703;c[f+12>>2]=-1150833019;c[f+16>>2]=1013904242;c[f+20>>2]=-1521486534;c[f+24>>2]=1359893119;c[f+28>>2]=-1694144372;c[f+32>>2]=528734635;c[f+36>>2]=1541459225;We(f,a,b);Ye(d,f);l=e;return}function _e(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;ol(a,e)|0;l=d;return}function $e(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+24|0;f=g+16|0;e=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];he(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[e>>2]=b;_e(18916,e);i=-1;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;_e(18941,f);i=-1;l=g;return i|0}}return 0}function af(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+16|0;f=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];he(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[d>>2]=e;i=0;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;_e(18941,f);i=-1;l=g;return i|0}}return 0}function bf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Le(24)|0;c[f>>2]=a;c[f+4>>2]=d;c[f+8>>2]=e;c[a>>2]=Tk(b)|0;if(!(Md(b)|0))cf();else{c[f+12>>2]=8;c[f+16>>2]=f;nd(b,0,0,f,15,1)|0;return}}function cf(){ra()}function df(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;oa=l;l=l+816|0;ma=oa+796|0;na=oa+744|0;ja=oa+736|0;ga=oa+728|0;fa=oa+720|0;ea=oa+712|0;da=oa+704|0;ca=oa+696|0;ba=oa+688|0;aa=oa+680|0;$=oa+672|0;_=oa+664|0;Y=oa+656|0;X=oa+648|0;W=oa+640|0;V=oa+632|0;U=oa+624|0;T=oa+616|0;ia=oa+608|0;P=oa+600|0;O=oa+592|0;N=oa+584|0;M=oa+576|0;L=oa+568|0;K=oa+560|0;ha=oa+552|0;H=oa+544|0;G=oa+536|0;F=oa+528|0;E=oa+520|0;D=oa+512|0;J=oa+504|0;A=oa+488|0;v=oa+480|0;u=oa+472|0;t=oa+464|0;s=oa+456|0;r=oa+448|0;q=oa+440|0;p=oa+432|0;j=oa+424|0;i=oa+416|0;n=oa+408|0;m=oa+400|0;k=oa+392|0;h=oa+384|0;g=oa+376|0;C=oa+288|0;w=oa+256|0;x=oa+792|0;z=oa+748|0;S=oa;la=oa+368|0;pa=oa+360|0;B=oa+352|0;I=oa+344|0;R=oa+336|0;Z=oa+328|0;f=oa+320|0;ka=c[b>>2]|0;qe(pa,d,e);e=pa;d=c[e>>2]|0;e=c[e+4>>2]|0;pa=la;c[pa>>2]=d;c[pa+4>>2]=e;if((d|0)==7){c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];c[g>>2]=le(ma)|0;_e(18992,g);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);Da(1)}pa=w;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19003);pa=C;d=c[pa+4>>2]|0;a:do switch(c[pa>>2]|0){case 6:{c[h>>2]=19003;_e(18916,h);Q=6;break}case 1:{if((d|0)!=1)if((d|0)>1){_e(19011,m);Da(1)}else{_e(19067,n);Da(1)}m=la;n=c[m+4>>2]|0;pa=w;c[pa>>2]=c[m>>2];c[pa+4>>2]=n;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19173);switch(c[C>>2]|0){case 6:{c[i>>2]=19173;_e(18916,i);break}case 0:{g=Tk((c[C+4>>2]|0)+4|0)|0;c[ka+8>>2]=g;d=c[3653]|0;e=kk(d,44)|0;b:do if(!e){o=d;Q=20}else{h=gk(g)|0;while(1){if((e-d|0)==(h|0)?(Zk(g,d,h)|0)==0:0)break b;d=e+1|0;e=kk(d,44)|0;if(!e){o=d;Q=20;break}}}while(0);if((Q|0)==20?fk(g,o)|0:0){c[ka+4>>2]=0;c[p>>2]=g;_e(19202,p);break a}c[ka+4>>2]=14612;db[c[14616>>2]&15](ka);pa=la;d=c[pa+4>>2]|0;e=w;c[e>>2]=c[pa>>2];c[e+4>>2]=d;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19228);e=C;d=c[e>>2]|0;e=c[e+4>>2]|0;switch(d|0){case 6:{c[q>>2]=19228;_e(18916,q);break}case 1:{q=ka+16|0;c[q>>2]=Jl(Hl(d|0,e|0,32)|0,y|0,20)|0;c[q+4>>2]=y;q=la;r=c[q+4>>2]|0;pa=w;c[pa>>2]=c[q>>2];c[pa+4>>2]=r;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19240);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+196>>2]=Tk((c[C+4>>2]|0)+4|0)|0;break}default:{c[s>>2]=19240;_e(19181,s);break a}}r=la;s=c[r+4>>2]|0;pa=w;c[pa>>2]=c[r>>2];c[pa+4>>2]=s;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19245);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+220>>2]=Tk((c[C+4>>2]|0)+4|0)|0;break}default:{c[t>>2]=19245;_e(19181,t);break a}}s=la;t=c[s+4>>2]|0;pa=w;c[pa>>2]=c[s>>2];c[pa+4>>2]=t;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19252);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+232>>2]=Tk((c[C+4>>2]|0)+4|0)|0;break}default:{c[u>>2]=19252;_e(19181,u);break a}}t=la;u=c[t+4>>2]|0;pa=w;c[pa>>2]=c[t>>2];c[pa+4>>2]=u;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19259);switch(c[C>>2]|0){case 6:break;case 0:{d=(c[C+4>>2]|0)+4|0;Ne(ma);h=C;i=z+36|0;c:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 0:break c;case 36:{e=d+1|0;if((a[e>>0]|0)==123){e=C;g=d+2|0;d:while(1){d=a[g>>0]|0;switch(d<<24>>24){case 0:case 125:break d;default:{}}if((e-h|0)>>>0<31){a[e>>0]=d;d=e+1|0}else d=e;e=d;g=g+1|0}a[e>>0]=0;d=(a[g>>0]|0)==125?g+1|0:g;if(!(fk(C,19267)|0)){Sa(x|0)|0;Qa(x|0,z|0)|0;u=c[i>>2]|0;v=(u|0)/60|0;u=(u|0)<-59;v=u?0-v|0:v;pa=(v|0)/60|0;c[A>>2]=u?43:45;c[A+4>>2]=pa;c[A+8>>2]=v-(pa*60|0);nk(w,32,19270,A)|0;Pe(ma,w)}}else{d=e;Q=52}break}default:{d=d+1|0;Q=52}}if((Q|0)==52){Q=0;Oe(ma,g)}}Oe(ma,0);c[ka+184>>2]=c[ma>>2];break}default:{c[v>>2]=19259;_e(19181,v);break a}}i=ka+96|0;c[J>>2]=c[i>>2];nk(S,256,19285,J)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(B,ma,S);e=B;d=c[e>>2]|0;e:do if((d|0)==6)Q=68;else{h=J+4|0;g=J+4|0;e=c[e+4>>2]|0;f:while(1){if((c[i>>2]|0)>3){Q=58;break}pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];he(J,ma,19310);switch(c[J>>2]|0){case 6:{Q=60;break f}case 0:break;default:{Q=61;break f}}pa=Tk((c[h>>2]|0)+4|0)|0;c[ka+48+((c[i>>2]|0)*12|0)+4>>2]=pa;pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];he(J,ma,19315);switch(c[J>>2]|0){case 6:{d=0;break}case 0:{d=Tk((c[g>>2]|0)+4|0)|0;break}default:{Q=65;break f}}c[ka+48+((c[i>>2]|0)*12|0)>>2]=d;e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[H>>2]=e;nk(S,256,19285,H)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(B,ma,S);e=B;d=c[e>>2]|0;if((d|0)==6){Q=68;break e}else e=c[e+4>>2]|0}if((Q|0)==58){_e(19293,D);break}else if((Q|0)==60){c[E>>2]=19310;_e(18916,E)}else if((Q|0)==61){c[F>>2]=19310;_e(19181,F)}else if((Q|0)==65){c[G>>2]=19315;_e(19181,G);break a}break a}while(0);g:do if((Q|0)==68){j=ka+164|0;c[ha>>2]=c[j>>2];nk(S,256,19322,ha)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(I,ma,S);e=I;d=c[e>>2]|0;h:do if((d|0)!=6){h=ha+4|0;i=ha+4|0;e=c[e+4>>2]|0;i:while(1){if((c[j>>2]|0)>3){Q=71;break}pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];he(ha,ma,19310);switch(c[ha>>2]|0){case 6:{Q=73;break i}case 0:break;default:{Q=74;break i}}pa=Tk((c[h>>2]|0)+4|0)|0;c[ka+100+(c[j>>2]<<4)+8>>2]=pa;pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];he(ha,ma,19349);j:do switch(c[ha>>2]|0){case 6:{d=c[j>>2]|0;if(!d){d=S;e=19353;g=d+10|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(g|0));d=S;break j}else{c[O>>2]=d;nk(S,256,19363,O)|0;d=S;break j}}case 0:{d=(c[i>>2]|0)+4|0;break}default:{Q=77;break i}}while(0);d=Tk(d)|0;e=c[j>>2]|0;c[ka+100+(e<<4)+4>>2]=d;e=e+1|0;c[j>>2]=e;c[P>>2]=e;nk(S,256,19322,P)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(I,ma,S);e=I;d=c[e>>2]|0;if((d|0)==6)break h;else e=c[e+4>>2]|0}if((Q|0)==71){_e(19327,K);break g}else if((Q|0)==73){c[L>>2]=19310;_e(18916,L)}else if((Q|0)==74){c[M>>2]=19310;_e(19181,M)}else if((Q|0)==77){c[N>>2]=19349;_e(19181,N);break a}break a}while(0);i=ka+180|0;c[ia>>2]=c[i>>2];nk(S,256,19375,ia)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(R,ma,S);e=R;d=c[e>>2]|0;k:do if((d|0)!=6){g=ia+4|0;h=ia+4|0;e=c[e+4>>2]|0;l:while(1){if((c[i>>2]|0)>0){Q=86;break}pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19411);switch(c[ia>>2]|0){case 6:{Q=88;break l}case 0:break;default:{Q=89;break l}}pa=(c[g>>2]|0)+4|0;P=Tk(pa)|0;c[ka+168+((c[i>>2]|0)*12|0)>>2]=P;if(!(fk(pa,19418)|0)){pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19422);switch(c[ia>>2]|0){case 6:{Q=93;break l}case 0:break;default:{Q=94;break l}}pa=Tk((c[h>>2]|0)+4|0)|0;c[ka+168+((c[i>>2]|0)*12|0)+4>>2]=pa}e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[Y>>2]=e;nk(S,256,19375,Y)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(R,ma,S);e=R;d=c[e>>2]|0;if((d|0)==6)break k;else e=c[e+4>>2]|0}if((Q|0)==86){_e(19381,T);break g}else if((Q|0)==88){c[U>>2]=19411;_e(18916,U);Q=90}else if((Q|0)==89){c[V>>2]=19411;_e(19181,V);Q=90}else if((Q|0)==93){c[W>>2]=19422;_e(18916,W);Q=95}else if((Q|0)==94){c[X>>2]=19422;_e(19181,X);Q=95}if((Q|0)==90)break a;else if((Q|0)==95)break a}while(0);d=ka+32|0;c[d>>2]=0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(Z,ma,19429);g=Z;e=c[g>>2]|0;g=c[g+4>>2]|0;m:do if((e|0)!=6){pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19315);switch(c[ia>>2]|0){case 6:{c[_>>2]=19315;_e(18916,_);break}case 0:{c[d>>2]=Tk((c[ia+4>>2]|0)+4|0)|0;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19438);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[aa>>2]=19438;_e(18916,aa);break}case 1:{c[ka+36>>2]=d;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19444);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[ca>>2]=19444;_e(18916,ca);break}case 1:{c[ka+40>>2]=d;pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19451);switch(c[ia>>2]|0){case 6:break m;case 0:{c[ka+208>>2]=Tk((c[ia+4>>2]|0)+4|0)|0;break m}default:{c[ea>>2]=19451;_e(19181,ea);break a}}}default:{c[da>>2]=19444;_e(18941,da)}}break a}default:{c[ba>>2]=19438;_e(18941,ba)}}break a}default:{c[$>>2]=19315;_e(19181,$)}}break a}while(0);da=la;ea=c[da+4>>2]|0;pa=ha;c[pa>>2]=c[da>>2];c[pa+4>>2]=ea;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19460);switch(c[ia>>2]|0){case 6:{d=0;break}case 0:{d=Tk((c[ia+4>>2]|0)+4|0)|0;break}default:{c[fa>>2]=19460;_e(19181,fa);break a}}c[ka+192>>2]=d;ea=la;fa=c[ea+4>>2]|0;pa=ha;c[pa>>2]=c[ea>>2];c[pa+4>>2]=fa;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19473);n:do switch(c[ia>>2]|0){case 6:break;case 0:{d=(c[ia+4>>2]|0)+4|0;if(!(fk(d,19479)|0)){c[ka+188>>2]=0;break n}if(!(fk(d,19484)|0)){c[ka+188>>2]=1;break n}c[ja>>2]=d;_e(19489,ja);Da(1);break}default:{c[ga>>2]=19473;_e(19181,ga);break a}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(f,ma,19521);switch(c[f>>2]|0){case 4:{c[ka+28>>2]=c[f+4>>2];c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);pa=b+20|0;c[pa>>2]=0;ff(b);l=oa;return}case 6:{c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);pa=b+20|0;c[pa>>2]=0;ff(b);l=oa;return}default:{c[na>>2]=19521;_e(19536,na);break a}}}while(0);Da(1);break}default:{c[r>>2]=19228;_e(18941,r)}}break a}default:{c[j>>2]=19173;_e(19181,j)}}break}default:{c[k>>2]=19003;_e(18941,k);Q=6}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);Da(1)}function ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if((b|0)<0){c[f>>2]=0-b;_e(18963,f);Da(1)}else{fb[c[a+12>>2]&15](c[a+16>>2]|0,d,e);l=g;return}}function ff(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=c[b>>2]|0;f=b+20|0;d=c[f>>2]|0;a:do if((d|0)<4)while(1){e=c[g+196+(d*12|0)>>2]|0;if(e|0)break a;e=d+1|0;c[f>>2]=e;if((d|0)<3)d=e;else{d=e;h=5;break}}else h=5;while(0);do if((h|0)==5){if((d|0)!=4){e=c[g+196+(d*12|0)>>2]|0;break}d=c[b+4>>2]|0;if(d|0)db[d&15](c[b+8>>2]|0);Uj(b);return}while(0);d=c[g>>2]|0;if((((d|0)!=0?(kk(e,58)|0)==0:0)?(a[e>>0]|0)!=47:0)?(i=Rk(d,47)|0,(i|0)!=0):0){g=i+1-d|0;h=(gk(e)|0)+1|0;i=Tj(h+g|0)|0;Ll(i|0,d|0,g|0)|0;Ll(i+g|0,e|0,h|0)|0;d=i}else d=Tk(e)|0;if(!(Md(d)|0))cf();c[b+12>>2]=9;c[b+16>>2]=b;nd(d,0,0,b,15,1)|0;Uj(d);return}function gf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;g=Tj(d)|0;e=a+20|0;c[f+196+((c[e>>2]|0)*12|0)+4>>2]=g;Ll(c[f+196+((c[e>>2]|0)*12|0)+4>>2]|0,b|0,d|0)|0;c[f+196+((c[e>>2]|0)*12|0)+8>>2]=d;c[e>>2]=(c[e>>2]|0)+1;ff(a);return}function hf(b,d){b=b|0;d=d|0;var e=0,f=0;if((a[d>>0]|0)==33){e=Tk(d+1|0)|0;d=b+184|0;b=c[d>>2]|0;Uj(b);c[d>>2]=e;return}else{e=b+184|0;f=c[e>>2]|0;f=(f|0)==0?16809164:f;b=gk(f)|0;b=Tj(b+2+(gk(d)|0)|0)|0;hk(b,f)|0;f=b+(gk(b)|0)|0;a[f>>0]=32;a[f+1>>0]=0;ik(b,d)|0;d=b;b=c[e>>2]|0;Uj(b);c[e>>2]=d;return}}function jf(a){a=a|0;var b=0,d=0;Uj(c[a+8>>2]|0);Uj(c[a+184>>2]|0);Uj(c[a+196>>2]|0);Uj(c[a+200>>2]|0);Uj(c[a+208>>2]|0);Uj(c[a+212>>2]|0);Uj(c[a+220>>2]|0);Uj(c[a+224>>2]|0);Uj(c[a+232>>2]|0);Uj(c[a+236>>2]|0);d=a+96|0;if((c[d>>2]|0)>0){b=0;do{Uj(c[a+48+(b*12|0)+4>>2]|0);Uj(c[a+48+(b*12|0)>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+164|0;if((c[d>>2]|0)>0){b=0;do{Uj(c[a+100+(b<<4)+8>>2]|0);Uj(c[a+100+(b<<4)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+180|0;if((c[d>>2]|0)<=0){d=a+192|0;d=c[d>>2]|0;Uj(d);d=a+32|0;d=c[d>>2]|0;Uj(d);a=c[a>>2]|0;Uj(a);return}b=0;do{Uj(c[a+168+(b*12|0)>>2]|0);Uj(c[a+168+(b*12|0)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0));d=a+192|0;d=c[d>>2]|0;Uj(d);d=a+32|0;d=c[d>>2]|0;Uj(d);a=c[a>>2]|0;Uj(a);return}function kf(a){a=a|0;return Wa[c[(c[a+4>>2]|0)+8>>2]&15](a)|0}function lf(a){a=a|0;Nl(a|0,0,248)|0;return}function mf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;switch(b|0){case 0:{c[a+36>>2]=e;f=e+d<<16>>16;c[a+40>>2]=f;g=1;break}case 1:{f=(e|d)<<16>>16;c[a+40>>2]=f;g=13;break}case 2:{g=nf(a)|0;c[a+36>>2]=e;f=e+d+g<<16>>16;c[a+40>>2]=f;g=(g|0)==0?1:4;break}case 3:{g=nf(a)|0;c[a+36>>2]=e;f=d-e-g<<16>>16;c[a+40>>2]=f;g=(g|0)==0?7:10;break}case 4:{f=(e&d)<<16>>16;c[a+40>>2]=f;g=13;break}case 5:{c[a+36>>2]=e;f=d-e<<16>>16;c[a+40>>2]=f;g=7;break}case 6:{f=(e^d)<<16>>16;c[a+40>>2]=f;g=13;break}case 7:{c[a+36>>2]=e;c[a+40>>2]=d-e<<16>>16;f=d;g=7;break}default:ra()}c[a+44>>2]=g;return f|0}function nf(a){a=a|0;var b=0,d=0,e=0;b=c[a+44>>2]|0;if((b|0)>24){d=a+48|0;e=c[a+52>>2]|0}else{d=a+40|0;e=b}b=c[d>>2]|0;do switch(e|0){case 0:{a=(b&255)>>>0<(c[a+36>>2]&255)>>>0&1;return a|0}case 1:{a=(b&65535)>>>0<(c[a+36>>2]&65535)>>>0&1;return a|0}case 2:{a=b>>>0<(c[a+36>>2]|0)>>>0&1;return a|0}case 3:{a=(b&255)>>>0<=(c[a+36>>2]&255)>>>0&1;return a|0}case 4:{a=(b&65535)>>>0<=(c[a+36>>2]&65535)>>>0&1;return a|0}case 5:{a=b>>>0<=(c[a+36>>2]|0)>>>0&1;return a|0}case 6:{a=c[a+36>>2]|0;a=(a+b&255)>>>0<(a&255)>>>0&1;return a|0}case 7:{a=c[a+36>>2]|0;a=(a+b&65535)>>>0<(a&65535)>>>0&1;return a|0}case 8:{a=c[a+36>>2]|0;a=(a+b|0)>>>0<a>>>0&1;return a|0}case 9:{a=c[a+36>>2]|0;a=(b+1+a&255)>>>0<=(a&255)>>>0&1;return a|0}case 10:{a=c[a+36>>2]|0;a=(b+1+a&65535)>>>0<=(a&65535)>>>0&1;return a|0}case 11:{a=c[a+36>>2]|0;a=(b+1+a|0)>>>0<=a>>>0&1;return a|0}case 15:{a=(c[a+36>>2]|0)>>>7&1;return a|0}case 16:{a=(c[a+36>>2]|0)>>>15&1;return a|0}case 17:{a=(c[a+36>>2]|0)>>>31;return a|0}case 20:case 19:case 18:{a=c[a+36>>2]&1;return a|0}case 23:case 22:case 21:{a=(c[a+36>>2]|0)!=0&1;return a|0}case 24:{a=c[a+36>>2]&1;return a|0}case 14:case 13:case 12:{a=0;return a|0}default:ra()}while(0);return 0}function of(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;if((d|0)<1){l=q;return}o=b+448|0;f=o;e=c[f>>2]|0;f=c[f+4>>2]|0;j=xl(e|0,f|0,d|0,((d|0)<0)<<31>>31|0)|0;k=y;i=b+441|0;if(a[i>>0]|0){l=q;return}b=e;d=f;a:while(1){d=yl(j|0,k|0,b|0,d|0)|0;h=c[5746]|0;do if((h|0)>-1){b=h+64|0;f=c[5766]|0;g=(f|0)==0;if(!g?c[f+(b>>>5<<2)>>2]&1<<(b&31)|0:0){c[5746]=32;g=f+112|0;c[g>>2]=b;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=0;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=c[5747];c[g+4>>2]=0;g=52;break}b=c[5748]|0;e=(a[22996]|0)==0;if((b|0)==8&e){if(g){g=12;break a}if((c[f+12>>2]|0)>-1){g=12;break a}c[5746]=32;g=f+112|0;c[g>>2]=127;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=0;c[g+4>>2]=0;g=52;break}b:do if((b|0)<0|e^1)g=18;else{if((b|0)==14)switch(h|0){case 30:case 13:case 12:case 11:case 10:case 0:case 14:break;default:{g=18;break b}}else switch(h|0){case 30:case 13:case 12:case 11:case 10:case 0:break;default:{g=18;break b}}e=22976;e=xl(c[e>>2]|0,c[e+4>>2]|0,1,0)|0;b=22976;c[b>>2]=e;c[b+4>>2]=y;b=0;e=8;d=d+-1|0;g=19}while(0);if((g|0)==18){g=0;b=c[5747]|0;d=d+-1|0;e=22976;e=xl(c[e>>2]|0,c[e+4>>2]|0,1,0)|0;f=22976;c[f>>2]=e;c[f+4>>2]=y;switch(h|0){case 17:case 14:case 13:case 12:case 11:case 10:case 8:{e=h;g=19;break}default:{f=0;e=h}}}if((g|0)==19){g=0;f=1}if(!(pf(e,0,0,f,b)|0)){c[5746]=-1;if(!d)break;else{g=23;break}}else if((c[5746]|0)==32){g=52;break}else break}else g=23;while(0);c:do if((g|0)==23){g=0;b=c[5743]|0;while(1){if((b|0)>-1){d=d+-1|0;f=22976;f=xl(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;h=22976;c[h>>2]=f;c[h+4>>2]=y;if(pf(b,1,0,0,0)|0){g=26;break}c[5743]=-1;if(!d)break c}f=c[5766]|0;if(!(a[22971]|0)){g=40;break}e=(f|0)==0;if(e)b=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[f+96>>2]&16777216))b=c[5647]|0;else b=c[(c[5767]|0)+1392>>2]|0;b=b>>>9&1}if(!b){g=40;break}if(!e?c[f+12>>2]&1|0:0){g=38;break}b=Wa[c[16808496>>2]&15](c[4202125]|0)|0;c[5743]=b}if((g|0)==26){g=0;if((c[5746]|0)==32){g=52;break}else break}else if((g|0)==38){c[5746]=32;h=f+112|0;c[h>>2]=96;c[h+4>>2]=0;h=(c[5766]|0)+120|0;c[h>>2]=0;c[h+4>>2]=0;g=52;break}else if((g|0)==40){g=0;do if((f|0)!=0?(m=f+96|0,n=c[m>>2]|0,(n&256|0)!=0):0){b=a[22970]|0;if((c[5647]&512|0)!=0&b<<24>>24==0){if(c[f+12>>2]&16|0){c[5746]=32;g=f+112|0;c[g>>2]=100;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=0;c[g+4>>2]=0;g=52;break c}c[m>>2]=n&-257;d=d+-1|0;f=22976;f=xl(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;h=22976;c[h>>2]=f;c[h+4>>2]=y;if(!(pf(c[(c[5766]|0)+100>>2]&255,1,0,0,0)|0))if(!d)break c;else{g=48;break}else if((c[5746]|0)==32){g=52;break c}else break c}}else g=48;while(0);if((g|0)==48){g=0;b=a[22970]|0}if(!(b<<24>>24)){qf(d);break}else{qf(1);a[22970]=0;break}}}while(0);if((g|0)==52){c[5746]=-1;rf()}if(a[i>>0]|0){g=55;break}d=o;b=c[d>>2]|0;d=c[d+4>>2]|0;if(!((k|0)>(d|0)|(k|0)==(d|0)&j>>>0>b>>>0)){g=55;break}}if((g|0)==12){q=c[3662]|0;c[p>>2]=19569;c[p+4>>2]=7874;c[p+8>>2]=19579;nl(q,19558,p)|0;ra()}else if((g|0)==55){l=q;return}}function pf(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+16|0;z=B+4|0;A=B;c[5748]=f;a[22996]=g;a[22997]=i;c[5750]=j;a:do if(!(c[5732]&1)){k=f<<2;if((k|3)>>>0>(c[5723]|0)>>>0){c[5746]=13;c[5747]=f<<3|2;A=-1;l=B;return A|0}f=(c[5722]|0)+k|0;k=c[23084+(f>>>12<<2)>>2]|0;do if((k|f)&1)if(!(zf(f,1,0,0)|0)){o=c[5762]|0;break}else{A=-1;l=B;return A|0}else o=e[k+f>>1]|0;while(0);k=f+2|0;f=c[23084+(k>>>12<<2)>>2]|0;do if((f|k)&1)if(!(zf(k,1,0,0)|0)){n=c[5762]|0;break}else{A=-1;l=B;return A|0}else n=e[f+k>>1]|0;while(0);m=c[5636]|0;h=(g|0)==2?h:c[5640]|0;k=(c[5729]&m+-2)+(c[5694]|0)|0;f=sf()|0;g=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((g|k)&1){if(Bf(k,f,1,2)|0){A=-1;l=B;return A|0}}else b[g+k>>1]=f;k=(c[5729]&m+-4)+(c[5694]|0)|0;f=c[5689]|0;g=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((g|k)&1){if(Bf(k,f,1,2)|0){A=-1;l=B;return A|0}}else b[g+k>>1]=f;k=m+-6|0;f=(c[5729]&k)+(c[5694]|0)|0;g=c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|0;if((g|f)&1){if(Bf(f,h,1,2)|0){A=-1;l=B;return A|0}}else b[g+f>>1]=h;z=c[5729]|0;c[5636]=c[5636]&~z|z&k;c[5640]=o;c[5689]=n;z=n<<4;c[5690]=z;A=(c[5696]|0)>>>6&65536;c[5729]=(A^65536)+-1;c[5731]=(c[5694]|z|c[5698]|c[5686]|0)==0?A>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;c[5647]=c[5647]&-328449}else{c[z>>2]=0;c[A>>2]=0;n=(g|0)==2;p=n?h:c[5640]|0;g=f<<3;b:do if((g|7)>>>0>(c[5723]|0)>>>0){c[5746]=13;c[5747]=g|2}else{f=(c[5722]|0)+g|0;k=c[23084+(f>>>12<<2)>>2]|0;if((k|f)&3)if(!(zf(f,2,0,0)|0))k=23048;else break;else k=k+f|0;m=c[k>>2]|0;k=f+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else break;else k=f+k|0;y=c[k>>2]|0;switch(y>>>8&31){case 5:{if(!(y&32768)){c[5746]=11;c[5747]=g|2;break b}k=Xg(g&65535,m,y,2,p,i,j)|0;if(!k)break a;l=B;return k|0}case 15:case 14:case 6:case 7:{o=d[22968]|0;if(n?(y>>>13&3)>>>0<o>>>0:0){c[5746]=13;c[5747]=g|2;break b}if(!(y&32768)){c[5746]=11;c[5747]=g|2;break b}f=m>>>16;w=y&-65536|m&65535;x=f&65532;if(!x){c[5746]=13;c[5747]=0;break b}k=(m>>>17&2^2)+6|0;if((f|7)>>>0>(c[22740+(k<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=x;break b}f=(c[22740+(k<<4)+4>>2]|0)+(f&65528)|0;k=c[23084+(f>>>12<<2)>>2]|0;if((k|f)&3)if(!(zf(f,2,0,0)|0))k=23048;else break b;else k=k+f|0;v=c[k>>2]|0;k=f+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else break b;else k=f+k|0;u=c[k>>2]|0;if(!(u>>>11&1&u>>>12)){c[5746]=13;c[5747]=x;break b}h=u>>>13&3;if(h>>>0>o>>>0){c[5746]=13;c[5747]=x;break b}if(!(u&32768)){c[5746]=11;c[5747]=x;break b}k=u&1024;do if((k|0)==0&h>>>0<o>>>0){if(_g(z,A,h)|0)break b;k=c[z>>2]|0;g=k&65532;if(!g){c[5746]=10;c[5747]=0;break b}if((k&3|0)!=(h|0)){c[5746]=10;c[5747]=g;break b}f=(k>>>1&2^2)+6|0;if((k|7)>>>0>(c[22740+(f<<4)+8>>2]|0)>>>0){c[5746]=10;c[5747]=g;break b}f=(c[22740+(f<<4)+4>>2]|0)+(k&-8)|0;k=c[23084+(f>>>12<<2)>>2]|0;if((k|f)&3)if(!(zf(f,2,0,0)|0))k=23048;else break b;else k=k+f|0;m=c[k>>2]|0;k=f+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else break b;else k=f+k|0;k=c[k>>2]|0;if((k>>>13&3|0)!=(h|0)){c[5746]=10;c[5747]=g;break b}if(k>>>12&1^1|k>>>11&1|k>>>9&1^1|0){c[5746]=10;c[5747]=g;break b}if(!(k&32768)){c[5746]=10;c[5747]=g;break b}else{f=k;n=1;t=h;s=k&-16777216|m>>>16|k<<16&16711680;r=k;q=m&65535;break}}else{if(!((k|0)!=0|(h|0)==(o|0))){c[5746]=13;c[5747]=x;break b}if(!(c[5647]&131072)){f=c[5696]|0;s=c[5694]|0;c[A>>2]=c[5636];n=0;t=o;r=0;q=0;break}else{c[5746]=13;c[5747]=x;break b}}while(0);h=(f>>>6&65536^65536)+-1|0;do if((y&6144|0)==2048){do if(n){do if(c[5647]&131072|0){k=(c[A>>2]|0)+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5705]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5701]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5697]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5685]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&3)if(!(Bf(k,f,2,0)|0))break;else break b;else{c[g+k>>2]=f;break}}while(0);k=(c[A>>2]|0)+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5693]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5636]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&3)if(!(Bf(k,f,2,0)|0))break;else break b;else{c[g+k>>2]=f;break}}while(0);k=(c[A>>2]|0)+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=sf()|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5689]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&3){if(Bf(k,p,2,0)|0)break b}else c[k+f>>2]=p;if(!i)break;k=(c[A>>2]|0)+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&3)if(!(Bf(k,j,2,0)|0))break;else break b;else{c[k+f>>2]=j;break}}else{do if(n){do if(c[5647]&131072|0){k=(c[A>>2]|0)+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5705]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5701]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5697]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5685]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&1)if(!(Bf(k,f,1,0)|0))break;else break b;else{b[g+k>>1]=f;break}}while(0);k=(c[A>>2]|0)+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5693]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5636]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&1)if(!(Bf(k,f,1,0)|0))break;else break b;else{b[g+k>>1]=f;break}}while(0);k=(c[A>>2]|0)+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=sf()|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5689]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&1){if(Bf(k,p,1,0)|0)break b}else b[k+f>>1]=p;if(!i)break;k=(c[A>>2]|0)+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&1)if(!(Bf(k,j,1,0)|0))break;else break b;else{b[k+f>>1]=j;break}}while(0);if(n){f=c[5647]|0;if(!(f&131072)){m=c[5692]&4194304;p=c[5686]|0;g=c[5698]|0;k=c[5690]|0}else{c[5685]=0;c[5686]=0;c[5687]=0;c[5688]=0;n=(c[5696]|0)>>>6&65536;h=(n^65536)+-1|0;k=c[5690]|0;m=c[5692]&4194304;g=(m|0)==0?384:0;n=(c[5694]|k|0)==0?n>>>16:0;o=22788;p=o+48|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[5729]=h;c[5731]=n;c[5730]=g;p=0;g=0}o=c[z>>2]&-4|t;c[z>>2]=o;h=r&983040|q;c[5693]=o;c[5694]=s;c[5695]=(r&8388608|0)==0?h:h<<12|4095;c[5696]=r;h=r>>>6&65536;o=(h^65536)+-1|0;c[5729]=o;h=h>>>16;c[5731]=(p|s|g|k|0)==0?h:0;c[5730]=(m|0)==0?384:0;n=o;m=p;k=s}else{n=(c[5696]|0)>>>6&65536;h=n>>>16;n=(n^65536)+-1|0;o=c[5729]|0;m=c[5686]|0;g=c[5698]|0;k=c[5694]|0;f=c[5647]|0}c[5636]=c[A>>2]&o|c[5636]&~o;A=u&-16777216|v>>>16|u<<16&16711680;z=u&983040|v&65535;c[5689]=t|x;c[5690]=A;c[5691]=(u&8388608|0)==0?z:z<<12|4095;c[5692]=u;c[5729]=n;c[5731]=(m|A|g|k|0)==0?h:0;c[5730]=(u&4194304|0)==0?384:0;a[22968]=t;c[5770]=(t|0)==3?1048576:0;c[5640]=w;k=f&-513;if(!(y&256))c[5647]=k;else k=f;c[5647]=k&-213249;break a}default:{c[5746]=13;c[5747]=g|2;break b}}}while(0);A=-1;l=B;return A|0}while(0);c[5748]=-1;A=0;l=B;return A|0}
+function Tj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;o=x;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;n=c[4202145]|0;d=n>>>a;if(d&3|0){b=(d&1^1)+a|0;a=16808620+(b<<1<<2)|0;d=a+8|0;e=c[d>>2]|0;f=e+8|0;g=c[f>>2]|0;if((g|0)==(a|0))c[4202145]=n&~(1<<b);else{c[g+12>>2]=a;c[d>>2]=g}w=b<<3;c[e+4>>2]=w|3;w=e+w+4|0;c[w>>2]=c[w>>2]|1;w=f;l=x;return w|0}m=c[4202147]|0;if(k>>>0>m>>>0){if(d|0){b=2<<a;b=d<<a&(b|0-b);b=(b&0-b)+-1|0;i=b>>>12&16;b=b>>>i;d=b>>>5&8;b=b>>>d;g=b>>>2&4;b=b>>>g;a=b>>>1&2;b=b>>>a;e=b>>>1&1;e=(d|i|g|a|e)+(b>>>e)|0;b=16808620+(e<<1<<2)|0;a=b+8|0;g=c[a>>2]|0;i=g+8|0;d=c[i>>2]|0;if((d|0)==(b|0)){a=n&~(1<<e);c[4202145]=a}else{c[d+12>>2]=b;c[a>>2]=d;a=n}w=e<<3;h=w-k|0;c[g+4>>2]=k|3;f=g+k|0;c[f+4>>2]=h|1;c[g+w>>2]=h;if(m|0){e=c[4202150]|0;b=m>>>3;d=16808620+(b<<1<<2)|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[4202147]=h;c[4202150]=f;w=i;l=x;return w|0}g=c[4202146]|0;if(g){d=(g&0-g)+-1|0;f=d>>>12&16;d=d>>>f;e=d>>>5&8;d=d>>>e;h=d>>>2&4;d=d>>>h;i=d>>>1&2;d=d>>>i;j=d>>>1&1;j=c[16808884+((e|f|h|i|j)+(d>>>j)<<2)>>2]|0;d=j;i=j;j=(c[j+4>>2]&-8)-k|0;while(1){a=c[d+16>>2]|0;if(!a){a=c[d+20>>2]|0;if(!a)break}h=(c[a+4>>2]&-8)-k|0;f=h>>>0<j>>>0;d=a;i=f?a:i;j=f?h:j}h=i+k|0;if(h>>>0>i>>>0){f=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){d=0;break}}while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);do if(f|0){b=c[i+28>>2]|0;a=16808884+(b<<2)|0;if((i|0)==(c[a>>2]|0)){c[a>>2]=d;if(!d){c[4202146]=g&~(1<<b);break}}else{w=f+16|0;c[((c[w>>2]|0)==(i|0)?w:f+20|0)>>2]=d;if(!d)break}c[d+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}b=c[i+20>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}while(0);if(j>>>0<16){w=j+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[h+4>>2]=j|1;c[h+j>>2]=j;if(m|0){e=c[4202150]|0;b=m>>>3;d=16808620+(b<<1<<2)|0;b=1<<b;if(!(b&n)){c[4202145]=b|n;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[4202147]=j;c[4202150]=h}w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=k}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;e=c[4202146]|0;if(e){f=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)j=31;else{n=(a+1048320|0)>>>16&8;r=a<<n;i=(r+520192|0)>>>16&4;r=r<<i;j=(r+245760|0)>>>16&2;j=14-(i|n|j)+(r<<j>>>15)|0;j=k>>>(j+7|0)&1|j<<1}else j=0;d=c[16808884+(j<<2)>>2]|0;a:do if(!d){d=0;a=0;r=61}else{a=0;i=k<<((j|0)==31?0:25-(j>>>1)|0);g=0;while(1){h=(c[d+4>>2]&-8)-k|0;if(h>>>0<f>>>0)if(!h){a=d;f=0;r=65;break a}else{a=d;f=h}r=c[d+20>>2]|0;d=c[d+16+(i>>>31<<2)>>2]|0;g=(r|0)==0|(r|0)==(d|0)?g:r;if(!d){d=g;r=61;break}else i=i<<1}}while(0);if((r|0)==61){if((d|0)==0&(a|0)==0){a=2<<j;a=(a|0-a)&e;if(!a){n=k;break}n=(a&0-a)+-1|0;h=n>>>12&16;n=n>>>h;g=n>>>5&8;n=n>>>g;i=n>>>2&4;n=n>>>i;j=n>>>1&2;n=n>>>j;d=n>>>1&1;a=0;d=c[16808884+((g|h|i|j|d)+(n>>>d)<<2)>>2]|0}if(!d){i=a;h=f}else r=65}if((r|0)==65){g=d;while(1){n=(c[g+4>>2]&-8)-k|0;d=n>>>0<f>>>0;f=d?n:f;a=d?g:a;d=c[g+16>>2]|0;if(!d)d=c[g+20>>2]|0;if(!d){i=a;h=f;break}else g=d}}if(((i|0)!=0?h>>>0<((c[4202147]|0)-k|0)>>>0:0)?(m=i+k|0,m>>>0>i>>>0):0){g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){b=0;break}}while(1){f=b+20|0;d=c[f>>2]|0;if(!d){f=b+16|0;d=c[f>>2]|0;if(!d)break;else{b=d;a=f}}else{b=d;a=f}}c[a>>2]=0}else{w=c[i+8>>2]|0;c[w+12>>2]=b;c[b+8>>2]=w}while(0);do if(g){a=c[i+28>>2]|0;d=16808884+(a<<2)|0;if((i|0)==(c[d>>2]|0)){c[d>>2]=b;if(!b){e=e&~(1<<a);c[4202146]=e;break}}else{w=g+16|0;c[((c[w>>2]|0)==(i|0)?w:g+20|0)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[i+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[i+20>>2]|0;if(a){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);b:do if(h>>>0<16){w=h+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[m+4>>2]=h|1;c[m+h>>2]=h;b=h>>>3;if(h>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=m;c[b+12>>2]=m;c[m+8>>2]=b;c[m+12>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;d=(w+245760|0)>>>16&2;d=14-(u|v|d)+(w<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=16808884+(d<<2)|0;c[m+28>>2]=d;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<d;if(!(e&a)){c[4202146]=e|a;c[b>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(h|0)){e=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(h|0)){b=a;break c}else{e=e<<1;b=a}}c[d>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break b}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=m;c[v>>2]=m;c[m+8>>2]=w;c[m+12>>2]=b;c[m+24>>2]=0}while(0);w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=-1;while(0);d=c[4202147]|0;if(d>>>0>=n>>>0){b=d-n|0;a=c[4202150]|0;if(b>>>0>15){w=a+n|0;c[4202150]=w;c[4202147]=b;c[w+4>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=n|3}else{c[4202147]=0;c[4202150]=0;c[a+4>>2]=d|3;w=a+d+4|0;c[w>>2]=c[w>>2]|1}w=a+8|0;l=x;return w|0}h=c[4202148]|0;if(h>>>0>n>>>0){u=h-n|0;c[4202148]=u;w=c[4202151]|0;v=w+n|0;c[4202151]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}if(!(c[4202263]|0)){c[4202265]=4096;c[4202264]=4096;c[4202266]=-1;c[4202267]=-1;c[4202268]=0;c[4202256]=0;c[4202263]=o&-16^1431655768;a=4096}else a=c[4202265]|0;i=n+48|0;j=n+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=n>>>0){w=0;l=x;return w|0}a=c[4202255]|0;if(a|0?(m=c[4202253]|0,o=m+k|0,o>>>0<=m>>>0|o>>>0>a>>>0):0){w=0;l=x;return w|0}d:do if(!(c[4202256]&4)){d=c[4202151]|0;e:do if(d){e=16809028;while(1){o=c[e>>2]|0;if(o>>>0<=d>>>0?(o+(c[e+4>>2]|0)|0)>>>0>d>>>0:0)break;a=c[e+8>>2]|0;if(!a){r=128;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=Ol(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[e+4>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;r=145;break d}}else{e=a;r=136}}else b=0}else r=128;while(0);do if((r|0)==128){d=Ol(0)|0;if((d|0)!=(-1|0)?(b=d,p=c[4202264]|0,q=p+-1|0,b=((q&b|0)==0?0:(q+b&0-p)-b|0)+k|0,p=c[4202253]|0,q=b+p|0,b>>>0>n>>>0&b>>>0<2147483647):0){o=c[4202255]|0;if(o|0?q>>>0<=p>>>0|q>>>0>o>>>0:0){b=0;break}a=Ol(b|0)|0;if((a|0)==(d|0)){h=b;g=d;r=145;break d}else{e=a;r=136}}else b=0}while(0);do if((r|0)==136){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;r=145;break d}a=c[4202265]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;r=145;break d}if((Ol(a|0)|0)==(-1|0)){Ol(d|0)|0;b=0;break}else{h=a+b|0;g=e;r=145;break d}}while(0);c[4202256]=c[4202256]|4;r=143}else{b=0;r=143}while(0);if(((r|0)==143?k>>>0<2147483647:0)?(u=Ol(k|0)|0,q=Ol(0)|0,s=q-u|0,t=s>>>0>(n+40|0)>>>0,!((u|0)==(-1|0)|t^1|u>>>0<q>>>0&((u|0)!=(-1|0)&(q|0)!=(-1|0))^1)):0){h=t?s:b;g=u;r=145}if((r|0)==145){b=(c[4202253]|0)+h|0;c[4202253]=b;if(b>>>0>(c[4202254]|0)>>>0)c[4202254]=b;j=c[4202151]|0;f:do if(j){b=16809028;while(1){a=c[b>>2]|0;d=c[b+4>>2]|0;if((g|0)==(a+d|0)){r=154;break}e=c[b+8>>2]|0;if(!e)break;else b=e}if(((r|0)==154?(v=b+4|0,(c[b+12>>2]&8|0)==0):0)?g>>>0>j>>>0&a>>>0<=j>>>0:0){c[v>>2]=d+h;w=(c[4202148]|0)+h|0;u=j+8|0;u=(u&7|0)==0?0:0-u&7;v=j+u|0;u=w-u|0;c[4202151]=v;c[4202148]=u;c[v+4>>2]=u|1;c[j+w+4>>2]=40;c[4202152]=c[4202267];break}if(g>>>0<(c[4202149]|0)>>>0)c[4202149]=g;d=g+h|0;b=16809028;while(1){if((c[b>>2]|0)==(d|0)){r=162;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((r|0)==162?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;m=b+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;k=m+n|0;i=b-m-n|0;c[m+4>>2]=n|3;g:do if((j|0)==(b|0)){w=(c[4202148]|0)+i|0;c[4202148]=w;c[4202151]=k;c[k+4>>2]=w|1}else{if((c[4202150]|0)==(b|0)){w=(c[4202147]|0)+i|0;c[4202147]=w;c[4202150]=k;c[k+4>>2]=w|1;c[k+w>>2]=w;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;e=a>>>3;h:do if(a>>>0<256){a=c[b+8>>2]|0;d=c[b+12>>2]|0;if((d|0)==(a|0)){c[4202145]=c[4202145]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}else{g=c[b+24>>2]|0;a=c[b+12>>2]|0;do if((a|0)==(b|0)){d=b+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{w=c[b+8>>2]|0;c[w+12>>2]=a;c[a+8>>2]=w}while(0);if(!g)break;d=c[b+28>>2]|0;e=16808884+(d<<2)|0;do if((c[e>>2]|0)!=(b|0)){w=g+16|0;c[((c[w>>2]|0)==(b|0)?w:g+20|0)>>2]=a;if(!a)break h}else{c[e>>2]=a;if(a|0)break;c[4202146]=c[4202146]&~(1<<d);break h}while(0);c[a+24>>2]=g;d=b+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(!d)break;c[a+20>>2]=d;c[d+24>>2]=a}while(0);b=b+h|0;f=h+i|0}else f=i;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;b=f>>>3;if(f>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=k;c[b+12>>2]=k;c[k+8>>2]=b;c[k+12>>2]=d;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=16808884+(e<<2)|0;c[k+28>>2]=e;a=k+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[4202146]|0;d=1<<e;if(!(a&d)){c[4202146]=a|d;c[b>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break}b=c[b>>2]|0;i:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break i}else{e=e<<1;b=a}}c[d>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break g}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=k;c[v>>2]=k;c[k+8>>2]=w;c[k+12>>2]=b;c[k+24>>2]=0}while(0);w=m+8|0;l=x;return w|0}b=16809028;while(1){a=c[b>>2]|0;if(a>>>0<=j>>>0?(w=a+(c[b+4>>2]|0)|0,w>>>0>j>>>0):0)break;b=c[b+8>>2]|0}f=w+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=j+16|0;a=a>>>0<f>>>0?j:a;b=a+8|0;d=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=d-u|0;c[4202151]=v;c[4202148]=u;c[v+4>>2]=u|1;c[g+d+4>>2]=40;c[4202152]=c[4202267];d=a+4|0;c[d>>2]=27;c[b>>2]=c[4202257];c[b+4>>2]=c[4202258];c[b+8>>2]=c[4202259];c[b+12>>2]=c[4202260];c[4202257]=g;c[4202258]=h;c[4202260]=0;c[4202259]=b;b=a+24|0;do{v=b;b=b+4|0;c[b>>2]=7}while((v+8|0)>>>0<w>>>0);if((a|0)!=(j|0)){g=a-j|0;c[d>>2]=c[d>>2]&-2;c[j+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=j;c[b+12>>2]=j;c[j+8>>2]=b;c[j+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=16808884+(e<<2)|0;c[j+28>>2]=e;c[j+20>>2]=0;c[f>>2]=0;b=c[4202146]|0;a=1<<e;if(!(b&a)){c[4202146]=b|a;c[d>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}b=c[d>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(g|0)){b=a;break j}else{e=e<<1;b=a}}c[d>>2]=j;c[j+24>>2]=b;c[j+12>>2]=j;c[j+8>>2]=j;break f}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=j;c[v>>2]=j;c[j+8>>2]=w;c[j+12>>2]=b;c[j+24>>2]=0}}else{w=c[4202149]|0;if((w|0)==0|g>>>0<w>>>0)c[4202149]=g;c[4202257]=g;c[4202258]=h;c[4202260]=0;c[4202154]=c[4202263];c[4202153]=-1;c[4202158]=16808620;c[4202157]=16808620;c[4202160]=16808628;c[4202159]=16808628;c[4202162]=16808636;c[4202161]=16808636;c[4202164]=16808644;c[4202163]=16808644;c[4202166]=16808652;c[4202165]=16808652;c[4202168]=16808660;c[4202167]=16808660;c[4202170]=16808668;c[4202169]=16808668;c[4202172]=16808676;c[4202171]=16808676;c[4202174]=16808684;c[4202173]=16808684;c[4202176]=16808692;c[4202175]=16808692;c[4202178]=16808700;c[4202177]=16808700;c[4202180]=16808708;c[4202179]=16808708;c[4202182]=16808716;c[4202181]=16808716;c[4202184]=16808724;c[4202183]=16808724;c[4202186]=16808732;c[4202185]=16808732;c[4202188]=16808740;c[4202187]=16808740;c[4202190]=16808748;c[4202189]=16808748;c[4202192]=16808756;c[4202191]=16808756;c[4202194]=16808764;c[4202193]=16808764;c[4202196]=16808772;c[4202195]=16808772;c[4202198]=16808780;c[4202197]=16808780;c[4202200]=16808788;c[4202199]=16808788;c[4202202]=16808796;c[4202201]=16808796;c[4202204]=16808804;c[4202203]=16808804;c[4202206]=16808812;c[4202205]=16808812;c[4202208]=16808820;c[4202207]=16808820;c[4202210]=16808828;c[4202209]=16808828;c[4202212]=16808836;c[4202211]=16808836;c[4202214]=16808844;c[4202213]=16808844;c[4202216]=16808852;c[4202215]=16808852;c[4202218]=16808860;c[4202217]=16808860;c[4202220]=16808868;c[4202219]=16808868;w=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=w-u|0;c[4202151]=v;c[4202148]=u;c[v+4>>2]=u|1;c[g+w+4>>2]=40;c[4202152]=c[4202267]}while(0);b=c[4202148]|0;if(b>>>0>n>>>0){u=b-n|0;c[4202148]=u;w=c[4202151]|0;v=w+n|0;c[4202151]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}}c[(ak()|0)>>2]=12;w=0;l=x;return w|0}function Uj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;d=a+-8|0;f=c[4202149]|0;a=c[a+-4>>2]|0;b=a&-8;j=d+b|0;do if(!(a&1)){e=c[d>>2]|0;if(!(a&3))return;h=d+(0-e)|0;g=e+b|0;if(h>>>0<f>>>0)return;if((c[4202150]|0)==(h|0)){a=j+4|0;b=c[a>>2]|0;if((b&3|0)!=3){i=h;b=g;break}c[4202147]=g;c[a>>2]=b&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}d=e>>>3;if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[4202145]=c[4202145]&~(1<<d);i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){b=h+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){a=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;d=16808884+(b<<2)|0;if((c[d>>2]|0)==(h|0)){c[d>>2]=a;if(!a){c[4202146]=c[4202146]&~(1<<b);i=h;b=g;break}}else{i=f+16|0;c[((c[i>>2]|0)==(h|0)?i:f+20|0)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=h+16|0;d=c[b>>2]|0;if(d|0){c[a+16>>2]=d;c[d+24>>2]=a}b=c[b+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=d;h=d}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;e=c[a>>2]|0;if(!(e&1))return;if(!(e&2)){if((c[4202151]|0)==(j|0)){j=(c[4202148]|0)+b|0;c[4202148]=j;c[4202151]=i;c[i+4>>2]=j|1;if((i|0)!=(c[4202150]|0))return;c[4202150]=0;c[4202147]=0;return}if((c[4202150]|0)==(j|0)){j=(c[4202147]|0)+b|0;c[4202147]=j;c[4202150]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[4202145]=c[4202145]&~(1<<d);break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){d=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0;d=a}else{d=c[j+8>>2]|0;c[d+12>>2]=a;c[a+8>>2]=d;d=a}while(0);if(g|0){a=c[j+28>>2]|0;b=16808884+(a<<2)|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=d;if(!d){c[4202146]=c[4202146]&~(1<<a);break}}else{e=g+16|0;c[((c[e>>2]|0)==(j|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;a=j+16|0;b=c[a>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}a=c[a+4>>2]|0;if(a|0){c[d+20>>2]=a;c[a+24>>2]=d}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[4202150]|0)){c[4202147]=f;return}}else{c[a>>2]=e&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}a=f>>>3;if(f>>>0<256){d=16808620+(a<<1<<2)|0;b=c[4202145]|0;a=1<<a;if(!(b&a)){c[4202145]=b|a;a=d;b=d+8|0}else{b=d+8|0;a=c[b>>2]|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)e=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;e=(j+245760|0)>>>16&2;e=14-(g|h|e)+(j<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;a=16808884+(e<<2)|0;c[i+28>>2]=e;c[i+20>>2]=0;c[i+16>>2]=0;b=c[4202146]|0;d=1<<e;a:do if(!(b&d)){c[4202146]=b|d;c[a>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i}else{a=c[a>>2]|0;b:do if((c[a+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=a+16+(e>>>31<<2)|0;b=c[d>>2]|0;if(!b)break;if((c[b+4>>2]&-8|0)==(f|0)){a=b;break b}else{e=e<<1;a=b}}c[d>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i;break a}while(0);h=a+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=a;c[i+24>>2]=0}while(0);j=(c[4202153]|0)+-1|0;c[4202153]=j;if(j|0)return;a=16809036;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[4202153]=-1;return}function Vj(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=Tj(b)|0;return b|0}if(b>>>0>4294967231){c[(ak()|0)>>2]=12;b=0;return b|0}d=Wj(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=Tj(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;Ll(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Uj(a);b=d;return b|0}function Wj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=a+4|0;m=c[l>>2]|0;d=m&-8;i=a+d|0;if(!(m&3)){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[4202265]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;k=a+b|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|3;m=i+4|0;c[m>>2]=c[m>>2]|1;Xj(k,d);return a|0}if((c[4202151]|0)==(i|0)){k=(c[4202148]|0)+d|0;d=k-b|0;e=a+b|0;if(k>>>0<=b>>>0){a=0;return a|0}c[l>>2]=m&1|b|2;c[e+4>>2]=d|1;c[4202151]=e;c[4202148]=d;return a|0}if((c[4202150]|0)==(i|0)){e=(c[4202147]|0)+d|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){k=a+b|0;e=a+e|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|1;c[e>>2]=d;e=e+4|0;c[e>>2]=c[e>>2]&-2;e=k}else{c[l>>2]=m&1|e|2;e=a+e+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[4202147]=d;c[4202150]=e;return a|0}e=c[i+4>>2]|0;if(e&2|0){a=0;return a|0}j=(e&-8)+d|0;if(j>>>0<b>>>0){a=0;return a|0}k=j-b|0;f=e>>>3;do if(e>>>0<256){e=c[i+8>>2]|0;d=c[i+12>>2]|0;if((d|0)==(e|0)){c[4202145]=c[4202145]&~(1<<f);break}else{c[e+12>>2]=d;c[d+8>>2]=e;break}}else{h=c[i+24>>2]|0;d=c[i+12>>2]|0;do if((d|0)==(i|0)){e=i+16|0;f=e+4|0;d=c[f>>2]|0;if(!d){d=c[e>>2]|0;if(!d){f=0;break}}else e=f;while(1){g=d+20|0;f=c[g>>2]|0;if(!f){g=d+16|0;f=c[g>>2]|0;if(!f)break;else{d=f;e=g}}else{d=f;e=g}}c[e>>2]=0;f=d}else{f=c[i+8>>2]|0;c[f+12>>2]=d;c[d+8>>2]=f;f=d}while(0);if(h|0){d=c[i+28>>2]|0;e=16808884+(d<<2)|0;if((c[e>>2]|0)==(i|0)){c[e>>2]=f;if(!f){c[4202146]=c[4202146]&~(1<<d);break}}else{g=h+16|0;c[((c[g>>2]|0)==(i|0)?g:h+20|0)>>2]=f;if(!f)break}c[f+24>>2]=h;d=i+16|0;e=c[d>>2]|0;if(e|0){c[f+16>>2]=e;c[e+24>>2]=f}d=c[d+4>>2]|0;if(d|0){c[f+20>>2]=d;c[d+24>>2]=f}}}while(0);if(k>>>0<16){c[l>>2]=m&1|j|2;m=a+j+4|0;c[m>>2]=c[m>>2]|1;return a|0}else{i=a+b|0;c[l>>2]=m&1|b|2;c[i+4>>2]=k|3;m=a+j+4|0;c[m>>2]=c[m>>2]|1;Xj(i,k);return a|0}return 0}function Xj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){f=c[a>>2]|0;if(!(d&3))return;h=a+(0-f)|0;b=f+b|0;if((c[4202150]|0)==(h|0)){a=i+4|0;d=c[a>>2]|0;if((d&3|0)!=3)break;c[4202147]=b;c[a>>2]=d&-2;c[h+4>>2]=b|1;c[i>>2]=b;return}e=f>>>3;if(f>>>0<256){a=c[h+8>>2]|0;d=c[h+12>>2]|0;if((d|0)==(a|0)){c[4202145]=c[4202145]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}g=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){d=h+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{f=c[h+8>>2]|0;c[f+12>>2]=a;c[a+8>>2]=f}while(0);if(g){d=c[h+28>>2]|0;e=16808884+(d<<2)|0;if((c[e>>2]|0)==(h|0)){c[e>>2]=a;if(!a){c[4202146]=c[4202146]&~(1<<d);break}}else{f=g+16|0;c[((c[f>>2]|0)==(h|0)?f:g+20|0)>>2]=a;if(!a)break}c[a+24>>2]=g;d=h+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(d){c[a+20>>2]=d;c[d+24>>2]=a}}}else h=a;while(0);a=i+4|0;e=c[a>>2]|0;if(!(e&2)){if((c[4202151]|0)==(i|0)){i=(c[4202148]|0)+b|0;c[4202148]=i;c[4202151]=h;c[h+4>>2]=i|1;if((h|0)!=(c[4202150]|0))return;c[4202150]=0;c[4202147]=0;return}if((c[4202150]|0)==(i|0)){i=(c[4202147]|0)+b|0;c[4202147]=i;c[4202150]=h;c[h+4>>2]=i|1;c[h+i>>2]=i;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){a=c[i+8>>2]|0;b=c[i+12>>2]|0;if((b|0)==(a|0)){c[4202145]=c[4202145]&~(1<<d);break}else{c[a+12>>2]=b;c[b+8>>2]=a;break}}else{g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+16|0;d=a+4|0;b=c[d>>2]|0;if(!b){b=c[a>>2]|0;if(!b){d=0;break}}else a=d;while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);if(g|0){b=c[i+28>>2]|0;a=16808884+(b<<2)|0;if((c[a>>2]|0)==(i|0)){c[a>>2]=d;if(!d){c[4202146]=c[4202146]&~(1<<b);break}}else{e=g+16|0;c[((c[e>>2]|0)==(i|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;b=i+16|0;a=c[b>>2]|0;if(a|0){c[d+16>>2]=a;c[a+24>>2]=d}b=c[b+4>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}}while(0);c[h+4>>2]=f|1;c[h+f>>2]=f;if((h|0)==(c[4202150]|0)){c[4202147]=f;return}}else{c[a>>2]=e&-2;c[h+4>>2]=b|1;c[h+b>>2]=b;f=b}b=f>>>3;if(f>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=h;c[b+12>>2]=h;c[h+8>>2]=b;c[h+12>>2]=d;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{g=(b+1048320|0)>>>16&8;i=b<<g;d=(i+520192|0)>>>16&4;i=i<<d;e=(i+245760|0)>>>16&2;e=14-(d|g|e)+(i<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=16808884+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[h+16>>2]=0;a=c[4202146]|0;d=1<<e;if(!(a&d)){c[4202146]=a|d;c[b>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}b=c[b>>2]|0;a:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break a}else{e=e<<1;b=a}}c[d>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}while(0);g=b+8|0;i=c[g>>2]|0;c[i+12>>2]=h;c[g>>2]=h;c[h+8>>2]=i;c[h+12>>2]=b;c[h+24>>2]=0;return}function Yj(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=bk(c[a+60>>2]|0)|0;a=$j(pa(6,d|0)|0)|0;l=b;return a|0}function Zj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+32|0;g=n+16|0;f=n;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=$j(na(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=b+(o<<31>>31)|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=$j(na(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function _j(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if(($j(ma(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function $j(a){a=a|0;if(a>>>0>4294963200){c[(ak()|0)>>2]=0-a;a=-1}return a|0}function ak(){return 16809140}function bk(a){a=a|0;return a|0}function ck(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=1;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,oa(54,f|0)|0):0)a[b+75>>0]=-1;f=Zj(b,d,e)|0;l=g;return f|0}function dk(a){a=a|0;return (a+-48|0)>>>0<10|0}function ek(){return 14904}function fk(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function gk(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=5;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=5;break}}}while(0);if((e|0)==5){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function hk(a,b){a=a|0;b=b|0;jk(a,b)|0;return a|0}function ik(a,b){a=a|0;b=b|0;hk(a+(gk(a)|0)|0,b)|0;return a|0}function jk(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=10}else f=10;while(0);if((f|0)==10){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function kk(b,c){b=b|0;c=c|0;b=mk(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function lk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else i=16;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)==g<<24>>24)if(!e){i=16;break}else break;f=N(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break c;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break}}else i=11;while(0);if((i|0)==11)if(!e){i=16;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;e=e+-1|0;if(!e){i=16;break}else b=b+1|0}}while(0);if((i|0)==16)b=0;return b|0}function mk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(gk(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=N(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f;c[g>>2]=e;e=ok(a,b,d,g)|0;l=f;return e|0}function ok(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=15148;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(ak()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=pk(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function pk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+208|0;p=s+160|0;q=s+80|0;r=s;f=p;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((qk(0,d,n,q,p)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)o=rk(b)|0;else o=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=qk(b,d,n,q,p)|0;if(h){Ya[c[b+36>>2]&63](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=qk(b,d,n,q,p)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(o|0)sk(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function qk(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+64|0;D=I+56|0;E=I+40|0;A=I;G=I+48|0;H=I+60|0;c[D>>2]=e;w=(d|0)!=0;x=A+40|0;z=x;A=A+39|0;B=G+4|0;j=0;e=0;m=0;a:while(1){do{do if((e|0)>-1)if((j|0)>(2147483647-e|0)){c[(ak()|0)>>2]=75;e=-1;break}else{e=j+e|0;break}while(0);s=c[D>>2]|0;j=a[s>>0]|0;if(!(j<<24>>24)){v=94;break a}k=s;b:while(1){switch(j<<24>>24){case 37:{v=10;break b}case 0:{j=k;break b}default:{}}u=k+1|0;c[D>>2]=u;j=a[u>>0]|0;k=u}c:do if((v|0)==10){v=0;j=k;do{if((a[k+1>>0]|0)!=37)break c;j=j+1|0;k=k+2|0;c[D>>2]=k}while((a[k>>0]|0)==37)}while(0);j=j-s|0;if(w)tk(d,s,j)}while((j|0)!=0);u=(dk(a[(c[D>>2]|0)+1>>0]|0)|0)==0;k=c[D>>2]|0;if(!u?(a[k+2>>0]|0)==36:0){q=(a[k+1>>0]|0)+-48|0;o=1;j=3}else{q=-1;o=m;j=1}j=k+j|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>31|(1<<m&75913|0)==0)n=0;else{n=0;do{n=1<<m|n;j=j+1|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0}while(!(m>>>0>31|(1<<m&75913|0)==0))}if(k<<24>>24==42){if((dk(a[j+1>>0]|0)|0)!=0?(F=c[D>>2]|0,(a[F+2>>0]|0)==36):0){j=F+1|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;m=1;k=F+3|0}else{if(o|0){e=-1;break}if(w){u=(c[f>>2]|0)+(4-1)&~(4-1);j=c[u>>2]|0;c[f>>2]=u+4}else j=0;m=0;k=(c[D>>2]|0)+1|0}c[D>>2]=k;u=(j|0)<0;t=u?0-j|0:j;n=u?n|8192:n;u=m}else{j=uk(D)|0;if((j|0)<0){e=-1;break}t=j;u=o;k=c[D>>2]|0}do if((a[k>>0]|0)==46){j=k+1|0;if((a[j>>0]|0)!=42){c[D>>2]=j;j=uk(D)|0;k=c[D>>2]|0;break}if(dk(a[k+2>>0]|0)|0?(C=c[D>>2]|0,(a[C+3>>0]|0)==36):0){j=C+2|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;k=C+4|0;c[D>>2]=k;break}if(u|0){e=-1;break a}if(w){r=(c[f>>2]|0)+(4-1)&~(4-1);j=c[r>>2]|0;c[f>>2]=r+4}else j=0;k=(c[D>>2]|0)+2|0;c[D>>2]=k}else j=-1;while(0);r=0;while(1){if(((a[k>>0]|0)+-65|0)>>>0>57){e=-1;break a}m=k;k=k+1|0;c[D>>2]=k;m=a[(a[m>>0]|0)+-65+(11728+(r*58|0))>>0]|0;o=m&255;if((o+-1|0)>>>0>=8)break;else r=o}if(!(m<<24>>24)){e=-1;break}p=(q|0)>-1;do if(m<<24>>24==19)if(p){e=-1;break a}else v=54;else{if(p){c[i+(q<<2)>>2]=o;p=g+(q<<3)|0;q=c[p+4>>2]|0;v=E;c[v>>2]=c[p>>2];c[v+4>>2]=q;v=54;break}if(!w){e=0;break a}vk(E,o,f);k=c[D>>2]|0;v=55}while(0);if((v|0)==54){v=0;if(w)v=55;else j=0}d:do if((v|0)==55){v=0;k=a[k+-1>>0]|0;k=(r|0)!=0&(k&15|0)==3?k&-33:k;m=n&-65537;q=(n&8192|0)==0?n:m;e:do switch(k|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[E>>2]>>2]=e;j=0;break d}case 1:{c[c[E>>2]>>2]=e;j=0;break d}case 2:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}case 3:{b[c[E>>2]>>1]=e;j=0;break d}case 4:{a[c[E>>2]>>0]=e;j=0;break d}case 6:{c[c[E>>2]>>2]=e;j=0;break d}case 7:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}default:{j=0;break d}}case 112:{k=120;j=j>>>0>8?j:8;m=q|8;v=67;break}case 88:case 120:{m=q;v=67;break}case 111:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;p=xk(k,m,x)|0;v=z-p|0;n=0;o=20067;j=(q&8|0)==0|(j|0)>(v|0)?j:v+1|0;v=73;break}case 105:case 100:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;if((m|0)<0){k=yl(0,0,k|0,m|0)|0;m=y;n=E;c[n>>2]=k;c[n+4>>2]=m;n=1;o=20067;v=72;break e}else{n=(q&2049|0)!=0&1;o=(q&2048|0)==0?((q&1|0)==0?20067:20069):20068;v=72;break e}}case 117:{m=E;n=0;o=20067;k=c[m>>2]|0;m=c[m+4>>2]|0;v=72;break}case 99:{a[A>>0]=c[E>>2];r=A;n=0;o=20067;p=1;j=z;break}case 109:{k=zk(c[(ak()|0)>>2]|0)|0;v=77;break}case 115:{k=c[E>>2]|0;k=(k|0)==0?20077:k;v=77;break}case 67:{c[G>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=G;o=-1;v=81;break}case 83:{if(!j){Ak(d,32,t,0,q);j=0;v=91}else{o=j;v=81}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{j=Ck(d,+h[E>>3],t,j,q,k)|0;break d}default:{r=s;n=0;o=20067;p=j;m=q;j=z}}while(0);f:do if((v|0)==67){s=E;r=c[s>>2]|0;s=c[s+4>>2]|0;p=wk(r,s,x,k&32)|0;o=(m&8|0)==0|(r|0)==0&(s|0)==0;n=o?0:2;o=o?20067:20067+(k>>>4)|0;q=m;k=r;m=s;v=73}else if((v|0)==72){p=yk(k,m,x)|0;v=73}else if((v|0)==77){v=0;s=lk(k,0,j)|0;q=(s|0)==0;r=k;n=0;o=20067;p=q?j:s-k|0;j=q?k+j|0:s}else if((v|0)==81){v=0;n=c[E>>2]|0;j=0;while(1){k=c[n>>2]|0;if(!k)break;k=Bk(H,k)|0;m=(k|0)<0;if(m|k>>>0>(o-j|0)>>>0){v=85;break}j=k+j|0;if(o>>>0>j>>>0)n=n+4|0;else break}if((v|0)==85){v=0;if(m){e=-1;break a}}Ak(d,32,t,j,q);if(!j){j=0;v=91}else{m=c[E>>2]|0;n=0;while(1){k=c[m>>2]|0;if(!k){v=91;break f}k=Bk(H,k)|0;n=k+n|0;if((n|0)>(j|0)){v=91;break f}tk(d,H,k);if(n>>>0>=j>>>0){v=91;break}else m=m+4|0}}}while(0);if((v|0)==73){v=0;m=(k|0)!=0|(m|0)!=0;s=(j|0)!=0|m;m=z-p+((m^1)&1)|0;r=s?p:x;p=s?((j|0)>(m|0)?j:m):0;m=(j|0)>-1?q&-65537:q;j=z}else if((v|0)==91){v=0;Ak(d,32,t,j,q^8192);j=(t|0)>(j|0)?t:j;break}q=j-r|0;p=(p|0)<(q|0)?q:p;s=p+n|0;j=(t|0)<(s|0)?s:t;Ak(d,32,j,s,m);tk(d,o,n);Ak(d,48,j,s,m^65536);Ak(d,48,p,q,0);tk(d,r,q);Ak(d,32,j,s,m^8192)}while(0);m=u}g:do if((v|0)==94)if(!d)if(!m)e=0;else{e=1;while(1){j=c[i+(e<<2)>>2]|0;if(!j)break;vk(g+(e<<3)|0,j,f);e=e+1|0;if(e>>>0>=10){e=1;break g}}while(1){if(c[i+(e<<2)>>2]|0){e=-1;break g}e=e+1|0;if(e>>>0>=10){e=1;break}}}while(0);l=I;return e|0}function rk(a){a=a|0;return 0}function sk(a){a=a|0;return}function tk(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))Ok(b,d,a)|0;return}function uk(b){b=b|0;var d=0,e=0;if(!(dk(a[c[b>>2]>>0]|0)|0))d=0;else{d=0;do{e=c[b>>2]|0;d=(d*10|0)+-48+(a[e>>0]|0)|0;e=e+1|0;c[b>>2]=e}while((dk(a[e>>0]|0)|0)!=0)}return d|0}function vk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function wk(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[12192+(b&15)>>0]|0|f;b=Il(b|0,c|0,4)|0;c=y}while(!((b|0)==0&(c|0)==0));return e|0}function xk(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Il(b|0,c|0,3)|0;c=y}while(!((b|0)==0&(c|0)==0));return d|0}function yk(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){do{e=b;b=Fl(b|0,c|0,10,0)|0;f=c;c=y;g=Dl(b|0,c|0,10,0)|0;g=yl(e|0,f|0,g|0,y|0)|0;d=d+-1|0;a[d>>0]=g&255|48}while(f>>>0>9|(f|0)==9&e>>>0>4294967295);c=b}else c=b;if(c)do{g=c;c=(c>>>0)/10|0;d=d+-1|0;a[d>>0]=g-(c*10|0)|48}while(g>>>0>=10);return d|0}function zk(a){a=a|0;return Jk(a,c[(Ik()|0)+188>>2]|0)|0}function Ak(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Nl(f|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{tk(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}tk(a,f,e)}l=g;return}function Bk(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Gk(a,b,0)|0;return a|0}function Ck(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+32|0;v=H+536|0;G=H;F=G;n=H+540|0;c[v>>2]=0;E=n+12|0;Dk(e)|0;j=y;if((j|0)<0){e=-e;Dk(e)|0;D=1;C=20084;j=y}else{D=(h&2049|0)!=0&1;C=(h&2048|0)==0?((h&1|0)==0?20085:20090):20087}do if(0==0&(j&2146435072|0)==2146435072){G=(i&32|0)!=0;j=D+3|0;Ak(b,32,f,j,h&-65537);tk(b,C,D);tk(b,e!=e|0.0!=0.0?(G?20111:20115):G?20103:20107,3);Ak(b,32,f,j,h^8192)}else{r=+Ek(e,v)*2.0;j=r!=0.0;if(j)c[v>>2]=(c[v>>2]|0)+-1;u=i|32;if((u|0)==97){p=i&32;s=(p|0)==0?C:C+9|0;q=D|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[s>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[v>>2]|0;j=(k|0)<0?0-k|0:k;j=yk(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;k=(g|0)<1;m=(h&8|0)==0;n=G;do{D=~~e;j=n+1|0;a[n>>0]=p|d[12192+D>>0];e=(e-+(D|0))*16.0;if((j-F|0)==1?!(m&(k&e==0.0)):0){a[j>>0]=46;n=n+2|0}else n=j}while(e!=0.0);if((g|0)!=0?(-2-F+n|0)<(g|0):0){k=E;m=o;j=g+2+k-m|0}else{k=E;m=o;j=k-F-m+n|0}E=j+q|0;Ak(b,32,f,E,h);tk(b,s,q);Ak(b,48,f,E,h^65536);F=n-F|0;tk(b,G,F);G=k-m|0;Ak(b,48,j-(F+G)|0,0,0);tk(b,o,G);Ak(b,32,f,E,h^8192);j=E;break}k=(g|0)<0?6:g;if(j){j=(c[v>>2]|0)+-28|0;c[v>>2]=j;e=r*268435456.0}else{e=r;j=c[v>>2]|0}B=(j|0)<0?m:m+288|0;m=B;do{z=~~e>>>0;c[m>>2]=z;m=m+4|0;e=(e-+(z>>>0))*1.0e9}while(e!=0.0);z=B;if((j|0)>0){p=B;while(1){o=(j|0)<29?j:29;j=m+-4|0;if(j>>>0>=p>>>0){n=0;do{t=Jl(c[j>>2]|0,0,o|0)|0;t=xl(t|0,y|0,n|0,0)|0;w=y;n=Fl(t|0,w|0,1e9,0)|0;x=Dl(n|0,y|0,1e9,0)|0;x=yl(t|0,w|0,x|0,y|0)|0;c[j>>2]=x;j=j+-4|0}while(j>>>0>=p>>>0);if(n){x=p+-4|0;c[x>>2]=n;n=x}else n=p}else n=p;a:do if(m>>>0>n>>>0){j=m;while(1){m=j+-4|0;if(c[m>>2]|0){m=j;break a}if(m>>>0>n>>>0)j=m;else break}}while(0);j=(c[v>>2]|0)-o|0;c[v>>2]=j;if((j|0)>0)p=n;else break}}else n=B;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(u|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0<m>>>0){o=(1<<s)+-1|0;p=1e9>>>s;q=0;j=n;do{x=c[j>>2]|0;c[j>>2]=(x>>>s)+q;q=N(x&o,p)|0;j=j+4|0}while(j>>>0<m>>>0);n=(c[n>>2]|0)==0?n+4|0:n;if(q){c[m>>2]=q;m=m+4|0}}else n=(c[n>>2]|0)==0?n+4|0:n;j=t?B:n;m=(m-j>>2|0)>(g|0)?j+(g<<2)|0:m;j=(c[v>>2]|0)+s|0;c[v>>2]=j}while((j|0)<0);t=n}else t=n;if(t>>>0<m>>>0){j=(z-t>>2)*9|0;o=c[t>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;j=j+1|0}while(o>>>0>=n>>>0)}}else j=0;w=(u|0)==103;x=(k|0)!=0;n=k-((u|0)==102?0:j)+((x&w)<<31>>31)|0;if((n|0)<(((m-z>>2)*9|0)+-9|0)){v=n+9216|0;n=(v|0)/9|0;g=B+4+(n+-1024<<2)|0;n=v-(n*9|0)|0;if((n|0)<8){o=10;while(1){o=o*10|0;if((n|0)<7)n=n+1|0;else break}}else o=10;q=c[g>>2]|0;n=(q>>>0)/(o>>>0)|0;s=q-(N(n,o)|0)|0;p=(g+4|0)==(m|0);if(!(p&(s|0)==0)){r=(n&1|0)==0?9007199254740992.0:9007199254740994.0;v=o>>>1;e=s>>>0<v>>>0?.5:p&(s|0)==(v|0)?1.0:1.5;if(D){v=(a[C>>0]|0)==45;e=v?-e:e;r=v?-r:r}n=q-s|0;c[g>>2]=n;if(r+e!=r){v=n+o|0;c[g>>2]=v;if(v>>>0>999999999){o=g;j=t;while(1){n=o+-4|0;c[o>>2]=0;if(n>>>0<j>>>0){j=j+-4|0;c[j>>2]=0}v=(c[n>>2]|0)+1|0;c[n>>2]=v;if(v>>>0>999999999)o=n;else{o=j;break}}}else{n=g;o=t}j=(z-o>>2)*9|0;q=c[o>>2]|0;if(q>>>0>=10){p=10;do{p=p*10|0;j=j+1|0}while(q>>>0>=p>>>0)}}else{n=g;o=t}}else{n=g;o=t}v=n+4|0;m=m>>>0>v>>>0?v:m}else o=t;g=0-j|0;b:do if(m>>>0>o>>>0)while(1){n=m+-4|0;if(c[n>>2]|0){v=m;u=1;break b}if(n>>>0>o>>>0)m=n;else{v=n;u=0;break}}else{v=m;u=0}while(0);do if(w){k=k+((x^1)&1)|0;if((k|0)>(j|0)&(j|0)>-5){p=i+-1|0;k=k+-1-j|0}else{p=i+-2|0;k=k+-1|0}if(!(h&8)){if(u?(A=c[v+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){n=0;m=10;do{m=m*10|0;n=n+1|0}while(!((A>>>0)%(m>>>0)|0|0))}else n=0;else n=9;m=((v-z>>2)*9|0)+-9|0;if((p|32|0)==102){i=m-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}else{i=m+j-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}}}else p=i;while(0);t=(k|0)!=0;q=t?1:h>>>3&1;s=(p|32|0)==102;if(s){w=0;j=(j|0)>0?j:0}else{m=(j|0)<0?g:j;m=yk(m,((m|0)<0)<<31>>31,E)|0;n=E;if((n-m|0)<2)do{m=m+-1|0;a[m>>0]=48}while((n-m|0)<2);a[m+-1>>0]=(j>>31&2)+43;j=m+-2|0;a[j>>0]=p;w=j;j=n-j|0}j=D+1+k+q+j|0;Ak(b,32,f,j,h);tk(b,C,D);Ak(b,48,f,j,h^65536);if(s){q=o>>>0>B>>>0?B:o;s=G+9|0;o=s;p=G+8|0;n=q;do{m=yk(c[n>>2]|0,0,s)|0;if((n|0)==(q|0)){if((m|0)==(s|0)){a[p>>0]=48;m=p}}else if(m>>>0>G>>>0){Nl(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}tk(b,m,o-m|0);n=n+4|0}while(n>>>0<=B>>>0);if(!((h&8|0)==0&(t^1)))tk(b,20119,1);if(n>>>0<v>>>0&(k|0)>0)while(1){m=yk(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){Nl(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}tk(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0<v>>>0&(k|0)>9)){k=m;break}else k=m}Ak(b,48,k+9|0,9,0)}else{v=u?v:o+4|0;if(o>>>0<v>>>0&(k|0)>-1){g=G+9|0;t=(h&8|0)==0;u=g;q=0-F|0;s=G+8|0;p=o;do{m=yk(c[p>>2]|0,0,g)|0;if((m|0)==(g|0)){a[s>>0]=48;m=s}do if((p|0)==(o|0)){n=m+1|0;tk(b,m,1);if(t&(k|0)<1){m=n;break}tk(b,20119,1);m=n}else{if(m>>>0<=G>>>0)break;Nl(G|0,48,m+q|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=u-m|0;tk(b,m,(k|0)>(F|0)?F:k);k=k-F|0;p=p+4|0}while(p>>>0<v>>>0&(k|0)>-1)}Ak(b,48,k+18|0,18,0);tk(b,w,E-w|0)}Ak(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function Dk(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;y=c[j+4>>2]|0;return b|0}function Ek(a,b){a=+a;b=b|0;return +(+Fk(a,b))}function Fk(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Il(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+Fk(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function Gk(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(Hk()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(ak()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(ak()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function Hk(){return ek()|0}function Ik(){return ek()|0}function Jk(b,e){b=b|0;e=e|0;var f=0,g=0;f=0;while(1){if((d[12208+f>>0]|0)==(b|0)){g=4;break}f=f+1|0;if((f|0)==87){b=87;g=5;break}}if((g|0)==4)if(!f)f=12304;else{b=f;g=5}if((g|0)==5){f=12304;do{do{g=f;f=f+1|0}while((a[g>>0]|0)!=0);b=b+-1|0}while((b|0)!=0)}return Kk(f,c[e+20>>2]|0)|0}function Kk(a,b){a=a|0;b=b|0;return Lk(a,b)|0}function Lk(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Mk(c[b>>2]|0,c[b+4>>2]|0,a)|0;return ((b|0)==0?a:b)|0}function Mk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=Nk(c[b+8>>2]|0,o)|0;f=Nk(c[b+12>>2]|0,o)|0;g=Nk(c[b+16>>2]|0,o)|0;a:do if((h>>>0<d>>>2>>>0?(n=d-(h<<2)|0,f>>>0<n>>>0&g>>>0<n>>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=Nk(c[b+(g<<2)>>2]|0,o)|0;g=Nk(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0<d>>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=fk(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}l=f?l:k;h=f?j:h-j|0}f=i+m|0;g=Nk(c[b+(f<<2)>>2]|0,o)|0;f=Nk(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0<d>>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Nk(a,b){a=a|0;b=b|0;var c=0;c=Kl(a|0)|0;return ((b|0)==0?a:c)|0}function Ok(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Pk(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0<d>>>0){f=Ya[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)<0|(d|0)==0){h=0;g=b}else{i=d;while(1){g=i+-1|0;if((a[b+g>>0]|0)==10)break;if(!g){h=0;g=b;break b}else i=g}f=Ya[c[e+36>>2]&63](e,b,i)|0;if(f>>>0<i>>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}while(0);Ll(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0}function Pk(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;Ll(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Rk(a,b){a=a|0;b=b|0;return Sk(a,b,(gk(a)|0)+1|0)|0}function Sk(b,c,d){b=b|0;c=c|0;d=d|0;a:do if(!d)d=0;else{c=c&255;while(1){d=d+-1|0;if((a[b+d>>0]|0)==c<<24>>24)break;if(!d){d=0;break a}}d=b+d|0}while(0);return d|0}function Tk(a){a=a|0;var b=0,c=0;b=(gk(a)|0)+1|0;c=Tj(b)|0;if(!c)a=0;else a=Ll(c|0,a|0,b|0)|0;return a|0}function Uk(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=kk(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=Vk(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=Wk(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=Xk(b,c)|0;break}else{b=Yk(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function Vk(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c>>0]|0)<<8|(d[c+1>>0]|0);c=b+1|0;e=a[c>>0]|0;a:do if(!(e<<24>>24))c=0;else{e=(d[b>>0]|0)<<8|e&255;while(1){b=e&65535;if((b|0)==(f|0))break;c=c+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){c=0;break a}else e=b<<8|e&255}c=c+-1|0}while(0);return c|0}function Wk(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=(b|c&255)<<8;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-2|0)|0}function Xk(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);e=b+3|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|c&255;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=b<<8|c&255;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-3|0)|0}function Yk(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+1056|0;v=x+1024|0;w=x;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;c[v+24>>2]=0;c[v+28>>2]=0;f=a[e>>0]|0;a:do if(f<<24>>24){q=0;do{if(!(a[b+q>>0]|0)){f=0;break a}u=f&255;t=v+(u>>>5<<2)|0;c[t>>2]=c[t>>2]|1<<(u&31);q=q+1|0;c[w+(u<<2)>>2]=q;f=a[e+q>>0]|0}while(f<<24>>24!=0);n=q>>>0>1;if(n){k=1;j=1;m=0;i=-1;o=1;while(1){f=a[e+(j+i)>>0]|0;g=a[e+o>>0]|0;do if(f<<24>>24==g<<24>>24)if((j|0)==(k|0)){h=k;f=1;g=k+m|0;break}else{h=k;f=j+1|0;g=m;break}else if((f&255)>(g&255)){h=o-i|0;f=1;g=o;break}else{h=1;f=1;g=m+1|0;i=m;break}while(0);o=f+g|0;if(o>>>0>=q>>>0)break;else{k=h;j=f;m=g}}if(n){n=1;m=1;o=0;g=-1;p=1;while(1){f=a[e+(m+g)>>0]|0;j=a[e+p>>0]|0;do if(f<<24>>24==j<<24>>24)if((m|0)==(n|0)){f=n;j=1;k=n+o|0;break}else{f=n;j=m+1|0;k=o;break}else if((f&255)<(j&255)){f=p-g|0;j=1;k=p;break}else{f=1;j=1;k=o+1|0;g=o;break}while(0);p=j+k|0;if(p>>>0>=q>>>0){u=q;j=25;break}else{n=f;m=j;o=k}}}else{u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=0;f=1;g=-1;j=25}while(0);b:do if((j|0)==25){s=(g+1|0)>>>0>(i+1|0)>>>0;f=s?f:h;s=s?g:i;t=s+1|0;if(!(Zk(e,e+f|0,t)|0)){n=u-f|0;r=n;m=f}else{n=u-s+-1|0;n=(s>>>0>n>>>0?s:n)+1|0;r=0;m=n;n=u-n|0}o=u|63;p=u+-1|0;q=(r|0)!=0;f=b;k=0;g=b;while(1){h=f;do if((g-h|0)>>>0<u>>>0){i=lk(g,0,o)|0;if(i)if((i-h|0)>>>0<u>>>0){f=0;break b}else break;else{i=g+o|0;break}}else i=g;while(0);g=d[f+p>>0]|0;c:do if(!(1<<(g&31)&c[v+(g>>>5<<2)>>2])){h=0;g=u}else{g=u-(c[w+(g<<2)>>2]|0)|0;if(g|0){h=0;g=q&(k|0)!=0&g>>>0<m>>>0?n:g;break}j=t>>>0>k>>>0;g=j?t:k;h=a[e+g>>0]|0;d:do if(h<<24>>24){while(1){if(h<<24>>24!=(a[f+g>>0]|0))break;g=g+1|0;h=a[e+g>>0]|0;if(!(h<<24>>24))break d}h=0;g=g-s|0;break c}while(0);if(!j)break b;g=t;while(1){g=g+-1|0;if((a[e+g>>0]|0)!=(a[f+g>>0]|0)){h=r;g=m;break c}if(g>>>0<=k>>>0)break b}}while(0);f=f+g|0;k=h;g=i}}while(0);l=x;return f|0}function Zk(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function _k(a,b,c){a=a|0;b=b|0;c=c|0;c=bl(a,b,c,-1,0)|0;return c|0}function $k(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=al(a,b,f)|0;l=e;return d|0}function al(a,b,c){a=a|0;b=b|0;c=c|0;return ok(a,2147483647,b,c)|0}function bl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;cl(h,0);d=dl(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function cl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=e+b;else c[a+100>>2]=d;return}function dl(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(ak()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0}while((fl(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=el(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0;if((i|32|0)!=120)if(j){o=8;n=47;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0;if((d[14113+i>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){cl(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{o=16;n=47}}else{e=j?10:e;if(e>>>0>(d[14113+i>>0]|0)>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;cl(b,0);c[(ak()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;do{i=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;e=j+-48|0}while(e>>>0<10&i>>>0<429496729);if(e>>>0<10){m=0;do{f=Dl(i|0,m|0,10,0)|0;k=y;l=((e|0)<0)<<31>>31;o=~l;if(k>>>0>o>>>0|(k|0)==(o|0)&f>>>0>~e>>>0){f=10;e=m;n=76;break c}i=xl(f|0,k|0,e|0,l|0)|0;m=y;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;e=j+-48|0}while(e>>>0<10&(m>>>0<429496729|(m|0)==429496729&i>>>0<2576980378));if(e>>>0>9){j=p;e=m}else{f=10;e=m;n=76}}else{j=p;e=0}}else{j=p;e=0;i=0}}else{o=e;n=47}while(0);d:do if((n|0)==47){if(!(o+-1&o)){n=a[20121+((o*23|0)>>>5&7)>>0]|0;f=a[14113+i>>0]|0;e=f&255;if(o>>>0>e>>>0){i=0;do{i=e|i<<n;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;f=a[14113+j>>0]|0;e=f&255}while(i>>>0<134217728&o>>>0>e>>>0);k=e;e=0}else{j=i;k=e;e=0;i=0}l=Il(-1,-1,n|0)|0;m=y;if(o>>>0<=k>>>0|(m>>>0<e>>>0|(m|0)==(e|0)&l>>>0<i>>>0)){f=o;n=76;break}while(1){i=Jl(i|0,e|0,n|0)|0;e=y;i=i|f&255;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=el(b)|0;f=a[14113+j>>0]|0;if(o>>>0<=(f&255)>>>0|(e>>>0>m>>>0|(e|0)==(m|0)&i>>>0>l>>>0)){f=o;n=76;break d}}}e=a[14113+i>>0]|0;f=e&255;if(o>>>0>f>>>0){i=0;do{i=f+(N(i,o)|0)|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;e=a[14113+j>>0]|0;f=e&255}while(i>>>0<119304647&o>>>0>f>>>0);k=e;e=0}else{j=i;k=e;i=0;e=0}if(o>>>0>f>>>0){m=Fl(-1,-1,o|0,0)|0;n=y;f=k;while(1){if(e>>>0>n>>>0|(e|0)==(n|0)&i>>>0>m>>>0){f=o;n=76;break d}k=Dl(i|0,e|0,o|0,0)|0;l=y;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=o;n=76;break d}i=xl(k|0,l|0,f|0,0)|0;e=y;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=el(b)|0;f=a[14113+j>>0]|0;if(o>>>0<=(f&255)>>>0){f=o;n=76;break}}}else{f=o;n=76}}while(0);if((n|0)==76)if(f>>>0>(d[14113+j>>0]|0)>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0}while(f>>>0>(d[14113+i>>0]|0)>>>0);c[(ak()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else j=p;if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0<h>>>0|(e|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(ak()|0)>>2]=34;g=xl(g|0,h|0,-1,-1)|0;h=y;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(ak()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=yl(i^j|0,e^g|0,j|0,g|0)|0;h=y}while(0);y=h;return g|0}function el(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=gl(b)|0;if((e|0)>=0){f=c[f>>2]|0;i=c[b+8>>2]|0;if(f){h=c[b+4>>2]|0;f=f-(c[b+108>>2]|0)|0;g=i;if((i-h|0)<(f|0))j=9;else c[b+100>>2]=h+(f+-1)}else{g=i;j=9}if((j|0)==9)c[b+100>>2]=i;f=b+4|0;if(!g)f=c[f>>2]|0;else{f=c[f>>2]|0;b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((e|0)!=(d[f>>0]|0|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function fl(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function gl(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if((hl(a)|0)==0?(Ya[c[a+32>>2]&63](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function hl(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Ya[c[b+36>>2]&63](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function il(a,b,c){a=a|0;b=b|0;c=c|0;c=bl(a,b,c,-1,-1)|0;return c|0}function jl(a,b,c){a=a|0;b=b|0;c=c|0;c=bl(a,b,c,-2147483648,0)|0;return c|0}function kl(a,b){a=a|0;b=b|0;var c=0;c=gk(a)|0;return ((ll(a,1,c,b)|0)!=(c|0))<<31>>31|0}function ll(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=N(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(rk(e)|0)==0;a=Ok(a,f,e)|0;if(!g)sk(e)}else a=Ok(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function ml(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(Pk(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0<h>>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((Ya[c[b+36>>2]&63](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function nl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=pk(a,b,f)|0;l=e;return d|0}function ol(a,b){a=a|0;b=b|0;return pk(c[3694]|0,a,b)|0}function pl(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=pk(c[3694]|0,a,e)|0;l=d;return b|0}function ql(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((c[d+76>>2]|0)>=0?(rk(d)|0)!=0:0){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(i=d+20|0,j=c[i>>2]|0,j>>>0<(c[d+16>>2]|0)>>>0):0){c[i>>2]=j+1;a[j>>0]=f}else e=ml(d,b)|0;sk(d)}else k=3;do if((k|0)==3){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=f;break}e=ml(d,b)|0}while(0);return e|0}function rl(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[3694]|0;if((c[f+76>>2]|0)>-1)g=rk(f)|0;else g=0;do if((kl(b,f)|0)<0)b=-1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(ml(f,10)|0)>>31}while(0);if(g|0)sk(f);return b|0}function sl(){ka(16809160);return}function tl(){return 16809144}function ul(){return 16809152}function vl(){return 16809156}function wl(){}function xl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function yl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (y=d,a-c>>>0|0)|0}function zl(a){a=a|0;return (a?31-(Q(a^a-1)|0)|0:32)|0}function Al(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (y=n,f)|0}else{if(!g){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (y=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (y=n,f)|0}g=h-1|0;if(g&h|0){i=(Q(h|0)|0)+33-(Q(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (y=o,p)|0}else{p=zl(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (y=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (y=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (y=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((zl(i|0)|0)>>>0);return (y=o,p)|0}g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (y=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (y=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=xl(m|0,l|0,-1,-1)|0;d=y;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;yl(k|0,d|0,e|0,n|0)|0;p=y;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=yl(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=y;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (y=o,p)|0}function Bl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=yl(j^a|0,i^b|0,j|0,i|0)|0;g=y;a=f^j;b=e^i;return yl((Al(h,g,yl(f^c|0,e^d|0,f|0,e|0)|0,y,0)|0)^a|0,y^b|0,a|0,b|0)|0}function Cl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function Dl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=Cl(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function El(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;i=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;j=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=yl(h^a|0,g^b|0,h|0,g|0)|0;b=y;Al(a,b,yl(k^d|0,j^e|0,k|0,j|0)|0,y,i)|0;e=yl(c[i>>2]^h|0,c[i+4>>2]^g|0,h|0,g|0)|0;d=y;l=f;return (y=d,e)|0}function Fl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Al(a,b,c,d,0)|0}function Gl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g|0;Al(a,b,d,e,f)|0;l=g;return (y=c[f+4>>2]|0,c[f>>2]|0)|0}function Hl(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=(b|0)<0?-1:0;return b>>c-32|0}function Il(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function Jl(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}y=a<<c-32;return 0}function Kl(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Ll(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return za(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function Ml(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Ll(b,c,d)|0;return b|0}function Nl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function Ol(a){a=a|0;var b=0,d=0;d=c[i>>2]|0;b=d+a|0;if((a|0)>0&(b|0)<(d|0)|(b|0)<0){V()|0;la(12);return -1}c[i>>2]=b;if((b|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=d;la(12);return -1}return d|0}function Pl(a,b){a=a|0;b=b|0;return Wa[a&15](b|0)|0}function Ql(a,b,c){a=a|0;b=b|0;c=c|0;return Xa[a&3](b|0,c|0)|0}function Rl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ya[a&63](b|0,c|0,d|0)|0}function Sl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Za[a&3](b|0,c|0,d|0,e|0)|0}function Tl(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return _a[a&7](b|0,c|0,d|0,e|0,f|0)|0}function Ul(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return $a[a&15](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Vl(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return ab[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)|0}function Wl(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return bb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Xl(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;return cb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0,n|0,o|0,p|0,q|0)|0}function Yl(a,b){a=a|0;b=b|0;db[a&15](b|0)}function Zl(a,b,c){a=a|0;b=b|0;c=c|0;eb[a&15](b|0,c|0)}function _l(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;fb[a&15](b|0,c|0,d|0)}function $l(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;gb[a&63](b|0,c|0,d|0,e|0)}function am(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;hb[a&7](b|0,c|0,d|0,e|0,f|0)}function bm(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ib[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function cm(a){a=a|0;R(0);return 0}function dm(a,b){a=a|0;b=b|0;R(1);return 0}function em(a,b,c){a=a|0;b=b|0;c=c|0;R(2);return 0}function fm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(3);return 0}function gm(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(4);return 0}function hm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(5);return 0}function im(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;R(6);return 0}function jm(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;R(7);return 0}function km(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;R(8);return 0}function lm(a){a=a|0;R(9)}function mm(a,b){a=a|0;b=b|0;R(10)}function nm(a,b,c){a=a|0;b=b|0;c=c|0;R(11)}function om(a,b,c){a=a|0;b=b|0;c=c|0;ua(a|0,b|0,c|0)}function pm(a,b,c){a=a|0;b=b|0;c=c|0;Ra(a|0,b|0,c|0)}function qm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(12)}function rm(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(13)}function sm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(14)}
+
+// EMSCRIPTEN_END_FUNCS
+var Wa=[cm,qh,uh,Yj,Xb,se,lh,xh,Hh,Ih,cm,cm,cm,cm,cm,cm];var Xa=[dm,sh,De,dm];var Ya=[em,Zj,_j,ck,Qk,Cb,Gb,Hb,Kb,Mb,Cc,Nc,Oc,Pc,Zc,td,ae,ce,mh,yh,Bh,Dh,Jh,Lh,Oh,Qh,Uh,Wh,Ui,Wi,Yi,vj,xj,Ej,Gj,Ij,Kj,Mj,Oj,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em];var Za=[fm,Ic,Lc,fm];var _a=[gm,Eb,Wb,dc,ic,lc,Mc,gm];var $a=[hm,xc,yc,zc,Ac,Fc,Gc,Hc,Jc,Be,hm,hm,hm,hm,hm,hm];var ab=[im,Bc,te,ue];var bb=[jm,Kc];var cb=[km,Dc];var db=[lm,ph,rh,xb,Ab,Bb,yb,jc,uc,Sh,_i,$i,bj,aj,ej,lm];var eb=[mm,th,Sb,Zb,vc,wc,Ec,Ce,Fh,dj,cj,zj,Aj,mm,mm,mm];var fb=[nm,wh,om,pm,Yb,Pd,Rd,$d,df,gf,Ah,Th,Qj,nm,nm,nm];var gb=[qm,Ib,Jb,Lb,oc,_c,fd,kd,ld,ud,be,de,ve,xe,ye,ef,nh,zh,Ch,Eh,Kh,Mh,Ph,Rh,Vh,Xh,Vi,Xi,Zi,wj,yj,Dj,Fj,Hj,Jj,Lj,Nj,Pj,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm];var hb=[rm,vh,Tc,bd,dd,Ee,rm,rm];var ib=[sm,zb];return{___divdi3:Bl,___emscripten_environ_constructor:sl,___muldi3:Dl,___remdi3:El,___udivdi3:Fl,___uremdi3:Gl,__get_daylight:ul,__get_timezone:vl,__get_tzname:tl,_bitshift64Ashr:Hl,_bitshift64Lshr:Il,_bitshift64Shl:Jl,_console_queue_char:qb,_display_key_event:rb,_display_mouse_event:sb,_display_wheel_event:tb,_free:Uj,_fs_import_file:id,_i64Add:xl,_i64Subtract:yl,_llvm_bswap_i32:Kl,_malloc:Tj,_memcpy:Ll,_memmove:Ml,_memset:Nl,_net_set_carrier:vb,_net_write_packet:ub,_sbrk:Ol,_vm_start:wb,dynCall_ii:Pl,dynCall_iii:Ql,dynCall_iiii:Rl,dynCall_iiiii:Sl,dynCall_iiiiii:Tl,dynCall_iiiiiii:Ul,dynCall_iiiiiiii:Vl,dynCall_iiiiiiiii:Wl,dynCall_iiiiiiiiiiiiiiiii:Xl,dynCall_vi:Yl,dynCall_vii:Zl,dynCall_viii:_l,dynCall_viiii:$l,dynCall_viiiii:am,dynCall_viiiiii:bm,establishStackSpace:mb,getTempRet0:pb,runPostSets:wl,setTempRet0:ob,setThrew:nb,stackAlloc:jb,stackRestore:lb,stackSave:kb}})
+
+
+// EMSCRIPTEN_END_ASM
+(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=asm["___emscripten_environ_constructor"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___remdi3=Module["___remdi3"]=asm["___remdi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var __get_daylight=Module["__get_daylight"]=asm["__get_daylight"];var __get_timezone=Module["__get_timezone"]=asm["__get_timezone"];var __get_tzname=Module["__get_tzname"]=asm["__get_tzname"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _console_queue_char=Module["_console_queue_char"]=asm["_console_queue_char"];var _display_key_event=Module["_display_key_event"]=asm["_display_key_event"];var _display_mouse_event=Module["_display_mouse_event"]=asm["_display_mouse_event"];var _display_wheel_event=Module["_display_wheel_event"]=asm["_display_wheel_event"];var _free=Module["_free"]=asm["_free"];var _fs_import_file=Module["_fs_import_file"]=asm["_fs_import_file"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _net_set_carrier=Module["_net_set_carrier"]=asm["_net_set_carrier"];var _net_write_packet=Module["_net_write_packet"]=asm["_net_write_packet"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _vm_start=Module["_vm_start"]=asm["_vm_start"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=asm["dynCall_iiiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=asm["dynCall_iiiiiiiiiiiiiiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;if(memoryInitializer){if(!isDataURI(memoryInitializer)){memoryInitializer=locateFile(memoryInitializer)}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run()
+
+
+
+
diff --git a/readme.md b/readme.md
index 649a400..c7c44c6 100644
--- a/readme.md
+++ b/readme.md
@@ -3,4 +3,7 @@
Dumped from http://squoze.net/UNIX/v4/README
Which itself is dumped from: https://archive.org/details/utah_unix_v4_raw
+Also includes jslinux for running the image from a browser.
+This a hacky and messy repo put together in just a few hours to let people
+play around with Unix v4 in their web browser.