'Programming'에 해당되는 글 1505건

  1. 2021.11.25 wasm interfacing example
  2. 2021.10.26 winform udp 소켓 여러개
  3. 2021.10.26 wasm text format
  4. 2021.10.26 wasm text 와 binary 상호변환
  5. 2021.10.25 emcc wasm 빌드
  6. 2021.10.24 wasm from c, cpp
  7. 2021.10.22 wasm
  8. 2021.10.20 c# thread
  9. 2021.10.20 Dispatcher / Control BeginInvoke()
  10. 2021.10.20 this.BeginInvoke()가 느려!
Programming/wasm2021. 11. 25. 19:07

웹 어셈블리에서

인자로 입력 받아 결과를 웹에서 받는 예제를 찾아봄.

 

wasm으로 변환될 코드는 int 형을 받아서 int 형으로 출력할 것이고

#include <math.h>

extern "C" {

int int_sqrt(int x) {
  return sqrt(x);
}

}

 

빌드는 아래와 같이 emcc를 통해 ccall과 cwrap 방식으로 _int_sqrt 함수를 내보내라 인것 같은데

int_sqrt가 아니라 _int_sqrt는 calling convention때문인가?

$ emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS='["_int_sqrt"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]'

 

웹에서 받는 법이 두가지라는데 cwrap으로 하면 int_sqrt 객체를 만들어서 한다는데 리턴이 되는진 모르겠고

ccall로 하면 인자를 던지는게 조금 귀찮아 지지만 var result에 결과가 들어가는 듯.

int_sqrt = Module.cwrap('int_sqrt', 'number', ['number'])
int_sqrt(12)
int_sqrt(28)

// Call C from JavaScript
var result = Module.ccall('int_sqrt', // name of C function
  'number', // return type
  ['number'], // argument types
  [28]); // arguments

// result is 5

[링크 : https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html]

 

 

[링크 : https://m.blog.daum.net/junek69/88]

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]

 

'Programming > wasm' 카테고리의 다른 글

wasm interfacing example  (0) 2021.11.25
wasm text format  (0) 2021.10.26
wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
Posted by 구차니

댓글을 달아 주세요

Programming/c# & winform2021. 10. 26. 18:07

 

[링크 : https://it-jerryfamily.tistory.com/entry/Program-C-multiple-port로-작업하기]

'Programming > c# & winform' 카테고리의 다른 글

winform udp 소켓 여러개  (0) 2021.10.26
c# thread  (0) 2021.10.20
Dispatcher / Control BeginInvoke()  (0) 2021.10.20
this.BeginInvoke()가 느려!  (0) 2021.10.20
크로스 스레드 작업이 잘못되었습니다  (0) 2021.10.19
winform 쓰레드와 소켓  (0) 2021.10.18
Posted by 구차니

댓글을 달아 주세요

Programming/wasm2021. 10. 26. 11:08

wasm 파일은 바이너리라 열어봐도 내용이 안보이는데, 크롬으로 실행하고 디버거로 보면 텍스트로 변환(?) 된다.

 

단순한(?!) hello world 하나 출력할 뿐인데 드럽게 기네

(module
  (func $wasi_snapshot_preview1.fd_write (;0;) (import "wasi_snapshot_preview1" "fd_write") (param i32 i32 i32 i32) (result i32))
  (func $env.emscripten_memcpy_big (;1;) (import "env" "emscripten_memcpy_big") (param i32 i32 i32) (result i32))
  (func $env.setTempRet0 (;2;) (import "env" "setTempRet0") (param i32))
  (table $__indirect_function_table (;0;) (export "__indirect_function_table") 6 6 funcref)
  (memory $memory (;0;) (export "memory") 256 256)
  (global $global0 (mut i32) (i32.const 5245984))
  (global $global1 (mut i32) (i32.const 0))
  (global $global2 (mut i32) (i32.const 0))
  (elem $elem0 (i32.const 1) funcref (ref.func $func9) (ref.func $func8) (ref.func $func10) (ref.func $func41) (ref.func $func42))
  (func $__wasm_call_ctors (;3;) (export "__wasm_call_ctors")
    call $emscripten_stack_init
    call $func24
  )
  (func $func4 (result i32)
    (local $var0 i32) (local $var1 i32) (local $var2 i32) (local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i32) (local $var7 i32) (local $var8 i32)
    global.get $global0
    local.set $var0
    i32.const 16
    local.set $var1
    local.get $var0
    local.get $var1
    i32.sub
    local.set $var2
    local.get $var2
    global.set $global0
    i32.const 0
    local.set $var3
    local.get $var2
    local.get $var3
    i32.store offset=12
    i32.const 1078
    local.set $var4
    i32.const 0
    local.set $var5
    local.get $var4
    local.get $var5
    call $func44
    drop
    i32.const 0
    local.set $var6
    i32.const 16
    local.set $var7
    local.get $var2
    local.get $var7
    i32.add
    local.set $var8
    local.get $var8
    global.set $global0
    local.get $var6
    return
  )
  (func $main (;5;) (export "main") (param $var0 i32) (param $var1 i32) (result i32)
    (local $var2 i32)
    call $func4
    local.set $var2
    local.get $var2
    return
  )
  (func $__errno_location (;6;) (export "__errno_location") (result i32)
    i32.const 1744
  )
  (func $func7 (param $var0 i32) (result i32)
    block $label0
      local.get $var0
      br_if $label0
      i32.const 0
      return
    end $label0
    call $__errno_location
    local.get $var0
    i32.store
    i32.const -1
  )
  (func $func8 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i32) (local $var7 i32) (local $var8 i32) (local $var9 i32)
    global.get $global0
    i32.const 32
    i32.sub
    local.tee $var3
    global.set $global0
    local.get $var3
    local.get $var0
    i32.load offset=28
    local.tee $var4
    i32.store offset=16
    local.get $var0
    i32.load offset=20
    local.set $var5
    local.get $var3
    local.get $var2
    i32.store offset=28
    local.get $var3
    local.get $var1
    i32.store offset=24
    local.get $var3
    local.get $var5
    local.get $var4
    i32.sub
    local.tee $var1
    i32.store offset=20
    local.get $var1
    local.get $var2
    i32.add
    local.set $var6
    i32.const 2
    local.set $var7
    local.get $var3
    i32.const 16
    i32.add
    local.set $var1
    block $label4
      block $label2
        block $label1
          block $label0
            local.get $var0
            i32.load offset=60
            local.get $var3
            i32.const 16
            i32.add
            i32.const 2
            local.get $var3
            i32.const 12
            i32.add
            call $wasi_snapshot_preview1.fd_write
            call $func7
            br_if $label0
            loop $label3
              local.get $var6
              local.get $var3
              i32.load offset=12
              local.tee $var4
              i32.eq
              br_if $label1
              local.get $var4
              i32.const -1
              i32.le_s
              br_if $label2
              local.get $var1
              local.get $var4
              local.get $var1
              i32.load offset=4
              local.tee $var8
              i32.gt_u
              local.tee $var5
              i32.const 3
              i32.shl
              i32.add
              local.tee $var9
              local.get $var9
              i32.load
              local.get $var4
              local.get $var8
              i32.const 0
              local.get $var5
              select
              i32.sub
              local.tee $var8
              i32.add
              i32.store
              local.get $var1
              i32.const 12
              i32.const 4
              local.get $var5
              select
              i32.add
              local.tee $var9
              local.get $var9
              i32.load
              local.get $var8
              i32.sub
              i32.store
              local.get $var6
              local.get $var4
              i32.sub
              local.set $var6
              local.get $var0
              i32.load offset=60
              local.get $var1
              i32.const 8
              i32.add
              local.get $var1
              local.get $var5
              select
              local.tee $var1
              local.get $var7
              local.get $var5
              i32.sub
              local.tee $var7
              local.get $var3
              i32.const 12
              i32.add
              call $wasi_snapshot_preview1.fd_write
              call $func7
              i32.eqz
              br_if $label3
            end $label3
          end $label0
          local.get $var6
          i32.const -1
          i32.ne
          br_if $label2
        end $label1
        local.get $var0
        local.get $var0
        i32.load offset=44
        local.tee $var1
        i32.store offset=28
        local.get $var0
        local.get $var1
        i32.store offset=20
        local.get $var0
        local.get $var1
        local.get $var0
        i32.load offset=48
        i32.add
        i32.store offset=16
        local.get $var2
        local.set $var4
        br $label4
      end $label2
      i32.const 0
      local.set $var4
      local.get $var0
      i32.const 0
      i32.store offset=28
      local.get $var0
      i64.const 0
      i64.store offset=16
      local.get $var0
      local.get $var0
      i32.load
      i32.const 32
      i32.or
      i32.store
      local.get $var7
      i32.const 2
      i32.eq
      br_if $label4
      local.get $var2
      local.get $var1
      i32.load offset=4
      i32.sub
      local.set $var4
    end $label4
    local.get $var3
    i32.const 32
    i32.add
    global.set $global0
    local.get $var4
  )
  (func $func9 (param $var0 i32) (result i32)
    i32.const 0
  )
  (func $func10 (param $var0 i32) (param $var1 i64) (param $var2 i32) (result i64)
    i64.const 0
  )
  (func $func11 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i64)
    block $label0
      local.get $var2
      i32.eqz
      br_if $label0
      local.get $var2
      local.get $var0
      i32.add
      local.tee $var3
      i32.const -1
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8
      local.get $var2
      i32.const 3
      i32.lt_u
      br_if $label0
      local.get $var3
      i32.const -2
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8 offset=1
      local.get $var3
      i32.const -3
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8 offset=2
      local.get $var2
      i32.const 7
      i32.lt_u
      br_if $label0
      local.get $var3
      i32.const -4
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8 offset=3
      local.get $var2
      i32.const 9
      i32.lt_u
      br_if $label0
      local.get $var0
      i32.const 0
      local.get $var0
      i32.sub
      i32.const 3
      i32.and
      local.tee $var4
      i32.add
      local.tee $var3
      local.get $var1
      i32.const 255
      i32.and
      i32.const 16843009
      i32.mul
      local.tee $var1
      i32.store
      local.get $var3
      local.get $var2
      local.get $var4
      i32.sub
      i32.const -4
      i32.and
      local.tee $var4
      i32.add
      local.tee $var2
      i32.const -4
      i32.add
      local.get $var1
      i32.store
      local.get $var4
      i32.const 9
      i32.lt_u
      br_if $label0
      local.get $var3
      local.get $var1
      i32.store offset=8
      local.get $var3
      local.get $var1
      i32.store offset=4
      local.get $var2
      i32.const -8
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -12
      i32.add
      local.get $var1
      i32.store
      local.get $var4
      i32.const 25
      i32.lt_u
      br_if $label0
      local.get $var3
      local.get $var1
      i32.store offset=24
      local.get $var3
      local.get $var1
      i32.store offset=20
      local.get $var3
      local.get $var1
      i32.store offset=16
      local.get $var3
      local.get $var1
      i32.store offset=12
      local.get $var2
      i32.const -16
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -20
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -24
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -28
      i32.add
      local.get $var1
      i32.store
      local.get $var4
      local.get $var3
      i32.const 4
      i32.and
      i32.const 24
      i32.or
      local.tee $var5
      i32.sub
      local.tee $var2
      i32.const 32
      i32.lt_u
      br_if $label0
      local.get $var1
      i64.extend_i32_u
      i64.const 4294967297
      i64.mul
      local.set $var6
      local.get $var3
      local.get $var5
      i32.add
      local.set $var1
      loop $label1
        local.get $var1
        local.get $var6
        i64.store offset=24
        local.get $var1
        local.get $var6
        i64.store offset=16
        local.get $var1
        local.get $var6
        i64.store offset=8
        local.get $var1
        local.get $var6
        i64.store
        local.get $var1
        i32.const 32
        i32.add
        local.set $var1
        local.get $var2
        i32.const -32
        i32.add
        local.tee $var2
        i32.const 31
        i32.gt_u
        br_if $label1
      end $label1
    end $label0
    local.get $var0
  )
  (func $func12 (param $var0 i32) (result i32)
    local.get $var0
    i32.const -48
    i32.add
    i32.const 10
    i32.lt_u
  )
  (func $func13 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32)
    local.get $var2
    i32.const 0
    i32.ne
    local.set $var3
    block $label3
      block $label1
        block $label0
          local.get $var0
          i32.const 3
          i32.and
          i32.eqz
          br_if $label0
          local.get $var2
          i32.eqz
          br_if $label0
          local.get $var1
          i32.const 255
          i32.and
          local.set $var4
          loop $label2
            local.get $var0
            i32.load8_u
            local.get $var4
            i32.eq
            br_if $label1
            local.get $var2
            i32.const -1
            i32.add
            local.tee $var2
            i32.const 0
            i32.ne
            local.set $var3
            local.get $var0
            i32.const 1
            i32.add
            local.tee $var0
            i32.const 3
            i32.and
            i32.eqz
            br_if $label0
            local.get $var2
            br_if $label2
          end $label2
        end $label0
        local.get $var3
        i32.eqz
        br_if $label3
      end $label1
      block $label4
        local.get $var0
        i32.load8_u
        local.get $var1
        i32.const 255
        i32.and
        i32.eq
        br_if $label4
        local.get $var2
        i32.const 4
        i32.lt_u
        br_if $label4
        local.get $var1
        i32.const 255
        i32.and
        i32.const 16843009
        i32.mul
        local.set $var4
        loop $label5
          local.get $var0
          i32.load
          local.get $var4
          i32.xor
          local.tee $var3
          i32.const -1
          i32.xor
          local.get $var3
          i32.const -16843009
          i32.add
          i32.and
          i32.const -2139062144
          i32.and
          br_if $label4
          local.get $var0
          i32.const 4
          i32.add
          local.set $var0
          local.get $var2
          i32.const -4
          i32.add
          local.tee $var2
          i32.const 3
          i32.gt_u
          br_if $label5
        end $label5
      end $label4
      local.get $var2
      i32.eqz
      br_if $label3
      local.get $var1
      i32.const 255
      i32.and
      local.set $var3
      loop $label7
        block $label6
          local.get $var0
          i32.load8_u
          local.get $var3
          i32.ne
          br_if $label6
          local.get $var0
          return
        end $label6
        local.get $var0
        i32.const 1
        i32.add
        local.set $var0
        local.get $var2
        i32.const -1
        i32.add
        local.tee $var2
        br_if $label7
      end $label7
    end $label3
    i32.const 0
  )
  (func $func14 (param $var0 i32)
  )
  (func $func15 (param $var0 i32)
  )
  (func $func16 (result i32)
    i32.const 2856
    call $func14
    i32.const 2864
  )
  (func $func17
    i32.const 2856
    call $func15
  )
  (func $func18 (param $var0 i32) (result i32)
    (local $var1 i32)
    local.get $var0
    local.get $var0
    i32.load8_u offset=74
    local.tee $var1
    i32.const -1
    i32.add
    local.get $var1
    i32.or
    i32.store8 offset=74
    block $label0
      local.get $var0
      i32.load
      local.tee $var1
      i32.const 8
      i32.and
      i32.eqz
      br_if $label0
      local.get $var0
      local.get $var1
      i32.const 32
      i32.or
      i32.store
      i32.const -1
      return
    end $label0
    local.get $var0
    i64.const 0
    i64.store offset=4 align=4
    local.get $var0
    local.get $var0
    i32.load offset=44
    local.tee $var1
    i32.store offset=28
    local.get $var0
    local.get $var1
    i32.store offset=20
    local.get $var0
    local.get $var1
    local.get $var0
    i32.load offset=48
    i32.add
    i32.store offset=16
    i32.const 0
  )
  (func $func19 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32)
    block $label0
      local.get $var2
      i32.const 512
      i32.lt_u
      br_if $label0
      local.get $var0
      local.get $var1
      local.get $var2
      call $env.emscripten_memcpy_big
      drop
      local.get $var0
      return
    end $label0
    local.get $var0
    local.get $var2
    i32.add
    local.set $var3
    block $label8
      block $label1
        local.get $var1
        local.get $var0
        i32.xor
        i32.const 3
        i32.and
        br_if $label1
        block $label3
          block $label2
            local.get $var0
            i32.const 3
            i32.and
            br_if $label2
            local.get $var0
            local.set $var2
            br $label3
          end $label2
          block $label4
            local.get $var2
            i32.const 1
            i32.ge_s
            br_if $label4
            local.get $var0
            local.set $var2
            br $label3
          end $label4
          local.get $var0
          local.set $var2
          loop $label5
            local.get $var2
            local.get $var1
            i32.load8_u
            i32.store8
            local.get $var1
            i32.const 1
            i32.add
            local.set $var1
            local.get $var2
            i32.const 1
            i32.add
            local.tee $var2
            i32.const 3
            i32.and
            i32.eqz
            br_if $label3
            local.get $var2
            local.get $var3
            i32.lt_u
            br_if $label5
          end $label5
        end $label3
        block $label6
          local.get $var3
          i32.const -4
          i32.and
          local.tee $var4
          i32.const 64
          i32.lt_u
          br_if $label6
          local.get $var2
          local.get $var4
          i32.const -64
          i32.add
          local.tee $var5
          i32.gt_u
          br_if $label6
          loop $label7
            local.get $var2
            local.get $var1
            i32.load
            i32.store
            local.get $var2
            local.get $var1
            i32.load offset=4
            i32.store offset=4
            local.get $var2
            local.get $var1
            i32.load offset=8
            i32.store offset=8
            local.get $var2
            local.get $var1
            i32.load offset=12
            i32.store offset=12
            local.get $var2
            local.get $var1
            i32.load offset=16
            i32.store offset=16
            local.get $var2
            local.get $var1
            i32.load offset=20
            i32.store offset=20
            local.get $var2
            local.get $var1
            i32.load offset=24
            i32.store offset=24
            local.get $var2
            local.get $var1
            i32.load offset=28
            i32.store offset=28
            local.get $var2
            local.get $var1
            i32.load offset=32
            i32.store offset=32
            local.get $var2
            local.get $var1
            i32.load offset=36
            i32.store offset=36
            local.get $var2
            local.get $var1
            i32.load offset=40
            i32.store offset=40
            local.get $var2
            local.get $var1
            i32.load offset=44
            i32.store offset=44
            local.get $var2
            local.get $var1
            i32.load offset=48
            i32.store offset=48
            local.get $var2
            local.get $var1
            i32.load offset=52
            i32.store offset=52
            local.get $var2
            local.get $var1
            i32.load offset=56
            i32.store offset=56
            local.get $var2
            local.get $var1
            i32.load offset=60
            i32.store offset=60
            local.get $var1
            i32.const 64
            i32.add
            local.set $var1
            local.get $var2
            i32.const 64
            i32.add
            local.tee $var2
            local.get $var5
            i32.le_u
            br_if $label7
          end $label7
        end $label6
        local.get $var2
        local.get $var4
        i32.ge_u
        br_if $label8
        loop $label9
          local.get $var2
          local.get $var1
          i32.load
          i32.store
          local.get $var1
          i32.const 4
          i32.add
          local.set $var1
          local.get $var2
          i32.const 4
          i32.add
          local.tee $var2
          local.get $var4
          i32.lt_u
          br_if $label9
          br $label8
        end $label9
        unreachable
      end $label1
      block $label10
        local.get $var3
        i32.const 4
        i32.ge_u
        br_if $label10
        local.get $var0
        local.set $var2
        br $label8
      end $label10
      block $label11
        local.get $var3
        i32.const -4
        i32.add
        local.tee $var4
        local.get $var0
        i32.ge_u
        br_if $label11
        local.get $var0
        local.set $var2
        br $label8
      end $label11
      local.get $var0
      local.set $var2
      loop $label12
        local.get $var2
        local.get $var1
        i32.load8_u
        i32.store8
        local.get $var2
        local.get $var1
        i32.load8_u offset=1
        i32.store8 offset=1
        local.get $var2
        local.get $var1
        i32.load8_u offset=2
        i32.store8 offset=2
        local.get $var2
        local.get $var1
        i32.load8_u offset=3
        i32.store8 offset=3
        local.get $var1
        i32.const 4
        i32.add
        local.set $var1
        local.get $var2
        i32.const 4
        i32.add
        local.tee $var2
        local.get $var4
        i32.le_u
        br_if $label12
      end $label12
    end $label8
    block $label13
      local.get $var2
      local.get $var3
      i32.ge_u
      br_if $label13
      loop $label14
        local.get $var2
        local.get $var1
        i32.load8_u
        i32.store8
        local.get $var1
        i32.const 1
        i32.add
        local.set $var1
        local.get $var2
        i32.const 1
        i32.add
        local.tee $var2
        local.get $var3
        i32.ne
        br_if $label14
      end $label14
    end $label13
    local.get $var0
  )
  (func $func20 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32)
    block $label1
      block $label0
        local.get $var2
        i32.load offset=16
        local.tee $var3
        br_if $label0
        i32.const 0
        local.set $var4
        local.get $var2
        call $func18
        br_if $label1
        local.get $var2
        i32.load offset=16
        local.set $var3
      end $label0
      block $label2
        local.get $var3
        local.get $var2
        i32.load offset=20
        local.tee $var5
        i32.sub
        local.get $var1
        i32.ge_u
        br_if $label2
        local.get $var2
        local.get $var0
        local.get $var1
        local.get $var2
        i32.load offset=36
        call_indirect (param i32 i32 i32) (result i32)
        return
      end $label2
      block $label4
        block $label3
          local.get $var2
          i32.load8_s offset=75
          i32.const 0
          i32.ge_s
          br_if $label3
          i32.const 0
          local.set $var3
          br $label4
        end $label3
        local.get $var1
        local.set $var4
        loop $label6
          block $label5
            local.get $var4
            local.tee $var3
            br_if $label5
            i32.const 0
            local.set $var3
            br $label4
          end $label5
          local.get $var0
          local.get $var3
          i32.const -1
          i32.add
          local.tee $var4
          i32.add
          i32.load8_u
          i32.const 10
          i32.ne
          br_if $label6
        end $label6
        local.get $var2
        local.get $var0
        local.get $var3
        local.get $var2
        i32.load offset=36
        call_indirect (param i32 i32 i32) (result i32)
        local.tee $var4
        local.get $var3
        i32.lt_u
        br_if $label1
        local.get $var0
        local.get $var3
        i32.add
        local.set $var0
        local.get $var1
        local.get $var3
        i32.sub
        local.set $var1
        local.get $var2
        i32.load offset=20
        local.set $var5
      end $label4
      local.get $var5
      local.get $var0
      local.get $var1
      call $func19
      drop
      local.get $var2
      local.get $var2
      i32.load offset=20
      local.get $var1
      i32.add
      i32.store offset=20
      local.get $var3
      local.get $var1
      i32.add
      local.set $var4
    end $label1
    local.get $var4
  )
  (func $func21 (result i32)
    i32.const 42
  )
  (func $func22 (result i32)
    call $func21
  )
  (func $func23 (result i32)
    i32.const 2868
  )
  (func $func24
    i32.const 0
    i32.const 2792
    i32.const 40
    i32.add
    i32.store offset=3036
    i32.const 0
    call $func22
    i32.store offset=2904
  )
  (func $func25 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32)
    i32.const 1
    local.set $var3
    block $label1
      block $label0
        local.get $var0
        i32.eqz
        br_if $label0
        local.get $var1
        i32.const 127
        i32.le_u
        br_if $label1
        block $label3
          block $label2
            call $func23
            i32.load offset=168
            i32.load
            br_if $label2
            local.get $var1
            i32.const -128
            i32.and
            i32.const 57216
            i32.eq
            br_if $label1
            call $__errno_location
            i32.const 25
            i32.store
            br $label3
          end $label2
          block $label4
            local.get $var1
            i32.const 2047
            i32.gt_u
            br_if $label4
            local.get $var0
            local.get $var1
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=1
            local.get $var0
            local.get $var1
            i32.const 6
            i32.shr_u
            i32.const 192
            i32.or
            i32.store8
            i32.const 2
            return
          end $label4
          block $label6
            block $label5
              local.get $var1
              i32.const 55296
              i32.lt_u
              br_if $label5
              local.get $var1
              i32.const -8192
              i32.and
              i32.const 57344
              i32.ne
              br_if $label6
            end $label5
            local.get $var0
            local.get $var1
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=2
            local.get $var0
            local.get $var1
            i32.const 12
            i32.shr_u
            i32.const 224
            i32.or
            i32.store8
            local.get $var0
            local.get $var1
            i32.const 6
            i32.shr_u
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=1
            i32.const 3
            return
          end $label6
          block $label7
            local.get $var1
            i32.const -65536
            i32.add
            i32.const 1048575
            i32.gt_u
            br_if $label7
            local.get $var0
            local.get $var1
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=3
            local.get $var0
            local.get $var1
            i32.const 18
            i32.shr_u
            i32.const 240
            i32.or
            i32.store8
            local.get $var0
            local.get $var1
            i32.const 6
            i32.shr_u
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=2
            local.get $var0
            local.get $var1
            i32.const 12
            i32.shr_u
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=1
            i32.const 4
            return
          end $label7
          call $__errno_location
          i32.const 25
          i32.store
        end $label3
        i32.const -1
        local.set $var3
      end $label0
      local.get $var3
      return
    end $label1
    local.get $var0
    local.get $var1
    i32.store8
    i32.const 1
  )
  (func $func26 (param $var0 i32) (param $var1 i32) (result i32)
    block $label0
      local.get $var0
      br_if $label0
      i32.const 0
      return
    end $label0
    local.get $var0
    local.get $var1
    i32.const 0
    call $func25
  )
  (func $func27 (param $var0 f64) (param $var1 i32) (result f64)
    (local $var2 i64) (local $var3 i32)
    block $label0
      local.get $var0
      i64.reinterpret_f64
      local.tee $var2
      i64.const 52
      i64.shr_u
      i32.wrap_i64
      i32.const 2047
      i32.and
      local.tee $var3
      i32.const 2047
      i32.eq
      br_if $label0
      block $label1
        local.get $var3
        br_if $label1
        block $label3
          block $label2
            local.get $var0
            f64.const 0.0
            f64.ne
            br_if $label2
            i32.const 0
            local.set $var3
            br $label3
          end $label2
          local.get $var0
          f64.const 18446744073709552000
          f64.mul
          local.get $var1
          call $func27
          local.set $var0
          local.get $var1
          i32.load
          i32.const -64
          i32.add
          local.set $var3
        end $label3
        local.get $var1
        local.get $var3
        i32.store
        local.get $var0
        return
      end $label1
      local.get $var1
      local.get $var3
      i32.const -1022
      i32.add
      i32.store
      local.get $var2
      i64.const -9218868437227405313
      i64.and
      i64.const 4602678819172646912
      i64.or
      f64.reinterpret_i64
      local.set $var0
    end $label0
    local.get $var0
  )
  (func $func28 (param $var0 i32) (param $var1 i64) (param $var2 i64) (param $var3 i32)
    (local $var4 i64)
    block $label1
      block $label0
        local.get $var3
        i32.const 64
        i32.and
        i32.eqz
        br_if $label0
        local.get $var1
        local.get $var3
        i32.const -64
        i32.add
        i64.extend_i32_u
        i64.shl
        local.set $var2
        i64.const 0
        local.set $var1
        br $label1
      end $label0
      local.get $var3
      i32.eqz
      br_if $label1
      local.get $var1
      i32.const 64
      local.get $var3
      i32.sub
      i64.extend_i32_u
      i64.shr_u
      local.get $var2
      local.get $var3
      i64.extend_i32_u
      local.tee $var4
      i64.shl
      i64.or
      local.set $var2
      local.get $var1
      local.get $var4
      i64.shl
      local.set $var1
    end $label1
    local.get $var0
    local.get $var1
    i64.store
    local.get $var0
    local.get $var2
    i64.store offset=8
  )
  (func $func29 (param $var0 i32) (param $var1 i64) (param $var2 i64) (param $var3 i32)
    (local $var4 i64)
    block $label1
      block $label0
        local.get $var3
        i32.const 64
        i32.and
        i32.eqz
        br_if $label0
        local.get $var2
        local.get $var3
        i32.const -64
        i32.add
        i64.extend_i32_u
        i64.shr_u
        local.set $var1
        i64.const 0
        local.set $var2
        br $label1
      end $label0
      local.get $var3
      i32.eqz
      br_if $label1
      local.get $var2
      i32.const 64
      local.get $var3
      i32.sub
      i64.extend_i32_u
      i64.shl
      local.get $var1
      local.get $var3
      i64.extend_i32_u
      local.tee $var4
      i64.shr_u
      i64.or
      local.set $var1
      local.get $var2
      local.get $var4
      i64.shr_u
      local.set $var2
    end $label1
    local.get $var0
    local.get $var1
    i64.store
    local.get $var0
    local.get $var2
    i64.store offset=8
  )
  (func $func30 (param $var0 i64) (param $var1 i64) (result f64)
    (local $var2 i32) (local $var3 i32) (local $var4 i64) (local $var5 i64)
    global.get $global0
    i32.const 32
    i32.sub
    local.tee $var2
    global.set $global0
    block $label2
      block $label0
        local.get $var1
        i64.const 9223372036854775807
        i64.and
        local.tee $var4
        i64.const -4323737117252386816
        i64.add
        local.get $var4
        i64.const -4899634919602388992
        i64.add
        i64.ge_u
        br_if $label0
        local.get $var0
        i64.const 60
        i64.shr_u
        local.get $var1
        i64.const 4
        i64.shl
        i64.or
        local.set $var4
        block $label1
          local.get $var0
          i64.const 1152921504606846975
          i64.and
          local.tee $var0
          i64.const 576460752303423489
          i64.lt_u
          br_if $label1
          local.get $var4
          i64.const 4611686018427387905
          i64.add
          local.set $var5
          br $label2
        end $label1
        local.get $var4
        i64.const 4611686018427387904
        i64.add
        local.set $var5
        local.get $var0
        i64.const 576460752303423488
        i64.xor
        i64.const 0
        i64.ne
        br_if $label2
        local.get $var5
        local.get $var4
        i64.const 1
        i64.and
        i64.add
        local.set $var5
        br $label2
      end $label0
      block $label3
        local.get $var0
        i64.eqz
        local.get $var4
        i64.const 9223090561878065152
        i64.lt_u
        local.get $var4
        i64.const 9223090561878065152
        i64.eq
        select
        br_if $label3
        local.get $var0
        i64.const 60
        i64.shr_u
        local.get $var1
        i64.const 4
        i64.shl
        i64.or
        i64.const 2251799813685247
        i64.and
        i64.const 9221120237041090560
        i64.or
        local.set $var5
        br $label2
      end $label3
      i64.const 9218868437227405312
      local.set $var5
      local.get $var4
      i64.const 4899634919602388991
      i64.gt_u
      br_if $label2
      i64.const 0
      local.set $var5
      local.get $var4
      i64.const 48
      i64.shr_u
      i32.wrap_i64
      local.tee $var3
      i32.const 15249
      i32.lt_u
      br_if $label2
      local.get $var2
      i32.const 16
      i32.add
      local.get $var0
      local.get $var1
      i64.const 281474976710655
      i64.and
      i64.const 281474976710656
      i64.or
      local.tee $var4
      local.get $var3
      i32.const -15233
      i32.add
      call $func28
      local.get $var2
      local.get $var0
      local.get $var4
      i32.const 15361
      local.get $var3
      i32.sub
      call $func29
      local.get $var2
      i64.load
      local.tee $var4
      i64.const 60
      i64.shr_u
      local.get $var2
      i32.const 8
      i32.add
      i64.load
      i64.const 4
      i64.shl
      i64.or
      local.set $var5
      block $label4
        local.get $var4
        i64.const 1152921504606846975
        i64.and
        local.get $var2
        i64.load offset=16
        local.get $var2
        i32.const 16
        i32.add
        i32.const 8
        i32.add
        i64.load
        i64.or
        i64.const 0
        i64.ne
        i64.extend_i32_u
        i64.or
        local.tee $var4
        i64.const 576460752303423489
        i64.lt_u
        br_if $label4
        local.get $var5
        i64.const 1
        i64.add
        local.set $var5
        br $label2
      end $label4
      local.get $var4
      i64.const 576460752303423488
      i64.xor
      i64.const 0
      i64.ne
      br_if $label2
      local.get $var5
      i64.const 1
      i64.and
      local.get $var5
      i64.add
      local.set $var5
    end $label2
    local.get $var2
    i32.const 32
    i32.add
    global.set $global0
    local.get $var5
    local.get $var1
    i64.const -9223372036854775808
    i64.and
    i64.or
    f64.reinterpret_i64
  )
  (func $func31 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
    (local $var5 i32) (local $var6 i32) (local $var7 i32)
    global.get $global0
    i32.const 208
    i32.sub
    local.tee $var5
    global.set $global0
    local.get $var5
    local.get $var2
    i32.store offset=204
    i32.const 0
    local.set $var2
    local.get $var5
    i32.const 160
    i32.add
    i32.const 0
    i32.const 40
    call $func11
    drop
    local.get $var5
    local.get $var5
    i32.load offset=204
    i32.store offset=200
    block $label1
      block $label0
        i32.const 0
        local.get $var1
        local.get $var5
        i32.const 200
        i32.add
        local.get $var5
        i32.const 80
        i32.add
        local.get $var5
        i32.const 160
        i32.add
        local.get $var3
        local.get $var4
        call $func32
        i32.const 0
        i32.ge_s
        br_if $label0
        i32.const -1
        local.set $var1
        br $label1
      end $label0
      block $label2
        local.get $var0
        i32.load offset=76
        i32.const 0
        i32.lt_s
        br_if $label2
        local.get $var0
        call $func45
        local.set $var2
      end $label2
      local.get $var0
      i32.load
      local.set $var6
      block $label3
        local.get $var0
        i32.load8_s offset=74
        i32.const 0
        i32.gt_s
        br_if $label3
        local.get $var0
        local.get $var6
        i32.const -33
        i32.and
        i32.store
      end $label3
      local.get $var6
      i32.const 32
      i32.and
      local.set $var6
      block $label5
        block $label4
          local.get $var0
          i32.load offset=48
          i32.eqz
          br_if $label4
          local.get $var0
          local.get $var1
          local.get $var5
          i32.const 200
          i32.add
          local.get $var5
          i32.const 80
          i32.add
          local.get $var5
          i32.const 160
          i32.add
          local.get $var3
          local.get $var4
          call $func32
          local.set $var1
          br $label5
        end $label4
        local.get $var0
        i32.const 80
        i32.store offset=48
        local.get $var0
        local.get $var5
        i32.const 80
        i32.add
        i32.store offset=16
        local.get $var0
        local.get $var5
        i32.store offset=28
        local.get $var0
        local.get $var5
        i32.store offset=20
        local.get $var0
        i32.load offset=44
        local.set $var7
        local.get $var0
        local.get $var5
        i32.store offset=44
        local.get $var0
        local.get $var1
        local.get $var5
        i32.const 200
        i32.add
        local.get $var5
        i32.const 80
        i32.add
        local.get $var5
        i32.const 160
        i32.add
        local.get $var3
        local.get $var4
        call $func32
        local.set $var1
        local.get $var7
        i32.eqz
        br_if $label5
        local.get $var0
        i32.const 0
        i32.const 0
        local.get $var0
        i32.load offset=36
        call_indirect (param i32 i32 i32) (result i32)
        drop
        local.get $var0
        i32.const 0
        i32.store offset=48
        local.get $var0
        local.get $var7
        i32.store offset=44
        local.get $var0
        i32.const 0
        i32.store offset=28
        local.get $var0
        i32.const 0
        i32.store offset=16
        local.get $var0
        i32.load offset=20
        local.set $var3
        local.get $var0
        i32.const 0
        i32.store offset=20
        local.get $var1
        i32.const -1
        local.get $var3
        select
        local.set $var1
      end $label5
      local.get $var0
      local.get $var0
      i32.load
      local.tee $var3
      local.get $var6
      i32.or
      i32.store
      i32.const -1
      local.get $var1
      local.get $var3
      i32.const 32
      i32.and
      select
      local.set $var1
      local.get $var2
      i32.eqz
      br_if $label1
      local.get $var0
      call $func46
    end $label1
    local.get $var5
    i32.const 208
    i32.add
    global.set $global0
    local.get $var1
  )
  (func $func32 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (param $var5 i32) (param $var6 i32) (result i32)
    (local $var7 i32) (local $var8 i32) (local $var9 i32) (local $var10 i32) (local $var11 i32) (local $var12 i32) (local $var13 i32) (local $var14 i32) (local $var15 i32) (local $var16 i32) (local $var17 i32) (local $var18 i32) (local $var19 i32) (local $var20 i32) (local $var21 i32) (local $var22 i64)
    global.get $global0
    i32.const 80
    i32.sub
    local.tee $var7
    global.set $global0
    local.get $var7
    local.get $var1
    i32.store offset=76
    local.get $var7
    i32.const 55
    i32.add
    local.set $var8
    local.get $var7
    i32.const 56
    i32.add
    local.set $var9
    i32.const 0
    local.set $var10
    i32.const 0
    local.set $var11
    i32.const 0
    local.set $var1
    block $label24
      loop $label8
        block $label0
          local.get $var11
          i32.const 0
          i32.lt_s
          br_if $label0
          block $label1
            local.get $var1
            i32.const 2147483647
            local.get $var11
            i32.sub
            i32.le_s
            br_if $label1
            call $__errno_location
            i32.const 61
            i32.store
            i32.const -1
            local.set $var11
            br $label0
          end $label1
          local.get $var1
          local.get $var11
          i32.add
          local.set $var11
        end $label0
        local.get $var7
        i32.load offset=76
        local.tee $var12
        local.set $var1
        block $label29
          block $label32
            block $label45
              block $label16
                block $label2
                  local.get $var12
                  i32.load8_u
                  local.tee $var13
                  i32.eqz
                  br_if $label2
                  loop $label66
                    block $label5
                      block $label4
                        block $label3
                          local.get $var13
                          i32.const 255
                          i32.and
                          local.tee $var13
                          br_if $label3
                          local.get $var1
                          local.set $var13
                          br $label4
                        end $label3
                        local.get $var13
                        i32.const 37
                        i32.ne
                        br_if $label5
                        local.get $var1
                        local.set $var13
                        loop $label6
                          local.get $var1
                          i32.load8_u offset=1
                          i32.const 37
                          i32.ne
                          br_if $label4
                          local.get $var7
                          local.get $var1
                          i32.const 2
                          i32.add
                          local.tee $var14
                          i32.store offset=76
                          local.get $var13
                          i32.const 1
                          i32.add
                          local.set $var13
                          local.get $var1
                          i32.load8_u offset=2
                          local.set $var15
                          local.get $var14
                          local.set $var1
                          local.get $var15
                          i32.const 37
                          i32.eq
                          br_if $label6
                        end $label6
                      end $label4
                      local.get $var13
                      local.get $var12
                      i32.sub
                      local.set $var1
                      block $label7
                        local.get $var0
                        i32.eqz
                        br_if $label7
                        local.get $var0
                        local.get $var12
                        local.get $var1
                        call $func33
                      end $label7
                      local.get $var1
                      br_if $label8
                      i32.const -1
                      local.set $var16
                      i32.const 1
                      local.set $var13
                      local.get $var7
                      i32.load offset=76
                      i32.load8_s offset=1
                      call $func12
                      local.set $var14
                      local.get $var7
                      i32.load offset=76
                      local.set $var1
                      block $label9
                        local.get $var14
                        i32.eqz
                        br_if $label9
                        local.get $var1
                        i32.load8_u offset=2
                        i32.const 36
                        i32.ne
                        br_if $label9
                        local.get $var1
                        i32.load8_s offset=1
                        i32.const -48
                        i32.add
                        local.set $var16
                        i32.const 1
                        local.set $var10
                        i32.const 3
                        local.set $var13
                      end $label9
                      local.get $var7
                      local.get $var1
                      local.get $var13
                      i32.add
                      local.tee $var1
                      i32.store offset=76
                      i32.const 0
                      local.set $var17
                      block $label11
                        block $label10
                          local.get $var1
                          i32.load8_s
                          local.tee $var15
                          i32.const -32
                          i32.add
                          local.tee $var14
                          i32.const 31
                          i32.le_u
                          br_if $label10
                          local.get $var1
                          local.set $var13
                          br $label11
                        end $label10
                        i32.const 0
                        local.set $var17
                        local.get $var1
                        local.set $var13
                        i32.const 1
                        local.get $var14
                        i32.shl
                        local.tee $var14
                        i32.const 75913
                        i32.and
                        i32.eqz
                        br_if $label11
                        loop $label12
                          local.get $var7
                          local.get $var1
                          i32.const 1
                          i32.add
                          local.tee $var13
                          i32.store offset=76
                          local.get $var14
                          local.get $var17
                          i32.or
                          local.set $var17
                          local.get $var1
                          i32.load8_s offset=1
                          local.tee $var15
                          i32.const -32
                          i32.add
                          local.tee $var14
                          i32.const 32
                          i32.ge_u
                          br_if $label11
                          local.get $var13
                          local.set $var1
                          i32.const 1
                          local.get $var14
                          i32.shl
                          local.tee $var14
                          i32.const 75913
                          i32.and
                          br_if $label12
                        end $label12
                      end $label11
                      block $label18
                        block $label13
                          local.get $var15
                          i32.const 42
                          i32.ne
                          br_if $label13
                          block $label15
                            block $label14
                              local.get $var13
                              i32.load8_s offset=1
                              call $func12
                              i32.eqz
                              br_if $label14
                              local.get $var7
                              i32.load offset=76
                              local.tee $var13
                              i32.load8_u offset=2
                              i32.const 36
                              i32.ne
                              br_if $label14
                              local.get $var13
                              i32.load8_s offset=1
                              i32.const 2
                              i32.shl
                              local.get $var4
                              i32.add
                              i32.const -192
                              i32.add
                              i32.const 10
                              i32.store
                              local.get $var13
                              i32.const 3
                              i32.add
                              local.set $var1
                              local.get $var13
                              i32.load8_s offset=1
                              i32.const 3
                              i32.shl
                              local.get $var3
                              i32.add
                              i32.const -384
                              i32.add
                              i32.load
                              local.set $var18
                              i32.const 1
                              local.set $var10
                              br $label15
                            end $label14
                            local.get $var10
                            br_if $label16
                            i32.const 0
                            local.set $var10
                            i32.const 0
                            local.set $var18
                            block $label17
                              local.get $var0
                              i32.eqz
                              br_if $label17
                              local.get $var2
                              local.get $var2
                              i32.load
                              local.tee $var1
                              i32.const 4
                              i32.add
                              i32.store
                              local.get $var1
                              i32.load
                              local.set $var18
                            end $label17
                            local.get $var7
                            i32.load offset=76
                            i32.const 1
                            i32.add
                            local.set $var1
                          end $label15
                          local.get $var7
                          local.get $var1
                          i32.store offset=76
                          local.get $var18
                          i32.const -1
                          i32.gt_s
                          br_if $label18
                          i32.const 0
                          local.get $var18
                          i32.sub
                          local.set $var18
                          local.get $var17
                          i32.const 8192
                          i32.or
                          local.set $var17
                          br $label18
                        end $label13
                        local.get $var7
                        i32.const 76
                        i32.add
                        call $func34
                        local.tee $var18
                        i32.const 0
                        i32.lt_s
                        br_if $label16
                        local.get $var7
                        i32.load offset=76
                        local.set $var1
                      end $label18
                      i32.const -1
                      local.set $var19
                      block $label19
                        local.get $var1
                        i32.load8_u
                        i32.const 46
                        i32.ne
                        br_if $label19
                        block $label20
                          local.get $var1
                          i32.load8_u offset=1
                          i32.const 42
                          i32.ne
                          br_if $label20
                          block $label21
                            local.get $var1
                            i32.load8_s offset=2
                            call $func12
                            i32.eqz
                            br_if $label21
                            local.get $var7
                            i32.load offset=76
                            local.tee $var1
                            i32.load8_u offset=3
                            i32.const 36
                            i32.ne
                            br_if $label21
                            local.get $var1
                            i32.load8_s offset=2
                            i32.const 2
                            i32.shl
                            local.get $var4
                            i32.add
                            i32.const -192
                            i32.add
                            i32.const 10
                            i32.store
                            local.get $var1
                            i32.load8_s offset=2
                            i32.const 3
                            i32.shl
                            local.get $var3
                            i32.add
                            i32.const -384
                            i32.add
                            i32.load
                            local.set $var19
                            local.get $var7
                            local.get $var1
                            i32.const 4
                            i32.add
                            local.tee $var1
                            i32.store offset=76
                            br $label19
                          end $label21
                          local.get $var10
                          br_if $label16
                          block $label23
                            block $label22
                              local.get $var0
                              br_if $label22
                              i32.const 0
                              local.set $var19
                              br $label23
                            end $label22
                            local.get $var2
                            local.get $var2
                            i32.load
                            local.tee $var1
                            i32.const 4
                            i32.add
                            i32.store
                            local.get $var1
                            i32.load
                            local.set $var19
                          end $label23
                          local.get $var7
                          local.get $var7
                          i32.load offset=76
                          i32.const 2
                          i32.add
                          local.tee $var1
                          i32.store offset=76
                          br $label19
                        end $label20
                        local.get $var7
                        local.get $var1
                        i32.const 1
                        i32.add
                        i32.store offset=76
                        local.get $var7
                        i32.const 76
                        i32.add
                        call $func34
                        local.set $var19
                        local.get $var7
                        i32.load offset=76
                        local.set $var1
                      end $label19
                      i32.const 0
                      local.set $var13
                      loop $label25
                        local.get $var13
                        local.set $var14
                        i32.const -1
                        local.set $var20
                        local.get $var1
                        i32.load8_s
                        i32.const -65
                        i32.add
                        i32.const 57
                        i32.gt_u
                        br_if $label24
                        local.get $var7
                        local.get $var1
                        i32.const 1
                        i32.add
                        local.tee $var15
                        i32.store offset=76
                        local.get $var1
                        i32.load8_s
                        local.set $var13
                        local.get $var15
                        local.set $var1
                        local.get $var13
                        local.get $var14
                        i32.const 58
                        i32.mul
                        i32.add
                        i32.const 1039
                        i32.add
                        i32.load8_u
                        local.tee $var13
                        i32.const -1
                        i32.add
                        i32.const 8
                        i32.lt_u
                        br_if $label25
                      end $label25
                      block $label30
                        block $label28
                          block $label26
                            local.get $var13
                            i32.const 19
                            i32.eq
                            br_if $label26
                            local.get $var13
                            i32.eqz
                            br_if $label24
                            block $label27
                              local.get $var16
                              i32.const 0
                              i32.lt_s
                              br_if $label27
                              local.get $var4
                              local.get $var16
                              i32.const 2
                              i32.shl
                              i32.add
                              local.get $var13
                              i32.store
                              local.get $var7
                              local.get $var3
                              local.get $var16
                              i32.const 3
                              i32.shl
                              i32.add
                              i64.load
                              i64.store offset=64
                              br $label28
                            end $label27
                            local.get $var0
                            i32.eqz
                            br_if $label29
                            local.get $var7
                            i32.const 64
                            i32.add
                            local.get $var13
                            local.get $var2
                            local.get $var6
                            call $func35
                            local.get $var7
                            i32.load offset=76
                            local.set $var15
                            br $label30
                          end $label26
                          i32.const -1
                          local.set $var20
                          local.get $var16
                          i32.const -1
                          i32.gt_s
                          br_if $label24
                        end $label28
                        i32.const 0
                        local.set $var1
                        local.get $var0
                        i32.eqz
                        br_if $label8
                      end $label30
                      local.get $var17
                      i32.const -65537
                      i32.and
                      local.tee $var21
                      local.get $var17
                      local.get $var17
                      i32.const 8192
                      i32.and
                      select
                      local.set $var13
                      i32.const 0
                      local.set $var20
                      i32.const 1024
                      local.set $var16
                      local.get $var9
                      local.set $var17
                      block $label34
                        block $label33
                          block $label60
                            block $label59
                              block $label42
                                block $label44
                                  block $label39
                                    block $label54
                                      block $label46
                                        block $label35
                                          block $label37
                                            block $label31
                                              block $label38
                                                block $label36
                                                  block $label40
                                                    block $label41
                                                      local.get $var15
                                                      i32.const -1
                                                      i32.add
                                                      i32.load8_s
                                                      local.tee $var1
                                                      i32.const -33
                                                      i32.and
                                                      local.get $var1
                                                      local.get $var1
                                                      i32.const 15
                                                      i32.and
                                                      i32.const 3
                                                      i32.eq
                                                      select
                                                      local.get $var1
                                                      local.get $var14
                                                      select
                                                      local.tee $var1
                                                      i32.const -88
                                                      i32.add
                                                      br_table $label31 $label32 $label32 $label32 $label32 $label32 $label32 $label32 $label32 $label33 $label32 $label34 $label35 $label33 $label33 $label33 $label32 $label35 $label32 $label32 $label32 $label32 $label36 $label37 $label38 $label32 $label32 $label39 $label32 $label40 $label32 $label32 $label31 $label41
                                                    end $label41
                                                    local.get $var9
                                                    local.set $var17
                                                    block $label43
                                                      local.get $var1
                                                      i32.const -65
                                                      i32.add
                                                      br_table $label33 $label32 $label42 $label32 $label33 $label33 $label33 $label43
                                                    end $label43
                                                    local.get $var1
                                                    i32.const 83
                                                    i32.eq
                                                    br_if $label44
                                                    br $label45
                                                  end $label40
                                                  i32.const 0
                                                  local.set $var20
                                                  i32.const 1024
                                                  local.set $var16
                                                  local.get $var7
                                                  i64.load offset=64
                                                  local.set $var22
                                                  br $label46
                                                end $label36
                                                i32.const 0
                                                local.set $var1
                                                block $label53
                                                  block $label52
                                                    block $label51
                                                      block $label50
                                                        block $label49
                                                          block $label48
                                                            block $label47
                                                              local.get $var14
                                                              i32.const 255
                                                              i32.and
                                                              br_table $label47 $label48 $label49 $label50 $label51 $label8 $label52 $label53 $label8
                                                            end $label47
                                                            local.get $var7
                                                            i32.load offset=64
                                                            local.get $var11
                                                            i32.store
                                                            br $label8
                                                          end $label48
                                                          local.get $var7
                                                          i32.load offset=64
                                                          local.get $var11
                                                          i32.store
                                                          br $label8
                                                        end $label49
                                                        local.get $var7
                                                        i32.load offset=64
                                                        local.get $var11
                                                        i64.extend_i32_s
                                                        i64.store
                                                        br $label8
                                                      end $label50
                                                      local.get $var7
                                                      i32.load offset=64
                                                      local.get $var11
                                                      i32.store16
                                                      br $label8
                                                    end $label51
                                                    local.get $var7
                                                    i32.load offset=64
                                                    local.get $var11
                                                    i32.store8
                                                    br $label8
                                                  end $label52
                                                  local.get $var7
                                                  i32.load offset=64
                                                  local.get $var11
                                                  i32.store
                                                  br $label8
                                                end $label53
                                                local.get $var7
                                                i32.load offset=64
                                                local.get $var11
                                                i64.extend_i32_s
                                                i64.store
                                                br $label8
                                              end $label38
                                              local.get $var19
                                              i32.const 8
                                              local.get $var19
                                              i32.const 8
                                              i32.gt_u
                                              select
                                              local.set $var19
                                              local.get $var13
                                              i32.const 8
                                              i32.or
                                              local.set $var13
                                              i32.const 120
                                              local.set $var1
                                            end $label31
                                            local.get $var7
                                            i64.load offset=64
                                            local.get $var9
                                            local.get $var1
                                            i32.const 32
                                            i32.and
                                            call $func36
                                            local.set $var12
                                            i32.const 0
                                            local.set $var20
                                            i32.const 1024
                                            local.set $var16
                                            local.get $var7
                                            i64.load offset=64
                                            i64.eqz
                                            br_if $label54
                                            local.get $var13
                                            i32.const 8
                                            i32.and
                                            i32.eqz
                                            br_if $label54
                                            local.get $var1
                                            i32.const 4
                                            i32.shr_u
                                            i32.const 1024
                                            i32.add
                                            local.set $var16
                                            i32.const 2
                                            local.set $var20
                                            br $label54
                                          end $label37
                                          i32.const 0
                                          local.set $var20
                                          i32.const 1024
                                          local.set $var16
                                          local.get $var7
                                          i64.load offset=64
                                          local.get $var9
                                          call $func37
                                          local.set $var12
                                          local.get $var13
                                          i32.const 8
                                          i32.and
                                          i32.eqz
                                          br_if $label54
                                          local.get $var19
                                          local.get $var9
                                          local.get $var12
                                          i32.sub
                                          local.tee $var1
                                          i32.const 1
                                          i32.add
                                          local.get $var19
                                          local.get $var1
                                          i32.gt_s
                                          select
                                          local.set $var19
                                          br $label54
                                        end $label35
                                        block $label55
                                          local.get $var7
                                          i64.load offset=64
                                          local.tee $var22
                                          i64.const -1
                                          i64.gt_s
                                          br_if $label55
                                          local.get $var7
                                          i64.const 0
                                          local.get $var22
                                          i64.sub
                                          local.tee $var22
                                          i64.store offset=64
                                          i32.const 1
                                          local.set $var20
                                          i32.const 1024
                                          local.set $var16
                                          br $label46
                                        end $label55
                                        block $label56
                                          local.get $var13
                                          i32.const 2048
                                          i32.and
                                          i32.eqz
                                          br_if $label56
                                          i32.const 1
                                          local.set $var20
                                          i32.const 1025
                                          local.set $var16
                                          br $label46
                                        end $label56
                                        i32.const 1026
                                        i32.const 1024
                                        local.get $var13
                                        i32.const 1
                                        i32.and
                                        local.tee $var20
                                        select
                                        local.set $var16
                                      end $label46
                                      local.get $var22
                                      local.get $var9
                                      call $func38
                                      local.set $var12
                                    end $label54
                                    local.get $var13
                                    i32.const -65537
                                    i32.and
                                    local.get $var13
                                    local.get $var19
                                    i32.const -1
                                    i32.gt_s
                                    select
                                    local.set $var13
                                    block $label57
                                      local.get $var7
                                      i64.load offset=64
                                      local.tee $var22
                                      i64.const 0
                                      i64.ne
                                      br_if $label57
                                      local.get $var19
                                      br_if $label57
                                      i32.const 0
                                      local.set $var19
                                      local.get $var9
                                      local.set $var12
                                      br $label45
                                    end $label57
                                    local.get $var19
                                    local.get $var9
                                    local.get $var12
                                    i32.sub
                                    local.get $var22
                                    i64.eqz
                                    i32.add
                                    local.tee $var1
                                    local.get $var19
                                    local.get $var1
                                    i32.gt_s
                                    select
                                    local.set $var19
                                    br $label45
                                  end $label39
                                  i32.const 0
                                  local.set $var20
                                  local.get $var7
                                  i32.load offset=64
                                  local.tee $var1
                                  i32.const 1071
                                  local.get $var1
                                  select
                                  local.tee $var12
                                  i32.const 0
                                  local.get $var19
                                  call $func13
                                  local.tee $var1
                                  local.get $var12
                                  local.get $var19
                                  i32.add
                                  local.get $var1
                                  select
                                  local.set $var17
                                  local.get $var21
                                  local.set $var13
                                  local.get $var1
                                  local.get $var12
                                  i32.sub
                                  local.get $var19
                                  local.get $var1
                                  select
                                  local.set $var19
                                  br $label32
                                end $label44
                                block $label58
                                  local.get $var19
                                  i32.eqz
                                  br_if $label58
                                  local.get $var7
                                  i32.load offset=64
                                  local.set $var14
                                  br $label59
                                end $label58
                                i32.const 0
                                local.set $var1
                                local.get $var0
                                i32.const 32
                                local.get $var18
                                i32.const 0
                                local.get $var13
                                call $func39
                                br $label60
                              end $label42
                              local.get $var7
                              i32.const 0
                              i32.store offset=12
                              local.get $var7
                              local.get $var7
                              i64.load offset=64
                              i64.store32 offset=8
                              local.get $var7
                              local.get $var7
                              i32.const 8
                              i32.add
                              i32.store offset=64
                              i32.const -1
                              local.set $var19
                              local.get $var7
                              i32.const 8
                              i32.add
                              local.set $var14
                            end $label59
                            i32.const 0
                            local.set $var1
                            block $label61
                              loop $label63
                                local.get $var14
                                i32.load
                                local.tee $var15
                                i32.eqz
                                br_if $label61
                                block $label62
                                  local.get $var7
                                  i32.const 4
                                  i32.add
                                  local.get $var15
                                  call $func26
                                  local.tee $var15
                                  i32.const 0
                                  i32.lt_s
                                  local.tee $var12
                                  br_if $label62
                                  local.get $var15
                                  local.get $var19
                                  local.get $var1
                                  i32.sub
                                  i32.gt_u
                                  br_if $label62
                                  local.get $var14
                                  i32.const 4
                                  i32.add
                                  local.set $var14
                                  local.get $var19
                                  local.get $var15
                                  local.get $var1
                                  i32.add
                                  local.tee $var1
                                  i32.gt_u
                                  br_if $label63
                                  br $label61
                                end $label62
                              end $label63
                              i32.const -1
                              local.set $var20
                              local.get $var12
                              br_if $label24
                            end $label61
                            local.get $var0
                            i32.const 32
                            local.get $var18
                            local.get $var1
                            local.get $var13
                            call $func39
                            block $label64
                              local.get $var1
                              br_if $label64
                              i32.const 0
                              local.set $var1
                              br $label60
                            end $label64
                            i32.const 0
                            local.set $var14
                            local.get $var7
                            i32.load offset=64
                            local.set $var15
                            loop $label65
                              local.get $var15
                              i32.load
                              local.tee $var12
                              i32.eqz
                              br_if $label60
                              local.get $var7
                              i32.const 4
                              i32.add
                              local.get $var12
                              call $func26
                              local.tee $var12
                              local.get $var14
                              i32.add
                              local.tee $var14
                              local.get $var1
                              i32.gt_s
                              br_if $label60
                              local.get $var0
                              local.get $var7
                              i32.const 4
                              i32.add
                              local.get $var12
                              call $func33
                              local.get $var15
                              i32.const 4
                              i32.add
                              local.set $var15
                              local.get $var14
                              local.get $var1
                              i32.lt_u
                              br_if $label65
                            end $label65
                          end $label60
                          local.get $var0
                          i32.const 32
                          local.get $var18
                          local.get $var1
                          local.get $var13
                          i32.const 8192
                          i32.xor
                          call $func39
                          local.get $var18
                          local.get $var1
                          local.get $var18
                          local.get $var1
                          i32.gt_s
                          select
                          local.set $var1
                          br $label8
                        end $label33
                        local.get $var0
                        local.get $var7
                        f64.load offset=64
                        local.get $var18
                        local.get $var19
                        local.get $var13
                        local.get $var1
                        local.get $var5
                        call_indirect (param i32 f64 i32 i32 i32 i32) (result i32)
                        local.set $var1
                        br $label8
                      end $label34
                      local.get $var7
                      local.get $var7
                      i64.load offset=64
                      i64.store8 offset=55
                      i32.const 1
                      local.set $var19
                      local.get $var8
                      local.set $var12
                      local.get $var9
                      local.set $var17
                      local.get $var21
                      local.set $var13
                      br $label32
                    end $label5
                    local.get $var7
                    local.get $var1
                    i32.const 1
                    i32.add
                    local.tee $var14
                    i32.store offset=76
                    local.get $var1
                    i32.load8_u offset=1
                    local.set $var13
                    local.get $var14
                    local.set $var1
                    br $label66
                  end $label66
                  unreachable
                end $label2
                local.get $var11
                local.set $var20
                local.get $var0
                br_if $label24
                local.get $var10
                i32.eqz
                br_if $label29
                i32.const 1
                local.set $var1
                block $label67
                  loop $label68
                    local.get $var4
                    local.get $var1
                    i32.const 2
                    i32.shl
                    i32.add
                    i32.load
                    local.tee $var13
                    i32.eqz
                    br_if $label67
                    local.get $var3
                    local.get $var1
                    i32.const 3
                    i32.shl
                    i32.add
                    local.get $var13
                    local.get $var2
                    local.get $var6
                    call $func35
                    i32.const 1
                    local.set $var20
                    local.get $var1
                    i32.const 1
                    i32.add
                    local.tee $var1
                    i32.const 10
                    i32.ne
                    br_if $label68
                    br $label24
                  end $label68
                  unreachable
                end $label67
                i32.const 1
                local.set $var20
                local.get $var1
                i32.const 10
                i32.ge_u
                br_if $label24
                loop $label69
                  local.get $var4
                  local.get $var1
                  i32.const 2
                  i32.shl
                  i32.add
                  i32.load
                  br_if $label16
                  i32.const 1
                  local.set $var20
                  local.get $var1
                  i32.const 1
                  i32.add
                  local.tee $var1
                  i32.const 10
                  i32.eq
                  br_if $label24
                  br $label69
                end $label69
                unreachable
              end $label16
              i32.const -1
              local.set $var20
              br $label24
            end $label45
            local.get $var9
            local.set $var17
          end $label32
          local.get $var0
          i32.const 32
          local.get $var20
          local.get $var17
          local.get $var12
          i32.sub
          local.tee $var15
          local.get $var19
          local.get $var19
          local.get $var15
          i32.lt_s
          select
          local.tee $var17
          i32.add
          local.tee $var14
          local.get $var18
          local.get $var18
          local.get $var14
          i32.lt_s
          select
          local.tee $var1
          local.get $var14
          local.get $var13
          call $func39
          local.get $var0
          local.get $var16
          local.get $var20
          call $func33
          local.get $var0
          i32.const 48
          local.get $var1
          local.get $var14
          local.get $var13
          i32.const 65536
          i32.xor
          call $func39
          local.get $var0
          i32.const 48
          local.get $var17
          local.get $var15
          i32.const 0
          call $func39
          local.get $var0
          local.get $var12
          local.get $var15
          call $func33
          local.get $var0
          i32.const 32
          local.get $var1
          local.get $var14
          local.get $var13
          i32.const 8192
          i32.xor
          call $func39
          br $label8
        end $label29
      end $label8
      i32.const 0
      local.set $var20
    end $label24
    local.get $var7
    i32.const 80
    i32.add
    global.set $global0
    local.get $var20
  )
  (func $func33 (param $var0 i32) (param $var1 i32) (param $var2 i32)
    block $label0
      local.get $var0
      i32.load8_u
      i32.const 32
      i32.and
      br_if $label0
      local.get $var1
      local.get $var2
      local.get $var0
      call $func20
      drop
    end $label0
  )
  (func $func34 (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32) (local $var3 i32)
    i32.const 0
    local.set $var1
    block $label0
      local.get $var0
      i32.load
      i32.load8_s
      call $func12
      i32.eqz
      br_if $label0
      loop $label1
        local.get $var0
        i32.load
        local.tee $var2
        i32.load8_s
        local.set $var3
        local.get $var0
        local.get $var2
        i32.const 1
        i32.add
        i32.store
        local.get $var3
        local.get $var1
        i32.const 10
        i32.mul
        i32.add
        i32.const -48
        i32.add
        local.set $var1
        local.get $var2
        i32.load8_s offset=1
        call $func12
        br_if $label1
      end $label1
    end $label0
    local.get $var1
  )
  (func $func35 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32)
    block $label0
      local.get $var1
      i32.const 20
      i32.gt_u
      br_if $label0
      block $label10
        block $label9
          block $label8
            block $label7
              block $label6
                block $label5
                  block $label4
                    block $label3
                      block $label2
                        block $label1
                          local.get $var1
                          i32.const -9
                          i32.add
                          br_table $label1 $label2 $label3 $label4 $label5 $label6 $label7 $label8 $label9 $label10 $label0
                        end $label1
                        local.get $var2
                        local.get $var2
                        i32.load
                        local.tee $var1
                        i32.const 4
                        i32.add
                        i32.store
                        local.get $var0
                        local.get $var1
                        i32.load
                        i32.store
                        return
                      end $label2
                      local.get $var2
                      local.get $var2
                      i32.load
                      local.tee $var1
                      i32.const 4
                      i32.add
                      i32.store
                      local.get $var0
                      local.get $var1
                      i64.load32_s
                      i64.store
                      return
                    end $label3
                    local.get $var2
                    local.get $var2
                    i32.load
                    local.tee $var1
                    i32.const 4
                    i32.add
                    i32.store
                    local.get $var0
                    local.get $var1
                    i64.load32_u
                    i64.store
                    return
                  end $label4
                  local.get $var2
                  local.get $var2
                  i32.load
                  i32.const 7
                  i32.add
                  i32.const -8
                  i32.and
                  local.tee $var1
                  i32.const 8
                  i32.add
                  i32.store
                  local.get $var0
                  local.get $var1
                  i64.load
                  i64.store
                  return
                end $label5
                local.get $var2
                local.get $var2
                i32.load
                local.tee $var1
                i32.const 4
                i32.add
                i32.store
                local.get $var0
                local.get $var1
                i64.load16_s
                i64.store
                return
              end $label6
              local.get $var2
              local.get $var2
              i32.load
              local.tee $var1
              i32.const 4
              i32.add
              i32.store
              local.get $var0
              local.get $var1
              i64.load16_u
              i64.store
              return
            end $label7
            local.get $var2
            local.get $var2
            i32.load
            local.tee $var1
            i32.const 4
            i32.add
            i32.store
            local.get $var0
            local.get $var1
            i64.load8_s
            i64.store
            return
          end $label8
          local.get $var2
          local.get $var2
          i32.load
          local.tee $var1
          i32.const 4
          i32.add
          i32.store
          local.get $var0
          local.get $var1
          i64.load8_u
          i64.store
          return
        end $label9
        local.get $var2
        local.get $var2
        i32.load
        i32.const 7
        i32.add
        i32.const -8
        i32.and
        local.tee $var1
        i32.const 8
        i32.add
        i32.store
        local.get $var0
        local.get $var1
        f64.load
        f64.store
        return
      end $label10
      local.get $var0
      local.get $var2
      local.get $var3
      call_indirect (param i32 i32)
    end $label0
  )
  (func $func36 (param $var0 i64) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32)
    block $label0
      local.get $var0
      i64.eqz
      br_if $label0
      loop $label1
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var0
        i32.wrap_i64
        i32.const 15
        i32.and
        i32.const 1568
        i32.add
        i32.load8_u
        local.get $var2
        i32.or
        i32.store8
        local.get $var0
        i64.const 15
        i64.gt_u
        local.set $var3
        local.get $var0
        i64.const 4
        i64.shr_u
        local.set $var0
        local.get $var3
        br_if $label1
      end $label1
    end $label0
    local.get $var1
  )
  (func $func37 (param $var0 i64) (param $var1 i32) (result i32)
    (local $var2 i32)
    block $label0
      local.get $var0
      i64.eqz
      br_if $label0
      loop $label1
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var0
        i32.wrap_i64
        i32.const 7
        i32.and
        i32.const 48
        i32.or
        i32.store8
        local.get $var0
        i64.const 7
        i64.gt_u
        local.set $var2
        local.get $var0
        i64.const 3
        i64.shr_u
        local.set $var0
        local.get $var2
        br_if $label1
      end $label1
    end $label0
    local.get $var1
  )
  (func $func38 (param $var0 i64) (param $var1 i32) (result i32)
    (local $var2 i64) (local $var3 i32) (local $var4 i32) (local $var5 i32)
    block $label1
      block $label0
        local.get $var0
        i64.const 4294967296
        i64.ge_u
        br_if $label0
        local.get $var0
        local.set $var2
        br $label1
      end $label0
      loop $label2
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var0
        local.get $var0
        i64.const 10
        i64.div_u
        local.tee $var2
        i64.const 10
        i64.mul
        i64.sub
        i32.wrap_i64
        i32.const 48
        i32.or
        i32.store8
        local.get $var0
        i64.const 42949672959
        i64.gt_u
        local.set $var3
        local.get $var2
        local.set $var0
        local.get $var3
        br_if $label2
      end $label2
    end $label1
    block $label3
      local.get $var2
      i32.wrap_i64
      local.tee $var3
      i32.eqz
      br_if $label3
      loop $label4
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var3
        local.get $var3
        i32.const 10
        i32.div_u
        local.tee $var4
        i32.const 10
        i32.mul
        i32.sub
        i32.const 48
        i32.or
        i32.store8
        local.get $var3
        i32.const 9
        i32.gt_u
        local.set $var5
        local.get $var4
        local.set $var3
        local.get $var5
        br_if $label4
      end $label4
    end $label3
    local.get $var1
  )
  (func $func39 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32)
    (local $var5 i32)
    global.get $global0
    i32.const 256
    i32.sub
    local.tee $var5
    global.set $global0
    block $label0
      local.get $var4
      i32.const 73728
      i32.and
      br_if $label0
      local.get $var2
      local.get $var3
      i32.le_s
      br_if $label0
      local.get $var5
      local.get $var1
      i32.const 255
      i32.and
      local.get $var2
      local.get $var3
      i32.sub
      local.tee $var2
      i32.const 256
      local.get $var2
      i32.const 256
      i32.lt_u
      local.tee $var3
      select
      call $func11
      drop
      block $label1
        local.get $var3
        br_if $label1
        loop $label2
          local.get $var0
          local.get $var5
          i32.const 256
          call $func33
          local.get $var2
          i32.const -256
          i32.add
          local.tee $var2
          i32.const 255
          i32.gt_u
          br_if $label2
        end $label2
      end $label1
      local.get $var0
      local.get $var5
      local.get $var2
      call $func33
    end $label0
    local.get $var5
    i32.const 256
    i32.add
    global.set $global0
  )
  (func $func40 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    local.get $var0
    local.get $var1
    local.get $var2
    i32.const 4
    i32.const 5
    call $func31
  )
  (func $func41 (param $var0 i32) (param $var1 f64) (param $var2 i32) (param $var3 i32) (param $var4 i32) (param $var5 i32) (result i32)
    (local $var6 i32) (local $var7 i32) (local $var8 i32) (local $var9 i32) (local $var10 i32) (local $var11 i32) (local $var12 i32) (local $var13 i32) (local $var14 i32) (local $var15 i32) (local $var16 i32) (local $var17 i32) (local $var18 i32) (local $var19 i32) (local $var20 i32) (local $var21 i32) (local $var22 i32) (local $var23 i32) (local $var24 i64) (local $var25 i64) (local $var26 f64)
    global.get $global0
    i32.const 560
    i32.sub
    local.tee $var6
    global.set $global0
    i32.const 0
    local.set $var7
    local.get $var6
    i32.const 0
    i32.store offset=44
    block $label1
      block $label0
        local.get $var1
        call $func43
        local.tee $var24
        i64.const -1
        i64.gt_s
        br_if $label0
        i32.const 1
        local.set $var8
        i32.const 1034
        local.set $var9
        local.get $var1
        f64.neg
        local.tee $var1
        call $func43
        local.set $var24
        br $label1
      end $label0
      block $label2
        local.get $var4
        i32.const 2048
        i32.and
        i32.eqz
        br_if $label2
        i32.const 1
        local.set $var8
        i32.const 1037
        local.set $var9
        br $label1
      end $label2
      i32.const 1040
      i32.const 1035
      local.get $var4
      i32.const 1
      i32.and
      local.tee $var8
      select
      local.set $var9
      local.get $var8
      i32.eqz
      local.set $var7
    end $label1
    block $label4
      block $label3
        local.get $var24
        i64.const 9218868437227405312
        i64.and
        i64.const 9218868437227405312
        i64.ne
        br_if $label3
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var8
        i32.const 3
        i32.add
        local.tee $var10
        local.get $var4
        i32.const -65537
        i32.and
        call $func39
        local.get $var0
        local.get $var9
        local.get $var8
        call $func33
        local.get $var0
        i32.const 1053
        i32.const 1061
        local.get $var5
        i32.const 32
        i32.and
        local.tee $var11
        select
        i32.const 1057
        i32.const 1065
        local.get $var11
        select
        local.get $var1
        local.get $var1
        f64.ne
        select
        i32.const 3
        call $func33
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var10
        local.get $var4
        i32.const 8192
        i32.xor
        call $func39
        br $label4
      end $label3
      local.get $var6
      i32.const 16
      i32.add
      local.set $var12
      block $label7
        block $label8
          block $label6
            block $label5
              local.get $var1
              local.get $var6
              i32.const 44
              i32.add
              call $func27
              local.tee $var1
              local.get $var1
              f64.add
              local.tee $var1
              f64.const 0.0
              f64.eq
              br_if $label5
              local.get $var6
              local.get $var6
              i32.load offset=44
              local.tee $var11
              i32.const -1
              i32.add
              i32.store offset=44
              local.get $var5
              i32.const 32
              i32.or
              local.tee $var13
              i32.const 97
              i32.ne
              br_if $label6
              br $label7
            end $label5
            local.get $var5
            i32.const 32
            i32.or
            local.tee $var13
            i32.const 97
            i32.eq
            br_if $label7
            i32.const 6
            local.get $var3
            local.get $var3
            i32.const 0
            i32.lt_s
            select
            local.set $var14
            local.get $var6
            i32.load offset=44
            local.set $var15
            br $label8
          end $label6
          local.get $var6
          local.get $var11
          i32.const -29
          i32.add
          local.tee $var15
          i32.store offset=44
          i32.const 6
          local.get $var3
          local.get $var3
          i32.const 0
          i32.lt_s
          select
          local.set $var14
          local.get $var1
          f64.const 268435456
          f64.mul
          local.set $var1
        end $label8
        local.get $var6
        i32.const 48
        i32.add
        local.get $var6
        i32.const 336
        i32.add
        local.get $var15
        i32.const 0
        i32.lt_s
        select
        local.tee $var16
        local.set $var17
        loop $label11
          block $label10
            block $label9
              local.get $var1
              f64.const 4294967296
              f64.lt
              local.get $var1
              f64.const 0.0
              f64.ge
              i32.and
              i32.eqz
              br_if $label9
              local.get $var1
              i32.trunc_f64_u
              local.set $var11
              br $label10
            end $label9
            i32.const 0
            local.set $var11
          end $label10
          local.get $var17
          local.get $var11
          i32.store
          local.get $var17
          i32.const 4
          i32.add
          local.set $var17
          local.get $var1
          local.get $var11
          f64.convert_i32_u
          f64.sub
          f64.const 1000000000
          f64.mul
          local.tee $var1
          f64.const 0.0
          f64.ne
          br_if $label11
        end $label11
        block $label13
          block $label12
            local.get $var15
            i32.const 1
            i32.ge_s
            br_if $label12
            local.get $var15
            local.set $var3
            local.get $var17
            local.set $var11
            local.get $var16
            local.set $var18
            br $label13
          end $label12
          local.get $var16
          local.set $var18
          local.get $var15
          local.set $var3
          loop $label18
            local.get $var3
            i32.const 29
            local.get $var3
            i32.const 29
            i32.lt_s
            select
            local.set $var3
            block $label14
              local.get $var17
              i32.const -4
              i32.add
              local.tee $var11
              local.get $var18
              i32.lt_u
              br_if $label14
              local.get $var3
              i64.extend_i32_u
              local.set $var25
              i64.const 0
              local.set $var24
              loop $label15
                local.get $var11
                local.get $var11
                i64.load32_u
                local.get $var25
                i64.shl
                local.get $var24
                i64.const 4294967295
                i64.and
                i64.add
                local.tee $var24
                local.get $var24
                i64.const 1000000000
                i64.div_u
                local.tee $var24
                i64.const 1000000000
                i64.mul
                i64.sub
                i64.store32
                local.get $var11
                i32.const -4
                i32.add
                local.tee $var11
                local.get $var18
                i32.ge_u
                br_if $label15
              end $label15
              local.get $var24
              i32.wrap_i64
              local.tee $var11
              i32.eqz
              br_if $label14
              local.get $var18
              i32.const -4
              i32.add
              local.tee $var18
              local.get $var11
              i32.store
            end $label14
            block $label16
              loop $label17
                local.get $var17
                local.tee $var11
                local.get $var18
                i32.le_u
                br_if $label16
                local.get $var11
                i32.const -4
                i32.add
                local.tee $var17
                i32.load
                i32.eqz
                br_if $label17
              end $label17
            end $label16
            local.get $var6
            local.get $var6
            i32.load offset=44
            local.get $var3
            i32.sub
            local.tee $var3
            i32.store offset=44
            local.get $var11
            local.set $var17
            local.get $var3
            i32.const 0
            i32.gt_s
            br_if $label18
          end $label18
        end $label13
        local.get $var14
        i32.const 25
        i32.add
        i32.const 9
        i32.div_s
        local.set $var17
        block $label19
          local.get $var3
          i32.const -1
          i32.gt_s
          br_if $label19
          local.get $var17
          i32.const 1
          i32.add
          local.set $var19
          local.get $var13
          i32.const 102
          i32.eq
          local.set $var20
          loop $label23
            i32.const 0
            local.get $var3
            i32.sub
            local.tee $var17
            i32.const 9
            local.get $var17
            i32.const 9
            i32.lt_s
            select
            local.set $var10
            block $label22
              block $label20
                local.get $var18
                local.get $var11
                i32.ge_u
                br_if $label20
                i32.const 1000000000
                local.get $var10
                i32.shr_u
                local.set $var21
                i32.const -1
                local.get $var10
                i32.shl
                i32.const -1
                i32.xor
                local.set $var22
                i32.const 0
                local.set $var3
                local.get $var18
                local.set $var17
                loop $label21
                  local.get $var17
                  local.get $var17
                  i32.load
                  local.tee $var23
                  local.get $var10
                  i32.shr_u
                  local.get $var3
                  i32.add
                  i32.store
                  local.get $var23
                  local.get $var22
                  i32.and
                  local.get $var21
                  i32.mul
                  local.set $var3
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var11
                  i32.lt_u
                  br_if $label21
                end $label21
                local.get $var18
                i32.load
                local.set $var17
                local.get $var3
                i32.eqz
                br_if $label22
                local.get $var11
                local.get $var3
                i32.store
                local.get $var11
                i32.const 4
                i32.add
                local.set $var11
                br $label22
              end $label20
              local.get $var18
              i32.load
              local.set $var17
            end $label22
            local.get $var6
            local.get $var6
            i32.load offset=44
            local.get $var10
            i32.add
            local.tee $var3
            i32.store offset=44
            local.get $var16
            local.get $var18
            local.get $var17
            i32.eqz
            i32.const 2
            i32.shl
            i32.add
            local.tee $var18
            local.get $var20
            select
            local.tee $var17
            local.get $var19
            i32.const 2
            i32.shl
            i32.add
            local.get $var11
            local.get $var11
            local.get $var17
            i32.sub
            i32.const 2
            i32.shr_s
            local.get $var19
            i32.gt_s
            select
            local.set $var11
            local.get $var3
            i32.const 0
            i32.lt_s
            br_if $label23
          end $label23
        end $label19
        i32.const 0
        local.set $var17
        block $label24
          local.get $var18
          local.get $var11
          i32.ge_u
          br_if $label24
          local.get $var16
          local.get $var18
          i32.sub
          i32.const 2
          i32.shr_s
          i32.const 9
          i32.mul
          local.set $var17
          i32.const 10
          local.set $var3
          local.get $var18
          i32.load
          local.tee $var23
          i32.const 10
          i32.lt_u
          br_if $label24
          loop $label25
            local.get $var17
            i32.const 1
            i32.add
            local.set $var17
            local.get $var23
            local.get $var3
            i32.const 10
            i32.mul
            local.tee $var3
            i32.ge_u
            br_if $label25
          end $label25
        end $label24
        block $label26
          local.get $var14
          i32.const 0
          local.get $var17
          local.get $var13
          i32.const 102
          i32.eq
          select
          i32.sub
          local.get $var13
          i32.const 103
          i32.eq
          local.get $var14
          i32.const 0
          i32.ne
          i32.and
          i32.sub
          local.tee $var3
          local.get $var11
          local.get $var16
          i32.sub
          i32.const 2
          i32.shr_s
          i32.const 9
          i32.mul
          i32.const -9
          i32.add
          i32.ge_s
          br_if $label26
          local.get $var3
          i32.const 9216
          i32.add
          local.tee $var23
          i32.const 9
          i32.div_s
          local.tee $var21
          i32.const 2
          i32.shl
          local.get $var6
          i32.const 48
          i32.add
          i32.const 4
          i32.const 292
          local.get $var15
          i32.const 0
          i32.lt_s
          select
          i32.add
          i32.add
          i32.const -4096
          i32.add
          local.set $var10
          i32.const 10
          local.set $var3
          block $label27
            local.get $var23
            local.get $var21
            i32.const 9
            i32.mul
            i32.sub
            local.tee $var23
            i32.const 7
            i32.gt_s
            br_if $label27
            loop $label28
              local.get $var3
              i32.const 10
              i32.mul
              local.set $var3
              local.get $var23
              i32.const 1
              i32.add
              local.tee $var23
              i32.const 8
              i32.ne
              br_if $label28
            end $label28
          end $label27
          local.get $var10
          i32.const 4
          i32.add
          local.set $var22
          block $label30
            block $label29
              local.get $var10
              i32.load
              local.tee $var23
              local.get $var23
              local.get $var3
              i32.div_u
              local.tee $var19
              local.get $var3
              i32.mul
              i32.sub
              local.tee $var21
              br_if $label29
              local.get $var22
              local.get $var11
              i32.eq
              br_if $label30
            end $label29
            f64.const 0.5
            f64.const 1
            f64.const 1.5
            local.get $var22
            local.get $var11
            i32.eq
            select
            f64.const 1.5
            local.get $var21
            local.get $var3
            i32.const 1
            i32.shr_u
            local.tee $var22
            i32.eq
            select
            local.get $var21
            local.get $var22
            i32.lt_u
            select
            local.set $var26
            f64.const 9007199254740994
            f64.const 9007199254740992
            local.get $var19
            i32.const 1
            i32.and
            select
            local.set $var1
            block $label31
              local.get $var7
              br_if $label31
              local.get $var9
              i32.load8_u
              i32.const 45
              i32.ne
              br_if $label31
              local.get $var26
              f64.neg
              local.set $var26
              local.get $var1
              f64.neg
              local.set $var1
            end $label31
            local.get $var10
            local.get $var23
            local.get $var21
            i32.sub
            local.tee $var23
            i32.store
            local.get $var1
            local.get $var26
            f64.add
            local.get $var1
            f64.eq
            br_if $label30
            local.get $var10
            local.get $var23
            local.get $var3
            i32.add
            local.tee $var17
            i32.store
            block $label32
              local.get $var17
              i32.const 1000000000
              i32.lt_u
              br_if $label32
              loop $label34
                local.get $var10
                i32.const 0
                i32.store
                block $label33
                  local.get $var10
                  i32.const -4
                  i32.add
                  local.tee $var10
                  local.get $var18
                  i32.ge_u
                  br_if $label33
                  local.get $var18
                  i32.const -4
                  i32.add
                  local.tee $var18
                  i32.const 0
                  i32.store
                end $label33
                local.get $var10
                local.get $var10
                i32.load
                i32.const 1
                i32.add
                local.tee $var17
                i32.store
                local.get $var17
                i32.const 999999999
                i32.gt_u
                br_if $label34
              end $label34
            end $label32
            local.get $var16
            local.get $var18
            i32.sub
            i32.const 2
            i32.shr_s
            i32.const 9
            i32.mul
            local.set $var17
            i32.const 10
            local.set $var3
            local.get $var18
            i32.load
            local.tee $var23
            i32.const 10
            i32.lt_u
            br_if $label30
            loop $label35
              local.get $var17
              i32.const 1
              i32.add
              local.set $var17
              local.get $var23
              local.get $var3
              i32.const 10
              i32.mul
              local.tee $var3
              i32.ge_u
              br_if $label35
            end $label35
          end $label30
          local.get $var10
          i32.const 4
          i32.add
          local.tee $var3
          local.get $var11
          local.get $var11
          local.get $var3
          i32.gt_u
          select
          local.set $var11
        end $label26
        block $label36
          loop $label37
            local.get $var11
            local.tee $var23
            local.get $var18
            i32.le_u
            local.tee $var3
            br_if $label36
            local.get $var23
            i32.const -4
            i32.add
            local.tee $var11
            i32.load
            i32.eqz
            br_if $label37
          end $label37
        end $label36
        block $label39
          block $label38
            local.get $var13
            i32.const 103
            i32.eq
            br_if $label38
            local.get $var4
            i32.const 8
            i32.and
            local.set $var22
            br $label39
          end $label38
          local.get $var17
          i32.const -1
          i32.xor
          i32.const -1
          local.get $var14
          i32.const 1
          local.get $var14
          select
          local.tee $var11
          local.get $var17
          i32.gt_s
          local.get $var17
          i32.const -5
          i32.gt_s
          i32.and
          local.tee $var10
          select
          local.get $var11
          i32.add
          local.set $var14
          i32.const -1
          i32.const -2
          local.get $var10
          select
          local.get $var5
          i32.add
          local.set $var5
          local.get $var4
          i32.const 8
          i32.and
          local.tee $var22
          br_if $label39
          i32.const -9
          local.set $var11
          block $label40
            local.get $var3
            br_if $label40
            local.get $var23
            i32.const -4
            i32.add
            i32.load
            local.tee $var10
            i32.eqz
            br_if $label40
            i32.const 10
            local.set $var3
            i32.const 0
            local.set $var11
            local.get $var10
            i32.const 10
            i32.rem_u
            br_if $label40
            loop $label41
              local.get $var11
              local.tee $var21
              i32.const 1
              i32.add
              local.set $var11
              local.get $var10
              local.get $var3
              i32.const 10
              i32.mul
              local.tee $var3
              i32.rem_u
              i32.eqz
              br_if $label41
            end $label41
            local.get $var21
            i32.const -1
            i32.xor
            local.set $var11
          end $label40
          local.get $var23
          local.get $var16
          i32.sub
          i32.const 2
          i32.shr_s
          i32.const 9
          i32.mul
          local.set $var3
          block $label42
            local.get $var5
            i32.const -33
            i32.and
            i32.const 70
            i32.ne
            br_if $label42
            i32.const 0
            local.set $var22
            local.get $var14
            local.get $var3
            local.get $var11
            i32.add
            i32.const -9
            i32.add
            local.tee $var11
            i32.const 0
            local.get $var11
            i32.const 0
            i32.gt_s
            select
            local.tee $var11
            local.get $var14
            local.get $var11
            i32.lt_s
            select
            local.set $var14
            br $label39
          end $label42
          i32.const 0
          local.set $var22
          local.get $var14
          local.get $var17
          local.get $var3
          i32.add
          local.get $var11
          i32.add
          i32.const -9
          i32.add
          local.tee $var11
          i32.const 0
          local.get $var11
          i32.const 0
          i32.gt_s
          select
          local.tee $var11
          local.get $var14
          local.get $var11
          i32.lt_s
          select
          local.set $var14
        end $label39
        local.get $var14
        local.get $var22
        i32.or
        i32.const 0
        i32.ne
        local.set $var19
        block $label44
          block $label43
            local.get $var5
            i32.const -33
            i32.and
            local.tee $var3
            i32.const 70
            i32.ne
            br_if $label43
            local.get $var17
            i32.const 0
            local.get $var17
            i32.const 0
            i32.gt_s
            select
            local.set $var11
            br $label44
          end $label43
          block $label45
            local.get $var12
            local.get $var17
            local.get $var17
            i32.const 31
            i32.shr_s
            local.tee $var11
            i32.add
            local.get $var11
            i32.xor
            i64.extend_i32_u
            local.get $var12
            call $func38
            local.tee $var11
            i32.sub
            i32.const 1
            i32.gt_s
            br_if $label45
            loop $label46
              local.get $var11
              i32.const -1
              i32.add
              local.tee $var11
              i32.const 48
              i32.store8
              local.get $var12
              local.get $var11
              i32.sub
              i32.const 2
              i32.lt_s
              br_if $label46
            end $label46
          end $label45
          local.get $var11
          i32.const -2
          i32.add
          local.tee $var20
          local.get $var5
          i32.store8
          local.get $var11
          i32.const -1
          i32.add
          i32.const 45
          i32.const 43
          local.get $var17
          i32.const 0
          i32.lt_s
          select
          i32.store8
          local.get $var12
          local.get $var20
          i32.sub
          local.set $var11
        end $label44
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var8
        local.get $var14
        i32.add
        local.get $var19
        i32.add
        local.get $var11
        i32.add
        i32.const 1
        i32.add
        local.tee $var10
        local.get $var4
        call $func39
        local.get $var0
        local.get $var9
        local.get $var8
        call $func33
        local.get $var0
        i32.const 48
        local.get $var2
        local.get $var10
        local.get $var4
        i32.const 65536
        i32.xor
        call $func39
        block $label64
          block $label52
            block $label53
              block $label47
                local.get $var3
                i32.const 70
                i32.ne
                br_if $label47
                local.get $var6
                i32.const 16
                i32.add
                i32.const 8
                i32.or
                local.set $var21
                local.get $var6
                i32.const 16
                i32.add
                i32.const 9
                i32.or
                local.set $var3
                local.get $var16
                local.get $var18
                local.get $var18
                local.get $var16
                i32.gt_u
                select
                local.tee $var18
                local.set $var17
                loop $label51
                  local.get $var17
                  i64.load32_u
                  local.get $var3
                  call $func38
                  local.set $var11
                  block $label49
                    block $label48
                      local.get $var17
                      local.get $var18
                      i32.eq
                      br_if $label48
                      local.get $var11
                      local.get $var6
                      i32.const 16
                      i32.add
                      i32.le_u
                      br_if $label49
                      loop $label50
                        local.get $var11
                        i32.const -1
                        i32.add
                        local.tee $var11
                        i32.const 48
                        i32.store8
                        local.get $var11
                        local.get $var6
                        i32.const 16
                        i32.add
                        i32.gt_u
                        br_if $label50
                        br $label49
                      end $label50
                      unreachable
                    end $label48
                    local.get $var11
                    local.get $var3
                    i32.ne
                    br_if $label49
                    local.get $var6
                    i32.const 48
                    i32.store8 offset=24
                    local.get $var21
                    local.set $var11
                  end $label49
                  local.get $var0
                  local.get $var11
                  local.get $var3
                  local.get $var11
                  i32.sub
                  call $func33
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var16
                  i32.le_u
                  br_if $label51
                end $label51
                i32.const 0
                local.set $var11
                local.get $var19
                i32.eqz
                br_if $label52
                local.get $var0
                i32.const 1069
                i32.const 1
                call $func33
                local.get $var17
                local.get $var23
                i32.ge_u
                br_if $label53
                local.get $var14
                i32.const 1
                i32.lt_s
                br_if $label53
                loop $label56
                  block $label54
                    local.get $var17
                    i64.load32_u
                    local.get $var3
                    call $func38
                    local.tee $var11
                    local.get $var6
                    i32.const 16
                    i32.add
                    i32.le_u
                    br_if $label54
                    loop $label55
                      local.get $var11
                      i32.const -1
                      i32.add
                      local.tee $var11
                      i32.const 48
                      i32.store8
                      local.get $var11
                      local.get $var6
                      i32.const 16
                      i32.add
                      i32.gt_u
                      br_if $label55
                    end $label55
                  end $label54
                  local.get $var0
                  local.get $var11
                  local.get $var14
                  i32.const 9
                  local.get $var14
                  i32.const 9
                  i32.lt_s
                  select
                  call $func33
                  local.get $var14
                  i32.const -9
                  i32.add
                  local.set $var11
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var23
                  i32.ge_u
                  br_if $label52
                  local.get $var14
                  i32.const 9
                  i32.gt_s
                  local.set $var18
                  local.get $var11
                  local.set $var14
                  local.get $var18
                  br_if $label56
                  br $label52
                end $label56
                unreachable
              end $label47
              block $label57
                local.get $var14
                i32.const 0
                i32.lt_s
                br_if $label57
                local.get $var23
                local.get $var18
                i32.const 4
                i32.add
                local.get $var23
                local.get $var18
                i32.gt_u
                select
                local.set $var21
                local.get $var6
                i32.const 16
                i32.add
                i32.const 9
                i32.or
                local.set $var3
                local.get $var6
                i32.const 16
                i32.add
                i32.const 8
                i32.or
                local.set $var16
                local.get $var18
                local.set $var17
                loop $label63
                  block $label58
                    local.get $var17
                    i64.load32_u
                    local.get $var3
                    call $func38
                    local.tee $var11
                    local.get $var3
                    i32.ne
                    br_if $label58
                    local.get $var6
                    i32.const 48
                    i32.store8 offset=24
                    local.get $var16
                    local.set $var11
                  end $label58
                  block $label60
                    block $label59
                      local.get $var17
                      local.get $var18
                      i32.eq
                      br_if $label59
                      local.get $var11
                      local.get $var6
                      i32.const 16
                      i32.add
                      i32.le_u
                      br_if $label60
                      loop $label61
                        local.get $var11
                        i32.const -1
                        i32.add
                        local.tee $var11
                        i32.const 48
                        i32.store8
                        local.get $var11
                        local.get $var6
                        i32.const 16
                        i32.add
                        i32.gt_u
                        br_if $label61
                        br $label60
                      end $label61
                      unreachable
                    end $label59
                    local.get $var0
                    local.get $var11
                    i32.const 1
                    call $func33
                    local.get $var11
                    i32.const 1
                    i32.add
                    local.set $var11
                    block $label62
                      local.get $var14
                      i32.const 0
                      i32.gt_s
                      br_if $label62
                      local.get $var22
                      i32.eqz
                      br_if $label60
                    end $label62
                    local.get $var0
                    i32.const 1069
                    i32.const 1
                    call $func33
                  end $label60
                  local.get $var0
                  local.get $var11
                  local.get $var3
                  local.get $var11
                  i32.sub
                  local.tee $var23
                  local.get $var14
                  local.get $var14
                  local.get $var23
                  i32.gt_s
                  select
                  call $func33
                  local.get $var14
                  local.get $var23
                  i32.sub
                  local.set $var14
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var21
                  i32.ge_u
                  br_if $label57
                  local.get $var14
                  i32.const -1
                  i32.gt_s
                  br_if $label63
                end $label63
              end $label57
              local.get $var0
              i32.const 48
              local.get $var14
              i32.const 18
              i32.add
              i32.const 18
              i32.const 0
              call $func39
              local.get $var0
              local.get $var20
              local.get $var12
              local.get $var20
              i32.sub
              call $func33
              br $label64
            end $label53
            local.get $var14
            local.set $var11
          end $label52
          local.get $var0
          i32.const 48
          local.get $var11
          i32.const 9
          i32.add
          i32.const 9
          i32.const 0
          call $func39
        end $label64
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var10
        local.get $var4
        i32.const 8192
        i32.xor
        call $func39
        br $label4
      end $label7
      local.get $var9
      local.get $var5
      i32.const 26
      i32.shl
      i32.const 31
      i32.shr_s
      i32.const 9
      i32.and
      i32.add
      local.set $var14
      block $label65
        local.get $var3
        i32.const 11
        i32.gt_u
        br_if $label65
        i32.const 12
        local.get $var3
        i32.sub
        local.set $var11
        f64.const 8
        local.set $var26
        loop $label66
          local.get $var26
          f64.const 16
          f64.mul
          local.set $var26
          local.get $var11
          i32.const -1
          i32.add
          local.tee $var11
          br_if $label66
        end $label66
        block $label67
          local.get $var14
          i32.load8_u
          i32.const 45
          i32.ne
          br_if $label67
          local.get $var26
          local.get $var1
          f64.neg
          local.get $var26
          f64.sub
          f64.add
          f64.neg
          local.set $var1
          br $label65
        end $label67
        local.get $var1
        local.get $var26
        f64.add
        local.get $var26
        f64.sub
        local.set $var1
      end $label65
      block $label68
        local.get $var6
        i32.load offset=44
        local.tee $var11
        local.get $var11
        i32.const 31
        i32.shr_s
        local.tee $var11
        i32.add
        local.get $var11
        i32.xor
        i64.extend_i32_u
        local.get $var12
        call $func38
        local.tee $var11
        local.get $var12
        i32.ne
        br_if $label68
        local.get $var6
        i32.const 48
        i32.store8 offset=15
        local.get $var6
        i32.const 15
        i32.add
        local.set $var11
      end $label68
      local.get $var8
      i32.const 2
      i32.or
      local.set $var22
      local.get $var5
      i32.const 32
      i32.and
      local.set $var18
      local.get $var6
      i32.load offset=44
      local.set $var17
      local.get $var11
      i32.const -2
      i32.add
      local.tee $var21
      local.get $var5
      i32.const 15
      i32.add
      i32.store8
      local.get $var11
      i32.const -1
      i32.add
      i32.const 45
      i32.const 43
      local.get $var17
      i32.const 0
      i32.lt_s
      select
      i32.store8
      local.get $var4
      i32.const 8
      i32.and
      local.set $var23
      local.get $var6
      i32.const 16
      i32.add
      local.set $var17
      loop $label73
        local.get $var17
        local.set $var11
        block $label70
          block $label69
            local.get $var1
            f64.abs
            f64.const 2147483648
            f64.lt
            i32.eqz
            br_if $label69
            local.get $var1
            i32.trunc_f64_s
            local.set $var17
            br $label70
          end $label69
          i32.const -2147483648
          local.set $var17
        end $label70
        local.get $var11
        local.get $var17
        i32.const 1568
        i32.add
        i32.load8_u
        local.get $var18
        i32.or
        i32.store8
        local.get $var1
        local.get $var17
        f64.convert_i32_s
        f64.sub
        f64.const 16
        f64.mul
        local.set $var1
        block $label71
          local.get $var11
          i32.const 1
          i32.add
          local.tee $var17
          local.get $var6
          i32.const 16
          i32.add
          i32.sub
          i32.const 1
          i32.ne
          br_if $label71
          block $label72
            local.get $var1
            f64.const 0.0
            f64.ne
            br_if $label72
            local.get $var3
            i32.const 0
            i32.gt_s
            br_if $label72
            local.get $var23
            i32.eqz
            br_if $label71
          end $label72
          local.get $var11
          i32.const 46
          i32.store8 offset=1
          local.get $var11
          i32.const 2
          i32.add
          local.set $var17
        end $label71
        local.get $var1
        f64.const 0.0
        f64.ne
        br_if $label73
      end $label73
      block $label75
        block $label74
          local.get $var3
          i32.eqz
          br_if $label74
          local.get $var17
          local.get $var6
          i32.const 16
          i32.add
          i32.sub
          i32.const -2
          i32.add
          local.get $var3
          i32.ge_s
          br_if $label74
          local.get $var3
          local.get $var12
          i32.add
          local.get $var21
          i32.sub
          i32.const 2
          i32.add
          local.set $var11
          br $label75
        end $label74
        local.get $var12
        local.get $var6
        i32.const 16
        i32.add
        local.get $var21
        i32.add
        i32.sub
        local.get $var17
        i32.add
        local.set $var11
      end $label75
      local.get $var0
      i32.const 32
      local.get $var2
      local.get $var11
      local.get $var22
      i32.add
      local.tee $var10
      local.get $var4
      call $func39
      local.get $var0
      local.get $var14
      local.get $var22
      call $func33
      local.get $var0
      i32.const 48
      local.get $var2
      local.get $var10
      local.get $var4
      i32.const 65536
      i32.xor
      call $func39
      local.get $var0
      local.get $var6
      i32.const 16
      i32.add
      local.get $var17
      local.get $var6
      i32.const 16
      i32.add
      i32.sub
      local.tee $var17
      call $func33
      local.get $var0
      i32.const 48
      local.get $var11
      local.get $var17
      local.get $var12
      local.get $var21
      i32.sub
      local.tee $var18
      i32.add
      i32.sub
      i32.const 0
      i32.const 0
      call $func39
      local.get $var0
      local.get $var21
      local.get $var18
      call $func33
      local.get $var0
      i32.const 32
      local.get $var2
      local.get $var10
      local.get $var4
      i32.const 8192
      i32.xor
      call $func39
    end $label4
    local.get $var6
    i32.const 560
    i32.add
    global.set $global0
    local.get $var2
    local.get $var10
    local.get $var10
    local.get $var2
    i32.lt_s
    select
  )
  (func $func42 (param $var0 i32) (param $var1 i32)
    (local $var2 i32)
    local.get $var1
    local.get $var1
    i32.load
    i32.const 7
    i32.add
    i32.const -8
    i32.and
    local.tee $var2
    i32.const 16
    i32.add
    i32.store
    local.get $var0
    local.get $var2
    i64.load
    local.get $var2
    i32.const 8
    i32.add
    i64.load
    call $func30
    f64.store
  )
  (func $func43 (param $var0 f64) (result i64)
    local.get $var0
    i64.reinterpret_f64
  )
  (func $func44 (param $var0 i32) (param $var1 i32) (result i32)
    (local $var2 i32)
    global.get $global0
    i32.const 16
    i32.sub
    local.tee $var2
    global.set $global0
    local.get $var2
    local.get $var1
    i32.store offset=12
    i32.const 0
    i32.load offset=1096
    local.get $var0
    local.get $var1
    call $func40
    local.set $var1
    local.get $var2
    i32.const 16
    i32.add
    global.set $global0
    local.get $var1
  )
  (func $func45 (param $var0 i32) (result i32)
    i32.const 1
  )
  (func $func46 (param $var0 i32)
  )
  (func $stackSave (;47;) (export "stackSave") (result i32)
    global.get $global0
  )
  (func $stackRestore (;48;) (export "stackRestore") (param $var0 i32)
    local.get $var0
    global.set $global0
  )
  (func $stackAlloc (;49;) (export "stackAlloc") (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32)
    global.get $global0
    local.get $var0
    i32.sub
    i32.const -16
    i32.and
    local.tee $var1
    global.set $global0
    local.get $var1
  )
  (func $emscripten_stack_init (;50;) (export "emscripten_stack_init")
    i32.const 5245984
    global.set $global2
    i32.const 3092
    i32.const 15
    i32.add
    i32.const -16
    i32.and
    global.set $global1
  )
  (func $emscripten_stack_get_free (;51;) (export "emscripten_stack_get_free") (result i32)
    global.get $global0
    global.get $global1
    i32.sub
  )
  (func $emscripten_stack_get_end (;52;) (export "emscripten_stack_get_end") (result i32)
    global.get $global1
  )
  (func $fflush (;53;) (export "fflush") (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32)
    block $label2
      block $label0
        local.get $var0
        i32.eqz
        br_if $label0
        block $label1
          local.get $var0
          i32.load offset=76
          i32.const -1
          i32.gt_s
          br_if $label1
          local.get $var0
          call $func54
          return
        end $label1
        local.get $var0
        call $func45
        local.set $var1
        local.get $var0
        call $func54
        local.set $var2
        local.get $var1
        i32.eqz
        br_if $label2
        local.get $var0
        call $func46
        local.get $var2
        return
      end $label0
      i32.const 0
      local.set $var2
      block $label3
        i32.const 0
        i32.load offset=1728
        i32.eqz
        br_if $label3
        i32.const 0
        i32.load offset=1728
        call $fflush
        local.set $var2
      end $label3
      block $label4
        call $func16
        i32.load
        local.tee $var0
        i32.eqz
        br_if $label4
        loop $label8
          i32.const 0
          local.set $var1
          block $label5
            local.get $var0
            i32.load offset=76
            i32.const 0
            i32.lt_s
            br_if $label5
            local.get $var0
            call $func45
            local.set $var1
          end $label5
          block $label6
            local.get $var0
            i32.load offset=20
            local.get $var0
            i32.load offset=28
            i32.le_u
            br_if $label6
            local.get $var0
            call $func54
            local.get $var2
            i32.or
            local.set $var2
          end $label6
          block $label7
            local.get $var1
            i32.eqz
            br_if $label7
            local.get $var0
            call $func46
          end $label7
          local.get $var0
          i32.load offset=56
          local.tee $var0
          br_if $label8
        end $label8
      end $label4
      call $func17
    end $label2
    local.get $var2
  )
  (func $func54 (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32)
    block $label0
      local.get $var0
      i32.load offset=20
      local.get $var0
      i32.load offset=28
      i32.le_u
      br_if $label0
      local.get $var0
      i32.const 0
      i32.const 0
      local.get $var0
      i32.load offset=36
      call_indirect (param i32 i32 i32) (result i32)
      drop
      local.get $var0
      i32.load offset=20
      br_if $label0
      i32.const -1
      return
    end $label0
    block $label1
      local.get $var0
      i32.load offset=4
      local.tee $var1
      local.get $var0
      i32.load offset=8
      local.tee $var2
      i32.ge_u
      br_if $label1
      local.get $var0
      local.get $var1
      local.get $var2
      i32.sub
      i64.extend_i32_s
      i32.const 1
      local.get $var0
      i32.load offset=40
      call_indirect (param i32 i64 i32) (result i64)
      drop
    end $label1
    local.get $var0
    i32.const 0
    i32.store offset=28
    local.get $var0
    i64.const 0
    i64.store offset=16
    local.get $var0
    i64.const 0
    i64.store offset=4 align=4
    i32.const 0
  )
  (func $func55 (param $var0 i32) (param $var1 i32) (param $var2 i64) (param $var3 i32) (result i64)
    local.get $var1
    local.get $var2
    local.get $var3
    local.get $var0
    call_indirect (param i32 i64 i32) (result i64)
  )
  (func $dynCall_jiji (;56;) (export "dynCall_jiji") (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
    (local $var5 i64)
    local.get $var0
    local.get $var1
    local.get $var2
    i64.extend_i32_u
    local.get $var3
    i64.extend_i32_u
    i64.const 32
    i64.shl
    i64.or
    local.get $var4
    call $func55
    local.set $var5
    local.get $var5
    i64.const 32
    i64.shr_u
    i32.wrap_i64
    call $env.setTempRet0
    local.get $var5
    i32.wrap_i64
  )
  (data (i32.const 1024) "-+   0X0x\00-0X+0X 0X-0x+0x 0x\00nan\00inf\00NAN\00INF\00.\00(null)\00hello, world!\0a\00\00\00\000\06\00\00\00\00\00\00\11\00\0a\00\11\11\11\00\00\00\00\05\00\00\00\00\00\00\09\00\00\00\00\0b\00\00\00\00\00\00\00\00\11\00\0f\0a\11\11\11\03\0a\07\00\01\00\09\0b\0b\00\00\09\06\0b\00\00\0b\00\06\11\00\00\00\11\11\11\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\00\00\00\00\00\11\00\0a\0a\11\11\11\00\0a\00\00\02\00\09\0b\00\00\00\09\00\0b\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\0c\00\00\00\00\09\0c\00\00\00\00\00\0c\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0e\00\00\00\00\00\00\00\00\00\00\00\0d\00\00\00\04\0d\00\00\00\00\09\0e\00\00\00\00\00\0e\00\00\0e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\00\00\00\00\0f\00\00\00\00\0f\00\00\00\00\09\10\00\00\00\00\00\10\00\00\10\00\00\12\00\00\00\12\12\12\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\12\00\00\00\12\12\12\00\00\00\00\00\00\09\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\00\0a\00\00\00\00\09\0b\00\00\00\00\00\0b\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\0c\00\00\00\00\09\0c\00\00\00\00\00\0c\00\00\0c\00\000123456789ABCDEF")
  (data (i32.const 1584) "\05\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\03\00\00\00\e8\06\00\00\00\04\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\ff\ff\ff\ff\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000\06\00\00")
)

 

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/Understanding_the_text_format]

'Programming > wasm' 카테고리의 다른 글

wasm interfacing example  (0) 2021.11.25
wasm text format  (0) 2021.10.26
wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
Posted by 구차니

댓글을 달아 주세요

Programming/wasm2021. 10. 26. 11:07

나름 컴파일 된거니, 디컴파일이라고 해야하나 애매하긴 하네

 

$ wat2wasm simple.wat -o simple.wasm
$ wasm2wat simple.wasm -o text.wat

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/Text_format_to_wasm]

 

emcc 와는 다르게 패키지로 존재하나 보다

$ wat2wasm

명령어 'wat2wasm' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다:

sudo apt install wabt

$ wasm2wat

명령어 'wasm2wat' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다:

sudo apt install wabt

 

 

$ wat2wasm
usage: wat2wasm [options] filename

  read a file in the wasm text format, check it for errors, and
  convert it to the wasm binary format.

examples:
  # parse and typecheck test.wat
  $ wat2wasm test.wat

  # parse test.wat and write to binary file test.wasm
  $ wat2wasm test.wat -o test.wasm

  # parse spec-test.wast, and write verbose output to stdout (including
  # the meaning of every byte)
  $ wat2wasm spec-test.wast -v

options:
      --help                                  Print this help message
      --version                               Print version information
  -v, --verbose                               Use multiple times for more info
      --debug-parser                          Turn on debugging the parser of wat files
  -d, --dump-module                           Print a hexdump of the module to stdout
      --enable-exceptions                     Enable Experimental exception handling
      --disable-mutable-globals               Disable Import/export mutable globals
      --enable-saturating-float-to-int        Enable Saturating float-to-int operators
      --enable-sign-extension                 Enable Sign-extension operators
      --enable-simd                           Enable SIMD support
      --enable-threads                        Enable Threading support
      --enable-multi-value                    Enable Multi-value
      --enable-tail-call                      Enable Tail-call support
      --enable-bulk-memory                    Enable Bulk-memory operations
      --enable-reference-types                Enable Reference types (anyref)
      --enable-annotations                    Enable Custom annotation syntax
      --enable-all                            Enable all features
  -o, --output=FILE                           output wasm binary file
  -r, --relocatable                           Create a relocatable wasm binary (suitable for linking with e.g. lld)
      --no-canonicalize-leb128s               Write all LEB128 sizes as 5-bytes instead of their minimal size
      --debug-names                           Write debug names to the generated binary file
      --no-check                              Don't check for invalid modules
expected filename argument.

$ wasm2wat
usage: wasm2wat [options] filename

  Read a file in the WebAssembly binary format, and convert it to
  the WebAssembly text format.

examples:
  # parse binary file test.wasm and write text file test.wast
  $ wasm2wat test.wasm -o test.wat

  # parse test.wasm, write test.wat, but ignore the debug names, if any
  $ wasm2wat test.wasm --no-debug-names -o test.wat

options:
      --help                                  Print this help message
      --version                               Print version information
  -v, --verbose                               Use multiple times for more info
  -o, --output=FILENAME                       Output file for the generated wast file, by default use stdout
  -f, --fold-exprs                            Write folded expressions where possible
      --enable-exceptions                     Enable Experimental exception handling
      --disable-mutable-globals               Disable Import/export mutable globals
      --enable-saturating-float-to-int        Enable Saturating float-to-int operators
      --enable-sign-extension                 Enable Sign-extension operators
      --enable-simd                           Enable SIMD support
      --enable-threads                        Enable Threading support
      --enable-multi-value                    Enable Multi-value
      --enable-tail-call                      Enable Tail-call support
      --enable-bulk-memory                    Enable Bulk-memory operations
      --enable-reference-types                Enable Reference types (anyref)
      --enable-annotations                    Enable Custom annotation syntax
      --enable-all                            Enable all features
      --inline-exports                        Write all exports inline
      --inline-imports                        Write all imports inline
      --no-debug-names                        Ignore debug names in the binary file
      --ignore-custom-section-errors          Ignore errors in custom sections
      --generate-names                        Give auto-generated names to non-named functions, types, etc.
      --no-check                              Don't check for invalid modules
expected filename argument.

'Programming > wasm' 카테고리의 다른 글

wasm interfacing example  (0) 2021.11.25
wasm text format  (0) 2021.10.26
wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
Posted by 구차니

댓글을 달아 주세요

Programming/wasm2021. 10. 25. 17:45

귀찮아서 로컬 파일로 접근하니 안열린다 -_ㅠ

 

node.js http-server 하려다가 안되서 걍 python -m http.server로 구동

별건 없고.. 그냥 hello world!만 나오고 끝!

 

# If Python version returned above is 3.X
# On Windows, try "python -m http.server" or "py -3 -m http.server"
python3 -m http.server
# If Python version returned above is 2.X
python -m SimpleHTTPServer

[링크 : https://developer.mozilla.org/en-US/docs/Learn/Common_questions/set_up_a_local_testing_server]

 

빌드는 아래의 명령어로 수행 가능한데

-o hello.html을 하면 .js .wasm .html 3개를 생성한다.

-s WASM=1은 주던 안 주던 영향을 받지 않는 듯하다.

$ emcc
emcc: error: no input files
$ cat hello.c
#include <stdio.h>

int main() {
  printf("hello, world!\n");
  return 0;
}
$ emcc -o hello.js hello.c
$ ls -al
합계 148
drwxrwxr-x 2 minimonk minimonk   4096 10월 25 15:40 .
drwxrwxr-x 8 minimonk minimonk   4096 10월 25 15:39 ..
-rw-rw-r-- 1 minimonk minimonk     76 10월 25 15:39 hello.c
-rw-rw-r-- 1 minimonk minimonk 126915 10월 25 15:39 hello.js
-rwxrwxr-x 1 minimonk minimonk  11522 10월 25 15:39 hello.wasm
$ file *
hello.c:    C source, ASCII text
hello.js:   ASCII text, with very long lines
hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

 

$ emcc hello.c -s WASM=1 -o hello.html
$ ls -al
합계 252
drwxrwxr-x 2 minimonk minimonk   4096 10월 25 17:47 .
drwxrwxr-x 8 minimonk minimonk   4096 10월 25 15:39 ..
-rw-rw-r-- 1 minimonk minimonk     76 10월 25 15:39 hello.c
-rw-rw-r-- 1 minimonk minimonk 102675 10월 25 17:47 hello.html
-rw-rw-r-- 1 minimonk minimonk 126915 10월 25 17:47 hello.js
-rwxrwxr-x 1 minimonk minimonk  11522 10월 25 17:47 hello.wasm
$ file *
hello.c:    C source, ASCII text
hello.html: HTML document, ASCII text, with very long lines
hello.js:   ASCII text, with very long lines
hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]

 

+

$ cat hello.js


// The Module object: Our interface to the outside world. We import
// and export values on it. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to check if Module already exists (e.g. case 3 above).
// Substitution will be replaced with actual code on later stage of the build,
// this way Closure Compiler will not mangle it (e.g. case 4. above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define   var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module = typeof Module !== 'undefined' ? Module : {};

// --pre-jses are emitted after the Module integration code, so that they can
// refer to Module (if they choose; they can also define Module)
// {{PRE_JSES}}

// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = {};
var key;
for (key in Module) {
  if (Module.hasOwnProperty(key)) {
    moduleOverrides[key] = Module[key];
  }
}

var arguments_ = [];
var thisProgram = './this.program';
var quit_ = function(status, toThrow) {
  throw toThrow;
};

// Determine the runtime environment we are in. You can customize this by
// setting the ENVIRONMENT setting at compile time (see settings.js).

// Attempt to auto-detect the environment
var ENVIRONMENT_IS_WEB = typeof window === 'object';
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
// N.b. Electron.js environment is simultaneously a NODE-environment, but
// also a web environment.
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string';
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;

if (Module['ENVIRONMENT']) {
  throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)');
}

// `/` should be present at the end if `scriptDirectory` is not empty
var scriptDirectory = '';
function locateFile(path) {
  if (Module['locateFile']) {
    return Module['locateFile'](path, scriptDirectory);
  }
  return scriptDirectory + path;
}

// Hooks that are implemented differently in different runtime environments.
var read_,
    readAsync,
    readBinary,
    setWindowTitle;

// Normally we don't log exceptions but instead let them bubble out the top
// level where the embedding environment (e.g. the browser) can handle
// them.
// However under v8 and node we sometimes exit the process direcly in which case
// its up to use us to log the exception before exiting.
// If we fix https://github.com/emscripten-core/emscripten/issues/15080
// this may no longer be needed under node.
function logExceptionOnExit(e) {
  if (e instanceof ExitStatus) return;
  var toLog = e;
  if (e && typeof e === 'object' && e.stack) {
    toLog = [e, e.stack];
  }
  err('exiting due to exception: ' + toLog);
}

var nodeFS;
var nodePath;

if (ENVIRONMENT_IS_NODE) {
  if (!(typeof process === 'object' && typeof require === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
  if (ENVIRONMENT_IS_WORKER) {
    scriptDirectory = require('path').dirname(scriptDirectory) + '/';
  } else {
    scriptDirectory = __dirname + '/';
  }

// include: node_shell_read.js


read_ = function shell_read(filename, binary) {
  if (!nodeFS) nodeFS = require('fs');
  if (!nodePath) nodePath = require('path');
  filename = nodePath['normalize'](filename);
  return nodeFS['readFileSync'](filename, binary ? null : 'utf8');
};

readBinary = function readBinary(filename) {
  var ret = read_(filename, true);
  if (!ret.buffer) {
    ret = new Uint8Array(ret);
  }
  assert(ret.buffer);
  return ret;
};

readAsync = function readAsync(filename, onload, onerror) {
  if (!nodeFS) nodeFS = require('fs');
  if (!nodePath) nodePath = require('path');
  filename = nodePath['normalize'](filename);
  nodeFS['readFile'](filename, function(err, data) {
    if (err) onerror(err);
    else onload(data.buffer);
  });
};

// end include: node_shell_read.js
  if (process['argv'].length > 1) {
    thisProgram = process['argv'][1].replace(/\\/g, '/');
  }

  arguments_ = process['argv'].slice(2);

  if (typeof module !== 'undefined') {
    module['exports'] = Module;
  }

  process['on']('uncaughtException', function(ex) {
    // suppress ExitStatus exceptions from showing an error
    if (!(ex instanceof ExitStatus)) {
      throw ex;
    }
  });

  // Without this older versions of node (< v15) will log unhandled rejections
  // but return 0, which is not normally the desired behaviour.  This is
  // not be needed with node v15 and about because it is now the default
  // behaviour:
  // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode
  process['on']('unhandledRejection', function(reason) { throw reason; });

  quit_ = function(status, toThrow) {
    if (keepRuntimeAlive()) {
      process['exitCode'] = status;
      throw toThrow;
    }
    logExceptionOnExit(toThrow);
    process['exit'](status);
  };

  Module['inspect'] = function () { return '[Emscripten Module object]'; };

} else
if (ENVIRONMENT_IS_SHELL) {

  if ((typeof process === 'object' && typeof require === 'function') || typeof window === 'object' || typeof importScripts === 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');

  if (typeof read != 'undefined') {
    read_ = function shell_read(f) {
      return read(f);
    };
  }

  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;
  };

  readAsync = function readAsync(f, onload, onerror) {
    setTimeout(function() { onload(readBinary(f)); }, 0);
  };

  if (typeof scriptArgs != 'undefined') {
    arguments_ = scriptArgs;
  } else if (typeof arguments != 'undefined') {
    arguments_ = arguments;
  }

  if (typeof quit === 'function') {
    quit_ = function(status, toThrow) {
      logExceptionOnExit(toThrow);
      quit(status);
    };
  }

  if (typeof print !== 'undefined') {
    // Prefer to use print/printErr where they exist, as they usually work better.
    if (typeof console === 'undefined') console = /** @type{!Console} */({});
    console.log = /** @type{!function(this:Console, ...*): undefined} */ (print);
    console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print);
  }

} else

// Note that this includes Node.js workers when relevant (pthreads is enabled).
// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
// ENVIRONMENT_IS_NODE.
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled
    scriptDirectory = self.location.href;
  } else if (typeof document !== 'undefined' && document.currentScript) { // web
    scriptDirectory = document.currentScript.src;
  }
  // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
  // otherwise, slice off the final part of the url to find the script directory.
  // if scriptDirectory does not contain a slash, lastIndexOf will return -1,
  // and scriptDirectory will correctly be replaced with an empty string.
  // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),
  // they are removed because they could contain a slash.
  if (scriptDirectory.indexOf('blob:') !== 0) {
    scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1);
  } else {
    scriptDirectory = '';
  }

  if (!(typeof window === 'object' || typeof importScripts === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');

  // Differentiate the Web Worker from the Node Worker case, as reading must
  // be done differently.
  {

// include: web_or_worker_shell_read.js


  read_ = function(url) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET', url, false);
      xhr.send(null);
      return xhr.responseText;
  };

  if (ENVIRONMENT_IS_WORKER) {
    readBinary = function(url) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, false);
        xhr.responseType = 'arraybuffer';
        xhr.send(null);
        return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
    };
  }

  readAsync = function(url, onload, onerror) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
      if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
        onload(xhr.response);
        return;
      }
      onerror();
    };
    xhr.onerror = onerror;
    xhr.send(null);
  };

// end include: web_or_worker_shell_read.js
  }

  setWindowTitle = function(title) { document.title = title };
} else
{
  throw new Error('environment detection error');
}

var out = Module['print'] || console.log.bind(console);
var err = Module['printErr'] || console.warn.bind(console);

// Merge back in the overrides
for (key in moduleOverrides) {
  if (moduleOverrides.hasOwnProperty(key)) {
    Module[key] = moduleOverrides[key];
  }
}
// Free the object hierarchy contained in the overrides, this lets the GC
// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
moduleOverrides = null;

// Emit code to handle expected values on the Module object. This applies Module.x
// to the proper local x. This has two benefits: first, we only emit it if it is
// expected to arrive, and second, by using a local everywhere else that can be
// minified.

if (Module['arguments']) arguments_ = Module['arguments'];
if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) {
  Object.defineProperty(Module, 'arguments', {
    configurable: true,
    get: function() {
      abort('Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (Module['thisProgram']) thisProgram = Module['thisProgram'];
if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) {
  Object.defineProperty(Module, 'thisProgram', {
    configurable: true,
    get: function() {
      abort('Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (Module['quit']) quit_ = Module['quit'];
if (!Object.getOwnPropertyDescriptor(Module, 'quit')) {
  Object.defineProperty(Module, 'quit', {
    configurable: true,
    get: function() {
      abort('Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
// Assertions on removed incoming Module JS APIs.
assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)');
assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)');
assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)');
assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)');
assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY');

if (!Object.getOwnPropertyDescriptor(Module, 'read')) {
  Object.defineProperty(Module, 'read', {
    configurable: true,
    get: function() {
      abort('Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) {
  Object.defineProperty(Module, 'readAsync', {
    configurable: true,
    get: function() {
      abort('Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) {
  Object.defineProperty(Module, 'readBinary', {
    configurable: true,
    get: function() {
      abort('Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) {
  Object.defineProperty(Module, 'setWindowTitle', {
    configurable: true,
    get: function() {
      abort('Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}
var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js';
var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js';
var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js';
var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js';
function alignMemory() { abort('`alignMemory` is now a library function and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'); }

assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time.  Add 'shell' to `-s ENVIRONMENT` to enable.");




var STACK_ALIGN = 16;

function getPointerSize() {
  return 4;
}

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 getPointerSize();
      } else if (type[0] === 'i') {
        var bits = Number(type.substr(1));
        assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type);
        return bits / 8;
      } else {
        return 0;
      }
    }
  }
}

function warnOnce(text) {
  if (!warnOnce.shown) warnOnce.shown = {};
  if (!warnOnce.shown[text]) {
    warnOnce.shown[text] = 1;
    err(text);
  }
}

// include: runtime_functions.js


// Wraps a JS function as a wasm function with a given signature.
function convertJsFunctionToWasm(func, sig) {

  // If the type reflection proposal is available, use the new
  // "WebAssembly.Function" constructor.
  // Otherwise, construct a minimal wasm module importing the JS function and
  // re-exporting it.
  if (typeof WebAssembly.Function === "function") {
    var typeNames = {
      'i': 'i32',
      'j': 'i64',
      'f': 'f32',
      'd': 'f64'
    };
    var type = {
      parameters: [],
      results: sig[0] == 'v' ? [] : [typeNames[sig[0]]]
    };
    for (var i = 1; i < sig.length; ++i) {
      type.parameters.push(typeNames[sig[i]]);
    }
    return new WebAssembly.Function(type, func);
  }

  // The module is static, with the exception of the type section, which is
  // generated based on the signature passed in.
  var typeSection = [
    0x01, // id: section,
    0x00, // length: 0 (placeholder)
    0x01, // count: 1
    0x60, // form: func
  ];
  var sigRet = sig.slice(0, 1);
  var sigParam = sig.slice(1);
  var typeCodes = {
    'i': 0x7f, // i32
    'j': 0x7e, // i64
    'f': 0x7d, // f32
    'd': 0x7c, // f64
  };

  // Parameters, length + signatures
  typeSection.push(sigParam.length);
  for (var i = 0; i < sigParam.length; ++i) {
    typeSection.push(typeCodes[sigParam[i]]);
  }

  // Return values, length + signatures
  // With no multi-return in MVP, either 0 (void) or 1 (anything else)
  if (sigRet == 'v') {
    typeSection.push(0x00);
  } else {
    typeSection = typeSection.concat([0x01, typeCodes[sigRet]]);
  }

  // Write the overall length of the type section back into the section header
  // (excepting the 2 bytes for the section id and length)
  typeSection[1] = typeSection.length - 2;

  // Rest of the module is static
  var bytes = new Uint8Array([
    0x00, 0x61, 0x73, 0x6d, // magic ("\0asm")
    0x01, 0x00, 0x00, 0x00, // version: 1
  ].concat(typeSection, [
    0x02, 0x07, // import section
      // (import "e" "f" (func 0 (type 0)))
      0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00,
    0x07, 0x05, // export section
      // (export "f" (func 0 (type 0)))
      0x01, 0x01, 0x66, 0x00, 0x00,
  ]));

   // We can compile this wasm module synchronously because it is very small.
  // This accepts an import (at "e.f"), that it reroutes to an export (at "f")
  var module = new WebAssembly.Module(bytes);
  var instance = new WebAssembly.Instance(module, {
    'e': {
      'f': func
    }
  });
  var wrappedFunc = instance.exports['f'];
  return wrappedFunc;
}

var freeTableIndexes = [];

// Weak map of functions in the table to their indexes, created on first use.
var functionsInTableMap;

function getEmptyTableSlot() {
  // Reuse a free index if there is one, otherwise grow.
  if (freeTableIndexes.length) {
    return freeTableIndexes.pop();
  }
  // Grow the table
  try {
    wasmTable.grow(1);
  } catch (err) {
    if (!(err instanceof RangeError)) {
      throw err;
    }
    throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.';
  }
  return wasmTable.length - 1;
}

function updateTableMap(offset, count) {
  for (var i = offset; i < offset + count; i++) {
    var item = getWasmTableEntry(i);
    // Ignore null values.
    if (item) {
      functionsInTableMap.set(item, i);
    }
  }
}

// Add a function to the table.
// 'sig' parameter is required if the function being added is a JS function.
function addFunction(func, sig) {
  assert(typeof func !== 'undefined');

  // Check if the function is already in the table, to ensure each function
  // gets a unique index. First, create the map if this is the first use.
  if (!functionsInTableMap) {
    functionsInTableMap = new WeakMap();
    updateTableMap(0, wasmTable.length);
  }
  if (functionsInTableMap.has(func)) {
    return functionsInTableMap.get(func);
  }

  // It's not in the table, add it now.

  var ret = getEmptyTableSlot();

  // Set the new value.
  try {
    // Attempting to call this with JS function will cause of table.set() to fail
    setWasmTableEntry(ret, func);
  } catch (err) {
    if (!(err instanceof TypeError)) {
      throw err;
    }
    assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction: ' + func);
    var wrapped = convertJsFunctionToWasm(func, sig);
    setWasmTableEntry(ret, wrapped);
  }

  functionsInTableMap.set(func, ret);

  return ret;
}

function removeFunction(index) {
  functionsInTableMap.delete(getWasmTableEntry(index));
  freeTableIndexes.push(index);
}

// end include: runtime_functions.js
// include: runtime_debug.js


// end include: runtime_debug.js
var tempRet0 = 0;

var setTempRet0 = function(value) {
  tempRet0 = value;
};

var getTempRet0 = function() {
  return tempRet0;
};



// === Preamble library stuff ===

// Documentation for the public APIs defined in this file must be updated in:
//    site/source/docs/api_reference/preamble.js.rst
// A prebuilt local version of the documentation is available at:
//    site/build/text/docs/api_reference/preamble.js.txt
// You can also build docs locally as HTML or other formats in site/
// An online HTML version (which may be of a different version of Emscripten)
//    is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html

var wasmBinary;
if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) {
  Object.defineProperty(Module, 'wasmBinary', {
    configurable: true,
    get: function() {
      abort('Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}
var noExitRuntime = Module['noExitRuntime'] || true;
if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) {
  Object.defineProperty(Module, 'noExitRuntime', {
    configurable: true,
    get: function() {
      abort('Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (typeof WebAssembly !== 'object') {
  abort('no native wasm support detected');
}

// include: runtime_safe_heap.js


// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking.
// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties)

/** @param {number} ptr
    @param {number} value
    @param {string} type
    @param {number|boolean=} noSafe */
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.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>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);
    }
}

/** @param {number} ptr
    @param {string} type
    @param {number|boolean=} noSafe */
function getValue(ptr, type, noSafe) {
  type = type || 'i8';
  if (type.charAt(type.length-1) === '*') type = 'i32';
    switch (type) {
      case 'i1': return HEAP8[((ptr)>>0)];
      case 'i8': return HEAP8[((ptr)>>0)];
      case 'i16': return HEAP16[((ptr)>>1)];
      case 'i32': return HEAP32[((ptr)>>2)];
      case 'i64': return HEAP32[((ptr)>>2)];
      case 'float': return HEAPF32[((ptr)>>2)];
      case 'double': return Number(HEAPF64[((ptr)>>3)]);
      default: abort('invalid type for getValue: ' + type);
    }
  return null;
}

// end include: runtime_safe_heap.js
// Wasm globals

var wasmMemory;

//========================================
// Runtime essentials
//========================================

// whether we are quitting the application. no code should run after this.
// set in exit() and abort()
var ABORT = false;

// set by exit() and abort().  Passed to 'onExit' handler.
// NOTE: This is also used as the process return code code in shell environments
// but only when noExitRuntime is false.
var EXITSTATUS;

/** @type {function(*, string=)} */
function assert(condition, text) {
  if (!condition) {
    abort('Assertion failed: ' + text);
  }
}

// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
  var func = Module['_' + ident]; // closure exported function
  assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported');
  return func;
}

// C calling interface.
/** @param {string|null=} returnType
    @param {Array=} argTypes
    @param {Arguments|Array=} args
    @param {Object=} opts */
function ccall(ident, returnType, argTypes, args, opts) {
  // For fast lookup of conversion functions
  var toC = {
    'string': function(str) {
      var ret = 0;
      if (str !== null && str !== undefined && str !== 0) { // null string
        // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0'
        var len = (str.length << 2) + 1;
        ret = stackAlloc(len);
        stringToUTF8(str, ret, len);
      }
      return ret;
    },
    'array': function(arr) {
      var ret = stackAlloc(arr.length);
      writeArrayToMemory(arr, ret);
      return ret;
    }
  };

  function convertReturnValue(ret) {
    if (returnType === 'string') return UTF8ToString(ret);
    if (returnType === 'boolean') return Boolean(ret);
    return ret;
  }

  var func = getCFunc(ident);
  var cArgs = [];
  var stack = 0;
  assert(returnType !== 'array', 'Return type should not be "array".');
  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);
  function onDone(ret) {
    if (stack !== 0) stackRestore(stack);
    return convertReturnValue(ret);
  }

  ret = onDone(ret);
  return ret;
}

/** @param {string=} returnType
    @param {Array=} argTypes
    @param {Object=} opts */
function cwrap(ident, returnType, argTypes, opts) {
  return function() {
    return ccall(ident, returnType, argTypes, arguments, opts);
  }
}

// We used to include malloc/free by default in the past. Show a helpful error in
// builds with assertions.
function _malloc() {
  abort("malloc() called but not included in the build - add '_malloc' to EXPORTED_FUNCTIONS");
}
function _free() {
  // Show a helpful error since we used to include free by default in the past.
  abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS");
}

var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call

// allocate(): This is for internal use. You can use it yourself as well, but the interface
//             is a little tricky (see docs right below). The reason is that it is optimized
//             for multiple syntaxes to save space in generated code. So you should
//             normally not use allocate(), and instead allocate memory using _malloc(),
//             initialize it with setValue(), and so forth.
// @slab: An array of data.
// @allocator: How to allocate memory, see ALLOC_*
/** @type {function((Uint8Array|Array<number>), number)} */
function allocate(slab, allocator) {
  var ret;
  assert(typeof allocator === 'number', 'allocate no longer takes a type argument')
  assert(typeof slab !== 'number', 'allocate no longer takes a number as arg0')

  if (allocator == ALLOC_STACK) {
    ret = stackAlloc(slab.length);
  } else {
    ret = abort('malloc was not included, but is needed in allocate. Adding "_malloc" to EXPORTED_FUNCTIONS should fix that. This may be a bug in the compiler, please file an issue.');;
  }

  if (slab.subarray || slab.slice) {
    HEAPU8.set(/** @type {!Uint8Array} */(slab), ret);
  } else {
    HEAPU8.set(new Uint8Array(slab), ret);
  }
  return ret;
}

// include: runtime_strings.js


// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime.

// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns
// a copy of that string as a Javascript String object.

var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;

/**
 * @param {number} idx
 * @param {number=} maxBytesToRead
 * @return {string}
 */
function UTF8ArrayToString(heap, idx, maxBytesToRead) {
  var endIdx = idx + maxBytesToRead;
  var endPtr = idx;
  // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
  // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
  // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity)
  while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;

  if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
    return UTF8Decoder.decode(heap.subarray(idx, endPtr));
  } else {
    var str = '';
    // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that
    while (idx < endPtr) {
      // For UTF8 byte structure, see:
      // http://en.wikipedia.org/wiki/UTF-8#Description
      // https://www.ietf.org/rfc/rfc2279.txt
      // https://tools.ietf.org/html/rfc3629
      var u0 = heap[idx++];
      if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
      var u1 = heap[idx++] & 63;
      if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
      var u2 = heap[idx++] & 63;
      if ((u0 & 0xF0) == 0xE0) {
        u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
      } else {
        if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!');
        u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63);
      }

      if (u0 < 0x10000) {
        str += String.fromCharCode(u0);
      } else {
        var ch = u0 - 0x10000;
        str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
      }
    }
  }
  return str;
}

// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a
// copy of that string as a Javascript String object.
// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit
//                 this parameter to scan the string until the first \0 byte. If maxBytesToRead is
//                 passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the
//                 middle, then the string will cut short at that byte index (i.e. maxBytesToRead will
//                 not produce a string of exact length [ptr, ptr+maxBytesToRead[)
//                 N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may
//                 throw JS JIT optimizations off, so it is worth to consider consistently using one
//                 style or the other.
/**
 * @param {number} ptr
 * @param {number=} maxBytesToRead
 * @return {string}
 */
function UTF8ToString(ptr, maxBytesToRead) {
  ;
  return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
}

// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx',
// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
//   str: the Javascript string to copy.
//   heap: the array to copy to. Each index in this array is assumed to be one 8-byte element.
//   outIdx: The starting offset in the array to begin the copying.
//   maxBytesToWrite: The maximum number of bytes this function can write to the array.
//                    This count should include the null terminator,
//                    i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else.
//                    maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
  if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes.
    return 0;

  var startIdx = outIdx;
  var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629
    var u = str.charCodeAt(i); // possibly a lead surrogate
    if (u >= 0xD800 && u <= 0xDFFF) {
      var u1 = str.charCodeAt(++i);
      u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
    }
    if (u <= 0x7F) {
      if (outIdx >= endIdx) break;
      heap[outIdx++] = u;
    } else if (u <= 0x7FF) {
      if (outIdx + 1 >= endIdx) break;
      heap[outIdx++] = 0xC0 | (u >> 6);
      heap[outIdx++] = 0x80 | (u & 63);
    } else if (u <= 0xFFFF) {
      if (outIdx + 2 >= endIdx) break;
      heap[outIdx++] = 0xE0 | (u >> 12);
      heap[outIdx++] = 0x80 | ((u >> 6) & 63);
      heap[outIdx++] = 0x80 | (u & 63);
    } else {
      if (outIdx + 3 >= endIdx) break;
      if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).');
      heap[outIdx++] = 0xF0 | (u >> 18);
      heap[outIdx++] = 0x80 | ((u >> 12) & 63);
      heap[outIdx++] = 0x80 | ((u >> 6) & 63);
      heap[outIdx++] = 0x80 | (u & 63);
    }
  }
  // Null-terminate the pointer to the buffer.
  heap[outIdx] = 0;
  return outIdx - startIdx;
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF8(str, outPtr, maxBytesToWrite) {
  assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
  return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);
}

// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF8(str) {
  var len = 0;
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    var u = str.charCodeAt(i); // possibly a lead surrogate
    if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);
    if (u <= 0x7F) ++len;
    else if (u <= 0x7FF) len += 2;
    else if (u <= 0xFFFF) len += 3;
    else len += 4;
  }
  return len;
}

// end include: runtime_strings.js
// include: runtime_strings_extra.js


// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime.

// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.

function AsciiToString(ptr) {
  var str = '';
  while (1) {
    var ch = HEAPU8[((ptr++)>>0)];
    if (!ch) return str;
    str += String.fromCharCode(ch);
  }
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP.

function stringToAscii(str, outPtr) {
  return writeAsciiToMemory(str, outPtr, false);
}

// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.

var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined;

function UTF16ToString(ptr, maxBytesToRead) {
  assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!');
  var endPtr = ptr;
  // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
  // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
  var idx = endPtr >> 1;
  var maxIdx = idx + maxBytesToRead / 2;
  // If maxBytesToRead is not passed explicitly, it will be undefined, and this
  // will always evaluate to true. This saves on code size.
  while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx;
  endPtr = idx << 1;

  if (endPtr - ptr > 32 && UTF16Decoder) {
    return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
  } else {
    var str = '';

    // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition
    // will always evaluate to true. The loop is then terminated on the first null char.
    for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
      var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
      if (codeUnit == 0) break;
      // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
      str += String.fromCharCode(codeUnit);
    }

    return str;
  }
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP.
// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
//   str: the Javascript string to copy.
//   outPtr: Byte address in Emscripten HEAP where to write the string to.
//   maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
//                    terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else.
//                    maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF16(str, outPtr, maxBytesToWrite) {
  assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!');
  assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
  // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
  if (maxBytesToWrite === undefined) {
    maxBytesToWrite = 0x7FFFFFFF;
  }
  if (maxBytesToWrite < 2) return 0;
  maxBytesToWrite -= 2; // Null terminator.
  var startPtr = outPtr;
  var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length;
  for (var i = 0; i < numCharsToWrite; ++i) {
    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
    HEAP16[((outPtr)>>1)] = codeUnit;
    outPtr += 2;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP16[((outPtr)>>1)] = 0;
  return outPtr - startPtr;
}

// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.

function lengthBytesUTF16(str) {
  return str.length*2;
}

function UTF32ToString(ptr, maxBytesToRead) {
  assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!');
  var i = 0;

  var str = '';
  // If maxBytesToRead is not passed explicitly, it will be undefined, and this
  // will always evaluate to true. This saves on code size.
  while (!(i >= maxBytesToRead / 4)) {
    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
    if (utf32 == 0) break;
    ++i;
    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    if (utf32 >= 0x10000) {
      var ch = utf32 - 0x10000;
      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
    } else {
      str += String.fromCharCode(utf32);
    }
  }
  return str;
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP.
// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
//   str: the Javascript string to copy.
//   outPtr: Byte address in Emscripten HEAP where to write the string to.
//   maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
//                    terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else.
//                    maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF32(str, outPtr, maxBytesToWrite) {
  assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!');
  assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
  // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
  if (maxBytesToWrite === undefined) {
    maxBytesToWrite = 0x7FFFFFFF;
  }
  if (maxBytesToWrite < 4) return 0;
  var startPtr = outPtr;
  var endPtr = startPtr + maxBytesToWrite - 4;
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
      var trailSurrogate = str.charCodeAt(++i);
      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
    }
    HEAP32[((outPtr)>>2)] = codeUnit;
    outPtr += 4;
    if (outPtr + 4 > endPtr) break;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP32[((outPtr)>>2)] = 0;
  return outPtr - startPtr;
}

// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.

function lengthBytesUTF32(str) {
  var len = 0;
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    var codeUnit = str.charCodeAt(i);
    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate.
    len += 4;
  }

  return len;
}

// Allocate heap space for a JS string, and write it there.
// It is the responsibility of the caller to free() that memory.
function allocateUTF8(str) {
  var size = lengthBytesUTF8(str) + 1;
  var ret = abort('malloc was not included, but is needed in allocateUTF8. Adding "_malloc" to EXPORTED_FUNCTIONS should fix that. This may be a bug in the compiler, please file an issue.');;
  if (ret) stringToUTF8Array(str, HEAP8, ret, size);
  return ret;
}

// Allocate stack space for a JS string, and write it there.
function allocateUTF8OnStack(str) {
  var size = lengthBytesUTF8(str) + 1;
  var ret = stackAlloc(size);
  stringToUTF8Array(str, HEAP8, ret, size);
  return ret;
}

// Deprecated: This function should not be called because it is unsafe and does not provide
// a maximum length limit of how many bytes it is allowed to write. Prefer calling the
// function stringToUTF8Array() instead, which takes in a maximum length that can be used
// to be secure from out of bounds writes.
/** @deprecated
    @param {boolean=} dontAddNull */
function writeStringToMemory(string, buffer, dontAddNull) {
  warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!');

  var /** @type {number} */ lastChar, /** @type {number} */ end;
  if (dontAddNull) {
    // stringToUTF8Array always appends null. If we don't want to do that, remember the
    // character that existed at the location where the null will be placed, and restore
    // that after the write (below).
    end = buffer + lengthBytesUTF8(string);
    lastChar = HEAP8[end];
  }
  stringToUTF8(string, buffer, Infinity);
  if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character.
}

function writeArrayToMemory(array, buffer) {
  assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)')
  HEAP8.set(array, buffer);
}

/** @param {boolean=} dontAddNull */
function writeAsciiToMemory(str, buffer, dontAddNull) {
  for (var i = 0; i < str.length; ++i) {
    assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff);
    HEAP8[((buffer++)>>0)] = str.charCodeAt(i);
  }
  // Null-terminate the pointer to the HEAP.
  if (!dontAddNull) HEAP8[((buffer)>>0)] = 0;
}

// end include: runtime_strings_extra.js
// Memory management

function alignUp(x, multiple) {
  if (x % multiple > 0) {
    x += multiple - (x % multiple);
  }
  return x;
}

var HEAP,
/** @type {ArrayBuffer} */
  buffer,
/** @type {Int8Array} */
  HEAP8,
/** @type {Uint8Array} */
  HEAPU8,
/** @type {Int16Array} */
  HEAP16,
/** @type {Uint16Array} */
  HEAPU16,
/** @type {Int32Array} */
  HEAP32,
/** @type {Uint32Array} */
  HEAPU32,
/** @type {Float32Array} */
  HEAPF32,
/** @type {Float64Array} */
  HEAPF64;

function updateGlobalBufferAndViews(buf) {
  buffer = buf;
  Module['HEAP8'] = HEAP8 = new Int8Array(buf);
  Module['HEAP16'] = HEAP16 = new Int16Array(buf);
  Module['HEAP32'] = HEAP32 = new Int32Array(buf);
  Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
  Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);
  Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
  Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);
  Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);
}

var TOTAL_STACK = 5242880;
if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime')

var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;
if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) {
  Object.defineProperty(Module, 'INITIAL_MEMORY', {
    configurable: true,
    get: function() {
      abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')');

// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined,
       'JS engine does not provide full typed array support');

// If memory is defined in wasm, the user can't provide it.
assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected.  Use -s IMPORTED_MEMORY to define wasmMemory externally');
assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting.  Use -s IMPORTED_MEMORY to define wasmMemory dynamically');

// include: runtime_init_table.js
// In regular non-RELOCATABLE mode the table is exported
// from the wasm module and this will be assigned once
// the exports are available.
var wasmTable;

// end include: runtime_init_table.js
// include: runtime_stack_check.js


// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
function writeStackCookie() {
  var max = _emscripten_stack_get_end();
  assert((max & 3) == 0);
  // The stack grows downwards
  HEAPU32[(max >> 2)+1] = 0x2135467;
  HEAPU32[(max >> 2)+2] = 0x89BACDFE;
  // Also test the global address 0 for integrity.
  HEAP32[0] = 0x63736d65; /* 'emsc' */
}

function checkStackCookie() {
  if (ABORT) return;
  var max = _emscripten_stack_get_end();
  var cookie1 = HEAPU32[(max >> 2)+1];
  var cookie2 = HEAPU32[(max >> 2)+2];
  if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) {
    abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' ' + cookie1.toString(16));
  }
  // Also test the global address 0 for integrity.
  if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
}

// end include: runtime_stack_check.js
// include: runtime_assertions.js


// Endianness check
(function() {
  var h16 = new Int16Array(1);
  var h8 = new Int8Array(h16.buffer);
  h16[0] = 0x6373;
  if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)';
})();

// end include: runtime_assertions.js
var __ATPRERUN__  = []; // functions called before the runtime is initialized
var __ATINIT__    = []; // functions called during startup
var __ATMAIN__    = []; // functions called when main() is to be run
var __ATEXIT__    = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the main() is called

var runtimeInitialized = false;
var runtimeExited = false;
var runtimeKeepaliveCounter = 0;

function keepRuntimeAlive() {
  return noExitRuntime || runtimeKeepaliveCounter > 0;
}

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 initRuntime() {
  checkStackCookie();
  assert(!runtimeInitialized);
  runtimeInitialized = true;


  callRuntimeCallbacks(__ATINIT__);
}

function preMain() {
  checkStackCookie();

  callRuntimeCallbacks(__ATMAIN__);
}

function exitRuntime() {
  checkStackCookie();
  runtimeExited = true;
}

function postRun() {
  checkStackCookie();

  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 addOnInit(cb) {
  __ATINIT__.unshift(cb);
}

function addOnPreMain(cb) {
  __ATMAIN__.unshift(cb);
}

function addOnExit(cb) {
}

function addOnPostRun(cb) {
  __ATPOSTRUN__.unshift(cb);
}

// include: runtime_math.js


// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc

assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');

// end include: runtime_math.js
// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// Module.preRun (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
var runDependencyTracking = {};

function getUniqueRunDependency(id) {
  var orig = id;
  while (1) {
    if (!runDependencyTracking[id]) return id;
    id = orig + Math.random();
  }
}

function addRunDependency(id) {
  runDependencies++;

  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }

  if (id) {
    assert(!runDependencyTracking[id]);
    runDependencyTracking[id] = 1;
    if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
      // Check for missing dependencies every few seconds
      runDependencyWatcher = setInterval(function() {
        if (ABORT) {
          clearInterval(runDependencyWatcher);
          runDependencyWatcher = null;
          return;
        }
        var shown = false;
        for (var dep in runDependencyTracking) {
          if (!shown) {
            shown = true;
            err('still waiting on run dependencies:');
          }
          err('dependency: ' + dep);
        }
        if (shown) {
          err('(end of list)');
        }
      }, 10000);
    }
  } else {
    err('warning: run dependency added without ID');
  }
}

function removeRunDependency(id) {
  runDependencies--;

  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }

  if (id) {
    assert(runDependencyTracking[id]);
    delete runDependencyTracking[id];
  } else {
    err('warning: run dependency removed without ID');
  }
  if (runDependencies == 0) {
    if (runDependencyWatcher !== null) {
      clearInterval(runDependencyWatcher);
      runDependencyWatcher = null;
    }
    if (dependenciesFulfilled) {
      var callback = dependenciesFulfilled;
      dependenciesFulfilled = null;
      callback(); // can add another dependenciesFulfilled
    }
  }
}

Module["preloadedImages"] = {}; // maps url to image data
Module["preloadedAudios"] = {}; // maps url to audio data

/** @param {string|number=} what */
function abort(what) {
  {
    if (Module['onAbort']) {
      Module['onAbort'](what);
    }
  }

  what = 'Aborted(' + what + ')';
  // TODO(sbc): Should we remove printing and leave it up to whoever
  // catches the exception?
  err(what);

  ABORT = true;
  EXITSTATUS = 1;

  // Use a wasm runtime error, because a JS error might be seen as a foreign
  // exception, which means we'd run destructors on it. We need the error to
  // simply make the program stop.
  var e = new WebAssembly.RuntimeError(what);

  // Throw the error whether or not MODULARIZE is set because abort is used
  // in code paths apart from instantiation where an exception is expected
  // to be thrown when abort is called.
  throw e;
}

// {{MEM_INITIALIZER}}

// include: memoryprofiler.js


// end include: memoryprofiler.js
// show errors on likely calls to FS when it was not included
var FS = {
  error: function() {
    abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with  -s FORCE_FILESYSTEM=1');
  },
  init: function() { FS.error() },
  createDataFile: function() { FS.error() },
  createPreloadedFile: function() { FS.error() },
  createLazyFile: function() { FS.error() },
  open: function() { FS.error() },
  mkdev: function() { FS.error() },
  registerDevice: function() { FS.error() },
  analyzePath: function() { FS.error() },
  loadFilesFromDB: function() { FS.error() },

  ErrnoError: function ErrnoError() { FS.error() },
};
Module['FS_createDataFile'] = FS.createDataFile;
Module['FS_createPreloadedFile'] = FS.createPreloadedFile;

// include: URIUtils.js


// Prefix of data URIs emitted by SINGLE_FILE and related options.
var dataURIPrefix = 'data:application/octet-stream;base64,';

// Indicates whether filename is a base64 data URI.
function isDataURI(filename) {
  // Prefix of data URIs emitted by SINGLE_FILE and related options.
  return filename.startsWith(dataURIPrefix);
}

// Indicates whether filename is delivered via file protocol (as opposed to http/https)
function isFileURI(filename) {
  return filename.startsWith('file://');
}

// end include: URIUtils.js
function createExportWrapper(name, fixedasm) {
  return function() {
    var displayName = name;
    var asm = fixedasm;
    if (!fixedasm) {
      asm = Module['asm'];
    }
    assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization');
    assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
    if (!asm[name]) {
      assert(asm[name], 'exported native function `' + displayName + '` not found');
    }
    return asm[name].apply(null, arguments);
  };
}

var wasmBinaryFile;
  wasmBinaryFile = 'hello.wasm';
  if (!isDataURI(wasmBinaryFile)) {
    wasmBinaryFile = locateFile(wasmBinaryFile);
  }

function getBinary(file) {
  try {
    if (file == wasmBinaryFile && wasmBinary) {
      return new Uint8Array(wasmBinary);
    }
    if (readBinary) {
      return readBinary(file);
    } else {
      throw "both async and sync fetching of the wasm failed";
    }
  }
  catch (err) {
    abort(err);
  }
}

function getBinaryPromise() {
  // If we don't have the binary yet, try to to load it asynchronously.
  // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
  // See https://github.com/github/fetch/pull/92#issuecomment-140665932
  // Cordova or Electron apps are typically loaded from a file:// url.
  // So use fetch if it is available and the url is not a file, otherwise fall back to XHR.
  if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
    if (typeof fetch === 'function'
      && !isFileURI(wasmBinaryFile)
    ) {
      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(wasmBinaryFile);
      });
    }
    else {
      if (readAsync) {
        // fetch is not available or url is file => try XHR (readAsync uses XHR internally)
        return new Promise(function(resolve, reject) {
          readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject)
        });
      }
    }
  }

  // Otherwise, getBinary should be able to get it synchronously
  return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); });
}

// Create the wasm instance.
// Receives the wasm imports, returns the exports.
function createWasm() {
  // prepare imports
  var info = {
    'env': asmLibraryArg,
    'wasi_snapshot_preview1': asmLibraryArg,
  };
  // Load the wasm module and create an instance of using native support in the JS engine.
  // handle a generated wasm instance, receiving its exports and
  // performing other necessary setup
  /** @param {WebAssembly.Module=} module*/
  function receiveInstance(instance, module) {
    var exports = instance.exports;

    Module['asm'] = exports;

    wasmMemory = Module['asm']['memory'];
    assert(wasmMemory, "memory not found in wasm exports");
    // This assertion doesn't hold when emscripten is run in --post-link
    // mode.
    // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode.
    //assert(wasmMemory.buffer.byteLength === 16777216);
    updateGlobalBufferAndViews(wasmMemory.buffer);

    wasmTable = Module['asm']['__indirect_function_table'];
    assert(wasmTable, "table not found in wasm exports");

    addOnInit(Module['asm']['__wasm_call_ctors']);

    removeRunDependency('wasm-instantiate');
  }
  // we can't run yet (except in a pthread, where we have a custom sync instantiator)
  addRunDependency('wasm-instantiate');

  // Prefer streaming instantiation if available.
  // Async compilation can be confusing when an error on the page overwrites Module
  // (for example, if the order of elements is wrong, and the one defining Module is
  // later), so we save Module and check it later.
  var trueModule = Module;
  function receiveInstantiationResult(result) {
    // 'result' is a ResultObject object which has both the module and instance.
    // receiveInstance() will swap in the exports (to Module.asm) so they can be called
    assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
    trueModule = null;
    // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
    // When the regression is fixed, can restore the above USE_PTHREADS-enabled path.
    receiveInstance(result['instance']);
  }

  function instantiateArrayBuffer(receiver) {
    return getBinaryPromise().then(function(binary) {
      return WebAssembly.instantiate(binary, info);
    }).then(function (instance) {
      return instance;
    }).then(receiver, function(reason) {
      err('failed to asynchronously prepare wasm: ' + reason);

      // Warn on some common problems.
      if (isFileURI(wasmBinaryFile)) {
        err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing');
      }
      abort(reason);
    });
  }

  function instantiateAsync() {
    if (!wasmBinary &&
        typeof WebAssembly.instantiateStreaming === 'function' &&
        !isDataURI(wasmBinaryFile) &&
        // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.
        !isFileURI(wasmBinaryFile) &&
        typeof fetch === 'function') {
      return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) {
        var result = WebAssembly.instantiateStreaming(response, info);

        return result.then(
          receiveInstantiationResult,
          function(reason) {
            // We expect the most common failure cause to be a bad MIME type for the binary,
            // in which case falling back to ArrayBuffer instantiation should work.
            err('wasm streaming compile failed: ' + reason);
            err('falling back to ArrayBuffer instantiation');
            return instantiateArrayBuffer(receiveInstantiationResult);
          });
      });
    } else {
      return instantiateArrayBuffer(receiveInstantiationResult);
    }
  }

  // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
  // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel
  // to any other async startup actions they are performing.
  if (Module['instantiateWasm']) {
    try {
      var exports = Module['instantiateWasm'](info, receiveInstance);
      return exports;
    } catch(e) {
      err('Module.instantiateWasm callback failed with error: ' + e);
      return false;
    }
  }

  instantiateAsync();
  return {}; // no exports yet; we'll fill them in later
}

// Globals used by JS i64 conversions (see makeSetValue)
var tempDouble;
var tempI64;

// === Body ===

var ASM_CONSTS = {

};






  function callRuntimeCallbacks(callbacks) {
      while (callbacks.length > 0) {
        var callback = callbacks.shift();
        if (typeof callback == 'function') {
          callback(Module); // Pass the module as the first argument.
          continue;
        }
        var func = callback.func;
        if (typeof func === 'number') {
          if (callback.arg === undefined) {
            getWasmTableEntry(func)();
          } else {
            getWasmTableEntry(func)(callback.arg);
          }
        } else {
          func(callback.arg === undefined ? null : callback.arg);
        }
      }
    }

  function withStackSave(f) {
      var stack = stackSave();
      var ret = f();
      stackRestore(stack);
      return ret;
    }
  function demangle(func) {
      warnOnce('warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling');
      return func;
    }

  function demangleAll(text) {
      var regex =
        /\b_Z[\w\d_]+/g;
      return text.replace(regex,
        function(x) {
          var y = demangle(x);
          return x === y ? x : (y + ' [' + x + ']');
        });
    }

  var wasmTableMirror = [];
  function getWasmTableEntry(funcPtr) {
      var func = wasmTableMirror[funcPtr];
      if (!func) {
        if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;
        wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);
      }
      assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!");
      return func;
    }

  function handleException(e) {
      // Certain exception types we do not treat as errors since they are used for
      // internal control flow.
      // 1. ExitStatus, which is thrown by exit()
      // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others
      //    that wish to return to JS event loop.
      if (e instanceof ExitStatus || e == 'unwind') {
        return EXITSTATUS;
      }
      quit_(1, e);
    }

  function jsStackTrace() {
      var error = new Error();
      if (!error.stack) {
        // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown,
        // so try that as a special-case.
        try {
          throw new Error();
        } catch(e) {
          error = e;
        }
        if (!error.stack) {
          return '(no stack trace available)';
        }
      }
      return error.stack.toString();
    }

  function setWasmTableEntry(idx, func) {
      wasmTable.set(idx, func);
      wasmTableMirror[idx] = func;
    }

  function stackTrace() {
      var js = jsStackTrace();
      if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']();
      return demangleAll(js);
    }

  function _emscripten_memcpy_big(dest, src, num) {
      HEAPU8.copyWithin(dest, src, src + num);
    }

  function flush_NO_FILESYSTEM() {
      // flush anything remaining in the buffers during shutdown
      if (typeof _fflush !== 'undefined') _fflush(0);
      var buffers = SYSCALLS.buffers;
      if (buffers[1].length) SYSCALLS.printChar(1, 10);
      if (buffers[2].length) SYSCALLS.printChar(2, 10);
    }

  var SYSCALLS = {mappings:{},buffers:[null,[],[]],printChar:function(stream, curr) {
        var buffer = SYSCALLS.buffers[stream];
        assert(buffer);
        if (curr === 0 || curr === 10) {
          (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
          buffer.length = 0;
        } else {
          buffer.push(curr);
        }
      },varargs:undefined,get:function() {
        assert(SYSCALLS.varargs != undefined);
        SYSCALLS.varargs += 4;
        var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
        return ret;
      },getStr:function(ptr) {
        var ret = UTF8ToString(ptr);
        return ret;
      },get64:function(low, high) {
        if (low >= 0) assert(high === 0);
        else assert(high === -1);
        return low;
      }};
  function _fd_write(fd, iov, iovcnt, pnum) {
      ;
      // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
      var num = 0;
      for (var i = 0; i < iovcnt; i++) {
        var ptr = HEAP32[((iov)>>2)];
        var len = HEAP32[(((iov)+(4))>>2)];
        iov += 8;
        for (var j = 0; j < len; j++) {
          SYSCALLS.printChar(fd, HEAPU8[ptr+j]);
        }
        num += len;
      }
      HEAP32[((pnum)>>2)] = num
      return 0;
    }

  function _setTempRet0(val) {
      setTempRet0(val);
    }
var ASSERTIONS = true;



/** @type {function(string, boolean=, number=)} */
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 > 0xFF) {
      if (ASSERTIONS) {
        assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ')  at offset ' + i + ' not in 0x00-0xFF.');
      }
      chr &= 0xFF;
    }
    ret.push(String.fromCharCode(chr));
  }
  return ret.join('');
}


var asmLibraryArg = {
  "emscripten_memcpy_big": _emscripten_memcpy_big,
  "fd_write": _fd_write,
  "setTempRet0": _setTempRet0
};
var asm = createWasm();
/** @type {function(...*):?} */
var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors");

/** @type {function(...*):?} */
var _main = Module["_main"] = createExportWrapper("main");

/** @type {function(...*):?} */
var _fflush = Module["_fflush"] = createExportWrapper("fflush");

/** @type {function(...*):?} */
var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location");

/** @type {function(...*):?} */
var stackSave = Module["stackSave"] = createExportWrapper("stackSave");

/** @type {function(...*):?} */
var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore");

/** @type {function(...*):?} */
var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc");

/** @type {function(...*):?} */
var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() {
  return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments);
};

/** @type {function(...*):?} */
var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() {
  return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments);
};

/** @type {function(...*):?} */
var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() {
  return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments);
};

/** @type {function(...*):?} */
var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji");





// === Auto-generated postamble setup entry stuff ===

if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = function() { abort("'ccall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = function() { abort("'cwrap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = function() { abort("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = function() { abort("'callMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = function() { abort("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "keepRuntimeAlive")) Module["keepRuntimeAlive"] = function() { abort("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "zeroMemory")) Module["zeroMemory"] = function() { abort("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = function() { abort("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setFileTime")) Module["setFileTime"] = function() { abort("'setFileTime' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "abortOnCannotGrowMemory")) Module["abortOnCannotGrowMemory"] = function() { abort("'abortOnCannotGrowMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = function() { abort("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "withStackSave")) Module["withStackSave"] = function() { abort("'withStackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = function() { abort("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = function() { abort("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = function() { abort("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetPton4")) Module["inetPton4"] = function() { abort("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetNtop4")) Module["inetNtop4"] = function() { abort("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetPton6")) Module["inetPton6"] = function() { abort("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetNtop6")) Module["inetNtop6"] = function() { abort("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readSockaddr")) Module["readSockaddr"] = function() { abort("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeSockaddr")) Module["writeSockaddr"] = function() { abort("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = function() { abort("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getHostByName")) Module["getHostByName"] = function() { abort("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = function() { abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = function() { abort("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = function() { abort("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getRandomDevice")) Module["getRandomDevice"] = function() { abort("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "traverseStack")) Module["traverseStack"] = function() { abort("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = function() { abort("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgsArray")) Module["readAsmConstArgsArray"] = function() { abort("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = function() { abort("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "mainThreadEM_ASM")) Module["mainThreadEM_ASM"] = function() { abort("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = function() { abort("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = function() { abort("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getExecutableName")) Module["getExecutableName"] = function() { abort("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "listenOnce")) Module["listenOnce"] = function() { abort("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "autoResumeAudioContext")) Module["autoResumeAudioContext"] = function() { abort("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCallLegacy")) Module["dynCallLegacy"] = function() { abort("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getDynCaller")) Module["getDynCaller"] = function() { abort("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callRuntimeCallbacks")) Module["callRuntimeCallbacks"] = function() { abort("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "wasmTableMirror")) Module["wasmTableMirror"] = function() { abort("'wasmTableMirror' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setWasmTableEntry")) Module["setWasmTableEntry"] = function() { abort("'setWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getWasmTableEntry")) Module["getWasmTableEntry"] = function() { abort("'getWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "handleException")) Module["handleException"] = function() { abort("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePush")) Module["runtimeKeepalivePush"] = function() { abort("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePop")) Module["runtimeKeepalivePop"] = function() { abort("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callUserCallback")) Module["callUserCallback"] = function() { abort("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "maybeExit")) Module["maybeExit"] = function() { abort("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "safeSetTimeout")) Module["safeSetTimeout"] = function() { abort("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "asmjsMangle")) Module["asmjsMangle"] = function() { abort("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "asyncLoad")) Module["asyncLoad"] = function() { abort("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "alignMemory")) Module["alignMemory"] = function() { abort("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "mmapAlloc")) Module["mmapAlloc"] = function() { abort("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = function() { abort("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "unSign")) Module["unSign"] = function() { abort("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "reSign")) Module["reSign"] = function() { abort("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = function() { abort("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = function() { abort("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = function() { abort("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = function() { abort("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = function() { abort("'syscallMmap2' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = function() { abort("'syscallMunmap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getSocketFromFD")) Module["getSocketFromFD"] = function() { abort("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getSocketAddress")) Module["getSocketAddress"] = function() { abort("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = function() { abort("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerKeyEventCallback")) Module["registerKeyEventCallback"] = function() { abort("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = function() { abort("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "maybeCStringToJsString")) Module["maybeCStringToJsString"] = function() { abort("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "findEventTarget")) Module["findEventTarget"] = function() { abort("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "findCanvasEventTarget")) Module["findCanvasEventTarget"] = function() { abort("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getBoundingClientRect")) Module["getBoundingClientRect"] = function() { abort("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillMouseEventData")) Module["fillMouseEventData"] = function() { abort("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerMouseEventCallback")) Module["registerMouseEventCallback"] = function() { abort("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerWheelEventCallback")) Module["registerWheelEventCallback"] = function() { abort("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerUiEventCallback")) Module["registerUiEventCallback"] = function() { abort("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFocusEventCallback")) Module["registerFocusEventCallback"] = function() { abort("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceOrientationEventData")) Module["fillDeviceOrientationEventData"] = function() { abort("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceOrientationEventCallback")) Module["registerDeviceOrientationEventCallback"] = function() { abort("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceMotionEventData")) Module["fillDeviceMotionEventData"] = function() { abort("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceMotionEventCallback")) Module["registerDeviceMotionEventCallback"] = function() { abort("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "screenOrientation")) Module["screenOrientation"] = function() { abort("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillOrientationChangeEventData")) Module["fillOrientationChangeEventData"] = function() { abort("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerOrientationChangeEventCallback")) Module["registerOrientationChangeEventCallback"] = function() { abort("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillFullscreenChangeEventData")) Module["fillFullscreenChangeEventData"] = function() { abort("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFullscreenChangeEventCallback")) Module["registerFullscreenChangeEventCallback"] = function() { abort("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerRestoreOldStyle")) Module["registerRestoreOldStyle"] = function() { abort("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "hideEverythingExceptGivenElement")) Module["hideEverythingExceptGivenElement"] = function() { abort("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "restoreHiddenElements")) Module["restoreHiddenElements"] = function() { abort("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setLetterbox")) Module["setLetterbox"] = function() { abort("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "currentFullscreenStrategy")) Module["currentFullscreenStrategy"] = function() { abort("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "restoreOldWindowedStyle")) Module["restoreOldWindowedStyle"] = function() { abort("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "softFullscreenResizeWebGLRenderTarget")) Module["softFullscreenResizeWebGLRenderTarget"] = function() { abort("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "doRequestFullscreen")) Module["doRequestFullscreen"] = function() { abort("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillPointerlockChangeEventData")) Module["fillPointerlockChangeEventData"] = function() { abort("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockChangeEventCallback")) Module["registerPointerlockChangeEventCallback"] = function() { abort("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockErrorEventCallback")) Module["registerPointerlockErrorEventCallback"] = function() { abort("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "requestPointerLock")) Module["requestPointerLock"] = function() { abort("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillVisibilityChangeEventData")) Module["fillVisibilityChangeEventData"] = function() { abort("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerVisibilityChangeEventCallback")) Module["registerVisibilityChangeEventCallback"] = function() { abort("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerTouchEventCallback")) Module["registerTouchEventCallback"] = function() { abort("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillGamepadEventData")) Module["fillGamepadEventData"] = function() { abort("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerGamepadEventCallback")) Module["registerGamepadEventCallback"] = function() { abort("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerBeforeUnloadEventCallback")) Module["registerBeforeUnloadEventCallback"] = function() { abort("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillBatteryEventData")) Module["fillBatteryEventData"] = function() { abort("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "battery")) Module["battery"] = function() { abort("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerBatteryEventCallback")) Module["registerBatteryEventCallback"] = function() { abort("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setCanvasElementSize")) Module["setCanvasElementSize"] = function() { abort("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getCanvasElementSize")) Module["getCanvasElementSize"] = function() { abort("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = function() { abort("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = function() { abort("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = function() { abort("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = function() { abort("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "checkWasiClock")) Module["checkWasiClock"] = function() { abort("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "flush_NO_FILESYSTEM")) Module["flush_NO_FILESYSTEM"] = function() { abort("'flush_NO_FILESYSTEM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = function() { abort("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = function() { abort("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = function() { abort("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = function() { abort("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = function() { abort("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = function() { abort("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = function() { abort("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = function() { abort("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = function() { abort("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setImmediateWrapped")) Module["setImmediateWrapped"] = function() { abort("'setImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "clearImmediateWrapped")) Module["clearImmediateWrapped"] = function() { abort("'clearImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "polyfillSetImmediate")) Module["polyfillSetImmediate"] = function() { abort("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "uncaughtExceptionCount")) Module["uncaughtExceptionCount"] = function() { abort("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exceptionLast")) Module["exceptionLast"] = function() { abort("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exceptionCaught")) Module["exceptionCaught"] = function() { abort("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfo")) Module["ExceptionInfo"] = function() { abort("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "CatchInfo")) Module["CatchInfo"] = function() { abort("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exception_addRef")) Module["exception_addRef"] = function() { abort("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exception_decRef")) Module["exception_decRef"] = function() { abort("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = function() { abort("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "funcWrappers")) Module["funcWrappers"] = function() { abort("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setMainLoop")) Module["setMainLoop"] = function() { abort("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "wget")) Module["wget"] = function() { abort("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = function() { abort("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = function() { abort("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = function() { abort("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = function() { abort("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = function() { abort("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "_setNetworkCallback")) Module["_setNetworkCallback"] = function() { abort("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "tempFixedLengthArray")) Module["tempFixedLengthArray"] = function() { abort("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "miniTempWebGLFloatBuffers")) Module["miniTempWebGLFloatBuffers"] = function() { abort("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "heapObjectForWebGLType")) Module["heapObjectForWebGLType"] = function() { abort("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "heapAccessShiftForWebGLHeap")) Module["heapAccessShiftForWebGLHeap"] = function() { abort("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = function() { abort("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = function() { abort("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "computeUnpackAlignedImageSize")) Module["computeUnpackAlignedImageSize"] = function() { abort("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = function() { abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = function() { abort("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglGetUniformLocation")) Module["webglGetUniformLocation"] = function() { abort("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglPrepareUniformLocationsBeforeFirstUse")) Module["webglPrepareUniformLocationsBeforeFirstUse"] = function() { abort("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglGetLeftBracePos")) Module["webglGetLeftBracePos"] = function() { abort("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = function() { abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeGLArray")) Module["writeGLArray"] = function() { abort("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = function() { abort("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = function() { abort("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = function() { abort("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = function() { abort("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = function() { abort("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = function() { abort("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = function() { abort("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = function() { abort("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = function() { abort("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = function() { abort("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = function() { abort("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = function() { abort("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = function() { abort("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = function() { abort("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
Module["writeStackCookie"] = writeStackCookie;
Module["checkStackCookie"] = checkStackCookie;
if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } });
if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } });

var calledRun;

/**
 * @constructor
 * @this {ExitStatus}
 */
function ExitStatus(status) {
  this.name = "ExitStatus";
  this.message = "Program terminated with exit(" + status + ")";
  this.status = status;
}

var calledMain = false;

dependenciesFulfilled = function runCaller() {
  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
  if (!calledRun) run();
  if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
};

function callMain(args) {
  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])');
  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');

  var entryFunction = Module['_main'];

  args = args || [];

  var argc = args.length+1;
  var argv = stackAlloc((argc + 1) * 4);
  HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram);
  for (var i = 1; i < argc; i++) {
    HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]);
  }
  HEAP32[(argv >> 2) + argc] = 0;

  try {

    var ret = entryFunction(argc, argv);

    // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as
    // execution is asynchronously handed off to a pthread.
    // if we're not running an evented main loop, it's time to exit
    exit(ret, /* implicit = */ true);
    return ret;
  }
  catch (e) {
    return handleException(e);
  } finally {
    calledMain = true;

  }
}

function stackCheckInit() {
  // This is normally called automatically during __wasm_call_ctors but need to
  // get these values before even running any of the ctors so we call it redundantly
  // here.
  // TODO(sbc): Move writeStackCookie to native to to avoid this.
  _emscripten_stack_init();
  writeStackCookie();
}

/** @type {function(Array=)} */
function run(args) {
  args = args || arguments_;

  if (runDependencies > 0) {
    return;
  }

  stackCheckInit();

  preRun();

  // a preRun added a dependency, run will be called later
  if (runDependencies > 0) {
    return;
  }

  function doRun() {
    // run may have just been called through dependencies being fulfilled just in this very frame,
    // or while the async setStatus time below was happening
    if (calledRun) return;
    calledRun = true;
    Module['calledRun'] = true;

    if (ABORT) return;

    initRuntime();

    preMain();

    if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();

    if (shouldRunNow) callMain(args);

    postRun();
  }

  if (Module['setStatus']) {
    Module['setStatus']('Running...');
    setTimeout(function() {
      setTimeout(function() {
        Module['setStatus']('');
      }, 1);
      doRun();
    }, 1);
  } else
  {
    doRun();
  }
  checkStackCookie();
}
Module['run'] = run;

function checkUnflushedContent() {
  // Compiler settings do not allow exiting the runtime, so flushing
  // the streams is not possible. but in ASSERTIONS mode we check
  // if there was something to flush, and if so tell the user they
  // should request that the runtime be exitable.
  // Normally we would not even include flush() at all, but in ASSERTIONS
  // builds we do so just for this check, and here we see if there is any
  // content to flush, that is, we check if there would have been
  // something a non-ASSERTIONS build would have not seen.
  // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
  // mode (which has its own special function for this; otherwise, all
  // the code is inside libc)
  var oldOut = out;
  var oldErr = err;
  var has = false;
  out = err = function(x) {
    has = true;
  }
  try { // it doesn't matter if it fails
    var flush = flush_NO_FILESYSTEM;
    if (flush) flush();
  } catch(e) {}
  out = oldOut;
  err = oldErr;
  if (has) {
    warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.');
    warnOnce('(this may also be due to not including full filesystem support - try building with -s FORCE_FILESYSTEM=1)');
  }
}

/** @param {boolean|number=} implicit */
function exit(status, implicit) {
  EXITSTATUS = status;

  checkUnflushedContent();

  if (keepRuntimeAlive()) {
    // if exit() was called, we may warn the user if the runtime isn't actually being shut down
    if (!implicit) {
      var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)';
      err(msg);
    }
  } else {
    exitRuntime();
  }

  procExit(status);
}

function procExit(code) {
  EXITSTATUS = code;
  if (!keepRuntimeAlive()) {
    if (Module['onExit']) Module['onExit'](code);
    ABORT = true;
  }
  quit_(code, new ExitStatus(code));
}

if (Module['preInit']) {
  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
  while (Module['preInit'].length > 0) {
    Module['preInit'].pop()();
  }
}

// shouldRunNow refers to calling main(), not run().
var shouldRunNow = true;

if (Module['noInitialRun']) shouldRunNow = false;

run();

 

'Programming > wasm' 카테고리의 다른 글

wasm text format  (0) 2021.10.26
wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
web assembly  (0) 2021.10.19
Posted by 구차니

댓글을 달아 주세요

Programming/wasm2021. 10. 24. 22:50

hello world 정도만 출력하는 예제를 해보는데

이걸로는 성능이 오르는지 알기 어렵지 않나?

최소한 외부 입력을 받고 리턴하는 것 정도는 찾아봐야 할 듯..

 

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]

[링크 : https://emscripten.org/docs/getting_started/downloads.html]

[링크 : https://wasmbyexample.dev/examples/hello-world/hello-world.c.en-us.html#]

'Programming > wasm' 카테고리의 다른 글

wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
web assembly  (0) 2021.10.19
wasm emcc  (0) 2018.10.24
Posted by 구차니

댓글을 달아 주세요

Programming/wasm2021. 10. 22. 19:35

웹 어셈. 이전에 볼 때는 도대체 왜 이런 쓸데없는 짓을 하는거야!! 했는데

알고보니 jsmpeg에 이미 쓴적이 있던 건 충격..

 

[링크 : https://d2.naver.com/helloworld/8257914]

 

[링크 : https://nodejs.dev/learn/nodejs-with-webassembly]

[링크 : https://nodejs.org/api/wasi.html]

[링크 : https://developers-kr.googleblog.com/2020/03/introducing-webassembly-backend-for-tensorflow-js.html?m=1]

 

'Programming > wasm' 카테고리의 다른 글

wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
web assembly  (0) 2021.10.19
wasm emcc  (0) 2018.10.24
Posted by 구차니

댓글을 달아 주세요

Programming/c# & winform2021. 10. 20. 14:13

abort는 그냥 죽어라! (보장은 안함) 라는 느낌이라면

join은 죽어줄때 까지 기다려 줄께~! 인데

코드 예제를 보면 abort는 서비스로 구성된 while 루프를 죽이고 있고

join은 일회성 쓰레드를 죽이는 예제로 설명되어 있는걸 보면..

맘편하게 abort로 죽어! 해야하려나?

 

[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/destroying-threads]

 

쓰레드 보다는 간접적인 방법을 쓰라고 권장 -_ㅠ

.NET Framework 4부터 다중 스레딩을 사용하는 권장 방법은 TPL(작업 병렬 라이브러리)  PLINQ(병렬 LINQ)를 사용하는 것입니다. 자세한 내용은 병렬 프로그래밍을 참조하세요.

[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/threads-and-threading]

 

 .NET Core는 Thread.Abort 메서드를 지원하지 않습니다. .NET Core에서 강제로 타사 코드 실행을 종료해야 하는 경우 별도의 프로세스에서 실행하고 Process.Kill를 사용합니다.

[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/using-threads-and-threading]

 

obsolete를 사용되지 않는으로 해석해버렸군.

아무튼 abort는 .net 5.0 이후에서는 컴파일 경고가 뜬다고 하니

반강제적으로 TPL이나 PLINQ로 가게 만들려는 정책인듯?

이 메서드는 사용되지 않습니다. .NET 5.0 이상 버전에서이 메서드를 호출 하면 컴파일 타임 경고가 생성 됩니다. 이 메서드는 PlatformNotSupportedException 런타임에 .net 5.0 이상 및 .Net Core에서을 throw 합니다.

[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.abort?view=net-5.0]

 

using System;
using System.Threading;

public class Example
{
   static Thread thread1, thread2;
   
   public static void Main()
   {
      thread1 = new Thread(ThreadProc);
      thread1.Name = "Thread1";
      thread1.Start();
      
      thread2 = new Thread(ThreadProc);
      thread2.Name = "Thread2";
      thread2.Start();   
   }

   private static void ThreadProc()
   {
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      if (Thread.CurrentThread.Name == "Thread1" && 
          thread2.ThreadState != ThreadState.Unstarted)
         if (thread2.Join(TimeSpan.FromSeconds(2)))
            Console.WriteLine("Thread2 has termminated.");
         else
            Console.WriteLine("The timeout has elapsed and Thread1 will resume.");   
      
      Thread.Sleep(4000);
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      Console.WriteLine("Thread1: {0}", thread1.ThreadState);
      Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
   }
}

[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.join?view=net-5.0]

 

using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread newThread  = new Thread(new ThreadStart(TestMethod));
        newThread.Start();
        Thread.Sleep(1000);

        // Abort newThread.
        Console.WriteLine("Main aborting new thread.");
        newThread.Abort("Information from Main.");

        // Wait for the thread to terminate.
        newThread.Join();
        Console.WriteLine("New thread terminated - Main exiting.");
    }

    static void TestMethod()
    {
        try
        {
            while(true)
            {
                Console.WriteLine("New thread running.");
                Thread.Sleep(1000);
            }
        }
        catch(ThreadAbortException abortException)
        {
            Console.WriteLine((string)abortException.ExceptionState);
        }
    }
}

[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.abort?view=net-5.0]

'Programming > c# & winform' 카테고리의 다른 글

winform udp 소켓 여러개  (0) 2021.10.26
c# thread  (0) 2021.10.20
Dispatcher / Control BeginInvoke()  (0) 2021.10.20
this.BeginInvoke()가 느려!  (0) 2021.10.20
크로스 스레드 작업이 잘못되었습니다  (0) 2021.10.19
winform 쓰레드와 소켓  (0) 2021.10.18
Posted by 구차니

댓글을 달아 주세요

Programming/c# & winform2021. 10. 20. 12:21

Control.BeginInvoke()는 .net 1.1 이후에 추가 되었고

Dispatcher.BeginInvoke()는 .net 3.x 이후에 추가 되었다고 하는데

코드에 넣고 빌드해보니

Control.BeginInvoke()는 using System.Threading;을 끌어오고

Dispatcherl.BeginInvoke()는 using System.Windows.Threading 를 끌어온다.

[링크 : https://stackoverflow.com/questions/29775965/what-is-difference-between-control-begininvoke-and-dispatcher-begininvoke]

 

어우 길다 -_-

[링크 : https://docs.microsoft.com/en-us/archive/msdn-magazine/2003/february/give-net-apps-a-fast-and-responsive-ui-with-multiple-threads

 

[링크 : https://stackoverflow.com/questions/10211096/thread-runs-slow-when-invoke-ui-element]

[링크 : https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher.begininvoke?redirectedfrom=MSDN&view=windowsdesktop-5.0#overloads]

[링크 : https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcherpriority?view=windowsdesktop-5.0]

 

[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.forms.control.begininvoke?view=windowsdesktop-5.0]

'Programming > c# & winform' 카테고리의 다른 글

winform udp 소켓 여러개  (0) 2021.10.26
c# thread  (0) 2021.10.20
Dispatcher / Control BeginInvoke()  (0) 2021.10.20
this.BeginInvoke()가 느려!  (0) 2021.10.20
크로스 스레드 작업이 잘못되었습니다  (0) 2021.10.19
winform 쓰레드와 소켓  (0) 2021.10.18
Posted by 구차니

댓글을 달아 주세요

Programming/c# & winform2021. 10. 20. 10:19

invoke()는 동기(blocking) 방식이고

begininvoke()는 비동기인데 메시지 큐에 넣어놓고 하는거 치고는 너무 느린데...

단순하게 키보드로 1,2,3,4 순서로 누르는 것 조차도 커버 못할 정도면

메시지 큐가 아니라 invoke 시퀀스에 먼가 문제가 있는 걸지도?

 

[링크 : https://stackoverflow.com/questions/50084323]

[링크 : https://yunhyeon.tistory.com/379]

'Programming > c# & winform' 카테고리의 다른 글

c# thread  (0) 2021.10.20
Dispatcher / Control BeginInvoke()  (0) 2021.10.20
this.BeginInvoke()가 느려!  (0) 2021.10.20
크로스 스레드 작업이 잘못되었습니다  (0) 2021.10.19
winform 쓰레드와 소켓  (0) 2021.10.18
C# 트레이 아이콘 예제  (0) 2021.10.18
Posted by 구차니

댓글을 달아 주세요