diff options
author | Vijay Marcel <vijaymarcel@outlook.com> | 2024-02-22 21:38:01 +0700 |
---|---|---|
committer | Willy Sudiarto Raharjo <willysr@slackbuilds.org> | 2024-02-23 16:28:11 +0700 |
commit | 7a5c5929f4c121ded607904829df1e6c45118490 (patch) | |
tree | 430752968536b0bde21006fc5e5040abfebebc05 | |
parent | 6bc59c4bc7c9a2bb5058a2b61b3fe695157f9609 (diff) |
multimedia/shine: Updated for version 3.1.1.
Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
-rw-r--r-- | multimedia/shine/fix-bugs.patch | 12394 | ||||
-rw-r--r-- | multimedia/shine/shine.SlackBuild | 27 | ||||
-rw-r--r-- | multimedia/shine/shine.info | 6 |
3 files changed, 12409 insertions, 18 deletions
diff --git a/multimedia/shine/fix-bugs.patch b/multimedia/shine/fix-bugs.patch new file mode 100644 index 0000000000000..8e97a12bce918 --- /dev/null +++ b/multimedia/shine/fix-bugs.patch @@ -0,0 +1,12394 @@ +diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml +new file mode 100644 +index 0000000..500a5f6 +--- /dev/null ++++ b/.github/workflows/ci.yml +@@ -0,0 +1,73 @@ ++name: Build and install ++ ++on: ++ push: ++ branches: [ "main" ] ++ pull_request: ++ ++concurrency: ++ group: ${{ github.workflow }}-${{ github.ref }} ++ cancel-in-progress: true ++ ++jobs: ++ build: ++ runs-on: ${{ matrix.os }} ++ strategy: ++ fail-fast: false ++ matrix: ++ os: [macos-latest, ubuntu-latest] ++ steps: ++ - uses: actions/checkout@v3 ++ - name: Install required packages on macos ++ if: matrix.os == 'macos-latest' ++ run: brew install autoconf automake pkg-config ++ - name: Install required packages on ubuntu ++ if: matrix.os == 'ubuntu-latest' ++ run: sudo apt-get -y install automake autoconf pkg-config ++ - name: bootstrap ++ run: ./bootstrap ++ - name: configure ++ run: ./configure ++ - name: make ++ run: make ++ - name: make install on macos ++ if: matrix.os == 'macos-latest' ++ run: make install ++ - name: make install on ubuntu ++ if: matrix.os == 'ubuntu-latest' ++ run: sudo make install ++ - name: Test pkg-config setup ++ run: pkg-config --libs shine ++ ++ android_build: ++ runs-on: ubuntu-latest ++ steps: ++ - uses: actions/checkout@v3 ++ - uses: nttld/setup-ndk@v1 ++ with: ++ ndk-version: r25b ++ local-cache: true ++ - name: Install autoconf/automake ++ run: sudo apt-get -y install automake autoconf ++ - name: bootstrap ++ run: ./bootstrap ++ - name: configure ++ run: ./configure ++ - name: make android ++ run: make android ++ ++ js_build: ++ runs-on: ubuntu-latest ++ steps: ++ - uses: actions/checkout@v3 ++ - uses: mymindstorm/setup-emsdk@v11 ++ - name: JS build ++ run: | ++ cd js ++ make ++ - uses: actions/setup-node@v3 ++ - name: Run node test ++ run: | ++ cd js/test/node ++ npm install ++ npm run test +diff --git a/.gitignore b/.gitignore +index aa76abe..ffdd74d 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -2,9 +2,9 @@ + obj + libs + compile +-android/lib +-android/include +-android/bin ++android/ ++js/src/post-node.js ++!android/*.mk + shine + shine.pc + m4 +@@ -82,6 +82,6 @@ src/lib/reservoir.o + src/lib/tables.lo + src/lib/tables.o + shine-*.tar.gz +-*.bc ++*.o + *.mp3 + node_modules +diff --git a/ChangeLog b/ChangeLog +index 122dae5..0713282 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,8 @@ ++x.y.z () ++===== ++* Be more specific when enabling MIPS assembly routines. ++* Fix wave header reading on big endian machines (#34) ++ + 3.1.1 (2017-07-28) + ===== + * Remove invalid MPEG 2.5 bitrates. +diff --git a/Makefile.am b/Makefile.am +index bebf32d..538256c 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -26,14 +26,14 @@ pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = shine.pc + + android: +- [ -d android/bin ] || mkdir android/bin + [ -d android/include ] || mkdir android/include +- [ -d android/lib ] || mkdir android/lib +- NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Library.mk +- cp libs/armeabi/libshine.so android/lib ++ [ -d android/lib ] || mkdir android/lib ++ [ -d android/bin ] || mkdir android/bin + cp src/lib/layer3.h android/include ++ NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Library.mk ++ mv libs/* android/lib + NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Binary.mk +- cp libs/armeabi/shineenc android/bin ++ mv libs/* android/bin + + clean-local: + -rm -rf obj libs android/lib android/bin android/include +diff --git a/README.md b/README.md +index 1d30cbd..e9b781a 100644 +--- a/README.md ++++ b/README.md +@@ -2,15 +2,15 @@ Shine: fast fixed-point mp3 encoding + ==================================== + + [shine](https://github.com/savonet/shine) is a blazing fast mp3 encoding library implemented in +-fixed-point arithmetic. The library can thus be used to performe super fast mp3 encoding on architectures +-without a FPU, such as `armel`, etc.. It is also, however, also super fast on architectures with a FPU! ++fixed-point arithmetic. The library can thus be used to perform super fast mp3 encoding on architectures ++without a FPU, such as `armel`, etc.. It is also super fast on architectures with a FPU! + + How to use? + ----------- + + The encoding API should be quite straight forward: + +-``` ++```c + #include <shine/layer3.h> + + (...) +@@ -42,46 +42,47 @@ shine_close(s); + How fast is it? + --------------- + +-On a [Raspberry Pi](http://www.raspberrypi.org/) (`ARM`, `FPU`): ++On a macbook pro (`arm64`/M1 pro, `FPU`, December 30, 2022): + +-Lame, `3m06s`, `1.8x` realtime: +-``` +-pi@raspberrypi ~ $ lame bla.wav bla.mp3 +-LAME 3.99.5 32bits (http://lame.sf.net) ++Lame, `88.7x` realtime: ++```bash ++LAME 3.100 64bits (http://lame.sf.net) + Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz +-Encoding bla.wav to bla.mp3 ++Encoding /tmp/decoded.wav to /tmp/lame.mp3 + Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3 + Frame | CPU time/estim | REAL time/estim | play/CPU | ETA +- 12987/12987 (100%)| 3:06/ 3:06| 3:06/ 3:06| 1.8216x| 0:00 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ++ 12203/12203 (100%)| 0:03/ 0:03| 0:04/ 0:04| 88.773x| 0:00 ++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + kbps LR MS % long switch short % +- 128.0 0.1 99.9 89.1 6.1 4.9 ++ 128.0 32.6 67.4 96.4 1.9 1.7 + Writing LAME Tag...done +-ReplayGain: -10.5dB ++ReplayGain: -9.3dB ++lame -b 128 /tmp/decoded.wav /tmp/lame.mp3 3.55s user 0.05s system 99% cpu 3.609 total + ``` + +-Shine, `1m35s`, `3.6x` realtime: ++Shine, `318.0x` realtime: + ``` +-pi@raspberrypi ~ $ shineenc bla.wav bla.mp3 + shineenc (Liquidsoap version) +-WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39 ++WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:18 + MPEG-I layer III, stereo Psychoacoustic Model: Shine + Bitrate: 128 kbps De-emphasis: none Original +-Encoding "bla.wav" to "bla.mp3" +-Finished in 00:01:35 (3.6x realtime) ++Encoding "/tmp/bla.wav" to "/tmp/shine.mp3" ++Finished in 00:00:01 (318.0x realtime) + ``` + +-Now, on a mac airbook (`x86_64`, `FPU`): ++### ⚠ The following are outdated tests ⚠ + +-Lame, `15s`, `22x` realtime: +-``` +-toots@zulu tmp % lame bla.wav bla.mp3 +-LAME 3.99.5 64bits (http://lame.sf.net) ++On a [Raspberry Pi](http://www.raspberrypi.org/) (`ARM`, `FPU`): ++ ++Lame, `1.8x` realtime: ++```bash ++pi@raspberrypi ~ $ lame bla.wav bla.mp3 ++LAME 3.99.5 32bits (http://lame.sf.net) + Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz + Encoding bla.wav to bla.mp3 + Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3 + Frame | CPU time/estim | REAL time/estim | play/CPU | ETA +- 12987/12987 (100%)| 0:15/ 0:15| 0:17/ 0:17| 22.087x| 0:00 ++ 12987/12987 (100%)| 3:06/ 3:06| 3:06/ 3:06| 1.8216x| 0:00 + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + kbps LR MS % long switch short % + 128.0 0.1 99.9 89.1 6.1 4.9 +@@ -89,20 +90,21 @@ Writing LAME Tag...done + ReplayGain: -10.5dB + ``` + +-Shine, `9s`, `37.7x` realtime: +-``` ++Shine, `3.6x` realtime: ++```bash ++pi@raspberrypi ~ $ shineenc bla.wav bla.mp3 + shineenc (Liquidsoap version) + WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39 + MPEG-I layer III, stereo Psychoacoustic Model: Shine + Bitrate: 128 kbps De-emphasis: none Original +-Encoding "/tmp/bla.wav" to "/tmp/bla.mp3" +-Finished in 00:00:09 (37.7x realtime) ++Encoding "bla.wav" to "bla.mp3" ++Finished in 00:01:35 (3.6x realtime) + ``` + + On a Google Nexus 5 (`ARM`, `FPU`): + + Shine, `14s`, `24.2x` realtime: +-``` ++```bash + u0_a65@hammerhead:/mnt/sdcard $ shineenc bla.wav bla.mp3 + shineenc (Liquidsoap version) + WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39 +@@ -128,7 +130,7 @@ A bit of history + This code was dug out from the dusty crates of those times before internet + and github. It apparently was created by Gabriel Bouvigne sometime around + the end of the 20th century. The encoder was converted circa 2001 by Pete +-Everett to fixed-point arithmetic for the RISC OS. Latest we know, Patrick ++Everett to fixed-point arithmetic for the RISC OS. Last we know, Patrick + Roberts had worked on the code to make it multi-platform and more library + oriented. That was around 2006. + +diff --git a/configure.ac b/configure.ac +index 87a5f68..6d6cb23 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1,6 +1,7 @@ +-AC_INIT([shine],[3.1.0],[savonet-users@lists.sourceforge.net]) ++AC_INIT([shine],[3.1.1],[toots@rastageeks.org]) + AM_INIT_AUTOMAKE([subdir-objects]) + LT_INIT + AC_CONFIG_MACRO_DIR([m4]) + AC_C_BIGENDIAN([CFLAGS="$CFLAGS -DSHINE_BIG_ENDIAN"]) ++AC_CHECK_HEADER([byteswap.h],[CFLAGS="$CFLAGS -DSHINE_HAVE_BSWAP_H"]) + AC_OUTPUT([Makefile shine.pc]) +diff --git a/js/.npmignore b/js/.npmignore +new file mode 100644 +index 0000000..f1b84a5 +--- /dev/null ++++ b/js/.npmignore +@@ -0,0 +1,4 @@ ++test/ ++src/ ++Makefile ++.* +diff --git a/js/.prettierignore b/js/.prettierignore +new file mode 100644 +index 0000000..1b64941 +--- /dev/null ++++ b/js/.prettierignore +@@ -0,0 +1,5 @@ ++.next/ ++dist/ ++stubs/ ++public/audio ++__ENV.js +diff --git a/js/.prettierrc b/js/.prettierrc +new file mode 100644 +index 0000000..a995c49 +--- /dev/null ++++ b/js/.prettierrc +@@ -0,0 +1,12 @@ ++{ ++ "singleQuote": false, ++ "quoteProps": "as-needed", ++ "arrowParens": "avoid", ++ "tabWidth": 2, ++ "trailingComma": "es5", ++ "semi": true, ++ "jsxSingleQuote": true, ++ "bracketSameLine": false, ++ "printWidth": 120, ++ "parser": "typescript" ++} +diff --git a/js/Makefile b/js/Makefile +index 465ffde..3781b6e 100644 +--- a/js/Makefile ++++ b/js/Makefile +@@ -1,24 +1,37 @@ + # Emscriptem compilation + + EMCC:=emcc +-EXPORTED_FUNCTIONS:='["_shine_check_config", "_shine_js_init",\ ++EXPORTED_FUNCTIONS:='["_malloc", "_free", "_shine_check_config", "_shine_js_init",\ ++ "_shine_js_int16_len", "_shine_js_ptr_len", \ + "_shine_samples_per_pass", "_shine_encode_buffer",\ +- "_shine_flush", "_shine_close"]' ++ "_shine_flush", "_shine_close"]' + CFLAGS:=-O3 +-LINKFLAGS:=-s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS) --memory-init-file 0 $(CFLAGS) ++LINKFLAGS:=-s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS) -s SINGLE_FILE=1 -s EXPORTED_RUNTIME_METHODS=setValue,getValue --memory-init-file 0 $(CFLAGS) ++WEB_LINKFLAGS:=$(LINKFLAGS) -s ENVIRONMENT='web' -s EXPORT_NAME='createModule' -s USE_ES6_IMPORT_META=0 + + C_FILES:=$(wildcard ../src/lib/*.c) src/wrapper.c + HEADER_FILES:=$(wildcard ../src/lib/*.h) + SOURCES:=$(C_FILES) $(HEADER_FILES) +-OBJECTS:=$(C_FILES:%.c=%.bc) ++OBJECTS:=$(C_FILES:%.c=%.o) + +-all: dist/libshine.js ++all: dist/libshine_node.js dist/libshine_browser.js + +-dist/libshine.js: $(SOURCES) $(OBJECTS) src/pre.js src/post.js +- $(EMCC) $(LINKFLAGS) --pre-js src/pre.js --post-js src/post.js $(OBJECTS) -o $@ ++src/post-node.js: src/libshine_class.js src/libshine_node_wrapper.js ++ rm -f src/post-node.js ++ cat src/libshine_class.js src/libshine_node_wrapper.js > src/post-node.js + +-%.bc: %.c ++dist/libshine_node.js: $(SOURCES) $(OBJECTS) src/post-node.js ++ $(EMCC) $(LINKFLAGS) --post-js src/post-node.js $(OBJECTS) -o dist/libshine_node.js ++ ++dist/libshine_browser_stubs.js: $(SOURCES) $(OBJECTS) ++ $(EMCC) $(WEB_LINKFLAGS) $(OBJECTS) -o dist/libshine_browser_stubs.mjs ++ mv dist/libshine_browser_stubs.mjs dist/libshine_browser_stubs.js ++ ++dist/libshine_browser.js: src/libshine_class.js src/libshine_browser_wrapper.js dist/libshine_browser_stubs.js ++ cat src/libshine_class.js src/libshine_browser_wrapper.js > dist/libshine_browser.js ++ ++%.o: %.c + $(EMCC) $(CFLAGS) -I../src/lib -c $< -o $@ + + clean: +- rm -f *.bc ../src/lib/*.bc ++ rm -rf *.o ../src/lib/*.o dist/libshine*js +diff --git a/js/README.md b/js/README.md +index 49ca3f6..d521d4b 100644 +--- a/js/README.md ++++ b/js/README.md +@@ -1,112 +1,156 @@ + Shine encoder library for Javascript + ==================================== + +-This directory contains a build of shine for Javascript using +-[kripken/emscripten](https://github.com/kripken/emscripten) and +-located in `dist/libshine.js` ++This package contains a build of the [shine](https://github.com/toots/shine) fixed-point ++mp3 encoder compiled for Javascript and wasm using [emscripten-core/emscripten](https://github.com/emscripten-core/emscripten). ++ ++Install ++------- ++ ++Using `npm`: ++ ++```shell ++npm install @toots/shine.js ++``` ++ ++Using `yarn`: ++ ++```shell ++yarn add @toots/shine.js ++``` ++ ++Using `pnpm`: ++ ++```shell ++pnpm install @toots/shine.js ++``` ++ ++In a HTML page: ++ ++When using `webpack`, the package should point to the correct ++`libshine_browser.js` file automatically. ++ ++When using directly as a script, you can load the `libshine_node.js` ++file as: ++ ++```html ++<script src="libshine_node.js"></script> ++``` ++ ++See: [test/browser](https://github.com/toots/shine/tree/main/js/test/browser) for an example. + + How to use? + ----------- + + The encoding API should be quite straight forward: + +-``` +-shine = new Shine({ +- samplerate: 44100, +- bitrate: 128, +- channels: 2, +- mode: Shine.STEREO +-}); ++```js ++import { Shine, StereoModel } from "@toots/shine.js"; ++ ++const exec = async () => { ++ await Shine.initialized; ++ ++ shine = new Shine({ ++ samplerate: 44100, ++ bitrate: 128, ++ channels: 2, ++ stereoModel: StereoModel.STEREO ++ }); + +-// All the magic happens here +-while (..) { +- // data here is an array of channels. +- // Channels must have the same number of samples +- // and both be either Int16Array or Float32Array. +- encoded = shine.encode(data); ++ // All the magic happens here ++ while (..) { ++ // data here is an array of channels. ++ // Channels must have the same number of samples ++ // and both be either Int16Array or Float32Array. ++ encoded = shine.encode(data); ++ ... ++ } ++ ++ // Close and get remaining data. ++ flushed = shine.close(); ++ + ... + } + +-// Close and get remaining data. +-flushed = shine.close(); +-... ++exec(); + ``` + + How fast is it? + --------------- + +-You can run the test suite located in `test/`. As of now (26/07/2014), only firefox +-and seems to show performances decent enough for real-time encoding while Google Chrome +-can encode between 1X and 2X. ++You can run the test suite located in `test/`. Encoding rate above `1X` means that ++the browser should be suitable for real-time encoding. ++ ++Results, as of December 30, 2022: + +-Chrome: ++Chrome (`108.0.5359.124`): + ``` + Executing encoding test + Got WAV file. + Encoding.. + Done encoding. + File duration: 5.57 seconds +-Encoding time: 5.18 seconds +-Encoding rate: 1.08X ++Encoding time: 0.08 seconds ++Encoding rate: 67.96X + + Executing rounds test + Encoding 50 buffers of 4096 samples + Done encoding + Total duration: 4.64 +-Encoding time: 2.73 +-Encoding rate: 1.70X ++Encoding time: 0.03 ++Encoding rate: 160.00X + ``` + +-Firefox: ++Firefox (`108.0.1`): + ``` + Executing encoding test + Got WAV file. + Encoding.. + Done encoding. + File duration: 5.57 seconds +-Encoding time: 1.48 seconds +-Encoding rate: 3.76X ++Encoding time: 0.06 seconds ++Encoding rate: 99.52X + + Executing rounds test + Encoding 50 buffers of 4096 samples + Done encoding + Total duration: 4.64 +-Encoding time: 0.98 +-Encoding rate: 4.72X ++Encoding time: 0.03 ++Encoding rate: 178.46X + ``` + +-Safari: ++Safari (`16.2`): + ``` + Executing encoding test + Got WAV file. + Encoding.. + Done encoding. + File duration: 5.57 seconds +-Encoding time: 11.77 seconds +-Encoding rate: 0.47X ++Encoding time: 0.12 seconds ++Encoding rate: 46.44X + + Executing rounds test + Encoding 50 buffers of 4096 samples + Done encoding + Total duration: 4.64 +-Encoding time: 6.93 +-Encoding rate: 0.67X ++Encoding time: 0.02 ++Encoding rate: 210.91X + ``` + +-NodeJS, v0.10.24: ++NodeJS (`v19.3.0`): + ``` + Executing encoding test + Got WAV file. + Encoding.. + Done encoding. + File duration: 5.57 seconds +-Encoding time: 22.57 seconds +-Encoding rate: 0.25X ++Encoding time: 0.06 seconds ++Encoding rate: 94.45X + + Executing rounds test + Encoding 50 buffers of 4096 samples + Done encoding + Total duration: 4.64 +-Encoding time: 11.46 +-Encoding rate: 0.40X ++Encoding time: 0.03 ++Encoding rate: 178.46X + ``` +diff --git a/js/dist/libshine.js b/js/dist/libshine.js +deleted file mode 100644 +index c44f119..0000000 +--- a/js/dist/libshine.js ++++ /dev/null +@@ -1,16 +0,0 @@ +-var Shine=(function(){var context={};return(function(){var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function shell_read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(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 Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return"$"+i}));var funcstr="(function("+argNames.join(",")+") {";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+="var stack = "+JSsource["stackSave"].body+";";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type==="number")continue;var convertCode=JSsource[type+"ToC"];funcstr+="var "+convertCode.arguments+" = "+arg+";";funcstr+=convertCode.body+";";funcstr+=arg+"=("+convertCode.returnValue+");"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+="var ret = "+cfuncname+"("+argNames.join(",")+");";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+="ret = "+strgfy+"(ret);"}if(!numericArgs){ensureJSsource();funcstr+=JSsource["stackRestore"].body.replace("()","(stack)")+";"}funcstr+="return ret})";return eval(funcstr)}}))();Module["ccall"]=ccall;Module["cwrap"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;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 HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr==="function"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module["allocate"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module["getMemory"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}Module["stackTrace"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw"Runtime error: expected the system to be little-endian!";Module["HEAP"]=HEAP;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8;Module["HEAP16"]=HEAP16;Module["HEAP32"]=HEAP32;Module["HEAPU8"]=HEAPU8;Module["HEAPU16"]=HEAPU16;Module["HEAPU32"]=HEAPU32;Module["HEAPF32"]=HEAPF32;Module["HEAPF64"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+10560;__ATINIT__.push();allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,104,18,0,0,108,29,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,112,18,0,0,112,29,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,130,18,0,0,121,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,148,18,0,0,130,29,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,180,18,0,0,146,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,212,18,0,0,162,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,28,19,0,0,198,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,100,19,0,0,234,29,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,172,19,0,0,14,30,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,44,20,0,0,78,30,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,172,20,0,0,142,30,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,21,0,0,206,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,23,0,0,206,31,0,0,16,0,0,0,16,0,0,0,1,0,0,0,1,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,2,0,0,0,3,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,3,0,0,0,7,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,4,0,0,0,15,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,6,0,0,0,63,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,8,0,0,0,255,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,10,0,0,0,255,3,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,13,0,0,0,255,31,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,4,0,0,0,15,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,5,0,0,0,31,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,6,0,0,0,63,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,7,0,0,0,127,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,8,0,0,0,255,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,9,0,0,0,255,1,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,11,0,0,0,255,7,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,13,0,0,0,255,31,0,0,44,27,0,0,206,33,0,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,29,0,0,206,34,0,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,76,29,0,0,222,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,4,0,0,0,5,0,0,0,4,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,7,0,0,0,6,0,0,0,7,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,6,0,0,0,11,0,0,0,16,0,0,0,21,0,0,0,1,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,68,172,0,0,128,187,0,0,0,125,0,0,34,86,0,0,192,93,0,0,128,62,0,0,17,43,0,0,224,46,0,0,64,31,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,8,0,0,0,255,255,255,255,8,0,0,0,32,0,0,0,16,0,0,0,255,255,255,255,16,0,0,0,40,0,0,0,24,0,0,0,255,255,255,255,24,0,0,0,48,0,0,0,32,0,0,0,255,255,255,255,32,0,0,0,56,0,0,0,40,0,0,0,255,255,255,255,40,0,0,0,64,0,0,0,48,0,0,0,255,255,255,255,48,0,0,0,80,0,0,0,56,0,0,0,255,255,255,255,56,0,0,0,96,0,0,0,64,0,0,0,255,255,255,255,64,0,0,0,112,0,0,0,255,255,255,255,255,255,255,255,80,0,0,0,128,0,0,0,255,255,255,255,255,255,255,255,96,0,0,0,160,0,0,0,255,255,255,255,255,255,255,255,112,0,0,0,192,0,0,0,255,255,255,255,255,255,255,255,128,0,0,0,224,0,0,0,255,255,255,255,255,255,255,255,144,0,0,0,0,1,0,0,255,255,255,255,255,255,255,255,160,0,0,0,64,1,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,52,0,0,0,62,0,0,0,74,0,0,0,90,0,0,0,110,0,0,0,134,0,0,0,162,0,0,0,196,0,0,0,238,0,0,0,32,1,0,0,86,1,0,0,162,1,0,0,64,2,0,0,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,42,0,0,0,50,0,0,0,60,0,0,0,72,0,0,0,88,0,0,0,106,0,0,0,128,0,0,0,156,0,0,0,190,0,0,0,230,0,0,0,20,1,0,0,74,1,0,0,128,1,0,0,64,2,0,0,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,82,0,0,0,102,0,0,0,126,0,0,0,156,0,0,0,194,0,0,0,240,0,0,0,40,1,0,0,108,1,0,0,192,1,0,0,38,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,114,0,0,0,136,0,0,0,162,0,0,0,194,0,0,0,232,0,0,0,22,1,0,0,74,1,0,0,138,1,0,0,208,1,0,0,28,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,45,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,248,0,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,12,0,0,0,24,0,0,0,36,0,0,0,48,0,0,0,60,0,0,0,72,0,0,0,88,0,0,0,108,0,0,0,132,0,0,0,160,0,0,0,192,0,0,0,232,0,0,0,24,1,0,0,80,1,0,0,144,1,0,0,220,1,0,0,54,2,0,0,56,2,0,0,58,2,0,0,60,2,0,0,62,2,0,0,64,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,58,239,255,255,58,239,255,255,58,239,255,255,58,239,255,255,214,230,255,255,214,230,255,255,214,230,255,255,115,222,255,255,115,222,255,255,15,214,255,255,15,214,255,255,172,205,255,255,72,197,255,255,229,188,255,255,229,188,255,255,129,180,255,255,30,172,255,255,186,163,255,255,87,155,255,255,144,138,255,255,44,130,255,255,101,113,255,255,2,105,255,255,59,88,255,255,215,79,255,255,16,63,255,255,73,46,255,255,31,21,255,255,88,4,255,255,145,243,254,255,103,218,254,255,60,193,254,255,18,168,254,255,75,151,254,255,32,126,254,255,146,92,254,255,104,67,254,255,61,42,254,255,175,8,254,255,133,239,253,255,91,214,253,255,205,180,253,255,162,155,253,255,20,122,253,255,134,88,253,255,92,63,253,255,49,38,253,255,163,4,253,255,221,243,252,255,178,218,252,255,136,193,252,255,163,87,3,0,106,104,3,0,49,121,3,0,148,129,3,0,248,137,3,0,91,146,3,0,91,146,3,0,248,137,3,0,148,129,3,0,205,112,3,0,6,96,3,0,120,62,3,0,234,28,3,0,249,242,2,0,164,192,2,0,79,142,2,0,51,75,2,0,180,255,1,0,209,171,1,0,139,79,1,0,126,226,0,0,112,117,0,0,157,247,255,255,101,113,255,255,202,226,254,255,104,67,254,255,162,155,253,255,121,235,252,255,236,50,252,255,153,105,251,255,226,151,250,255,199,189,249,255,230,210,248,255,4,232,247,255,92,236,246,255,80,232,245,255,68,228,244,255,212,215,243,255,1,195,242,255,203,165,241,255,49,128,240,255,250,98,239,255,96,61,238,255,198,23,237,255,45,242,235,255,147,204,234,255,92,175,233,255,137,154,232,255,182,133,231,255,71,121,230,255,59,117,229,255,246,129,228,255,120,159,227,255,93,197,226,255,109,4,226,255,68,84,225,255,69,189,224,255,113,63,224,255,199,218,223,255,171,151,223,255,186,109,223,255,86,101,223,255,129,126,223,255,157,193,223,255,86,209,31,0,187,66,31,0,203,129,30,0,233,150,29,0,179,121,28,0,39,42,27,0,171,176,25,0,118,252,23,0,235,21,22,0,13,253,19,0,117,169,17,0,236,43,15,0,72,107,12,0,235,111,9,0,156,74,6,0,50,226,2,0,215,79,255,255,195,130,251,255,247,122,247,255,57,73,243,255,38,229,238,255,190,78,234,255,101,142,229,255,27,164,224,255,66,152,219,255,120,98,214,255,132,19,209,255,2,163,203,255,85,25,198,255,69,135,192,255,10,220,186,255,207,48,181,255,49,125,175,255,147,201,169,255,188,38,164,255,72,140,158,255,255,10,153,255,224,162,147,255,179,100,142,255,19,72,137,255,44,102,132,255,254,190,127,255,135,82,123,255,144,49,119,255,124,100,115,255,174,243,111,255,39,223,108,255,16,64,106,255,163,5,104,255,11,73,102,255,170,18,101,255,129,98,100,255,86,73,100,255,42,199,100,255,97,228,101,255,93,169,103,255,130,30,106,255,52,76,109,255,115,50,113,255,5,226,117,255,135,82,123,255,93,140,129,255,78,160,136,255,245,133,144,255,73,186,102,0,9,24,93,0,17,164,82,0,56,69,71,0,226,3,59,0,13,224,45,0,86,209,31,0,133,232,16,0,210,20,1,0,6,103,240,255,187,214,222,255,85,108,204,255,213,39,185,255,1,26,165,255,118,58,144,255,151,145,122,255,200,39,100,255,109,5,77,255,232,50,53,255,58,176,28,255,142,150,3,255,227,229,233,254,156,166,207,254,130,233,180,254,90,191,153,254,37,40,126,254,169,52,98,254,18,254,69,254,251,123,41,254,243,207,12,254,92,2,240,253,255,35,211,253,63,61,182,253,226,94,153,253,19,162,124,253,209,6,96,253,172,174,67,253,163,153,39,253,67,233,11,253,141,157,240,252,171,207,213,252,1,136,187,252,86,215,161,252,212,214,136,252,223,142,112,252,218,7,89,252,239,90,66,252,130,144,44,252,247,176,23,252,120,213,3,252,105,6,241,251,44,76,223,251,38,175,206,251,29,64,191,251,117,7,177,251,145,13,164,251,214,90,152,251,165,247,141,251,0,228,132,251,174,48,125,251,173,221,118,251,255,234,113,251,7,97,110,251,197,63,108,251,200,120,148,4,59,192,147,4,249,158,145,4,1,21,142,4,83,34,137,4,82,207,130,4,0,28,123,4,91,8,114,4,42,165,103,4,111,242,91,4,139,248,78,4,227,191,64,4,218,80,49,4,212,179,32,4,151,249,14,4,136,42,252,3,9,79,232,3,126,111,211,3,17,165,189,3,38,248,166,3,33,113,143,3,44,41,119,3,170,40,94,3,255,119,68,3,85,48,42,3,115,98,15,3,189,22,244,2,93,102,216,2,84,81,188,2,47,249,159,2,237,93,131,2,30,161,102,2,193,194,73,2,1,220,44,2,164,253,15,2,13,48,243,1,5,132,214,1,238,1,186,1,87,203,157,1,219,215,129,1,166,64,102,1,126,22,75,1,100,89,48,1,29,26,22,1,114,105,252,0,198,79,227,0,24,205,202,0,147,250,178,0,56,216,155,0,105,110,133,0,138,197,111,0,255,229,90,0,43,216,70,0,171,147,51,0,69,41,33,0,250,152,15,0,46,235,254,255,123,23,239,255,170,46,224,255,243,31,210,255,30,252,196,255,200,186,184,255,239,91,173,255,247,231,162,255,73,186,102,0,11,122,111,0,178,95,119,0,163,115,126,0,121,173,132,0,251,29,138,0,141,205,142,0,204,179,146,0,126,225,149,0,163,86,152,0,159,27,154,0,214,56,155,0,170,182,155,0,127,157,155,0,86,237,154,0,245,182,153,0,93,250,151,0,240,191,149,0,217,32,147,0,82,12,144,0,132,155,140,0,112,206,136,0,121,173,132,0,2,65,128,0,212,153,123,0,237,183,118,0,77,155,113,0,32,93,108,0,1,245,102,0,184,115,97,0,68,217,91,0,109,54,86,0,207,130,80,0,49,207,74,0,246,35,69,0,187,120,63,0,171,230,57,0,254,92,52,0,124,236,46,0,136,157,41,0,190,103,36,0,229,91,31,0,155,113,26,0,66,177,21,0,218,26,17,0,199,182,12,0,9,133,8,0,61,125,4,0,41,176,0,0,206,29,253,255,100,181,249,255,21,144,246,255,184,148,243,255,20,212,240,255,139,86,238,255,243,2,236,255,21,234,233,255,138,3,232,255,85,79,230,255,217,213,228,255,77,134,227,255,23,105,226,255,53,126,225,255,69,189,224,255,86,209,31,0,99,62,32,0,127,129,32,0,170,154,32,0,70,146,32,0,85,104,32,0,57,37,32,0,143,192,31,0,187,66,31,0,188,171,30,0,147,251,29,0,163,58,29,0,136,96,28,0,10,126,27,0,197,138,26,0,185,134,25,0,74,122,24,0,119,101,23,0,164,80,22,0,109,51,21,0,211,13,20,0,58,232,18,0,160,194,17,0,6,157,16,0,207,127,15,0,53,90,14,0,255,60,13,0,44,40,12,0,188,27,11,0,176,23,10,0,164,19,9,0,252,23,8,0,26,45,7,0,57,66,6,0,30,104,5,0,103,150,4,0,20,205,3,0,135,20,3,0,94,100,2,0,152,188,1,0,54,29,1,0,155,142,0,0,99,8,0,0,144,138,255,255,130,29,255,255,117,176,254,255,47,84,254,255,76,0,254,255,205,180,253,255,177,113,253,255,92,63,253,255,7,13,253,255,22,227,252,255,136,193,252,255,250,159,252,255,51,143,252,255,108,126,252,255,8,118,252,255,165,109,252,255,165,109,252,255,8,118,252,255,108,126,252,255,207,134,252,255,150,151,252,255,163,87,3,0,120,62,3,0,78,37,3,0,35,12,3,0,93,251,2,0,207,217,2,0,164,192,2,0,122,167,2,0,236,133,2,0,94,100,2,0,51,75,2,0,165,41,2,0,123,16,2,0,81,247,1,0,195,213,1,0,152,188,1,0,110,163,1,0,224,129,1,0,181,104,1,0,238,87,1,0,196,62,1,0,153,37,1,0,111,12,1,0,168,251,0,0,225,234,0,0,183,209,0,0,240,192,0,0,41,176,0,0,197,167,0,0,254,150,0,0,155,142,0,0,212,125,0,0,112,117,0,0,169,100,0,0,70,92,0,0,226,83,0,0,127,75,0,0,27,67,0,0,27,67,0,0,184,58,0,0,84,50,0,0,241,41,0,0,241,41,0,0,141,33,0,0,141,33,0,0,42,25,0,0,42,25,0,0,42,25,0,0,198,16,0,0,198,16,0,0,198,16,0,0,198,16,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,52,37,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,0,0,1,0,1,0,1,0,0,0,1,0,2,0,1,0,3,0,1,0,1,0,3,0,2,0,0,0,3,0,2,0,1,0,1,0,1,0,1,0,3,0,2,0,0,0,1,0,2,0,6,0,5,0,3,0,1,0,4,0,4,0,7,0,5,0,7,0,1,0,6,0,1,0,1,0,0,0,7,0,3,0,5,0,1,0,6,0,2,0,3,0,2,0,5,0,4,0,4,0,1,0,3,0,3,0,2,0,0,0,1,0,2,0,10,0,19,0,16,0,10,0,3,0,3,0,7,0,10,0,5,0,3,0,11,0,4,0,13,0,17,0,8,0,4,0,12,0,11,0,18,0,15,0,11,0,2,0,7,0,6,0,9,0,14,0,3,0,1,0,6,0,4,0,5,0,3,0,2,0,0,0,3,0,4,0,6,0,18,0,12,0,5,0,5,0,1,0,2,0,16,0,9,0,3,0,7,0,3,0,5,0,14,0,7,0,3,0,19,0,17,0,15,0,13,0,10,0,4,0,13,0,5,0,8,0,11,0,5,0,1,0,12,0,4,0,4,0,1,0,1,0,0,0,7,0,5,0,9,0,14,0,15,0,7,0,6,0,4,0,5,0,5,0,6,0,7,0,7,0,6,0,8,0,8,0,8,0,5,0,15,0,6,0,9,0,10,0,5,0,1,0,11,0,7,0,9,0,6,0,4,0,1,0,14,0,4,0,6,0,2,0,6,0,0,0,1,0,2,0,10,0,23,0,35,0,30,0,12,0,17,0,3,0,3,0,8,0,12,0,18,0,21,0,12,0,7,0,11,0,9,0,15,0,21,0,32,0,40,0,19,0,6,0,14,0,13,0,22,0,34,0,46,0,23,0,18,0,7,0,20,0,19,0,33,0,47,0,27,0,22,0,9,0,3,0,31,0,22,0,41,0,26,0,21,0,20,0,5,0,3,0,14,0,13,0,10,0,11,0,16,0,6,0,5,0,1,0,9,0,8,0,7,0,8,0,4,0,4,0,2,0,0,0,3,0,4,0,10,0,24,0,34,0,33,0,21,0,15,0,5,0,3,0,4,0,10,0,32,0,17,0,11,0,10,0,11,0,7,0,13,0,18,0,30,0,31,0,20,0,5,0,25,0,11,0,19,0,59,0,27,0,18,0,12,0,5,0,35,0,33,0,31,0,58,0,30,0,16,0,7,0,5,0,28,0,26,0,32,0,19,0,17,0,15,0,8,0,14,0,14,0,12,0,9,0,13,0,14,0,9,0,4,0,1,0,11,0,4,0,6,0,6,0,6,0,3,0,2,0,0,0,9,0,6,0,16,0,33,0,41,0,39,0,38,0,26,0,7,0,5,0,6,0,9,0,23,0,16,0,26,0,11,0,17,0,7,0,11,0,14,0,21,0,30,0,10,0,7,0,17,0,10,0,15,0,12,0,18,0,28,0,14,0,5,0,32,0,13,0,22,0,19,0,18,0,16,0,9,0,5,0,40,0,17,0,31,0,29,0,17,0,13,0,4,0,2,0,27,0,12,0,11,0,15,0,10,0,7,0,4,0,1,0,27,0,12,0,8,0,12,0,6,0,3,0,1,0,0,0,1,0,5,0,14,0,21,0,34,0,51,0,46,0,71,0,42,0,52,0,68,0,52,0,67,0,44,0,43,0,19,0,3,0,4,0,12,0,19,0,31,0,26,0,44,0,33,0,31,0,24,0,32,0,24,0,31,0,35,0,22,0,14,0,15,0,13,0,23,0,36,0,59,0,49,0,77,0,65,0,29,0,40,0,30,0,40,0,27,0,33,0,42,0,16,0,22,0,20,0,37,0,61,0,56,0,79,0,73,0,64,0,43,0,76,0,56,0,37,0,26,0,31,0,25,0,14,0,35,0,16,0,60,0,57,0,97,0,75,0,114,0,91,0,54,0,73,0,55,0,41,0,48,0,53,0,23,0,24,0,58,0,27,0,50,0,96,0,76,0,70,0,93,0,84,0,77,0,58,0,79,0,29,0,74,0,49,0,41,0,17,0,47,0,45,0,78,0,74,0,115,0,94,0,90,0,79,0,69,0,83,0,71,0,50,0,59,0,38,0,36,0,15,0,72,0,34,0,56,0,95,0,92,0,85,0,91,0,90,0,86,0,73,0,77,0,65,0,51,0,44,0,43,0,42,0,43,0,20,0,30,0,44,0,55,0,78,0,72,0,87,0,78,0,61,0,46,0,54,0,37,0,30,0,20,0,16,0,53,0,25,0,41,0,37,0,44,0,59,0,54,0,81,0,66,0,76,0,57,0,54,0,37,0,18,0,39,0,11,0,35,0,33,0,31,0,57,0,42,0,82,0,72,0,80,0,47,0,58,0,55,0,21,0,22,0,26,0,38,0,22,0,53,0,25,0,23,0,38,0,70,0,60,0,51,0,36,0,55,0,26,0,34,0,23,0,27,0,14,0,9,0,7,0,34,0,32,0,28,0,39,0,49,0,75,0,30,0,52,0,48,0,40,0,52,0,28,0,18,0,17,0,9,0,5,0,45,0,21,0,34,0,64,0,56,0,50,0,49,0,45,0,31,0,19,0,12,0,15,0,10,0,7,0,6,0,3,0,48,0,23,0,20,0,39,0,36,0,35,0,53,0,21,0,16,0,23,0,13,0,10,0,6,0,1,0,4,0,2,0,16,0,15,0,17,0,27,0,25,0,20,0,29,0,11,0,17,0,12,0,16,0,8,0,1,0,1,0,0,0,1,0,7,0,12,0,18,0,53,0,47,0,76,0,124,0,108,0,89,0,123,0,108,0,119,0,107,0,81,0,122,0,63,0,13,0,5,0,16,0,27,0,46,0,36,0,61,0,51,0,42,0,70,0,52,0,83,0,65,0,41,0,59,0,36,0,19,0,17,0,15,0,24,0,41,0,34,0,59,0,48,0,40,0,64,0,50,0,78,0,62,0,80,0,56,0,33,0,29,0,28,0,25,0,43,0,39,0,63,0,55,0,93,0,76,0,59,0,93,0,72,0,54,0,75,0,50,0,29,0,52,0,22,0,42,0,40,0,67,0,57,0,95,0,79,0,72,0,57,0,89,0,69,0,49,0,66,0,46,0,27,0,77,0,37,0,35,0,66,0,58,0,52,0,91,0,74,0,62,0,48,0,79,0,63,0,90,0,62,0,40,0,38,0,125,0,32,0,60,0,56,0,50,0,92,0,78,0,65,0,55,0,87,0,71,0,51,0,73,0,51,0,70,0,30,0,109,0,53,0,49,0,94,0,88,0,75,0,66,0,122,0,91,0,73,0,56,0,42,0,64,0,44,0,21,0,25,0,90,0,43,0,41,0,77,0,73,0,63,0,56,0,92,0,77,0,66,0,47,0,67,0,48,0,53,0,36,0,20,0,71,0,34,0,67,0,60,0,58,0,49,0,88,0,76,0,67,0,106,0,71,0,54,0,38,0,39,0,23,0,15,0,109,0,53,0,51,0,47,0,90,0,82,0,58,0,57,0,48,0,72,0,57,0,41,0,23,0,27,0,62,0,9,0,86,0,42,0,40,0,37,0,70,0,64,0,52,0,43,0,70,0,55,0,42,0,25,0,29,0,18,0,11,0,11,0,118,0,68,0,30,0,55,0,50,0,46,0,74,0,65,0,49,0,39,0,24,0,16,0,22,0,13,0,14,0,7,0,91,0,44,0,39,0,38,0,34,0,63,0,52,0,45,0,31,0,52,0,28,0,19,0,14,0,8,0,9,0,3,0,123,0,60,0,58,0,53,0,47,0,43,0,32,0,22,0,37,0,24,0,17,0,12,0,15,0,10,0,2,0,1,0,71,0,37,0,34,0,30,0,28,0,20,0,17,0,26,0,21,0,16,0,10,0,6,0,8,0,6,0,2,0,0,0,1,0,5,0,14,0,44,0,74,0,63,0,110,0,93,0,172,0,149,0,138,0,242,0,225,0,195,0,120,1,17,0,3,0,4,0,12,0,20,0,35,0,62,0,53,0,47,0,83,0,75,0,68,0,119,0,201,0,107,0,207,0,9,0,15,0,13,0,23,0,38,0,67,0,58,0,103,0,90,0,161,0,72,0,127,0,117,0,110,0,209,0,206,0,16,0,45,0,21,0,39,0,69,0,64,0,114,0,99,0,87,0,158,0,140,0,252,0,212,0,199,0,131,1,109,1,26,0,75,0,36,0,68,0,65,0,115,0,101,0,179,0,164,0,155,0,8,1,246,0,226,0,139,1,126,1,106,1,9,0,66,0,30,0,59,0,56,0,102,0,185,0,173,0,9,1,142,0,253,0,232,0,144,1,132,1,122,1,189,1,16,0,111,0,54,0,52,0,100,0,184,0,178,0,160,0,133,0,1,1,244,0,228,0,217,0,129,1,110,1,203,2,10,0,98,0,48,0,91,0,88,0,165,0,157,0,148,0,5,1,248,0,151,1,141,1,116,1,124,1,121,3,116,3,8,0,85,0,84,0,81,0,159,0,156,0,143,0,4,1,249,0,171,1,145,1,136,1,127,1,215,2,201,2,196,2,7,0,154,0,76,0,73,0,141,0,131,0,0,1,245,0,170,1,150,1,138,1,128,1,223,2,103,1,198,2,96,1,11,0,139,0,129,0,67,0,125,0,247,0,233,0,229,0,219,0,137,1,231,2,225,2,208,2,117,3,114,3,183,1,4,0,243,0,120,0,118,0,115,0,227,0,223,0,140,1,234,2,230,2,224,2,209,2,200,2,194,2,223,0,180,1,6,0,202,0,224,0,222,0,218,0,216,0,133,1,130,1,125,1,108,1,120,3,187,1,195,2,184,1,181,1,192,6,4,0,235,2,211,0,210,0,208,0,114,1,123,1,222,2,211,2,202,2,199,6,115,3,109,3,108,3,131,13,97,3,2,0,121,1,113,1,102,0,187,0,214,2,210,2,102,1,199,2,197,2,98,3,198,6,103,3,130,13,102,3,178,1,0,0,12,0,10,0,7,0,11,0,10,0,17,0,11,0,9,0,13,0,12,0,10,0,7,0,5,0,3,0,1,0,3,0,15,0,13,0,46,0,80,0,146,0,6,1,248,0,178,1,170,1,157,2,141,2,137,2,109,2,5,2,8,4,88,0,14,0,12,0,21,0,38,0,71,0,130,0,122,0,216,0,209,0,198,0,71,1,89,1,63,1,41,1,23,1,42,0,47,0,22,0,41,0,74,0,68,0,128,0,120,0,221,0,207,0,194,0,182,0,84,1,59,1,39,1,29,2,18,0,81,0,39,0,75,0,70,0,134,0,125,0,116,0,220,0,204,0,190,0,178,0,69,1,55,1,37,1,15,1,16,0,147,0,72,0,69,0,135,0,127,0,118,0,112,0,210,0,200,0,188,0,96,1,67,1,50,1,29,1,28,2,14,0,7,1,66,0,129,0,126,0,119,0,114,0,214,0,202,0,192,0,180,0,85,1,61,1,45,1,25,1,6,1,12,0,249,0,123,0,121,0,117,0,113,0,215,0,206,0,195,0,185,0,91,1,74,1,52,1,35,1,16,1,8,2,10,0,179,1,115,0,111,0,109,0,211,0,203,0,196,0,187,0,97,1,76,1,57,1,42,1,27,1,19,2,125,1,17,0,171,1,212,0,208,0,205,0,201,0,193,0,186,0,177,0,169,0,64,1,47,1,30,1,12,1,2,2,121,1,16,0,79,1,199,0,197,0,191,0,189,0,181,0,174,0,77,1,65,1,49,1,33,1,19,1,9,2,123,1,115,1,11,0,156,2,184,0,183,0,179,0,175,0,88,1,75,1,58,1,48,1,34,1,21,1,18,2,127,1,117,1,110,1,10,0,140,2,90,1,171,0,168,0,164,0,62,1,53,1,43,1,31,1,20,1,7,1,1,2,119,1,112,1,106,1,6,0,136,2,66,1,60,1,56,1,51,1,46,1,36,1,28,1,13,1,5,1,0,2,120,1,114,1,108,1,103,1,4,0,108,2,44,1,40,1,38,1,32,1,26,1,17,1,10,1,3,2,124,1,118,1,113,1,109,1,105,1,101,1,2,0,9,4,24,1,22,1,18,1,11,1,8,1,3,1,126,1,122,1,116,1,111,1,107,1,104,1,102,1,100,1,0,0,43,0,20,0,19,0,17,0,15,0,13,0,11,0,9,0,7,0,6,0,4,0,7,0,5,0,3,0,1,0,3,0,1,0,5,0,4,0,5,0,6,0,5,0,4,0,4,0,7,0,3,0,6,0,0,0,7,0,2,0,3,0,1,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,1,3,2,3,1,3,6,3,3,5,5,5,6,2,2,6,3,2,5,5,5,6,1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8,3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7,1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10,2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11,3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9,1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10,10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11,2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10,9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10,4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8,8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10,1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12,6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12,13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11,12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11,11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15,10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13,14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12,12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15,16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14,15,15,16,16,19,18,19,16,3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5,5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6,7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8,8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8,8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12,12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10,11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12,13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13,1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12,8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12,13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12,12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11,11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14,10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13,14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12,12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15,17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10,11,11,11,11,11,11,11,8,4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8,6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7,8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8,9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9,9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11,11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7,7,7,7,7,7,7,8,8,8,8,4,1,4,4,5,4,6,5,6,4,5,5,6,5,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module["_i64Add"]=_i64Add;function _llvm_exp2_f32(x){return Math.pow(2,x)}function _llvm_exp2_f64(){return _llvm_exp2_f32.apply(null,arguments)}Module["_memset"]=_memset;Module["_bitshift64Lshr"]=_bitshift64Lshr;function _abort(){Module["abort"]()}function ___lock(){}function ___unlock(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["___muldsi3"]=___muldsi3;Module["___muldi3"]=___muldi3;function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}Module["_sbrk"]=_sbrk;function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;Module["_llvm_bswap_i32"]=_llvm_bswap_i32;function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iiii":invoke_iiii,"_llvm_exp2_f64":_llvm_exp2_f64,"___lock":___lock,"_llvm_exp2_f32":_llvm_exp2_f32,"_abort":_abort,"___setErrNo":___setErrNo,"___syscall6":___syscall6,"___syscall140":___syscall140,"_emscripten_memcpy_big":_emscripten_memcpy_big,"___syscall54":___syscall54,"___unlock":___unlock,"___syscall146":___syscall146,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM +-var asm=(function(global,env,buffer) { +-"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iiii;var Y=env._llvm_exp2_f64;var Z=env.___lock;var _=env._llvm_exp2_f32;var $=env._abort;var aa=env.___setErrNo;var ba=env.___syscall6;var ca=env.___syscall140;var da=env._emscripten_memcpy_big;var ea=env.___syscall54;var fa=env.___unlock;var ga=env.___syscall146;var ha=0.0; +-// EMSCRIPTEN_START_FUNCS +-function ka(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function la(){return l|0}function ma(a){a=a|0;l=a}function na(a,b){a=a|0;b=b|0;l=a;m=b}function oa(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function pa(a){a=a|0;y=a}function qa(){return y|0}function ra(a,b){a=a|0;b=b|0;c[a>>2]=gb(b)|0;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=32;return}function sa(a){a=a|0;a=c[a>>2]|0;if(!a)return;hb(a);return}function ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=a+16|0;i=c[k>>2]|0;if(i>>>0>d>>>0){d=i-d|0;c[k>>2]=d;k=a+12|0;c[k>>2]=c[k>>2]|b<<d;return}j=a+8|0;e=c[j>>2]|0;g=a+4|0;h=c[g>>2]|0;f=c[a>>2]|0;if((e+4|0)>>>0<h>>>0)g=i;else{f=jb(f,((h|0)/2|0)+h|0)|0;c[a>>2]=f;e=c[g>>2]|0;c[g>>2]=((e|0)/2|0)+e;g=c[k>>2]|0;e=c[j>>2]|0}i=d-g|0;d=a+12|0;c[f+e>>2]=ub(b>>>i|c[d>>2]|0)|0;c[j>>2]=(c[j>>2]|0)+4;j=32-i|0;c[k>>2]=j;c[d>>2]=(i|0)==0?0:b<<j;return}function ua(a){a=a|0;return (c[a+8>>2]<<3)+32-(c[a+16>>2]|0)|0}function va(a){a=a|0;var b=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;C=l;l=l+416|0;B=C;if((c[a>>2]|0)>0){j=a+16|0;g=0;b=c[j>>2]|0;do{if((b|0)>0){f=0;do{b=0;do{if((c[a+25264+(g*4608|0)+(f*2304|0)+(b<<2)>>2]|0)<0?(h=a+2224+(g*4608|0)+(f*2304|0)+(b<<2)|0,i=c[h>>2]|0,(i|0)>0):0)c[h>>2]=0-i;b=b+1|0}while((b|0)!=576);f=f+1|0;b=c[j>>2]|0}while((f|0)<(b|0))}g=g+1|0}while((g|0)<(c[a>>2]|0))}j=a+116|0;tb(B|0,j|0,408)|0;z=a+96|0;ta(z,2047,11);i=a+8|0;ta(z,c[i>>2]|0,2);ta(z,c[a+12>>2]|0,2);ta(z,(c[a+76>>2]|0)==0&1,1);ta(z,c[a+68>>2]|0,4);A=a+72|0;ta(z,(c[A>>2]|0)%3|0,2);ta(z,c[a+32>>2]|0,1);ta(z,c[a+80>>2]|0,1);ta(z,c[a+20>>2]|0,2);ta(z,c[a+84>>2]|0,2);ta(z,c[a+88>>2]|0,1);ta(z,c[a+92>>2]|0,1);ta(z,c[a+28>>2]|0,2);do if((c[i>>2]|0)==3){ta(z,0,9);b=c[B>>2]|0;if((c[a>>2]|0)==2){ta(z,b,3);break}else{ta(z,b,5);break}}else{ta(z,0,8);b=c[B>>2]|0;if((c[a>>2]|0)==2){ta(z,b,2);break}else{ta(z,b,1);break}}while(0);if((c[i>>2]|0)==3?(c[a>>2]|0)>0:0){b=0;do{ta(z,c[B+8+(b<<4)>>2]|0,1);ta(z,c[B+8+(b<<4)+4>>2]|0,1);ta(z,c[B+8+(b<<4)+8>>2]|0,1);ta(z,c[B+8+(b<<4)+12>>2]|0,1);b=b+1|0}while((b|0)<(c[a>>2]|0))}y=a+16|0;b=c[y>>2]|0;if((b|0)>0){h=0;g=c[a>>2]|0;do{if((g|0)>0){f=0;do{ta(z,c[B+40+(h*184|0)+(f*92|0)>>2]|0,12);ta(z,c[B+40+(h*184|0)+(f*92|0)+4>>2]|0,9);ta(z,c[B+40+(h*184|0)+(f*92|0)+12>>2]|0,8);b=c[B+40+(h*184|0)+(f*92|0)+16>>2]|0;if((c[i>>2]|0)==3)ta(z,b,4);else ta(z,b,9);ta(z,0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+20>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+24>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+28>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+32>>2]|0,4);ta(z,c[B+40+(h*184|0)+(f*92|0)+36>>2]|0,3);if((c[i>>2]|0)==3)ta(z,c[B+40+(h*184|0)+(f*92|0)+40>>2]|0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+44>>2]|0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+48>>2]|0,1);f=f+1|0;g=c[a>>2]|0}while((f|0)<(g|0));b=c[y>>2]|0}h=h+1|0}while((h|0)<(b|0))}tb(B|0,j|0,408)|0;if((b|0)<=0){l=C;return}x=0;f=c[a>>2]|0;do{if((f|0)>0){w=(x|0)==0;v=0;do{f=c[B+40+(x*184|0)+(v*92|0)+16>>2]|0;b=c[1044+(f<<2)>>2]|0;f=c[1108+(f<<2)>>2]|0;if(!w?(c[B+8+(v<<4)>>2]|0)!=0:0)t=39;else{ta(z,c[a+1208+(x*176|0)+(v*88|0)>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+4>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+8>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+12>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+16>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+20>>2]|0,b);if(w)t=40;else t=39}if((t|0)==39)if(!(c[B+8+(v<<4)+4>>2]|0))t=40;else t=41;if((t|0)==40){ta(z,c[a+1208+(x*176|0)+(v*88|0)+24>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+28>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+32>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+36>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+40>>2]|0,b);if(w)t=42;else t=41}if((t|0)==41)if(!(c[B+8+(v<<4)+8>>2]|0))t=42;else t=43;if((t|0)==42){ta(z,c[a+1208+(x*176|0)+(v*88|0)+44>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+48>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+52>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+56>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+60>>2]|0,f);if(w)t=44;else t=43}if((t|0)==43?(t=0,(c[B+8+(v<<4)+12>>2]|0)==0):0)t=44;if((t|0)==44){t=0;ta(z,c[a+1208+(x*176|0)+(v*88|0)+64>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+68>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+72>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+76>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+80>>2]|0,f)}q=c[A>>2]|0;u=ua(z)|0;b=c[B+40+(x*184|0)+(v*92|0)+4>>2]<<1;s=c[B+40+(x*184|0)+(v*92|0)+32>>2]|0;r=c[1464+(q*92|0)+(s+1<<2)>>2]|0;s=c[1464+(q*92|0)+(s+2+(c[B+40+(x*184|0)+(v*92|0)+36>>2]|0)<<2)>>2]|0;if((b|0)>0){q=0;do{g=c[B+40+(x*184|0)+(v*92|0)+20+(((q|0)>=(r|0)&1)+((q|0)>=(s|0)&1)<<2)>>2]|0;do if(g|0){h=c[a+2224+(v*4608|0)+(x*2304|0)+(q<<2)>>2]|0;k=c[a+2224+(v*4608|0)+(x*2304|0)+((q|1)<<2)>>2]|0;i=(h|0)>0;h=i?h:0-h|0;i=(i^1)&1;o=(k|0)>0;k=o?k:0-k|0;o=(o^1)&1;f=c[8+(g*24|0)+4>>2]|0;if((g|0)<=15){p=(N(f,h)|0)+k|0;j=e[(c[8+(g*24|0)+16>>2]|0)+(p<<1)>>1]|0;n=(h|0)==0;j=n?j:j<<1|i;m=(k|0)==0;ta(z,m?j:j<<1|o,((m^1)&1)+((n^1)&1)+(d[(c[8+(g*24|0)+20>>2]|0)+p>>0]|0)|0);break}m=c[8+(g*24|0)+8>>2]|0;E=(h|0)>14;F=E?15:h;D=(k|0)>14;j=D?15:k;n=(N(F,f)|0)+j|0;p=e[(c[8+(g*24|0)+16>>2]|0)+(n<<1)>>1]|0;n=d[(c[8+(g*24|0)+20>>2]|0)+n>>0]|0;f=E?h+-15|0:0;g=(F|0)==0;f=g?f:f<<1|i;g=(E?m:0)+((g^1)&1)|0;if(!D){if(j)t=51}else{g=g+m|0;f=f<<m|k+2147483633;t=51}if((t|0)==51){t=0;g=g+1|0;f=f<<1|o}ta(z,p,n);ta(z,f,g)}while(0);q=q+2|0}while((q|0)<(b|0))}f=(c[B+40+(x*184|0)+(v*92|0)+48>>2]|0)+32|0;h=(c[B+40+(x*184|0)+(v*92|0)+8>>2]<<2)+b|0;if((b|0)<(h|0)){g=c[8+(f*24|0)+16>>2]|0;f=c[8+(f*24|0)+20>>2]|0;do{E=c[a+2224+(v*4608|0)+(x*2304|0)+(b<<2)>>2]|0;D=c[a+2224+(v*4608|0)+(x*2304|0)+((b|1)<<2)>>2]|0;t=c[a+2224+(v*4608|0)+(x*2304|0)+(b+2<<2)>>2]|0;F=c[a+2224+(v*4608|0)+(x*2304|0)+(b+3<<2)>>2]|0;p=(E|0)>0;E=p?E:0-E|0;q=(D|0)>0;D=q?D:0-D|0;r=(t|0)>0;t=r?t:0-t|0;s=(F|0)>0;F=s?F:0-F|0;o=(D<<1)+E+(t<<2)+(F<<3)|0;ta(z,e[g+(o<<1)>>1]|0,d[f+o>>0]|0);E=(E|0)==0;p=((p|E)^1)&1;D=(D|0)==0;q=D?p:p<<1|(q^1)&1;t=(t|0)==0;r=t?q:q<<1|(r^1)&1;F=(F|0)==0;ta(z,F?r:r<<1|(s^1)&1,((t^1)&1)+(D?(E^1)&1:E?1:2)+((F^1)&1)|0);b=b+4|0}while((b|0)<(h|0))}b=ua(z)|0;b=(c[B+40+(x*184|0)+(v*92|0)>>2]|0)-(c[B+40+(x*184|0)+(v*92|0)+52>>2]|0)+(u-b)|0;if(b|0){f=(b|0)%32|0;if((b+31|0)>>>0>=63){b=(b|0)/32|0;do{b=b+-1|0;ta(z,-1,32)}while((b|0)!=0)}if(f|0)ta(z,(1<<f)+-1|0,f)}v=v+1|0;f=c[a>>2]|0}while((v|0)<(f|0));b=c[y>>2]|0}x=x+1|0}while((x|0)<(b|0));l=C;return}function wa(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,O=0,P=0;J=e+72|0;if((b|0)<0)c[J>>2]=(c[J>>2]|0)+-1;v=i+39100|0;w=i+34488|0;x=e+8|0;z=e+4|0;A=e+48|0;C=e+32|0;D=e+36|0;E=e+20|0;F=e+24|0;G=e+28|0;H=e+60|0;I=e+64|0;r=e+68|0;s=i+72|0;t=c[199]|0;u=c[205]|0;do{while(1){f=c[J>>2]|0;c[J>>2]=f+1;f=f+128|0;l=c[i+40480+(f<<2)>>2]|0;q=c[v>>2]|0;m=((l|0)<0)<<31>>31;q=rb(q|0,((q|0)<0)<<31>>31|0,l|0,m|0)|0;nb(q|0,y|0,-2147483648,0)|0;if((y|0)>165140)continue;k=i+39456+(f<<3)|0;j=c[w>>2]|0;g=0;e=0;do{f=c[j+(e<<2)>>2]|0;f=(f|0)>-1?f:0-f|0;f=rb(f|0,((f|0)<0)<<31>>31|0,l|0,m|0)|0;nb(f|0,y|0,-2147483648,0)|0;f=y;if((f|0)<1e4)f=c[i+40992+(f<<2)>>2]|0;else{K=+h[k>>3]*+(c[i+36796+(e<<2)>>2]|0)*4.656612875e-10;f=~~+B(+(+B(+K)*K))}c[a+(e<<2)>>2]=f;g=(g|0)<(f|0)?f:g;e=e+1|0}while((e|0)!=576);if((g|0)<=8192){g=576;break}}while(1){if((g|0)<=1){n=13;break}if(c[a+(g+-1<<2)>>2]|0){n=16;break}f=g+-2|0;if(!(c[a+(f<<2)>>2]|0))g=f;else{n=16;break}}do if((n|0)==13){c[x>>2]=0;n=23}else if((n|0)==16){c[x>>2]=0;if((g|0)>3){j=0;while(1){if((c[a+(g+-1<<2)>>2]|0)>=2){n=24;break}if((c[a+(g+-2<<2)>>2]|0)>=2){n=24;break}if((c[a+(g+-3<<2)>>2]|0)>=2){n=24;break}f=g+-4|0;e=j+1|0;if((c[a+(f<<2)>>2]|0)>=2){n=24;break}c[x>>2]=e;if((f|0)>3){g=f;j=e}else{n=18;break}}if((n|0)==18){n=0;q=f>>1;c[z>>2]=q;g=f;f=q}else if((n|0)==24){n=0;f=g>>>1;c[z>>2]=f;if(!j){k=0;j=0;break}else e=j}j=0;l=g;m=0;k=0;while(1){o=c[a+(l<<2)>>2]|0;L=c[a+((l|1)<<2)>>2]|0;M=c[a+(l+2<<2)>>2]|0;p=c[a+(l+3<<2)>>2]|0;q=(L<<1)+o+(M<<2)+(p<<3)|0;o=(o|0)!=0;p=((M|0)!=0&1)+((L|0)==0?o&1:o?2:1)+((p|0)!=0&1)|0;j=(d[t+q>>0]|0)+j+p|0;k=p+k+(d[u+q>>0]|0)|0;m=m+1|0;if((m|0)==(e|0))break;else l=l+4|0}}else n=23}while(0);if((n|0)==23){f=g>>1;c[z>>2]=f;k=0;j=0}M=(j|0)<(k|0);q=M?j:k;c[A>>2]=(M^1)&1;if(!f){c[C>>2]=0;c[D>>2]=0;j=c[H>>2]|0}else{j=c[s>>2]|0;e=0;while(1)if((c[1464+(j*92|0)+(e<<2)>>2]|0)<(g|0))e=e+1|0;else break;f=c[824+(e<<3)>>2]|0;while(1){k=1464+(j*92|0)+(f+1<<2)|0;l=c[k>>2]|0;if((f|0)!=0&(l|0)>(g|0))f=f+-1|0;else break}c[C>>2]=f;c[H>>2]=l;f=c[824+(e<<3)+4>>2]|0;while(1){e=c[k+(f+1<<2)>>2]|0;if((f|0)!=0&(e|0)>(g|0))f=f+-1|0;else break}c[D>>2]=f;c[I>>2]=e;c[r>>2]=g;j=l}c[E>>2]=0;c[F>>2]=0;c[G>>2]=0;if(!j)k=0;else{k=xa(a,0,j)|0;c[E>>2]=k}e=c[I>>2]|0;n=e>>>0>j>>>0;if(n){o=xa(a,j,e)|0;c[F>>2]=o}else o=0;if(g>>>0>e>>>0){p=xa(a,e,g)|0;c[G>>2]=p}else p=0;do if(k){m=c[8+(k*24|0)+4>>2]|0;l=c[8+(k*24|0)+8>>2]|0;f=(j|0)!=0;if(k>>>0>15){if(!f){f=0;break}k=c[8+(k*24|0)+20>>2]|0;f=0;g=0;do{L=c[a+(g<<2)>>2]|0;M=c[a+((g|1)<<2)>>2]|0;P=(L|0)>14;L=P?15:L;O=(M|0)>14;M=O?15:M;f=(P?l:0)+f+(O?l:0)+(d[k+((N(L,m)|0)+M)>>0]|0)+((L|0)!=0&1)+((M|0)!=0&1)|0;g=g+2|0}while(g>>>0<j>>>0)}else{if(!f){f=0;break}k=c[8+(k*24|0)+20>>2]|0;g=0;f=0;do{O=c[a+(g<<2)>>2]|0;P=c[a+((g|1)<<2)>>2]|0;f=((O|0)!=0&1)+f+((P|0)!=0&1)+(d[k+((N(O,m)|0)+P)>>0]|0)|0;g=g+2|0}while(g>>>0<j>>>0)}}else f=0;while(0);if(o){m=c[8+(o*24|0)+4>>2]|0;l=c[8+(o*24|0)+8>>2]|0;if(o>>>0>15)if(n){k=c[8+(o*24|0)+20>>2]|0;g=0;do{O=c[a+(j<<2)>>2]|0;P=c[a+(j+1<<2)>>2]|0;L=(O|0)>14;O=L?15:O;M=(P|0)>14;P=M?15:P;g=(L?l:0)+g+(M?l:0)+(d[k+((N(O,m)|0)+P)>>0]|0)+((O|0)!=0&1)+((P|0)!=0&1)|0;j=j+2|0}while(j>>>0<e>>>0)}else g=0;else if(n){k=c[8+(o*24|0)+20>>2]|0;g=0;do{O=c[a+(j<<2)>>2]|0;P=c[a+(j+1<<2)>>2]|0;g=((O|0)!=0&1)+g+((P|0)!=0&1)+(d[k+((N(O,m)|0)+P)>>0]|0)|0;j=j+2|0}while(j>>>0<e>>>0)}else g=0;f=g+f|0}if(p){l=c[r>>2]|0;m=c[8+(p*24|0)+4>>2]|0;k=c[8+(p*24|0)+8>>2]|0;g=e>>>0<l>>>0;if(p>>>0>15)if(g){j=c[8+(p*24|0)+20>>2]|0;g=0;do{O=c[a+(e<<2)>>2]|0;P=c[a+(e+1<<2)>>2]|0;L=(O|0)>14;O=L?15:O;M=(P|0)>14;P=M?15:P;g=(L?k:0)+g+(M?k:0)+(d[j+((N(O,m)|0)+P)>>0]|0)+((O|0)!=0&1)+((P|0)!=0&1)|0;e=e+2|0}while(e>>>0<l>>>0)}else g=0;else if(g){j=c[8+(p*24|0)+20>>2]|0;g=0;do{O=c[a+(e<<2)>>2]|0;P=c[a+(e+1<<2)>>2]|0;g=((O|0)!=0&1)+g+((P|0)!=0&1)+(d[j+((N(O,m)|0)+P)>>0]|0)|0;e=e+2|0}while(e>>>0<l>>>0)}else g=0;f=g+f|0}f=f+q|0}while((f|0)>(b|0));return f|0}function xa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(b>>>0<e>>>0){f=b;g=0}else{e=0;return e|0}do{m=c[a+(f<<2)>>2]|0;g=(g|0)<(m|0)?m:g;f=f+1|0}while((f|0)!=(e|0));if(!g){e=0;return e|0}if((g|0)>=15){f=g+-15|0;if((c[95]|0)>>>0<f>>>0)if((c[101]|0)>>>0<f>>>0)if((c[107]|0)>>>0<f>>>0)if((c[113]|0)>>>0<f>>>0)if((c[119]|0)>>>0<f>>>0)if((c[125]|0)>>>0<f>>>0)if((c[131]|0)>>>0<f>>>0)if((c[137]|0)>>>0<f>>>0)m=(c[143]|0)>>>0<f>>>0?0:23;else m=22;else m=21;else m=20;else m=19;else m=18;else m=17;else m=16;else m=15;if((c[149]|0)>>>0<f>>>0)if((c[155]|0)>>>0<f>>>0)if((c[161]|0)>>>0<f>>>0)if((c[167]|0)>>>0<f>>>0)if((c[173]|0)>>>0<f>>>0)if((c[179]|0)>>>0<f>>>0)if((c[185]|0)>>>0<f>>>0)l=(c[191]|0)>>>0<f>>>0?0:31;else l=30;else l=29;else l=28;else l=27;else l=26;else l=25;else l=24;if(m){i=c[8+(m*24|0)+4>>2]|0;h=c[8+(m*24|0)+8>>2]|0;j=c[8+(m*24|0)+20>>2]|0;if(m>>>0>15){f=0;g=b;do{n=c[a+(g<<2)>>2]|0;k=c[a+(g+1<<2)>>2]|0;p=(n|0)>14;n=p?15:n;o=(k|0)>14;k=o?15:k;f=(p?h:0)+f+(o?h:0)+(d[j+((N(n,i)|0)+k)>>0]|0)+((n|0)!=0&1)+((k|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);k=f}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);k=f}}else k=0;if(!l){p=0;p=(p|0)<(k|0);p=p?l:m;return p|0}i=c[8+(l*24|0)+4>>2]|0;h=c[8+(l*24|0)+8>>2]|0;j=c[8+(l*24|0)+20>>2]|0;if(l>>>0>15){f=0;g=b;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;b=(o|0)>14;o=b?15:o;n=(p|0)>14;p=n?15:p;f=(b?h:0)+f+(n?h:0)+(d[j+((N(o,i)|0)+p)>>0]|0)+((o|0)!=0&1)+((p|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);p=(f|0)<(k|0);p=p?l:m;return p|0}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);p=(f|0)<(k|0);p=p?l:m;return p|0}}else k=14;while(1){l=k+-1|0;if(!k){f=0;h=44;break}if((c[8+(l*24|0)>>2]|0)>>>0>g>>>0)break;else k=l}if((h|0)==44)return f|0;if(!l){p=0;return p|0}i=c[8+(l*24|0)+4>>2]|0;h=c[8+(l*24|0)+8>>2]|0;j=c[8+(l*24|0)+20>>2]|0;if(l>>>0>15){f=0;g=b;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;m=(o|0)>14;o=m?15:o;n=(p|0)>14;p=n?15:p;f=(m?h:0)+f+(n?h:0)+(d[j+((N(o,i)|0)+p)>>0]|0)+((o|0)!=0&1)+((p|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);j=f}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);j=f}switch(k|0){case 3:{h=c[21]|0;i=c[25]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:3;return p|0}case 6:{h=c[39]|0;i=c[43]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:6;return p|0}case 8:{g=c[51]|0;h=c[55]|0;f=b;i=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;i=((o|0)!=0&1)+i+((p|0)!=0&1)+(d[h+((N(o,g)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);h=(i|0)>(j|0);k=h?l:8;h=h?j:i;i=c[57]|0;j=c[61]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);return ((g|0)>(h|0)?k:9)|0}case 11:{g=c[69]|0;h=c[73]|0;f=b;i=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;i=((o|0)!=0&1)+i+((p|0)!=0&1)+(d[h+((N(o,g)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);h=(i|0)>(j|0);k=h?l:11;h=h?j:i;i=c[75]|0;j=c[79]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(h|0)?k:12;return p|0}case 14:{h=c[93]|0;i=c[97]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:15;return p|0}default:{p=l;return p|0}}return 0}function ya(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0;K=i+39100|0;L=i+34488|0;M=i+156+(f*184|0)+(g*92|0)+8|0;O=i+156+(f*184|0)+(g*92|0)+4|0;u=i+156+(f*184|0)+(g*92|0)+48|0;v=i+156+(f*184|0)+(g*92|0)+32|0;w=i+156+(f*184|0)+(g*92|0)+36|0;x=i+156+(f*184|0)+(g*92|0)+20|0;z=i+156+(f*184|0)+(g*92|0)+24|0;A=i+156+(f*184|0)+(g*92|0)+28|0;C=i+156+(f*184|0)+(g*92|0)+60|0;D=i+156+(f*184|0)+(g*92|0)+64|0;E=i+156+(f*184|0)+(g*92|0)+68|0;F=i+72|0;G=c[199]|0;H=c[205]|0;t=120;P=-120;do{I=(t|0)/2|0;J=I+P|0;b=J+127|0;n=c[i+40480+(b<<2)>>2]|0;s=c[K>>2]|0;o=((n|0)<0)<<31>>31;s=rb(s|0,((s|0)<0)<<31>>31|0,n|0,o|0)|0;nb(s|0,y|0,-2147483648,0)|0;if((y|0)<=165140){m=i+39456+(b<<3)|0;l=c[L>>2]|0;j=0;k=0;do{b=c[l+(k<<2)>>2]|0;b=(b|0)>-1?b:0-b|0;b=rb(b|0,((b|0)<0)<<31>>31|0,n|0,o|0)|0;nb(b|0,y|0,-2147483648,0)|0;b=y;if((b|0)<1e4)b=c[i+40992+(b<<2)>>2]|0;else{Q=+h[m>>3]*+(c[i+36796+(k<<2)>>2]|0)*4.656612875e-10;b=~~+B(+(+B(+Q)*Q))}c[e+(k<<2)>>2]=b;j=(j|0)<(b|0)?b:j;k=k+1|0}while((k|0)!=576);if((j|0)<=8192){j=576;while(1){if((j|0)<=1){n=10;break}if(c[e+(j+-1<<2)>>2]|0){n=13;break}b=j+-2|0;if(!(c[e+(b<<2)>>2]|0))j=b;else{n=13;break}}do if((n|0)==10){c[M>>2]=0;n=20}else if((n|0)==13){c[M>>2]=0;if((j|0)>3){l=0;while(1){if((c[e+(j+-1<<2)>>2]|0)>=2){n=21;break}if((c[e+(j+-2<<2)>>2]|0)>=2){n=21;break}if((c[e+(j+-3<<2)>>2]|0)>=2){n=21;break}b=j+-4|0;k=l+1|0;if((c[e+(b<<2)>>2]|0)>=2){n=21;break}c[M>>2]=k;if((b|0)>3){j=b;l=k}else{n=15;break}}if((n|0)==15){s=b>>1;c[O>>2]=s;j=b;b=s}else if((n|0)==21){b=j>>>1;c[O>>2]=b;if(!l){c[u>>2]=1;b=0;n=27;break}else k=l}l=0;n=j;o=0;m=0;while(1){q=c[e+(n<<2)>>2]|0;p=c[e+((n|1)<<2)>>2]|0;R=c[e+(n+2<<2)>>2]|0;r=c[e+(n+3<<2)>>2]|0;s=(p<<1)+q+(R<<2)+(r<<3)|0;q=(q|0)!=0;r=((R|0)!=0&1)+((p|0)==0?q&1:q?2:1)+((r|0)!=0&1)|0;l=(d[G+s>>0]|0)+l+r|0;m=r+m+(d[H+s>>0]|0)|0;o=o+1|0;if((o|0)==(k|0)){k=b;n=25;break}else n=n+4|0}}else n=20}while(0);if((n|0)==20){k=j>>1;c[O>>2]=k;m=0;l=0;n=25}if((n|0)==25){n=0;R=(l|0)<(m|0);b=R?l:m;c[u>>2]=(R^1)&1;if(!k){c[v>>2]=0;c[w>>2]=0;s=b;l=c[C>>2]|0}else n=27}if((n|0)==27){m=c[F>>2]|0;l=0;while(1)if((c[1464+(m*92|0)+(l<<2)>>2]|0)<(j|0))l=l+1|0;else break;k=c[824+(l<<3)>>2]|0;while(1){n=1464+(m*92|0)+(k+1<<2)|0;o=c[n>>2]|0;if((k|0)!=0&(o|0)>(j|0))k=k+-1|0;else break}c[v>>2]=k;c[C>>2]=o;k=c[824+(l<<3)+4>>2]|0;while(1){l=c[n+(k+1<<2)>>2]|0;if((k|0)!=0&(l|0)>(j|0))k=k+-1|0;else break}c[w>>2]=k;c[D>>2]=l;c[E>>2]=j;s=b;l=o}c[x>>2]=0;c[z>>2]=0;c[A>>2]=0;if(!l)m=0;else{m=xa(e,0,l)|0;c[x>>2]=m}k=c[D>>2]|0;p=k>>>0>l>>>0;if(p){q=xa(e,l,k)|0;c[z>>2]=q}else q=0;if(j>>>0>k>>>0){r=xa(e,k,j)|0;c[A>>2]=r}else r=0;do if(m){o=c[8+(m*24|0)+4>>2]|0;n=c[8+(m*24|0)+8>>2]|0;b=(l|0)!=0;if(m>>>0>15){if(!b){b=0;break}m=c[8+(m*24|0)+20>>2]|0;b=0;j=0;do{S=c[e+(j<<2)>>2]|0;R=c[e+((j|1)<<2)>>2]|0;U=(S|0)>14;S=U?15:S;T=(R|0)>14;R=T?15:R;b=(U?n:0)+b+(T?n:0)+(d[m+((N(S,o)|0)+R)>>0]|0)+((S|0)!=0&1)+((R|0)!=0&1)|0;j=j+2|0}while(j>>>0<l>>>0)}else{if(!b){b=0;break}m=c[8+(m*24|0)+20>>2]|0;j=0;b=0;do{T=c[e+(j<<2)>>2]|0;U=c[e+((j|1)<<2)>>2]|0;b=((T|0)!=0&1)+b+((U|0)!=0&1)+(d[m+((N(T,o)|0)+U)>>0]|0)|0;j=j+2|0}while(j>>>0<l>>>0)}}else b=0;while(0);if(q){o=c[8+(q*24|0)+4>>2]|0;n=c[8+(q*24|0)+8>>2]|0;if(q>>>0>15)if(p){m=c[8+(q*24|0)+20>>2]|0;j=0;do{T=c[e+(l<<2)>>2]|0;U=c[e+(l+1<<2)>>2]|0;R=(T|0)>14;T=R?15:T;S=(U|0)>14;U=S?15:U;j=(R?n:0)+j+(S?n:0)+(d[m+((N(T,o)|0)+U)>>0]|0)+((T|0)!=0&1)+((U|0)!=0&1)|0;l=l+2|0}while(l>>>0<k>>>0)}else j=0;else if(p){m=c[8+(q*24|0)+20>>2]|0;j=0;do{T=c[e+(l<<2)>>2]|0;U=c[e+(l+1<<2)>>2]|0;j=((T|0)!=0&1)+j+((U|0)!=0&1)+(d[m+((N(T,o)|0)+U)>>0]|0)|0;l=l+2|0}while(l>>>0<k>>>0)}else j=0;b=j+b|0}if(r){n=c[E>>2]|0;o=c[8+(r*24|0)+4>>2]|0;m=c[8+(r*24|0)+8>>2]|0;j=k>>>0<n>>>0;if(r>>>0>15)if(j){l=c[8+(r*24|0)+20>>2]|0;j=0;do{T=c[e+(k<<2)>>2]|0;U=c[e+(k+1<<2)>>2]|0;R=(T|0)>14;T=R?15:T;S=(U|0)>14;U=S?15:U;j=(R?m:0)+j+(S?m:0)+(d[l+((N(T,o)|0)+U)>>0]|0)+((T|0)!=0&1)+((U|0)!=0&1)|0;k=k+2|0}while(k>>>0<n>>>0)}else j=0;else if(j){l=c[8+(r*24|0)+20>>2]|0;j=0;do{T=c[e+(k<<2)>>2]|0;U=c[e+(k+1<<2)>>2]|0;j=((T|0)!=0&1)+j+((U|0)!=0&1)+(d[l+((N(T,o)|0)+U)>>0]|0)|0;k=k+2|0}while(k>>>0<n>>>0)}else j=0;b=j+b|0}b=b+s|0}else b=1e5}else b=1e5;U=(b|0)<(a|0);P=U?P:J;t=U?I:t-I|0}while((t|0)>1);l=i+156+(f*184|0)+(g*92|0)|0;c[i+156+(f*184|0)+(g*92|0)+72>>2]=P;b=c[i+156+(f*184|0)+(g*92|0)+16>>2]|0;k=c[1044+(b<<2)>>2]|0;b=c[1108+(b<<2)>>2]|0;if(f){j=b*5|0;b=((c[i+124+(g<<4)+4>>2]|0)==0?k*5|0:0)+((c[i+124+(g<<4)>>2]|0)==0?k*6|0:0)+((c[i+124+(g<<4)+8>>2]|0)==0?j:0)|0;if(c[i+124+(g<<4)+12>>2]|0){U=b;T=i+156+(f*184|0)+(g*92|0)+52|0;c[T>>2]=U;U=a-U|0;U=wa(e,U,l,0,0,i)|0;T=c[T>>2]|0;U=T+U|0;c[l>>2]=U;return U|0}}else{j=b*5|0;b=j+(k*11|0)|0}U=b+j|0;T=i+156+(f*184|0)+(g*92|0)+52|0;c[T>>2]=U;U=a-U|0;U=wa(e,U,l,0,0,i)|0;T=c[T>>2]|0;U=T+U|0;c[l>>2]=U;return U|0}function za(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;F=l;l=l+672|0;t=F;b=c[a>>2]|0;if(!b){Pa(a);l=F;return}z=a+16|0;A=a+34488|0;B=a+39100|0;C=a+8|0;D=a+72|0;E=a+39452|0;u=a+39448|0;v=a+39104|0;w=a+39108|0;x=b*23|0;d=c[z>>2]|0;s=0;while(1){r=x+(N(s,-23)|0)|0;b=b+-1|0;if((d|0)>0){q=a+((b<<4)+124)|0;p=0;while(1){o=a+140+(r+(p*46|0)<<2)|0;c[A>>2]=a+25264+(b*4608|0)+(p*2304|0);d=576;e=0;a:while(1){c[B>>2]=e;while(1){f=d+-1|0;if(!d)break a;n=c[(c[A>>2]|0)+(f<<2)>>2]|0;e=((n|0)<0)<<31>>31;e=rb(n|0,e|0,n|0,e|0)|0;e=nb(e|0,y|0,1073741824,0)|0;e=pb(e|0,y|0,31)|0;c[a+34492+(f<<2)>>2]=e;e=c[(c[A>>2]|0)+(f<<2)>>2]|0;e=(e|0)>-1?e:0-e|0;c[a+36796+(f<<2)>>2]=e;if((e|0)>(c[B>>2]|0)){d=f;continue a}else d=f}}m=a+2224+(b*4608|0)+(p*2304|0)|0;n=a+156+(p*184|0)+(b*92|0)|0;c[a+156+(p*184|0)+(b*92|0)+56>>2]=21;ob(t+(p*336|0)+(b*168|0)|0,0,168)|0;b:do if((c[C>>2]|0)==3){k=c[D>>2]|0;c[a+39448+(p<<2)>>2]=c[B>>2];d=0;e=575;while(1){d=(c[a+34492+(e<<2)>>2]>>10)+d|0;if(!e)break;else e=e+-1|0}if(!d)d=0;else d=~~(+L(+(+(d|0)*4.768371584e-07))/.69314718);c[a+39104+(p<<2)>>2]=d;i=20;j=c[1464+(k*92|0)+84>>2]|0;while(1){f=j;j=c[1464+(k*92|0)+(i<<2)>>2]|0;if((j|0)<(f|0)){d=0;e=j;do{d=(c[a+34492+(e<<2)>>2]>>10)+d|0;e=e+1|0}while((e|0)!=(f|0));if(d)d=~~(+L(+(+(d|0)*4.768371584e-07))/.69314718);else d=0}else d=0;c[a+39112+(p*84|0)+(i<<2)>>2]=d;g=+h[t+(p*336|0)+(b*168|0)+(i<<3)>>3];if(g!=0.0)d=~~(+L(+g)/.69314718);else d=0;c[a+39280+(p*84|0)+(i<<2)>>2]=d;if(!i)break;else i=i+-1|0}if((p|0)==1){j=(c[u>>2]|0)!=0;e=c[E>>2]|0?3:2;i=(c[v>>2]|0)-(c[w>>2]|0)|0;i=(((i|0)>-1?i:0-i|0)|0)<10;d=0;f=20;while(1){k=(c[a+39112+(f<<2)>>2]|0)-(c[a+39196+(f<<2)>>2]|0)|0;d=((k|0)>-1?k:0-k|0)+d|0;if(!f)break;else f=f+-1|0}if(((j&1)+e+(i&1)+((d|0)<100&1)|0)==6){d=0;e=0}else{c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;break}do{while(1){k=a+124+(b<<4)+(d<<2)|0;c[k>>2]=0;d=d+1|0;j=e;e=c[1008+(d<<2)>>2]|0;if((j|0)<(e|0)){f=0;i=0;do{G=(c[a+39112+(j<<2)>>2]|0)-(c[a+39196+(j<<2)>>2]|0)|0;f=((G|0)>-1?G:0-G|0)+f|0;G=(c[a+39280+(j<<2)>>2]|0)-(c[a+39364+(j<<2)>>2]|0)|0;i=((G|0)>-1?G:0-G|0)+i|0;j=j+1|0}while((j|0)!=(e|0))}else{i=0;f=0}if((f|0)<10&(i|0)<10)break;c[k>>2]=0;if((d|0)>=4)break b}c[k>>2]=1}while((d|0)<4)}}while(0);d=Na(a+2192+(b<<4)+(p<<3)|0,a)|0;e=a+1208+(p*176|0)+(b*88|0)|0;f=e+88|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));ob(a+1560+(p*312|0)+(b*156|0)|0,0,156)|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[n>>2]=0;c[a+156+(p*184|0)+(b*92|0)+4>>2]=0;c[a+156+(p*184|0)+(b*92|0)+8>>2]=0;e=a+156+(p*184|0)+(b*92|0)+16|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));if(c[B>>2]|0)c[n>>2]=ya(d,0,m,p,b,a)|0;Oa(n,a);c[a+156+(p*184|0)+(b*92|0)+12>>2]=(c[a+156+(p*184|0)+(b*92|0)+72>>2]|0)+210;p=p+1|0;d=c[z>>2]|0;if((p|0)>=(d|0))break}}if(!b)break;else s=s+1|0}Pa(a);l=F;return}function Aa(a){a=a|0;var b=0,d=0,e=0.0;b=128;d=127;while(1){e=+Y(+(+(128-b|0)*.25));h[a+39456+(d<<3)>>3]=e;e=e*2.0;c[a+40480+(d<<2)>>2]=e>2147483647.0?2147483647:~~(e+.5);if(!d){b=9999;break}else{b=d;d=d+-1|0}}while(1){e=+(b|0);c[a+40992+(b<<2)>>2]=~~(+B(+(e*+B(+e)))+-.0946+.5);if(!b)break;else b=b+-1|0}return}function Ba(a){a=a|0;var b=0,d=0.0,e=0;b=17;while(1){d=+(b<<1|1|0);e=35;while(1){c[a+80992+(b*144|0)+(e<<2)>>2]=~~(+E(+((+(e|0)+.5)*.087266462599717))*+D(+(d*(+((e<<1)+19|0)*.043633231299858195)))*2147483647.0);if(!e)break;else e=e+-1|0}if(!b)break;else b=b+-1|0}return}function Ca(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;s=l;l=l+144|0;p=s;d=c[a>>2]|0;if(!d){l=s;return}q=a+16|0;r=p+140|0;do{d=d+-1|0;e=c[q>>2]|0;if((e|0)>0){o=a+2184+(d<<2)|0;n=0;do{m=a+25264+(d*4608|0)+(n*2304|0)|0;k=n;n=n+1|0;e=0;do{Ea(o,a+11440+(d*6912|0)+(n*2304|0)+(e<<7)|0,d,a,b);j=e|1;Ea(o,a+11440+(d*6912|0)+(n*2304|0)+(j<<7)|0,d,a,b);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+4|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+12|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+20|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+28|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+36|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+44|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+52|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+60|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+68|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+76|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+84|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+92|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+100|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+108|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+116|0;c[i>>2]=0-(c[i>>2]|0);j=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+124|0;c[j>>2]=0-(c[j>>2]|0);e=e+2|0}while((e|0)<18);j=0;while(1){e=18;f=17;while(1){c[p+(f<<2)>>2]=c[a+11440+(d*6912|0)+(k*2304|0)+(f<<7)+(j<<2)>>2];c[p+(e+17<<2)>>2]=c[a+11440+(d*6912|0)+(n*2304|0)+(f<<7)+(j<<2)>>2];if(!f)break;else{e=f;f=f+-1|0}}g=c[r>>2]|0;h=((g|0)<0)<<31>>31;i=17;while(1){e=c[a+80992+(i*144|0)+140>>2]|0;rb(e|0,((e|0)<0)<<31>>31|0,g|0,h|0)|0;e=35;f=y;do{v=e+-1|0;t=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;t=y+f|0;v=e+-2|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;u=e+-3|0;v=c[p+(u<<2)>>2]|0;u=c[a+80992+(i*144|0)+(u<<2)>>2]|0;rb(u|0,((u|0)<0)<<31>>31|0,v|0,((v|0)<0)<<31>>31|0)|0;t=t+y|0;v=e+-4|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;u=e+-5|0;v=c[p+(u<<2)>>2]|0;u=c[a+80992+(i*144|0)+(u<<2)>>2]|0;rb(u|0,((u|0)<0)<<31>>31|0,v|0,((v|0)<0)<<31>>31|0)|0;t=t+y|0;v=e+-6|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;e=e+-7|0;u=c[p+(e<<2)>>2]|0;v=c[a+80992+(i*144|0)+(e<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;f=t+y|0}while((e|0)!=0);c[m+(j*72|0)+(i<<2)>>2]=f;if(!i)break;else i=i+-1|0}if(!j){j=1;continue}v=m+(j*72|0)|0;e=c[v>>2]|0;u=((e|0)<0)<<31>>31;w=rb(e|0,u|0,1841452035,0)|0;i=y;t=j+-1|0;h=m+(t*72|0)+68|0;g=c[h>>2]|0;f=((g|0)<0)<<31>>31;x=rb(g|0,f|0,1104871221,0)|0;i=nb(x|0,y|0,w|0,i|0)|0;i=pb(i|0,y|0,31)|0;u=rb(e|0,u|0,-1104871221,-1)|0;e=y;f=rb(g|0,f|0,1841452035,0)|0;e=nb(f|0,y|0,u|0,e|0)|0;e=pb(e|0,y|0,31)|0;c[h>>2]=e;c[v>>2]=i;v=m+(j*72|0)+4|0;i=c[v>>2]|0;h=((i|0)<0)<<31>>31;e=rb(i|0,h|0,1893526520,0)|0;u=y;f=m+(t*72|0)+64|0;g=c[f>>2]|0;w=((g|0)<0)<<31>>31;x=rb(g|0,w|0,1013036688,0)|0;u=nb(x|0,y|0,e|0,u|0)|0;u=pb(u|0,y|0,31)|0;h=rb(i|0,h|0,-1013036688,-1)|0;i=y;w=rb(g|0,w|0,1893526520,0)|0;i=nb(w|0,y|0,h|0,i|0)|0;i=pb(i|0,y|0,31)|0;c[f>>2]=i;c[v>>2]=u;v=m+(j*72|0)+8|0;u=c[v>>2]|0;f=((u|0)<0)<<31>>31;i=rb(u|0,f|0,2039311994,0)|0;h=y;w=m+(t*72|0)+60|0;g=c[w>>2]|0;e=((g|0)<0)<<31>>31;x=rb(g|0,e|0,672972958,0)|0;h=nb(x|0,y|0,i|0,h|0)|0;h=pb(h|0,y|0,31)|0;f=rb(u|0,f|0,-672972958,-1)|0;u=y;e=rb(g|0,e|0,2039311994,0)|0;u=nb(e|0,y|0,f|0,u|0)|0;u=pb(u|0,y|0,31)|0;c[w>>2]=u;c[v>>2]=h;v=m+(j*72|0)+12|0;h=c[v>>2]|0;w=((h|0)<0)<<31>>31;u=rb(h|0,w|0,2111652007,0)|0;f=y;e=m+(t*72|0)+56|0;g=c[e>>2]|0;i=((g|0)<0)<<31>>31;x=rb(g|0,i|0,390655621,0)|0;f=nb(x|0,y|0,u|0,f|0)|0;f=pb(f|0,y|0,31)|0;w=rb(h|0,w|0,-390655621,-1)|0;h=y;i=rb(g|0,i|0,2111652007,0)|0;h=nb(i|0,y|0,w|0,h|0)|0;h=pb(h|0,y|0,31)|0;c[e>>2]=h;c[v>>2]=f;v=m+(j*72|0)+16|0;f=c[v>>2]|0;e=((f|0)<0)<<31>>31;h=rb(f|0,e|0,2137858230,0)|0;w=y;i=m+(t*72|0)+52|0;g=c[i>>2]|0;u=((g|0)<0)<<31>>31;x=rb(g|0,u|0,203096531,0)|0;w=nb(x|0,y|0,h|0,w|0)|0;w=pb(w|0,y|0,31)|0;e=rb(f|0,e|0,-203096531,-1)|0;f=y;u=rb(g|0,u|0,2137858230,0)|0;f=nb(u|0,y|0,e|0,f|0)|0;f=pb(f|0,y|0,31)|0;c[i>>2]=f;c[v>>2]=w;v=m+(j*72|0)+20|0;w=c[v>>2]|0;i=((w|0)<0)<<31>>31;f=rb(w|0,i|0,2145680959,0)|0;e=y;u=m+(t*72|0)+48|0;g=c[u>>2]|0;h=((g|0)<0)<<31>>31;x=rb(g|0,h|0,87972919,0)|0;e=nb(x|0,y|0,f|0,e|0)|0;e=pb(e|0,y|0,31)|0;i=rb(w|0,i|0,-87972919,-1)|0;w=y;h=rb(g|0,h|0,2145680959,0)|0;w=nb(h|0,y|0,i|0,w|0)|0;w=pb(w|0,y|0,31)|0;c[u>>2]=w;c[v>>2]=e;v=m+(j*72|0)+24|0;e=c[v>>2]|0;u=((e|0)<0)<<31>>31;w=rb(e|0,u|0,2147267170,0)|0;i=y;h=m+(t*72|0)+44|0;g=c[h>>2]|0;f=((g|0)<0)<<31>>31;x=rb(g|0,f|0,30491193,0)|0;i=nb(x|0,y|0,w|0,i|0)|0;i=pb(i|0,y|0,31)|0;u=rb(e|0,u|0,-30491193,-1)|0;e=y;f=rb(g|0,f|0,2147267170,0)|0;e=nb(f|0,y|0,u|0,e|0)|0;e=pb(e|0,y|0,31)|0;c[h>>2]=e;c[v>>2]=i;v=m+(j*72|0)+28|0;i=c[v>>2]|0;h=((i|0)<0)<<31>>31;e=rb(i|0,h|0,2147468947,0)|0;u=y;t=m+(t*72|0)+40|0;f=c[t>>2]|0;g=((f|0)<0)<<31>>31;w=rb(f|0,g|0,7945635,0)|0;u=nb(w|0,y|0,e|0,u|0)|0;u=pb(u|0,y|0,31)|0;h=rb(i|0,h|0,-7945635,-1)|0;i=y;g=rb(f|0,g|0,2147468947,0)|0;i=nb(g|0,y|0,h|0,i|0)|0;i=pb(i|0,y|0,31)|0;c[t>>2]=i;c[v>>2]=u;j=j+1|0;if((j|0)==32)break}e=c[q>>2]|0}while((n|0)<(e|0))}tb(a+11440+(d*6912|0)|0,a+11440+(d*6912|0)+(e*2304|0)|0,2304)|0}while((d|0)!=0);l=s;return}function Da(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+16|0;e=j;c[a+83588>>2]=0;c[a+83584>>2]=0;ob(a+91784|0,0,4096)|0;g=31;while(1){i=g<<1|1;b=64;f=63;while(1){d=+D(+(+(N(17-b|0,i)|0)*.049087385212))*1.0e9;h[e>>3]=d;if(!(d>=0.0))+bb(d+-.5,e);else+bb(d+.5,e);c[a+83592+(g<<8)+(f<<2)>>2]=~~(+h[e>>3]*2.147483647);if(!f)break;else{b=f;f=f+-1|0}}if(!g)break;else g=g+-1|0}l=j;return}function Ea(a,b,d,f,g){a=a|0;b=b|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+256|0;o=p;j=c[a>>2]|0;n=f+83584+(d<<2)|0;k=g<<5;h=j;i=31;m=c[n>>2]|0;while(1){c[f+91784+(d<<11)+(i+m<<2)>>2]=(e[h>>1]|0)<<16;m=c[n>>2]|0;if(!i)break;else{h=h+(g<<1)|0;i=i+-1|0}}c[a>>2]=j+(k<<1);h=64;a=63;while(1){j=a+m|0;k=c[f+91784+(d<<11)+((j&511)<<2)>>2]|0;g=c[2292+(a<<2)>>2]|0;rb(g|0,((g|0)<0)<<31>>31|0,k|0,((k|0)<0)<<31>>31|0)|0;k=y;g=c[f+91784+(d<<11)+((j+64&511)<<2)>>2]|0;i=c[2292+(h+63<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=y+k|0;g=c[f+91784+(d<<11)+((j+128&511)<<2)>>2]|0;i=c[2292+(h+127<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+192&511)<<2)>>2]|0;i=c[2292+(h+191<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+256&511)<<2)>>2]|0;i=c[2292+(h+255<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+320&511)<<2)>>2]|0;i=c[2292+(h+319<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+384&511)<<2)>>2]|0;i=c[2292+(h+383<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;j=c[f+91784+(d<<11)+((j+448&511)<<2)>>2]|0;g=c[2292+(h+447<<2)>>2]|0;rb(g|0,((g|0)<0)<<31>>31|0,j|0,((j|0)<0)<<31>>31|0)|0;c[o+(a<<2)>>2]=k+y;if(!a)break;else{h=a;a=a+-1|0}}c[n>>2]=m+480&511;i=c[o+252>>2]|0;g=((i|0)<0)<<31>>31;j=31;while(1){h=c[f+83592+(j<<8)+252>>2]|0;rb(i|0,g|0,h|0,((h|0)<0)<<31>>31|0)|0;h=y;a=63;do{m=a+-1|0;n=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=y+h|0;m=a+-2|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;d=a+-3|0;m=c[f+83592+(j<<8)+(d<<2)>>2]|0;d=c[o+(d<<2)>>2]|0;rb(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=n+y|0;m=a+-4|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;d=a+-5|0;m=c[f+83592+(j<<8)+(d<<2)>>2]|0;d=c[o+(d<<2)>>2]|0;rb(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=n+y|0;m=a+-6|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;a=a+-7|0;d=c[f+83592+(j<<8)+(a<<2)>>2]|0;m=c[o+(a<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;h=n+y|0}while((a|0)!=0);c[b+(j<<2)>>2]=h;if(!j)break;else j=j+-1|0}l=p;return}function Fa(a){a=a|0;c[a+4>>2]=128;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=1;return}function Ga(a,b){a=a|0;b=b|0;if((c[1208+(b<<2)>>2]|0)==(a|0)){b=0;return b|0}if((c[1224+(b<<2)>>2]|0)==(a|0)){b=1;return b|0}if((c[1240+(b<<2)>>2]|0)==(a|0)){b=2;return b|0}if((c[1256+(b<<2)>>2]|0)==(a|0)){b=3;return b|0}if((c[1272+(b<<2)>>2]|0)==(a|0)){b=4;return b|0}if((c[1288+(b<<2)>>2]|0)==(a|0)){b=5;return b|0}if((c[1304+(b<<2)>>2]|0)==(a|0)){b=6;return b|0}if((c[1320+(b<<2)>>2]|0)==(a|0)){b=7;return b|0}if((c[1336+(b<<2)>>2]|0)==(a|0)){b=8;return b|0}if((c[1352+(b<<2)>>2]|0)==(a|0)){b=9;return b|0}if((c[1368+(b<<2)>>2]|0)==(a|0)){b=10;return b|0}if((c[1384+(b<<2)>>2]|0)==(a|0)){b=11;return b|0}if((c[1400+(b<<2)>>2]|0)==(a|0)){b=12;return b|0}if((c[1416+(b<<2)>>2]|0)==(a|0)){b=13;return b|0}if((c[1432+(b<<2)>>2]|0)==(a|0)){b=14;return b|0}else return ((c[1448+(b<<2)>>2]|0)==(a|0)?15:-1)|0;return 0}function Ha(a,b){a=a|0;b=b|0;if((c[293]|0)!=(a|0))if((c[294]|0)!=(a|0))if((c[295]|0)!=(a|0))if((c[296]|0)!=(a|0))if((c[297]|0)!=(a|0))if((c[298]|0)!=(a|0))if((c[299]|0)!=(a|0))if((c[300]|0)!=(a|0))if((c[301]|0)==(a|0))a=8;else{b=-1;return b|0}else a=7;else a=6;else a=5;else a=4;else a=3;else a=2;else a=1;else a=0;a=a>>>0<3?3:a>>>0<6?2:0;b=(Ga(b,a)|0)<0;b=b?-1:a;return b|0}function Ia(a){a=a|0;return (c[a+16>>2]|0)*576|0}function Ja(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;e=a+4|0;b=c[e>>2]|0;i=a+12|0;d=c[i>>2]|0;j=c[293]|0;if((j|0)!=(b|0))if((c[294]|0)!=(b|0))if((c[295]|0)!=(b|0))if((c[296]|0)!=(b|0))if((c[297]|0)!=(b|0))if((c[298]|0)!=(b|0))if((c[299]|0)!=(b|0))if((c[300]|0)!=(b|0))if((c[301]|0)==(b|0))b=8;else{j=0;return j|0}else b=7;else b=6;else b=5;else b=4;else b=3;else b=2;else b=1;else b=0;if((Ga(d,b>>>0<3?3:b>>>0<6?2:0)|0)<0){j=0;return j|0}g=ib(1,95880)|0;if(!g){j=g;return j|0}Da(g);Ba(g);Aa(g);c[g>>2]=c[a>>2];f=c[e>>2]|0;c[g+4>>2]=f;d=g+8|0;c[g+20>>2]=c[a+8>>2];e=c[i>>2]|0;c[g+24>>2]=e;c[g+28>>2]=c[a+16>>2];c[g+88>>2]=c[a+20>>2];c[g+92>>2]=c[a+24>>2];c[g+34484>>2]=0;c[g+34480>>2]=0;c[g+12>>2]=1;c[g+76>>2]=0;c[g+80>>2]=0;c[g+84>>2]=0;c[g+40>>2]=8;if((j|0)!=(f|0))if((c[294]|0)!=(f|0))if((c[295]|0)!=(f|0))if((c[296]|0)!=(f|0))if((c[297]|0)!=(f|0))if((c[298]|0)!=(f|0))if((c[299]|0)!=(f|0))if((c[300]|0)==(f|0))b=7;else b=(c[301]|0)==(f|0)?8:-1;else b=6;else b=5;else b=4;else b=3;else b=2;else b=1;else b=0;c[g+72>>2]=b;j=(b|0)<3?3:(b|0)<6?2:0;c[d>>2]=j;c[g+68>>2]=Ga(e,j)|0;j=c[1028+(j<<2)>>2]|0;b=g+16|0;c[b>>2]=j;k=+(j|0)*576.0/+(f|0)*(+(e|0)*1.0e3*.125);j=~~k;c[g+64>>2]=j;k=k-+(j|0);h[g+48>>3]=k;h[g+56>>3]=-k;if(k==0.0)c[g+32>>2]=0;ra(g+96|0,4096);ob(g+116|0,0,408)|0;j=(c[g>>2]|0)==1;c[g+524>>2]=(c[b>>2]|0)==2?(j?168:288):j?104:168;j=g;return j|0}function Ka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0;c[a+2184>>2]=c[b>>2];if((c[a>>2]|0)==2)c[a+2188>>2]=c[b+4>>2];e=+h[a+48>>3];if(e!=0.0){f=a+56|0;i=+h[f>>3];g=i<=e+-1.0;b=g&1;c[a+32>>2]=b;h[f>>3]=i+(+(g&1)-e)}else b=c[a+32>>2]|0;g=(c[a+64>>2]|0)+b<<3;c[a+36>>2]=g;c[a+528>>2]=(g-(c[a+524>>2]|0)|0)/(c[a+16>>2]|0)|0;Ca(a,1);za(a);va(a);g=a+104|0;c[d>>2]=c[g>>2];c[g>>2]=0;return c[a+96>>2]|0}function La(a,b){a=a|0;b=b|0;var d=0;d=a+104|0;c[b>>2]=c[d>>2];c[d>>2]=0;return c[a+96>>2]|0}function Ma(a){a=a|0;sa(a+96|0);hb(a);return}function Na(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b+528>>2]|0)/(c[b>>2]|0)|0;e=(d|0)<4095?d:4095;f=c[b+34484>>2]|0;if(!f){f=e;return f|0}a=~~(+h[a>>3]*3.1-+(d|0));d=c[b+34480>>2]|0;if((a|0)>100){b=(d*6|0)/10|0;a=(b|0)<(a|0)?b:a}else a=0;f=d-((f<<3|0)/10|0)|0;f=((f|0)>(a|0)?f:a)+e|0;f=(f|0)<4095?f:4095;return f|0}function Oa(a,b){a=a|0;b=b|0;var d=0;d=b+34480|0;c[d>>2]=((c[b+528>>2]|0)/(c[b>>2]|0)|0)-(c[a>>2]|0)+(c[d>>2]|0);return}function Pa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;f=c[a>>2]|0;if((f|0)==2?c[a+528>>2]&1|0:0){h=a+34480|0;c[h>>2]=(c[h>>2]|0)+1}h=a+34480|0;e=c[h>>2]|0;b=e-(c[a+34484>>2]|0)|0;b=(b|0)>0?b:0;e=e-b|0;g=(e|0)%8|0;b=g+b|0;c[h>>2]=e-g;if(!b)return;d=a+156|0;e=(c[d>>2]|0)+b|0;if(e>>>0<4095){c[d>>2]=e;return}h=a+16|0;d=c[h>>2]|0;if((d|0)>0){g=0;e=f;do{if((e|0)>0){f=0;d=e;while(1){if(!b){b=0;e=d;break}e=a+156+(g*184|0)+(f*92|0)|0;i=c[e>>2]|0;d=4095-i|0;d=(d|0)<(b|0)?d:b;c[e>>2]=d+i;b=b-d|0;f=f+1|0;d=c[a>>2]|0;if((f|0)>=(d|0)){e=d;break}}d=c[h>>2]|0}g=g+1|0}while((g|0)<(d|0))}c[a+120>>2]=b;return}function Qa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[g>>2]=a;c[g+4>>2]=b;b=g+8|0;Fa(b);c[b>>2]=d;c[g+12>>2]=e;e=Ja(g)|0;l=f;return e|0}function Ra(){return 8944}function Sa(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Za(c[a+60>>2]|0)|0;a=Va(ba(6,d|0)|0)|0;l=b;return a|0}function Ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+16|0;g=n;f=n+32|0;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=Va(ga(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=(o<<31>>31)+b|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=Va(ga(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function Ua(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((Va(ca(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function Va(a){a=a|0;if(a>>>0>4294963200){c[(Wa()|0)>>2]=0-a;a=-1}return a|0}function Wa(){return (Xa()|0)+64|0}function Xa(){return Ya()|0}function Ya(){return 4340}function Za(a){a=a|0;return a|0}function _a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=3;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,ea(54,f|0)|0):0)a[b+75>>0]=-1;f=Ta(b,d,e)|0;l=g;return f|0}function $a(a){a=a|0;return 0}function ab(a){a=a|0;return}function bb(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0,i=0.0;h[j>>3]=a;f=c[j>>2]|0;g=c[j+4>>2]|0;d=pb(f|0,g|0,52)|0;d=d&2047;e=d+-1023|0;if((e|0)>51){h[b>>3]=a;c[j>>2]=0;c[j+4>>2]=g&-2147483648;return +((f|0)==0&(g&1048575|0)==0|(e|0)!=1024?+h[j>>3]:a)}do if(d>>>0>=1023){d=pb(-1,1048575,e|0)|0;e=y;if((d&f|0)==0&(e&g|0)==0){h[b>>3]=a;c[j>>2]=0;c[j+4>>2]=g&-2147483648;a=+h[j>>3];break}else{d=f&~d;f=g&~e;c[j>>2]=d;c[j+4>>2]=f;i=+h[j>>3];g=b;c[g>>2]=d;c[g+4>>2]=f;a=a-i;break}}else{f=b;c[f>>2]=0;c[f+4>>2]=g&-2147483648}while(0);return +a}function cb(){Z(9008);return 9016}function db(){fa(9008);return}function eb(a){a=a|0;var b=0,d=0;do if(a){if((c[a+76>>2]|0)<=-1){b=fb(a)|0;break}d=($a(a)|0)==0;b=fb(a)|0;if(!d)ab(a)}else{if(!(c[1177]|0))b=0;else b=eb(c[1177]|0)|0;a=c[(cb()|0)>>2]|0;if(a)do{if((c[a+76>>2]|0)>-1)d=$a(a)|0;else d=0;if((c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0)b=fb(a)|0|b;if(d|0)ab(a);a=c[a+56>>2]|0}while((a|0)!=0);db()}while(0);return b|0}function fb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;h=a+28|0;if((c[b>>2]|0)>>>0>(c[h>>2]|0)>>>0?(ja[c[a+36>>2]&3](a,0,0)|0,(c[b>>2]|0)==0):0)a=-1;else{d=a+4|0;e=c[d>>2]|0;f=a+8|0;g=c[f>>2]|0;if(e>>>0<g>>>0)ja[c[a+40>>2]&3](a,e-g|0,1)|0;c[a+16>>2]=0;c[h>>2]=0;c[b>>2]=0;c[f>>2]=0;c[d>>2]=0;a=0}return a|0}function gb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+16|0;o=K;do if(a>>>0<245){p=a>>>0<11?16:a+11&-8;a=p>>>3;t=c[2255]|0;d=t>>>a;if(d&3|0){a=(d&1^1)+a|0;d=9060+(a<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[2259]|0)>>>0)$();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else $()}else c[2255]=t&~(1<<a);while(0);J=a<<3;c[f+4>>2]=J|3;J=f+J+4|0;c[J>>2]=c[J>>2]|1;J=g;l=K;return J|0}s=c[2257]|0;if(p>>>0>s>>>0){if(d|0){i=2<<a;a=d<<a&(i|0-i);a=(a&0-a)+-1|0;i=a>>>12&16;a=a>>>i;e=a>>>5&8;a=a>>>e;g=a>>>2&4;a=a>>>g;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=(e|i|g|d|b)+(a>>>b)|0;a=9060+(b<<1<<2)|0;d=a+8|0;g=c[d>>2]|0;i=g+8|0;e=c[i>>2]|0;do if((a|0)!=(e|0)){if(e>>>0<(c[2259]|0)>>>0)$();f=e+12|0;if((c[f>>2]|0)==(g|0)){c[f>>2]=a;c[d>>2]=e;j=t;break}else $()}else{j=t&~(1<<b);c[2255]=j}while(0);h=(b<<3)-p|0;c[g+4>>2]=p|3;e=g+p|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(s|0){f=c[2260]|0;b=s>>>3;d=9060+(b<<1<<2)|0;b=1<<b;if(j&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{k=a;m=b}}else{c[2255]=j|b;k=d;m=d+8|0}c[m>>2]=f;c[k+12>>2]=f;c[f+8>>2]=k;c[f+12>>2]=d}c[2257]=h;c[2260]=e;J=i;l=K;return J|0}k=c[2256]|0;if(k){a=(k&0-k)+-1|0;I=a>>>12&16;a=a>>>I;H=a>>>5&8;a=a>>>H;J=a>>>2&4;a=a>>>J;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=c[9324+((H|I|J|d|b)+(a>>>b)<<2)>>2]|0;a=(c[b+4>>2]&-8)-p|0;d=c[b+16+(((c[b+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=b;h=a}else{do{I=(c[d+4>>2]&-8)-p|0;J=I>>>0<a>>>0;a=J?I:a;b=J?d:b;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=b;h=a}f=c[2259]|0;if(j>>>0<f>>>0)$();i=j+p|0;if(j>>>0>=i>>>0)$();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)$();else{c[a>>2]=0;n=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)$();b=e+12|0;if((c[b>>2]|0)!=(j|0))$();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;n=d;break}else $()}while(0);a:do if(g|0){b=c[j+28>>2]|0;a=9324+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[2256]=k&~(1<<b);break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=n;if(!n)break a;else break}else $();while(0);a=c[2259]|0;if(n>>>0<a>>>0)$();c[n+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)$();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[j+20>>2]|0;if(b|0)if(b>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(h>>>0<16){J=h+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}else{c[j+4>>2]=p|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(s|0){e=c[2260]|0;b=s>>>3;d=9060+(b<<1<<2)|0;b=1<<b;if(t&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{q=a;r=b}}else{c[2255]=t|b;q=d;r=d+8|0}c[r>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[2257]=h;c[2260]=i}J=j+8|0;l=K;return J|0}}}else if(a>>>0<=4294967231){a=a+11|0;p=a&-8;k=c[2256]|0;if(k){e=0-p|0;a=a>>>8;if(a)if(p>>>0>16777215)i=31;else{r=(a+1048320|0)>>>16&8;C=a<<r;q=(C+520192|0)>>>16&4;C=C<<q;i=(C+245760|0)>>>16&2;i=14-(q|r|i)+(C<<i>>>15)|0;i=p>>>(i+7|0)&1|i<<1}else i=0;d=c[9324+(i<<2)>>2]|0;b:do if(!d){d=0;a=0;C=81}else{a=0;h=p<<((i|0)==31?0:25-(i>>>1)|0);g=0;while(1){f=(c[d+4>>2]&-8)-p|0;if(f>>>0<e>>>0)if(!f){a=d;e=0;f=d;C=85;break b}else{a=d;e=f}f=c[d+20>>2]|0;d=c[d+16+(h>>>31<<2)>>2]|0;g=(f|0)==0|(f|0)==(d|0)?g:f;f=(d|0)==0;if(f){d=g;C=81;break}else h=h<<((f^1)&1)}}while(0);if((C|0)==81){if((d|0)==0&(a|0)==0){a=2<<i;a=k&(a|0-a);if(!a)break;r=(a&0-a)+-1|0;m=r>>>12&16;r=r>>>m;j=r>>>5&8;r=r>>>j;n=r>>>2&4;r=r>>>n;q=r>>>1&2;r=r>>>q;d=r>>>1&1;a=0;d=c[9324+((j|m|n|q|d)+(r>>>d)<<2)>>2]|0}if(!d){j=a;i=e}else{f=d;C=85}}if((C|0)==85)while(1){C=0;d=(c[f+4>>2]&-8)-p|0;r=d>>>0<e>>>0;d=r?d:e;a=r?f:a;f=c[f+16+(((c[f+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){j=a;i=d;break}else{e=d;C=85}}if((j|0)!=0?i>>>0<((c[2257]|0)-p|0)>>>0:0){f=c[2259]|0;if(j>>>0<f>>>0)$();h=j+p|0;if(j>>>0>=h>>>0)$();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){s=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)$();else{c[a>>2]=0;s=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)$();b=e+12|0;if((c[b>>2]|0)!=(j|0))$();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;s=d;break}else $()}while(0);c:do if(g){b=c[j+28>>2]|0;a=9324+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=s;if(!s){t=k&~(1<<b);c[2256]=t;break c}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=s;if(!s){t=k;break c}else break}else $();while(0);a=c[2259]|0;if(s>>>0<a>>>0)$();c[s+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)$();else{c[s+16>>2]=b;c[b+24>>2]=s;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[2259]|0)>>>0)$();else{c[s+20>>2]=b;c[b+24>>2]=s;t=k;break}else t=k}else t=k;while(0);do if(i>>>0>=16){c[j+4>>2]=p|3;c[h+4>>2]=i|1;c[h+i>>2]=i;b=i>>>3;if(i>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{x=a;y=b}}else{c[2255]=a|b;x=d;y=d+8|0}c[y>>2]=h;c[x+12>>2]=h;c[h+8>>2]=x;c[h+12>>2]=d;break}b=i>>>8;if(b)if(i>>>0>16777215)b=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=i>>>(b+7|0)&1|b<<1}else b=0;d=9324+(b<<2)|0;c[h+28>>2]=b;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<b;if(!(t&a)){c[2256]=t|a;c[d>>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}a=i<<((b|0)==31?0:25-(b>>>1)|0);e=c[d>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){C=139;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=136;break}else{a=a<<1;e=b}}if((C|0)==136)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((C|0)==139){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=e;c[h+24>>2]=0;break}else $()}}else{J=i+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}while(0);J=j+8|0;l=K;return J|0}}}else p=-1;while(0);d=c[2257]|0;if(d>>>0>=p>>>0){b=d-p|0;a=c[2260]|0;if(b>>>0>15){J=a+p|0;c[2260]=J;c[2257]=b;c[J+4>>2]=b|1;c[J+b>>2]=b;c[a+4>>2]=p|3}else{c[2257]=0;c[2260]=0;c[a+4>>2]=d|3;J=a+d+4|0;c[J>>2]=c[J>>2]|1}J=a+8|0;l=K;return J|0}h=c[2258]|0;if(h>>>0>p>>>0){H=h-p|0;c[2258]=H;J=c[2261]|0;I=J+p|0;c[2261]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}if(!(c[2373]|0)){c[2375]=4096;c[2374]=4096;c[2376]=-1;c[2377]=-1;c[2378]=0;c[2366]=0;a=o&-16^1431655768;c[o>>2]=a;c[2373]=a;a=4096}else a=c[2375]|0;i=p+48|0;j=p+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=p>>>0){J=0;l=K;return J|0}a=c[2365]|0;if(a|0?(x=c[2363]|0,y=x+k|0,y>>>0<=x>>>0|y>>>0>a>>>0):0){J=0;l=K;return J|0}d:do if(!(c[2366]&4)){d=c[2261]|0;e:do if(d){e=9468;while(1){a=c[e>>2]|0;if(a>>>0<=d>>>0?(w=e+4|0,(a+(c[w>>2]|0)|0)>>>0>d>>>0):0)break;a=c[e+8>>2]|0;if(!a){C=163;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=sb(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[w>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;C=180;break d}}else{e=a;C=171}}else b=0}else C=163;while(0);do if((C|0)==163){d=sb(0)|0;if((d|0)!=(-1|0)?(b=d,u=c[2374]|0,v=u+-1|0,b=((v&b|0)==0?0:(v+b&0-u)-b|0)+k|0,u=c[2363]|0,v=b+u|0,b>>>0>p>>>0&b>>>0<2147483647):0){y=c[2365]|0;if(y|0?v>>>0<=u>>>0|v>>>0>y>>>0:0){b=0;break}a=sb(b|0)|0;if((a|0)==(d|0)){h=b;g=d;C=180;break d}else{e=a;C=171}}else b=0}while(0);do if((C|0)==171){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;C=180;break d}a=c[2375]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;C=180;break d}if((sb(a|0)|0)==(-1|0)){sb(d|0)|0;b=0;break}else{h=a+b|0;g=e;C=180;break d}}while(0);c[2366]=c[2366]|4;C=178}else{b=0;C=178}while(0);if(((C|0)==178?k>>>0<2147483647:0)?(B=sb(k|0)|0,y=sb(0)|0,z=y-B|0,A=z>>>0>(p+40|0)>>>0,!((B|0)==(-1|0)|A^1|B>>>0<y>>>0&((B|0)!=(-1|0)&(y|0)!=(-1|0))^1)):0){h=A?z:b;g=B;C=180}if((C|0)==180){b=(c[2363]|0)+h|0;c[2363]=b;if(b>>>0>(c[2364]|0)>>>0)c[2364]=b;k=c[2261]|0;do if(k){b=9468;while(1){a=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;if((g|0)==(a+e|0)){C=190;break}f=c[b+8>>2]|0;if(!f)break;else b=f}if(((C|0)==190?(c[b+12>>2]&8|0)==0:0)?k>>>0<g>>>0&k>>>0>=a>>>0:0){c[d>>2]=e+h;J=k+8|0;J=(J&7|0)==0?0:0-J&7;I=k+J|0;J=(c[2258]|0)+(h-J)|0;c[2261]=I;c[2258]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[2262]=c[2377];break}b=c[2259]|0;if(g>>>0<b>>>0){c[2259]=g;i=g}else i=b;d=g+h|0;b=9468;while(1){if((c[b>>2]|0)==(d|0)){C=198;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((C|0)==198?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;n=b+4|0;c[n>>2]=(c[n>>2]|0)+h;n=g+8|0;n=g+((n&7|0)==0?0:0-n&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;m=n+p|0;j=b-n-p|0;c[n+4>>2]=p|3;do if((b|0)!=(k|0)){if((b|0)==(c[2260]|0)){J=(c[2257]|0)+j|0;c[2257]=J;c[2260]=m;c[m+4>>2]=J|1;c[m+J>>2]=J;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;f=a>>>3;f:do if(a>>>0>=256){g=c[b+24>>2]|0;e=c[b+12>>2]|0;do if((e|0)==(b|0)){e=b+16|0;d=e+4|0;a=c[d>>2]|0;if(!a){a=c[e>>2]|0;if(!a){H=0;break}else d=e}while(1){e=a+20|0;f=c[e>>2]|0;if(f|0){a=f;d=e;continue}e=a+16|0;f=c[e>>2]|0;if(!f)break;else{a=f;d=e}}if(d>>>0<i>>>0)$();else{c[d>>2]=0;H=a;break}}else{f=c[b+8>>2]|0;if(f>>>0<i>>>0)$();a=f+12|0;if((c[a>>2]|0)!=(b|0))$();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;H=e;break}else $()}while(0);if(!g)break;a=c[b+28>>2]|0;d=9324+(a<<2)|0;do if((b|0)!=(c[d>>2]|0))if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(b|0)&1)<<2)>>2]=H;if(!H)break f;else break}else $();else{c[d>>2]=H;if(H|0)break;c[2256]=c[2256]&~(1<<a);break f}while(0);e=c[2259]|0;if(H>>>0<e>>>0)$();c[H+24>>2]=g;a=b+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<e>>>0)$();else{c[H+16>>2]=d;c[d+24>>2]=H;break}while(0);a=c[a+4>>2]|0;if(!a)break;if(a>>>0<(c[2259]|0)>>>0)$();else{c[H+20>>2]=a;c[a+24>>2]=H;break}}else{d=c[b+8>>2]|0;e=c[b+12>>2]|0;a=9060+(f<<1<<2)|0;do if((d|0)!=(a|0)){if(d>>>0<i>>>0)$();if((c[d+12>>2]|0)==(b|0))break;$()}while(0);if((e|0)==(d|0)){c[2255]=c[2255]&~(1<<f);break}do if((e|0)==(a|0))E=e+8|0;else{if(e>>>0<i>>>0)$();a=e+8|0;if((c[a>>2]|0)==(b|0)){E=a;break}$()}while(0);c[d+12>>2]=e;c[E>>2]=d}while(0);b=b+h|0;f=h+j|0}else f=j;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[m+4>>2]=f|1;c[m+f>>2]=f;b=f>>>3;if(f>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;do if(!(a&b)){c[2255]=a|b;I=d;J=d+8|0}else{b=d+8|0;a=c[b>>2]|0;if(a>>>0>=(c[2259]|0)>>>0){I=a;J=b;break}$()}while(0);c[J>>2]=m;c[I+12>>2]=m;c[m+8>>2]=I;c[m+12>>2]=d;break}b=f>>>8;do if(!b)b=0;else{if(f>>>0>16777215){b=31;break}I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=f>>>(b+7|0)&1|b<<1}while(0);e=9324+(b<<2)|0;c[m+28>>2]=b;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[2256]|0;d=1<<b;if(!(a&d)){c[2256]=a|d;c[e>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}a=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){C=265;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=262;break}else{a=a<<1;e=b}}if((C|0)==262)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}else if((C|0)==265){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=m;c[b>>2]=m;c[m+8>>2]=a;c[m+12>>2]=e;c[m+24>>2]=0;break}else $()}}else{J=(c[2258]|0)+j|0;c[2258]=J;c[2261]=m;c[m+4>>2]=J|1}while(0);J=n+8|0;l=K;return J|0}b=9468;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(D=a+(c[b+4>>2]|0)|0,D>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=D+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=k+16|0;a=a>>>0<f>>>0?k:a;b=a+8|0;d=g+8|0;d=(d&7|0)==0?0:0-d&7;J=g+d|0;d=h+-40-d|0;c[2261]=J;c[2258]=d;c[J+4>>2]=d|1;c[J+d+4>>2]=40;c[2262]=c[2377];d=a+4|0;c[d>>2]=27;c[b>>2]=c[2367];c[b+4>>2]=c[2368];c[b+8>>2]=c[2369];c[b+12>>2]=c[2370];c[2367]=g;c[2368]=h;c[2370]=0;c[2369]=b;b=a+24|0;do{J=b;b=b+4|0;c[b>>2]=7}while((J+8|0)>>>0<D>>>0);if((a|0)!=(k|0)){g=a-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{F=a;G=b}}else{c[2255]=a|b;F=d;G=d+8|0}c[G>>2]=k;c[F+12>>2]=k;c[k+8>>2]=F;c[k+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)d=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;d=(J+245760|0)>>>16&2;d=14-(H|I|d)+(J<<d>>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=9324+(d<<2)|0;c[k+28>>2]=d;c[k+20>>2]=0;c[f>>2]=0;b=c[2256]|0;a=1<<d;if(!(b&a)){c[2256]=b|a;c[e>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}a=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){C=292;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=289;break}else{a=a<<1;e=b}}if((C|0)==289)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((C|0)==292){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=k;c[b>>2]=k;c[k+8>>2]=a;c[k+12>>2]=e;c[k+24>>2]=0;break}else $()}}}else{J=c[2259]|0;if((J|0)==0|g>>>0<J>>>0)c[2259]=g;c[2367]=g;c[2368]=h;c[2370]=0;c[2264]=c[2373];c[2263]=-1;b=0;do{J=9060+(b<<1<<2)|0;c[J+12>>2]=J;c[J+8>>2]=J;b=b+1|0}while((b|0)!=32);J=g+8|0;J=(J&7|0)==0?0:0-J&7;I=g+J|0;J=h+-40-J|0;c[2261]=I;c[2258]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[2262]=c[2377]}while(0);b=c[2258]|0;if(b>>>0>p>>>0){H=b-p|0;c[2258]=H;J=c[2261]|0;I=J+p|0;c[2261]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}}c[(Wa()|0)>>2]=12;J=0;l=K;return J|0}function hb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!a)return;d=a+-8|0;h=c[2259]|0;if(d>>>0<h>>>0)$();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)$();e=a&-8;o=d+e|0;a:do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0<h>>>0)$();if((k|0)==(c[2260]|0)){a=o+4|0;b=c[a>>2]|0;if((b&3|0)!=3){r=k;f=j;m=k;break}c[2257]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=9060+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<h>>>0)$();if((c[b+12>>2]|0)!=(k|0))$()}if((d|0)==(b|0)){c[2255]=c[2255]&~(1<<e);r=k;f=j;m=k;break}if((d|0)!=(a|0)){if(d>>>0<h>>>0)$();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else $()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;r=k;f=j;m=k;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<h>>>0)$();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0<h>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(k|0))$();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else $()}while(0);if(g){a=c[k+28>>2]|0;b=9324+(a<<2)|0;do if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[2256]=c[2256]&~(1<<a);r=k;f=j;m=k;break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(k|0)&1)<<2)>>2]=i;if(!i){r=k;f=j;m=k;break a}else break}else $();while(0);d=c[2259]|0;if(i>>>0<d>>>0)$();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)$();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[2259]|0)>>>0)$();else{c[i+20>>2]=a;c[a+24>>2]=i;r=k;f=j;m=k;break}else{r=k;f=j;m=k}}else{r=k;f=j;m=k}}else{r=d;f=e;m=d}while(0);if(m>>>0>=o>>>0)$();a=o+4|0;b=c[a>>2]|0;if(!(b&1))$();if(!(b&2)){a=c[2260]|0;if((o|0)==(c[2261]|0)){q=(c[2258]|0)+f|0;c[2258]=q;c[2261]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[2260]=0;c[2257]=0;return}if((o|0)==(a|0)){q=(c[2257]|0)+f|0;c[2257]=q;c[2260]=m;c[r+4>>2]=q|1;c[m+q>>2]=q;return}f=(b&-8)+f|0;e=b>>>3;b:do if(b>>>0>=256){g=c[o+24>>2]|0;a=c[o+12>>2]|0;do if((a|0)==(o|0)){d=o+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[2259]|0)>>>0)$();else{c[b>>2]=0;n=a;break}}else{b=c[o+8>>2]|0;if(b>>>0<(c[2259]|0)>>>0)$();d=b+12|0;if((c[d>>2]|0)!=(o|0))$();e=a+8|0;if((c[e>>2]|0)==(o|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else $()}while(0);if(g|0){a=c[o+28>>2]|0;b=9324+(a<<2)|0;do if((o|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[2256]=c[2256]&~(1<<a);break b}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else $();while(0);d=c[2259]|0;if(n>>>0<d>>>0)$();c[n+24>>2]=g;a=o+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)$();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[o+8>>2]|0;d=c[o+12>>2]|0;a=9060+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[2259]|0)>>>0)$();if((c[b+12>>2]|0)!=(o|0))$()}if((d|0)==(b|0)){c[2255]=c[2255]&~(1<<e);break}if((d|0)!=(a|0)){if(d>>>0<(c[2259]|0)>>>0)$();a=d+8|0;if((c[a>>2]|0)==(o|0))l=a;else $()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[r+4>>2]=f|1;c[m+f>>2]=f;if((r|0)==(c[2260]|0)){c[2257]=f;return}}else{c[a>>2]=b&-2;c[r+4>>2]=f|1;c[m+f>>2]=f}a=f>>>3;if(f>>>0<256){d=9060+(a<<1<<2)|0;b=c[2255]|0;a=1<<a;if(b&a){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[2259]|0)>>>0)$();else{p=b;q=a}}else{c[2255]=b|a;p=d;q=d+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=9324+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;b=c[2256]|0;d=1<<a;do if(b&d){b=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=124;break}d=e+16+(b>>>31<<2)|0;a=c[d>>2]|0;if(!a){a=121;break}else{b=b<<1;e=a}}if((a|0)==121)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;break}else if((a|0)==124){a=e+8|0;b=c[a>>2]|0;q=c[2259]|0;if(b>>>0>=q>>>0&e>>>0>=q>>>0){c[b+12>>2]=r;c[a>>2]=r;c[r+8>>2]=b;c[r+12>>2]=e;c[r+24>>2]=0;break}else $()}}else{c[2256]=b|d;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r}while(0);r=(c[2263]|0)+-1|0;c[2263]=r;if(!r)a=9476;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[2263]=-1;return}function ib(a,b){a=a|0;b=b|0;var d=0;if(a){d=N(b,a)|0;if((b|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1}else d=0;a=gb(d)|0;if(!a)return a|0;if(!(c[a+-4>>2]&3))return a|0;ob(a|0,0,d|0)|0;return a|0}function jb(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=gb(b)|0;return b|0}if(b>>>0>4294967231){c[(Wa()|0)>>2]=12;b=0;return b|0}d=kb(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=gb(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;tb(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;hb(a);b=d;return b|0}function kb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=a+4|0;n=c[o>>2]|0;d=n&-8;k=a+d|0;i=c[2259]|0;e=n&3;if(!((e|0)!=1&a>>>0>=i>>>0&a>>>0<k>>>0))$();f=c[k+4>>2]|0;if(!(f&1))$();if(!e){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[2375]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;m=a+b|0;c[o>>2]=n&1|b|2;c[m+4>>2]=d|3;o=m+d+4|0;c[o>>2]=c[o>>2]|1;lb(m,d);return a|0}if((k|0)==(c[2261]|0)){m=(c[2258]|0)+d|0;d=m-b|0;e=a+b|0;if(m>>>0<=b>>>0){a=0;return a|0}c[o>>2]=n&1|b|2;c[e+4>>2]=d|1;c[2261]=e;c[2258]=d;return a|0}if((k|0)==(c[2260]|0)){f=(c[2257]|0)+d|0;if(f>>>0<b>>>0){a=0;return a|0}d=f-b|0;e=n&1;if(d>>>0>15){n=a+b|0;m=n+d|0;c[o>>2]=e|b|2;c[n+4>>2]=d|1;c[m>>2]=d;e=m+4|0;c[e>>2]=c[e>>2]&-2;e=n}else{c[o>>2]=e|f|2;e=a+f+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[2257]=d;c[2260]=e;return a|0}if(f&2|0){a=0;return a|0}l=(f&-8)+d|0;if(l>>>0<b>>>0){a=0;return a|0}m=l-b|0;g=f>>>3;a:do if(f>>>0>=256){h=c[k+24>>2]|0;f=c[k+12>>2]|0;do if((f|0)==(k|0)){f=k+16|0;e=f+4|0;d=c[e>>2]|0;if(!d){d=c[f>>2]|0;if(!d){j=0;break}else e=f}while(1){f=d+20|0;g=c[f>>2]|0;if(g|0){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<i>>>0)$();else{c[e>>2]=0;j=d;break}}else{g=c[k+8>>2]|0;if(g>>>0<i>>>0)$();d=g+12|0;if((c[d>>2]|0)!=(k|0))$();e=f+8|0;if((c[e>>2]|0)==(k|0)){c[d>>2]=f;c[e>>2]=g;j=f;break}else $()}while(0);if(h|0){d=c[k+28>>2]|0;e=9324+(d<<2)|0;do if((k|0)==(c[e>>2]|0)){c[e>>2]=j;if(!j){c[2256]=c[2256]&~(1<<d);break a}}else if(h>>>0>=(c[2259]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(k|0)&1)<<2)>>2]=j;if(!j)break a;else break}else $();while(0);f=c[2259]|0;if(j>>>0<f>>>0)$();c[j+24>>2]=h;d=k+16|0;e=c[d>>2]|0;do if(e|0)if(e>>>0<f>>>0)$();else{c[j+16>>2]=e;c[e+24>>2]=j;break}while(0);d=c[d+4>>2]|0;if(d|0)if(d>>>0<(c[2259]|0)>>>0)$();else{c[j+20>>2]=d;c[d+24>>2]=j;break}}}else{e=c[k+8>>2]|0;f=c[k+12>>2]|0;d=9060+(g<<1<<2)|0;if((e|0)!=(d|0)){if(e>>>0<i>>>0)$();if((c[e+12>>2]|0)!=(k|0))$()}if((f|0)==(e|0)){c[2255]=c[2255]&~(1<<g);break}if((f|0)!=(d|0)){if(f>>>0<i>>>0)$();d=f+8|0;if((c[d>>2]|0)==(k|0))h=d;else $()}else h=f+8|0;c[e+12>>2]=f;c[h>>2]=e}while(0);d=n&1;if(m>>>0<16){c[o>>2]=l|d|2;o=a+l+4|0;c[o>>2]=c[o>>2]|1;return a|0}else{n=a+b|0;c[o>>2]=d|b|2;c[n+4>>2]=m|3;o=n+m+4|0;c[o>>2]=c[o>>2]|1;lb(n,m);return a|0}return 0}function lb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;a:do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[2259]|0;if(l>>>0<i>>>0)$();if((l|0)==(c[2260]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[2257]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){d=c[l+8>>2]|0;b=c[l+12>>2]|0;a=9060+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<i>>>0)$();if((c[d+12>>2]|0)!=(l|0))$()}if((b|0)==(d|0)){c[2255]=c[2255]&~(1<<e);r=l;f=k;break}if((b|0)!=(a|0)){if(b>>>0<i>>>0)$();a=b+8|0;if((c[a>>2]|0)==(l|0))h=a;else $()}else h=b+8|0;c[d+12>>2]=b;c[h>>2]=d;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){j=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<i>>>0)$();else{c[d>>2]=0;j=a;break}}else{e=c[l+8>>2]|0;if(e>>>0<i>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(l|0))$();d=b+8|0;if((c[d>>2]|0)==(l|0)){c[a>>2]=b;c[d>>2]=e;j=b;break}else $()}while(0);if(g){a=c[l+28>>2]|0;d=9324+(a<<2)|0;do if((l|0)==(c[d>>2]|0)){c[d>>2]=j;if(!j){c[2256]=c[2256]&~(1<<a);r=l;f=k;break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(l|0)&1)<<2)>>2]=j;if(!j){r=l;f=k;break a}else break}else $();while(0);b=c[2259]|0;if(j>>>0<b>>>0)$();c[j+24>>2]=g;a=l+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)$();else{c[j+16>>2]=d;c[d+24>>2]=j;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[2259]|0)>>>0)$();else{c[j+20>>2]=a;c[a+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[2259]|0;if(o>>>0<h>>>0)$();a=o+4|0;d=c[a>>2]|0;if(!(d&2)){a=c[2260]|0;if((o|0)==(c[2261]|0)){q=(c[2258]|0)+f|0;c[2258]=q;c[2261]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[2260]=0;c[2257]=0;return}if((o|0)==(a|0)){q=(c[2257]|0)+f|0;c[2257]=q;c[2260]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(d&-8)+f|0;e=d>>>3;b:do if(d>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){n=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<h>>>0)$();else{c[d>>2]=0;n=a;break}}else{e=c[o+8>>2]|0;if(e>>>0<h>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(o|0))$();d=b+8|0;if((c[d>>2]|0)==(o|0)){c[a>>2]=b;c[d>>2]=e;n=b;break}else $()}while(0);if(g|0){a=c[o+28>>2]|0;d=9324+(a<<2)|0;do if((o|0)==(c[d>>2]|0)){c[d>>2]=n;if(!n){c[2256]=c[2256]&~(1<<a);break b}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else $();while(0);b=c[2259]|0;if(n>>>0<b>>>0)$();c[n+24>>2]=g;a=o+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)$();else{c[n+16>>2]=d;c[d+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{d=c[o+8>>2]|0;b=c[o+12>>2]|0;a=9060+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<h>>>0)$();if((c[d+12>>2]|0)!=(o|0))$()}if((b|0)==(d|0)){c[2255]=c[2255]&~(1<<e);break}if((b|0)!=(a|0)){if(b>>>0<h>>>0)$();a=b+8|0;if((c[a>>2]|0)==(o|0))m=a;else $()}else m=b+8|0;c[d+12>>2]=b;c[m>>2]=d}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[2260]|0)){c[2257]=f;return}}else{c[a>>2]=d&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}a=f>>>3;if(f>>>0<256){b=9060+(a<<1<<2)|0;d=c[2255]|0;a=1<<a;if(d&a){a=b+8|0;d=c[a>>2]|0;if(d>>>0<(c[2259]|0)>>>0)$();else{p=d;q=a}}else{c[2255]=d|a;p=b;q=b+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=b;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=9324+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;d=c[2256]|0;b=1<<a;if(!(d&b)){c[2256]=d|b;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}d=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=121;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=118;break}else{d=d<<1;e=a}}if((a|0)==118){if(b>>>0<(c[2259]|0)>>>0)$();c[b>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((a|0)==121){a=e+8|0;d=c[a>>2]|0;q=c[2259]|0;if(!(d>>>0>=q>>>0&e>>>0>=q>>>0))$();c[d+12>>2]=r;c[a>>2]=r;c[r+8>>2]=d;c[r+12>>2]=e;c[r+24>>2]=0;return}}function mb(){}function nb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function ob(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function pb(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function rb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=qb(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function sb(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){V()|0;aa(12);return -1}c[i>>2]=a;if((a|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=b;aa(12);return -1}return b|0}function tb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return da(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function ub(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function vb(a,b){a=a|0;b=b|0;return ia[a&1](b|0)|0}function wb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ja[a&3](b|0,c|0,d|0)|0}function xb(a){a=a|0;R(0);return 0}function yb(a,b,c){a=a|0;b=b|0;c=c|0;R(1);return 0} +- +-// EMSCRIPTEN_END_FUNCS +-var ia=[xb,Sa];var ja=[yb,_a,Ua,Ta];return{_llvm_bswap_i32:ub,_shine_check_config:Ha,_shine_flush:La,setThrew:oa,_bitshift64Lshr:pb,_shine_samples_per_pass:Ia,_fflush:eb,_shine_js_init:Qa,_memset:ob,_sbrk:sb,_memcpy:tb,___errno_location:Wa,_shine_encode_buffer:Ka,_shine_close:Ma,stackAlloc:ka,getTempRet0:qa,___muldi3:rb,setTempRet0:pa,_i64Add:nb,_emscripten_get_global_libc:Ra,stackSave:la,___muldsi3:qb,_free:hb,runPostSets:mb,establishStackSpace:na,stackRestore:ma,_malloc:gb,stackAlloc:ka,stackSave:la,stackRestore:ma,establishStackSpace:na,setThrew:oa,setTempRet0:pa,getTempRet0:qa,dynCall_ii:vb,dynCall_iiii:wb}}) +- +- +-// EMSCRIPTEN_END_ASM +-(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _shine_check_config=Module["_shine_check_config"]=asm["_shine_check_config"];var _shine_flush=Module["_shine_flush"]=asm["_shine_flush"];var setThrew=Module["setThrew"]=asm["setThrew"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=asm["_shine_samples_per_pass"];var _fflush=Module["_fflush"]=asm["_fflush"];var _shine_js_init=Module["_shine_js_init"]=asm["_shine_js_init"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _shine_encode_buffer=Module["_shine_encode_buffer"]=asm["_shine_encode_buffer"];var _shine_close=Module["_shine_close"]=asm["_shine_close"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=asm["_emscripten_get_global_libc"];var stackSave=Module["stackSave"]=asm["stackSave"];var ___muldsi3=Module["___muldsi3"]=asm["___muldsi3"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var _malloc=Module["_malloc"]=asm["_malloc"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}Module.printErr("exception thrown: "+toLog);Module["quit"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run();var isNode=typeof process==="object"&&typeof require==="function";var int16Len=Module.HEAP16.BYTES_PER_ELEMENT;var ptrLen=Module.HEAP32.BYTES_PER_ELEMENT;function Shine(args){if(_shine_check_config(args.samplerate,args.bitrate)<0)throw"Invalid configuration";var mode;if(!args.mode){if(args.channels===1){mode=Shine.MONO}else{mode=Shine.JOINT_STEREO}}else{mode=args.mode}this._handle=_shine_js_init(args.channels,args.samplerate,mode,args.bitrate);this._channels=args.channels;this._samples_per_pass=_shine_samples_per_pass(this._handle);this._buffer=_malloc(this._channels*ptrLen);this._pcm=new Array(this._channels);this._rem=new Array(this._channels);this._written=_malloc(int16Len);var _tmp,chan;for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array;_tmp=_malloc(this._samples_per_pass*int16Len);setValue(this._buffer+chan*ptrLen,_tmp,"*");this._pcm[chan]=Module.HEAP16.subarray(_tmp/int16Len,_tmp/int16Len+this._samples_per_pass)}return this}Shine.STEREO=0;Shine.JOINT_STEREO=1;Shine.DUAL_CHANNEL=2;Shine.MONO=3;Shine.prototype._encodePass=(function(data){if(!this._handle)throw"Closed";var chan;for(chan=0;chan<this._channels;chan++)this._pcm[chan].set(data[chan]);var _buf=_shine_encode_buffer(this._handle,this._buffer,this._written);var written=getValue(this._written,"i16");return Module.HEAPU8.subarray(_buf,_buf+written)});function concat(ctr,a,b){if(typeof b==="undefined"){return a}var ret=new ctr(a.length+b.length);ret.set(a);ret.subarray(a.length).set(b);return ret}function clip(x){return x>1?1:x<-1?-1:x}function convertFloat32(buf){var ret=new Array(buf.length);var samples=buf[0].length;var chan,i;for(chan=0;chan<buf.length;chan++){ret[chan]=new Int16Array(samples);for(i=0;i<samples;i++){ret[chan][i]=parseInt(clip(buf[chan][i])*32767)}}return ret}Shine.prototype.encode=(function(data){if(data.length!=this._channels)throw"Invalid data";var encoded=new Uint8Array;var tmp=new Array(this._channels);if(data[0]instanceof Float32Array){data=convertFloat32(data)}var chan;for(chan=0;chan<this._channels;chan++){tmp[chan]=new Float32Array;this._rem[chan]=concat(Int16Array,this._rem[chan],data[chan])}var i,enc;for(i=0;i<this._rem[0].length;i+=this._samples_per_pass){for(chan=0;chan<this._channels;chan++){tmp[chan]=this._rem[chan].subarray(i,i+this._samples_per_pass)}if(tmp[0].length<this._samples_per_pass){break}else{enc=this._encodePass(tmp);if(enc.length>0){encoded=concat(Uint8Array,encoded,enc)}}}if(tmp[0].length<this._samples_per_pass){this._rem=tmp}else{for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array}}return encoded});Shine.prototype.close=(function(){if(!this._handle){throw"Closed"}var _buf=_shine_flush(this._handle,this._written);var written=getValue(this._written,"i16");var encoded=new Uint8Array(written);encoded.set(Module.HEAPU8.subarray(_buf,_buf+written));_free(this._written);_shine_close(this._handle);this._handle=null;var chan;for(chan=0;chan<this._channels;chan++){_free(getValue(this._buffer+chan*ptrLen,"*"))}_free(this._buffer);return encoded});if(isNode){module.exports=Shine}return Shine}).call(context)})() +- +- +- +- +diff --git a/js/dist/libshine_browser.js b/js/dist/libshine_browser.js +new file mode 100644 +index 0000000..5e8cd74 +--- /dev/null ++++ b/js/dist/libshine_browser.js +@@ -0,0 +1,183 @@ ++// libshine function wrappers ++ ++var StereoMode = { ++ '0': 'STEREO', ++ '1': 'JOINT_STEREO', ++ '2': 'DUAL_CHANNEL', ++ '3': 'MONO', ++ STEREO: 0, ++ JOINT_STEREO: 1, ++ DUAL_CHANNEL: 2, ++ MONO: 3 ++}; ++ ++var ShineModule; ++var int16Len; ++var ptrLen; ++ ++function shineInit() { ++ int16Len = ShineModule._shine_js_int16_len(); ++ ptrLen = ShineModule._shine_js_ptr_len(); ++}; ++ ++function Shine(args) { ++ if (ShineModule._shine_check_config(args.samplerate, args.bitrate) < 0) ++ throw "Invalid configuration"; ++ ++ var stereoMode; ++ if (!args.stereoMode) { ++ if (args.channels === 1) { ++ stereoMode = Shine.MONO; ++ } else { ++ stereoMode = Shine.JOINT_STEREO; ++ } ++ } else { ++ stereoMode = args.stereoMode; ++ } ++ ++ this._handle = ShineModule._shine_js_init(args.channels, args.samplerate, stereoMode, args.bitrate); ++ ++ this._channels = args.channels; ++ this._samples_per_pass = ShineModule._shine_samples_per_pass(this._handle); ++ ++ this._buffer = ShineModule._malloc(this._channels * ptrLen); ++ this._pcm = new Array(this._channels); ++ this._rem = new Array(this._channels); ++ this._written = ShineModule._malloc(int16Len); ++ ++ var _tmp, chan; ++ for (chan=0; chan<this._channels; chan++) { ++ this._rem[chan] = new Int16Array; ++ _tmp = ShineModule._malloc(this._samples_per_pass * int16Len); ++ ShineModule.setValue(this._buffer + chan*ptrLen, _tmp, "*") ++ this._pcm[chan] = ShineModule.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass) ++ } ++ ++ return this; ++}; ++ ++Shine.checkConfig = function (samplerate, bitrate) { ++ return ShineModule._shine_check_config(samplerate, bitrate) >= 0; ++}; ++ ++Shine.prototype._encodePass = function (data) { ++ if (!this._handle) ++ throw "Closed"; ++ ++ var chan; ++ for (chan=0;chan<this._channels;chan++) ++ this._pcm[chan].set(data[chan]); ++ ++ var _buf = ShineModule._shine_encode_buffer(this._handle, this._buffer, this._written); ++ ++ var written = ShineModule.getValue(this._written, "i16"); ++ ++ return ShineModule.HEAPU8.subarray(_buf, _buf+written); ++}; ++ ++function concat(ctr, a, b) { ++ if (typeof b === "undefined") { ++ return a; ++ } ++ var ret = new ctr(a.length+b.length); ++ ret.set(a); ++ ret.subarray(a.length).set(b); ++ return ret; ++} ++ ++function clip(x) { ++ return (x > 1 ? 1 : (x < -1 ? -1 : x)); ++} ++ ++function convertFloat32(buf) { ++ var ret = new Array(buf.length); ++ var samples = buf[0].length; ++ var chan, i; ++ ++ for (chan=0;chan<buf.length;chan++) { ++ ret[chan] = new Int16Array(samples); ++ for (i=0;i<samples;i++) { ++ ret[chan][i] = parseInt(clip(buf[chan][i]) * 32767); ++ } ++ } ++ return ret; ++} ++ ++Shine.prototype.encode = function (data) { ++ if (data.length != this._channels) ++ throw "Invalid data"; ++ ++ var encoded = new Uint8Array; ++ var tmp = new Array(this._channels); ++ ++ if (data[0] instanceof Float32Array) { ++ data = convertFloat32(data); ++ } ++ ++ var chan; ++ for (chan=0;chan<this._channels; chan++) { ++ tmp[chan] = new Float32Array; ++ this._rem[chan] = concat(Int16Array, this._rem[chan], data[chan]); ++ } ++ ++ var i, enc; ++ for (i=0;i<this._rem[0].length;i+=this._samples_per_pass) { ++ for (chan=0; chan<this._channels; chan++) { ++ tmp[chan] = this._rem[chan].subarray(i, i+this._samples_per_pass); ++ } ++ ++ if (tmp[0].length < this._samples_per_pass) { ++ break; ++ } else { ++ enc = this._encodePass(tmp); ++ if (enc.length > 0) { ++ encoded = concat(Uint8Array, encoded, enc); ++ } ++ } ++ } ++ ++ if (tmp[0].length < this._samples_per_pass) { ++ this._rem = tmp; ++ } else { ++ for (chan=0; chan<this._channels; chan++) { ++ this._rem[chan] = new Int16Array; ++ } ++ } ++ ++ return encoded; ++}; ++ ++Shine.prototype.close = function () { ++ if (!this._handle) { ++ throw "Closed"; ++ } ++ ++ var _buf = ShineModule._shine_flush(this._handle, this._written); ++ ++ var written = ShineModule.getValue(this._written, "i16"); ++ var encoded = new Uint8Array(written); ++ ++ encoded.set(ShineModule.HEAPU8.subarray(_buf, _buf + written)); ++ ++ ShineModule._free(this._written); ++ ShineModule._shine_close(this._handle); ++ this._handle = null; ++ ++ var chan; ++ for (chan=0; chan<this._channels; chan++) { ++ ShineModule._free(ShineModule.getValue(this._buffer + chan*ptrLen, "*")); ++ } ++ ShineModule._free(this._buffer); ++ ++ return encoded; ++}; ++var createModule = require("./libshine_browser_stubs").default; ++ ++Shine.initialized = (createModule()).then(function (Module) { ++ ShineModule = Module; ++ shineInit(); ++}); ++ ++module.exports.Shine = Shine; ++ ++module.exports.StereoMode = StereoMode; +diff --git a/js/dist/libshine_browser_stubs.js b/js/dist/libshine_browser_stubs.js +new file mode 100644 +index 0000000..23863a3 +--- /dev/null ++++ b/js/dist/libshine_browser_stubs.js +@@ -0,0 +1,16 @@ ++ ++var createModule = (() => { ++ var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; ++ ++ return ( ++function(createModule) { ++ createModule = createModule || {}; ++ ++var Module=typeof createModule!="undefined"?createModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,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 INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,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/LECIAMoAtCyAmsiBiAGQR91IgZzIAZraiADKAL4sQIiBiADKALMsgJrIgggCEEfdSIIcyAIa2ogAygC9LECIAMoAsiyAiIIayIKIApBH3UiCnMgCmtqIAMoAvCxAiADKALEsgIiCmsiByAHQR91IgdzIAdraiADKALssQIgAygCwLICayIHIAdBH3UiB3MgB2tqIAMoAuixAiIHIAMoAryyAmsiCyALQR91IgtzIAtramogAygC4LECIAMoArSyAiILayIOIA5BH3UiDnMgDmtqIAMoAtyxAiADKAKwsgIiDmsiEiASQR91IhJzIBJraiADKALYsQIiEiADKAKssgJrIhMgE0EfdSITcyATa2pqaiADKALMsQIgAygCoLICIhNrIhQgFEEfdSIUcyAUa2ogAygCyLECIhQgAygCnLICayIWIBZBH3UiFnMgFmtqQeQASWpBBkcEQCAMQgA3AnwgDEIANwKEAQwBCyAMQQA2AnwgDCAAIAFqIAMoAtyxAiAOayIAIABBH3UiAHMgAGtqIBIgAygCrLICayIAIABBH3UiAHMgAGtqIAMoAsyxAiATayIAIABBH3UiAHMgAGtqIBQgAygCnLICayIAIABBH3UiAHMgAGtqQQpJIAMoAoCzAiADKALUswJrIgAgAEEfdSIAcyAAayADKAKEswIgAygC2LMCayIAIABBH3UiAHMgAGtqIAMoAvyyAiADKALQswJrIgAgAEEfdSIAcyAAa2ogAygC+LICIAMoAsyzAmsiACAAQR91IgBzIABraiADKAL0sgIgAygCyLMCayIAIABBH3UiAHMgAGtqIAMoAvCyAiADKALEswJrIgAgAEEfdSIAcyAAa2pBCklxNgJ8IAxBADYCgAEgDCADKALwsQIgCmsiACAAQR91IgBzIABrIARqIAMoAuyxAiADKALAsgJrIgAgAEEfdSIAcyAAa2ogByADKAK8sgJrIgAgAEEfdSIAcyAAa2ogAygC4LECIAtrIgAgAEEfdSIAcyAAa2pBCkkgAygClLMCIAMoAuizAmsiACAAQR91IgBzIABrIAMoApizAiADKALsswJrIgAgAEEfdSIAcyAAa2ogAygCkLMCIAMoAuSzAmsiACAAQR91IgBzIABraiADKAKMswIgAygC4LMCayIAIABBH3UiAHMgAGtqIAMoAoizAiADKALcswJrIgAgAEEfdSIAcyAAa2pBCklxNgKAASAMQQA2AoQBIAwgAygCgLICIAMoAtSyAmsiACAAQR91IgBzIABrIAMoAoSyAiAFayIAIABBH3UiAHMgAGtqIAMoAvyxAiADKALQsgJrIgAgAEEfdSIAcyAAa2ogBiADKALMsgJrIgAgAEEfdSIAcyAAa2ogAygC9LECIAhrIgAgAEEfdSIAcyAAa2pBCkkgAygCqLMCIAMoAvyzAmsiACAAQR91IgBzIABrIAMoAqyzAiADKAKAtAJrIgAgAEEfdSIAcyAAa2ogAygCpLMCIAMoAvizAmsiACAAQR91IgBzIABraiADKAKgswIgAygC9LMCayIAIABBH3UiAHMgAGtqIAMoApyzAiADKALwswJrIgAgAEEfdSIAcyAAa2pBCklxNgKEASAMQQA2AogBIAwgAygClLICIAMoAuiyAmsiACAAQR91IgBzIABrIAMoApiyAiADKALssgJrIgAgAEEfdSIAcyAAa2ogAygCkLICIAMoAuSyAmsiACAAQR91IgBzIABraiADKAKMsgIgAygC4LICayIAIABBH3UiAHMgAGtqIAMoAoiyAiADKALcsgJrIgAgAEEfdSIAcyAAa2pBCkkgAygCvLMCIAMoApC0AmsiACAAQR91IgBzIABrIAMoAsCzAiADKAKUtAJrIgAgAEEfdSIAcyAAa2ogAygCuLMCIAMoAoy0AmsiACAAQR91IgBzIABraiADKAK0swIgAygCiLQCayIAIABBH3UiAHMgAGtqIAMoArCzAiADKAKEtAJrIgAgAEEfdSIAcyAAa2pBCklxNgKIAQtB/x8gAygCkAQgAygCAG0iBCAEQf8fThshACADKAK0jQIiBQRAQQAhAUH/HyAAISMgAygCsI0CIgYgBUEDdEF2bWoiBSEiAn8gDCANQQN0akGQEWorAwBEzczMzMzMCECiIAS3oSJImUQAAAAAAADgQWMEQCBIqgwBC0GAgICAeAsiBEHlAE4EQCAGQQZsQQptIgEgBCABIARIGyEBCyAjICIgASABIAVIG2oiACAAQf8fThshAAsgGSANQbABbGogEEHYAGxqQdgAEAcgAyANQbgCbGogEEGcAWxqQZgMakGcARAHIAlCADcCCCAJQgA3AgAgEUIANwKsASARQQA2AqQBIBFCADcCnAEgEUIA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BQAHAAEABgABAAEAAAABAwYHAwMGBwYGBwgHBgcIBwADAAUAAQAGAAIAAwACAAUABAAEAAEAAwADAAIAAAADAwUHAwIEBQQEBQYGBQYHAQACAAoAEwAQAAoAAwADAAcACgAFAAMACwAEAA0AEQAIAAQADAALABIADwALAAIABwAGAAkADgADAAEABgAEAAUAAwACAEGACgskAQMGCAgJAwQGBwcIBgUHCAgJBwcICQkJBwcICQkKCAgJCgoKAEGwCgtFAwAEAAYAEgAMAAUABQABAAIAEAAJAAMABwADAAUADgAHAAMAEwARAA8ADQAKAAQADQAFAAgACwAFAAEADAAEAAQAAQABAEGACwskAgMGCAgJAwIECAgIBgQGCAgJCAgICQkKCAcICQoKCQgJCQsLAEGwCwtFBwAFAAkADgAPAAcABgAEAAUABQAGAAcABwAGAAgACAAIAAUADwAGAAkACgAFAAEACwAHAAkABgAEAAEADgAEAAYAAgAGAEGADAskAwMFBggJAwMEBQYIBAQFBgcIBgUGBwcIBwYHBwgJCAcICAkJAEGwDAugHQEAAgAKABcAIwAeAAwAEQADAAMACAAMABIAFQAMAAcACwAJAA8AFQAgACgAEwAGAA4ADQAWACIALgAXABIABwAUABMAIQAvABsAFgAJAAMAHwAWACkAGgAVABQABQADAA4ADQAKAAsAEAAGAAUAAQAJAAgABwAIAAQABAACAAAAAQMGCAkJCQoDBAYHCAkICAYGBwgJCgkJBwcICQoKCQoICAkKCgoKCgkJCgoLCwoLCAgJCgoKCwsJCAkKCgsLCwMABAAKABgAIgAhABUADwAFAAMABAAKACAAEQALAAoACwAHAA0AEgAeAB8AFAAFABkACwATADsAGwASAAwABQAjACEAHwA6AB4AEAAHAAUAHAAaACAAEwARAA8ACAAOAA4ADAAJAA0ADgAJAAQAAQALAAQABgAGAAYAAwACAAAAAgMFBwgJCAkDAwQGCAgHCAUFBgcICQgIBwYHCQgKCAkICAgJCQoJCggICQoKCwoLCAcHCAkKCgoIBwgJCgoKCgkABgAQACEAKQAnACYAGgAHAAUABgAJABcAEAAaAAsAEQAHAAsADgAVAB4ACgAHABEACgAPAAwAEgAcAA4ABQAgAA0AFgATABIAEAAJAAUAKAARAB8AHQARAA0ABAACABsADAALAA8ACgAHAAQAAQAbAAwACAAMAAYAAwABAAAABAMFBwgJCQkDAwQFBwcICAUEBQYHCAcIBgUGBgcICAgHBgcHCAgICQgHCAgICQgJCAcHCAgJCQoJCAgJCQkJCgEABQAOABUAIgAzAC4ARwAqADQARAA0AEMALAArABMAAwAEAAwAEwAfABoALAAhAB8AGAAgABgAHwAjABYADgAPAA0AFwAkADsAMQBNAEEAHQAoAB4AKAAbACEAKgAQABYAFAAlAD0AOABPAEkAQAArAEwAOAAlABoAHwAZAA4AIwAQADwAOQBhAEsAcgBbADYASQA3ACkAMAA1ABcAGAA6ABsAMgBgAEwARgBdAFQATQA6AE8AHQBKADEAKQARAC8ALQBOAEoAcwBeAFoATwBFAFMARwAyADsAJgAkAA8ASAAiADgAXwBcAFUAWwBaAFYASQBNAEEAMwAsACsAKgArABQAHgAsADcATgBIAFcATgA9AC4ANgAlAB4AFAAQADUAGQApACUALAA7ADYAUQBCAEwAOQA2ACUAEgAnAAsAIwAhAB8AOQAqAFIASABQAC8AOgA3ABUAFgAaACYAFgA1ABkAFwAmAEYAPAAzACQANwAaACIAFwAbAA4ACQAHACIAIAAcACcAMQBLAB4ANAAwACgANAAcABIAEQAJAAUALQAVACIAQAA4ADIAMQAtAB8AEwAMAA8ACgAHAAYAAwAwABcAFAAnACQAIwA1ABUAEAAXAA0ACgAGAAEABAACABAADwARABsAGQAUAB0ACwARAAwAEAAIAAEAAQAAAAEAAQQGBwgJCQoJCgsLDAwNDQMEBgcICAkJCQkKCgsMDAwGBgcICQkKCgkKCgsLDA0NBwcICQkKCgoKCwsLCwwNDQgHCQkKCgsLCgsLDAwNDQ4JCAkKCgoLCwsLDAsNDQ4OCQkKCgsLCwsLDAwMDQ0ODgoJCgsLCwwMDAwNDQ0OEBAJCAkKCgsLDAwMDA0NDg8PCgkKCgsLCw0MDQ0ODg4QDwoKCgsLDAwNDA0ODQ4PEBELCgoLDAwMDA0NDQ4PDw8QCwsLDAwNDA0ODg8PDxAQEAwLDA0NDQ4ODg4ODxAPEBANDAwNDQ0PDg4RDw8PERAQDAwNDg4ODw4PDxAQExITEAcADAASADUALwBMAHwAbABZAHsAbAB3AGsAUQB6AD8ADQAFABAAGwAuACQAPQAzACoARgA0AFMAQQApADsAJAATABEADwAYACkAIgA7ADAAKABAADIATgA+AFAAOAAhAB0AHAAZACsAJwA/ADcAXQBMADsAXQBIADYASwAyAB0ANAAWACoAKABDADkAXwBPAEgAOQBZAEUAMQBCAC4AGwBNACUAIwBCADoANABbAEoAPgAwAE8APwBaAD4AKAAmAH0AIAA8ADgAMgBcAE4AQQA3AFcARwAzAEkAMwBGAB4AbQA1ADEAXgBYAEsAQgB6AFsASQA4ACoAQAAsABUAGQBaACsAKQBNAEkAPwA4AFwATQBCAC8AQwAwADUAJAAUAEcAIgBDADwAOgAxAFgATABDAGoARwA2ACYAJwAXAA8AbQA1ADMALwBaAFIAOgA5ADAASAA5ACkAFwAbAD4ACQBWACoAKAAlAEYAQAA0ACsARgA3ACoAGQAdABIACwALAHYARAAeADcAMgAuAEoAQQAxACcAGAAQABYADQAOAAcAWwAsACcAJgAiAD8ANAAtAB8ANAAcABMADgAIAAkAAwB7ADwAOgA1AC8AKwAgABYAJQAYABEADAAPAAoAAgABAEcAJQAiAB4AHAAUABEAGgAVABAACgAGAAgABgACAAAAAwQFBwcICQkJCgoLCwsMDQQDBQYHBwgICAkJCgoKCwsFBQUGBwcICAgJCQoKCwsLBgYGBwcICAkJCQoKCgsLCwcGBwcICAkJCQkKCgoLCwsIBwcICAgJCQkJCgoLCwsMCQcICAgJCQkJCgoKCwsMDAkICAkJCQkKCgoKCgsLCwwJCAgJCQkJCgoKCgsLDAwMCQgJCQkJCgoKCwsLCwwMDAoJCQkKCgoKCgsLCwsMDQwKCQkJCgoKCgsLCwsMDAwNCwoJCgoKCwsLCwsLDAwNDQsKCgoKCwsLCwwMDAwMDQ0MCwsLCwsLCwwMDAwNDQwNDAsLCwsLCwwMDAwMDQ0NDQEABQAOACwASgA/AG4AXQCsAJUAigDyAOEAwwB4AREAAwAEAAwAFAAjAD4ANQAvAFMASwBEAHcAyQBrAM8ACQAPAA0AFwAmAEMAOgBnAFoAoQBIAH8AdQBuANEAzgAQAC0AFQAnAEUAQAByAGMAVwCeAIwA/ADUAMcAgwFtARoASwAkAEQAQQBzAGUAswCkAJsACAH2AOIAiwF+AWoBCQBCAB4AOwA4AGYAuQCtAAkBjgD9AOgAkAGEAXoBvQEQAG8ANgA0AGQAuACyAKAAhQABAfQA5ADZAIEBbgHLAgoAYgAwAFsAWAClAJ0AlAAFAfgAlwGNAXQBfAF5A3QDCABVAFQAUQCfAJwAjwAEAfkAqwGRAYgBfwHXAskCxAIHAJoATABJAI0AgwAAAfUAqgGWAYoBgAHfAmcBxgJgAQsAiwCBAEMAfQD3AOkA5QDbAIkB5wLhAtACdQNyA7cBBADzAHgAdgBzAOMA3wCMAeoC5gLgAtECyALCAt8AtAEGAMoA4ADeANoA2ACFAYIBfQFsAXgDuwHDArgBtQHABgQA6wLTANIA0AByAXsB3gLTAsoCxwZzA20DbAODDWEDAgB5AXEBZgC7ANYC0gJmAccCxQJiA8YGZwOCDWYDsgEAAAwACgAHAAsACgARAAsACQANAAwACgAHAAUAAwABAAMAAQQGCAkJCgoLCwsMDAwNCQMEBgcICQkJCgoKCwwLDAgGBgcICQkKCgsKCwsLDAwJCAcICQkKCgoLCwwMDA0NCgkICQkKCgsLCwwMDA0NDQkJCAkJCgsLDAsMDA0NDQ4KCgkJCgsLCwsMDAwMDQ0OCgoJCgoLCwsMDA0NDQ0PDwoKCgoLCwsMDA0NDQ0ODg4KCwoKCwsMDA0NDQ0ODQ4NCwsLCgsMDAwMDQ4ODg8PDgoMCwsLDAwNDg4ODg4ODQ4LDAwMDAwNDQ0NDw4ODg4QCw4MDAwNDQ4ODhAPDw8RDwsNDQsMDg4NDg4PEA8RDw4LCQgICQkKCgoLCwsLCwsLCA8ADQAuAFAAkgAGAfgAsgGqAZ0CjQKJAm0CBQIIBFgADgAMABUAJgBHAIIAegDYANEAxgBHAVkBPwEpARcBKgAvABYAKQBKAEQAgAB4AN0AzwDCALYAVAE7AScBHQISAFEAJwBLAEYAhgB9AHQA3ADMAL4AsgBFATcBJQEPARAAkwBIAEUAhwB/AHYAcADSAMgAvABgAUMBMgEdARwCDgAHAUIAgQB+AHcAcgDWAMoAwAC0AFUBPQEtARkBBgEMAPkAewB5AHUAcQDXAM4AwwC5AFsBSgE0ASMBEAEIAgoAswFzAG8AbQDTAMsAxAC7AGEBTAE5ASoBGwETAn0BEQCrAdQA0ADNAMkAwQC6ALEAqQBAAS8BHgEMAQICeQEQAE8BxwDFAL8AvQC1AK4ATQFBATEBIQETAQkCewFzAQsAnAK4ALcAswCvAFgBSwE6ATABIgEVARICfwF1AW4BCgCMAloBqwCoAKQAPgE1ASsBHwEUAQcBAQJ3AXABagEGAIgCQgE8ATgBMwEuASQBHAENAQUBAAJ4AXIBbAFnAQQAbAIsASgBJgEgARoBEQEKAQMCfAF2AXEBbQFpAWUBAgAJBBgBFgESAQsBCAEDAX4BegF0AW8BawFoAWYBZAEAACsAFAATABEADwANAAsACQAHAAYABAAHAAUAAwABAAMABAQGBwgJCQoKCwsLCwsMCQQEBQYHCAgJCQkKCgoKCggGBQYHBwgICQkJCQoKCgsHBwYHBwgICAkJCQkKCgoKBwgHBwgICAgJCQkKCgoKCwcJBwgICAgJCQkJCgoKCgoHCQgICAgJCQkJCgoKCgoLBwoICAgJCQkJCgoKCgoLCwgKCQkJCQkJCQkKCgoKCwsICgkJCQkJCQoKCgoKCwsLCAsJCQkJCgoKCgoKCwsLCwgLCgkJCQoKCgoKCgsLCwsICwoKCgoKCgoKCgsLCwsLCAsKCgoKCgoKCwsLCwsLCwgMCgoKCgoKCwsLCwsLCwsICAcHBwcHBwcHBwcICAgIBAEABQAEAAUABgAFAAQABAAHAAMABgAAAAcAAgADAAEAAQQEBQQGBQYEBQUGBQYGBg8ADgANAAwACwAKAAkACAAHAAYABQAEAAMAAgABAAAABAQEBAQEBAQEBAQEBAQEBABB6CkLBQIAAAACAEH5KQsMBAAACAQAAAMAAAADAEGQKgsNEAQAACIEAAADAAAAAwBBqCoLBjAEAABCBABByCoLBQQAAAAEAEHYKgsNUAQAAHAEAAAEAAAABABB8CoLDYAEAACgBAAABgAAAAYAQYgrCw2wBAAAAAUAAAYAAAAGAEGgKwsNMAUAAIAFAAAGAAAABgBBuCsLDbAFAAAABgAACAAAAAgAQdArCw0wBgAAsAYAAAgAAAAIAEHoKwsN8AYAAHAHAAAIAAAACABBgCwLDbAHAAAwCAAAEAAAABAAQZgsCwZwCAAAcAoAQbgsCwUQAAAAEABByCwLjQNwCwAAcA0AABAAAAAQAAAAAQAAAAEAAABwDgAAcBAAABAAAAAQAAAAAgAAAAMAAABwDgAAcBAAABAAAAAQAAAAAwAAAAcAAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwDgAAcBAAABAAAAAQAAAABgAAAD8AAABwDgAAcBAAABAAAAAQAAAACAAAAP8AAABwDgAAcBAAABAAAAAQAAAACgAAAP8DAABwDgAAcBAAABAAAAAQAAAADQAAAP8fAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwEQAAcBMAABAAAAAQAAAABQAAAB8AAABwEQAAcBMAABAAAAAQAAAABgAAAD8AAABwEQAAcBMAABAAAAAQAAAABwAAAH8AAABwEQAAcBMAABAAAAAQAAAACAAAAP8AAABwEQAAcBMAABAAAAAQAAAACQAAAP8BAABwEQAAcBMAABAAAAAQAAAACwAAAP8HAABwEQAAcBMAABAAAAAQAAAADQAAAP8fAABwEQAAcBMAAAEAAAAQAEHgLwsNcBQAAJAUAAABAAAAEABB+C8LBqAUAADAFABBrDALiQEBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAIAAAADAAAAAwAAAAQAAAADAAAABAAAAAMAAAAEAAAABAAAAAUAAAAEAAAABQAAAAQAAAAGAAAABQAAAAYAAAAFAAAABgAAAAUAAAAHAAAABgAAAAcAAAAGAAAABwBBwDELDQEAAAD/////AQAAAAIAQeAxC5IBAwAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAQAAAAEAAAAAAAAAAEAAAACAAAAAwAAAAAAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAACAAAAAwAAAESsAACAuwAAAH0AACJWAADAXQAAgD4AABErAADgLgAAQB8AQYAzC7oI/////////////////////wgAAAD/////CAAAACAAAAAQAAAA/////xAAAAAoAAAAGAAAAP////8YAAAAMAAAACAAAAD/////IAAAADgAAAAoAAAA/////ygAAABAAAAAMAAAAP////8wAAAAUAAAADgAAAD/////OAAAAGAAAABAAAAA/////0AAAABwAAAA//////////9QAAAAgAAAAP//////////YAAAAKAAAAD//////////3AAAADAAAAA//////////+AAAAA4AAAAP//////////kAAAAAABAAD//////////6AAAABAAQAA/////////////////////wAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAeAAAAJAAAACwAAAA0AAAAPgAAAEoAAABaAAAAbgAAAIYAAACiAAAAxAAAAO4AAAAgAQAAVgEAAKIBAABAAgAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAB4AAAAkAAAAKgAAADIAAAA8AAAASAAAAFgAAABqAAAAgAAAAJwAAAC+AAAA5gAAABQBAABKAQAAgAEAAEACAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABSAAAAZgAAAH4AAACcAAAAwgAAAPAAAAAoAQAAbAEAAMABAAAmAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAcgAAAIgAAACiAAAAwgAAAOgAAAAWAQAASgEAAIoBAADQAQAAHAIAAEACAAAAAAAABgAAAAwAAAASAAAAGAAAAB4AAAAkAAAALAAAAC0AAABCAAAAUAAAAGAAAAB0AAAAjAAAAKgAAADIAAAA7gAAAPgAAABQAQAAjAEAANABAAAKAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAdAAAAIwAAACoAAAAyAAAAO4AAAAcAQAAUAEAAIwBAADQAQAACgIAAEACAAAAAAAADAAAABgAAAAkAAAAMAAAADwAAABIAAAAWAAAAGwAAACEAAAAoAAAAMAAAADoAAAAGAEAAFABAACQAQAA3AEAADYCAAA4AgAAOgIAADwCAAA+AgAAQAIAQdw7C8oPnff//533//+d9///nff//533//+d9///Ou///zrv//867///Ou///9bm///W5v//1ub//3Pe//9z3v//D9b//w/W//+szf//SMX//+W8///lvP//gbT//x6s//+6o///V5v//5CK//8sgv//ZXH//wJp//87WP//10///xA///9JLv//HxX//1gE//+R8/7/Z9r+/zzB/v8SqP7/S5f+/yB+/v+SXP7/aEP+/z0q/v+vCP7/he/9/1vW/f/NtP3/opv9/xR6/f+GWP3/XD/9/zEm/f+jBP3/3fP8/7La/P+Iwfz/o1cDAGpoAwAxeQMAlIEDAPiJAwBbkgMAW5IDAPiJAwCUgQMAzXADAAZgAwB4PgMA6hwDAPnyAgCkwAIAT44CADNLAgC0/wEA0asBAItPAQB+4gAAcHUAAJ33//9lcf//yuL+/2hD/v+im/3/eev8/+wy/P+Zafv/4pf6/8e9+f/m0vj/BOj3/1zs9v9Q6PX/ROT0/9TX8/8Bw/L/y6Xx/zGA8P/6Yu//YD3u/8YX7f8t8uv/k8zq/1yv6f+Jmuj/toXn/0d55v87deX/9oHk/3if4/9dxeL/bQTi/0RU4f9FveD/cT/g/8fa3/+rl9//um3f/1Zl3/+Bft//ncHf/1bRHwC7Qh8Ay4EeAOmWHQCzeRwAJyobAKuwGQB2/BcA6xUWAA39EwB1qREA7CsPAEhrDADrbwkAnEoGADLiAgDXT///w4L7//d69/85SfP/JuXu/75O6v9ljuX/G6Tg/0KY2/94Ytb/hBPR/wKjy/9VGcb/RYfA/wrcuv/PMLX/MX2v/5PJqf+8JqT/SIye//8Kmf/gopP/s2SO/xNIif8sZoT//r5//4dSe/+QMXf/fGRz/67zb/8n32z/EEBq/6MFaP8LSWb/qhJl/4FiZP9WSWT/Ksdk/2HkZf9dqWf/gh5q/zRMbf9zMnH/BeJ1/4dSe/9djIH/TqCI//WFkP9JumYACRhdABGkUgA4RUcA4gM7AA3gLQBW0R8AhegQANIUAQAGZ/D/u9be/1VszP/VJ7n/ARql/3Y6kP+XkXr/yCdk/20FTf/oMjX/OrAc/46WA//j5en+nKbP/oLptP5av5n+JSh+/qk0Yv4S/kX++3sp/vPPDP5cAvD9/yPT/T89tv3iXpn9E6J8/dEGYP2srkP9o5kn/UPpC/2NnfD8q8/V/AGIu/xW16H81NaI/N+OcPzaB1n871pC/IKQLPz3sBf8eNUD/GkG8fssTN/7Jq/O+x1Av/t1B7H7kQ2k+9ZamPul9437AOSE+64wffut3Xb7/+px+wdhbvvFP2z7yHiUBDvAkwT5npEEARWOBFMiiQRSz4IEABx7BFsIcgQqpWcEb/JbBIv4TgTjv0AE2lAxBNSzIASX+Q4EiCr8AwlP6AN+b9MDEaW9Ayb4pgMhcY8DLCl3A6ooXgP/d0QDVTAqA3NiDwO9FvQCXWbYAlRRvAIv+Z8C7V2DAh6hZgLBwkkCAdwsAqT9DwINMPMBBYTWAe4BugFXy50B29eBAaZAZgF+FksBZFkwAR0aFgFyafwAxk/jABjNygCT+rIAONibAGluhQCKxW8A/+VaACvYRgCrkzMARSkhAPqYDwAu6/7/exfv/6ou4P/zH9L/HvzE/8i6uP/vW63/9+ei/0m6ZgALem8Asl93AKNzfgB5rYQA+x2KAI3NjgDMs5IAfuGVAKNWmACfG5oA1jibAKq2mwB/nZsAVu2aAPW2mQBd+pcA8L+VANkgkwBSDJAAhJuMAHDOiAB5rYQAAkGAANSZewDtt3YATZtxACBdbAAB9WYAuHNhAETZWwBtNlYAz4JQADHPSgD2I0UAu3g/AKvmOQD+XDQAfOwuAIidKQC+ZyQA5VsfAJtxGgBCsRUA2hoRAMe2DAAJhQgAPX0EACmwAADOHf3/ZLX5/xWQ9v+4lPP/FNTw/4tW7v/zAuz/Ferp/4oD6P9VT+b/2dXk/02G4/8XaeL/NX7h/0W94P9W0R8AYz4gAH+BIACqmiAARpIgAFVoIAA5JSAAj8AfALtCHwC8qx4Ak/sdAKM6HQCIYBwACn4bAMWKGgC5hhkASnoYAHdlFwCkUBYAbTMVANMNFAA66BIAoMIRAAadEADPfw8ANVoOAP88DQAsKAwAvBsLALAXCgCkEwkA/BcIABotBwA5QgYAHmgFAGeWBAAUzQMAhxQDAF5kAgCYvAEANh0BAJuOAABjCAAAkIr//4Id//91sP7/L1T+/0wA/v/NtP3/sXH9/1w//f8HDf3/FuP8/4jB/P/6n/z/M4/8/2x+/P8Idvz/pW38/6Vt/P8Idvz/bH78/8+G/P+Wl/z/o1cDAHg+AwBOJQMAIwwDAF37AgDP2QIApMACAHqnAgDshQIAXmQCADNLAgClKQIAexACAFH3AQDD1QEAmLwBAG6jAQDggQEAtWgBAO5XAQDEPgEAmSUBAG8MAQCo+wAA4eoAALfRAADwwAAAKbAAAMWnAAD+lgAAm44AANR9AABwdQAAqWQAAEZcAADiUwAAf0sAABtDAAAbQwAAuDoAAFQyAADxKQAA8SkAAI0hAACNIQAAKhkAACoZAAAqGQAAxhAAAMYQAADGEAAAxhAAAGMIAABjCAAAYwgAAGMIAABjCAAAYwgAQcDLAAvXFQMAAAAEAAAABAAAAAYAAACD+aIARE5uAPwpFQDRVycA3TT1AGLbwAA8mZUAQZBDAGNR/gC73qsAt2HFADpuJADSTUIASQbgAAnqLgAcktEA6x3+ACmxHADoPqcA9TWCAES7LgCc6YQAtCZwAEF+XwDWkTkAU4M5AJz0OQCLX4QAKPm9APgfOwDe/5cAD5gFABEv7wAKWosAbR9tAM9+NgAJyycARk+3AJ5mPwAt6l8Auid1AOXrxwA9e/EA9zkHAJJSigD7a+oAH7FfAAhdjQAwA1YAe/xGAPCrawAgvM8ANvSaAOOpHQBeYZEACBvmAIWZZQCgFF8AjUBoAIDY/wAnc00ABgYxAMpWFQDJqHMAe+JgAGuMwAAZxEcAzWfDAAno3ABZgyoAi3bEAKYclgBEr90AGVfRAKU+BQAFB/8AM34/AMIy6ACYT94Au30yACY9wwAea+8An/heADUfOgB/8soA8YcdAHyQIQBqJHwA1W76ADAtdwAVO0MAtRTGAMMZnQCtxMIALE1BAAwAXQCGfUYA43EtAJvGmgAzYgAAtNJ8ALSnlwA3VdUA1z72AKMQGABNdvwAZJ0qAHDXqwBjfPgAerBXABcV5wDASVYAO9bZAKeEOAAkI8sA1op3AFpUIwAAH7kA8QobABnO3wCfMf8AZh5qAJlXYQCs+0cAfn/YACJltwAy6IkA5r9gAO/EzQBsNgkAXT/UABbe1wBYO94A3puSANIiKAAohugA4lhNAMbKMgAI4xYA4H3LABfAUADzHacAGOBbAC4TNACDEmIAg0gBAPWOWwCtsH8AHunyAEhKQwAQZ9MAqt3YAK5fQgBqYc4ACiikANOZtAAGpvIAXHd/AKPCgwBhPIgAinN4AK+MWgBv170ALaZjAPS/ywCNge8AJsFnAFXKRQDK2TYAKKjSAMJhjQASyXcABCYUABJGmwDEWcQAyMVEAE2ykQAAF/MA1EOtAClJ5QD91RAAAL78AB6UzABwzu4AEz71AOzxgACz58MAx/goAJMFlADBcT4ALgmzAAtF8wCIEpwAqyB7AC61nwBHksIAezIvAAxVbQByp5AAa+cfADHLlgB5FkoAQXniAPTfiQDolJcA4uaEAJkxlwCI7WsAX182ALv9DgBImrQAZ6RsAHFyQgCNXTIAnxW4ALzlCQCNMSUA93Q5ADAFHAANDAEASwhoACzuWABHqpAAdOcCAL3WJAD3faYAbkhyAJ8W7wCOlKYAtJH2ANFTUQDPCvIAIJgzAPVLfgCyY2gA3T5fAEBdAwCFiX8AVVIpADdkwABt2BAAMkgyAFtMdQBOcdQARVRuAAsJwQAq9WkAFGbVACcHnQBdBFAAtDvbAOp2xQCH+RcASWt9AB0nugCWaSkAxsysAK0UVACQ4moAiNmJACxyUAAEpL4AdweUAPMwcAAA/CcA6nGoAGbCSQBk4D0Al92DAKM/lwBDlP0ADYaMADFB3gCSOZ0A3XCMABe35wAI3zsAFTcrAFyAoABagJMAEBGSAA/o2ABsgK8A2/9LADiQDwBZGHYAYqUVAGHLuwDHibkAEEC9ANLyBABJdScA67b2ANsiuwAKFKoAiSYvAGSDdgAJOzMADpQaAFE6qgAdo8IAr+2uAFwmEgBtwk0ALXqcAMBWlwADP4MACfD2ACtAjABtMZkAObQHAAwgFQDYw1sA9ZLEAMatSwBOyqUApzfNAOapNgCrkpQA3UJoABlj3gB2jO8AaItSAPzbNwCuoasA3xUxAACuoQAM+9oAZE1mAO0FtwApZTAAV1a/AEf/OgBq+bkAdb7zACiT3wCrgDAAZoz2AATLFQD6IgYA2eQdAD2zpABXG48ANs0JAE5C6QATvqQAMyO1APCqGgBPZagA0sGlAAs/DwBbeM0AI/l2AHuLBACJF3IAxqZTAG9u4gDv6wAAm0pYAMTatwCqZroAds/PANECHQCx8S0AjJnBAMOtdwCGSNoA912gAMaA9ACs8C8A3eyaAD9cvADQ3m0AkMcfACrbtgCjJToAAK+aAK1TkwC2VwQAKS20AEuAfgDaB6cAdqoOAHtZoQAWEioA3LctAPrl/QCJ2/4Aib79AOR2bAAGqfwAPoBwAIVuFQD9h/8AKD4HAGFnMwAqGIYATb3qALPnrwCPbW4AlWc5ADG/WwCE10gAMN8WAMctQwAlYTUAyXDOADDLuAC/bP0ApACiAAVs5ABa3aAAIW9HAGIS0gC5XIQAcGFJAGtW4ACZUgEAUFU3AB7VtwAz8cQAE25fAF0w5ACFLqkAHbLDAKEyNgAIt6QA6rHUABb3IQCPaeQAJ/93AAwDgACNQC0AT82gACClmQCzotMAL10KALT5QgAR2ssAfb7QAJvbwQCrF70AyqKBAAhqXAAuVRcAJwBVAH8U8ADhB4YAFAtkAJZBjQCHvt4A2v0qAGsltgB7iTQABfP+ALm/ngBoak8ASiqoAE/EWgAt+LwA11qYAPTHlQANTY0AIDqmAKRXXwAUP7EAgDiVAMwgAQBx3YYAyd62AL9g9QBNZREAAQdrAIywrACywNAAUVVIAB77DgCVcsMAowY7AMBANQAG3HsA4EXMAE4p+gDWysgA6PNBAHxk3gCbZNgA2b4xAKSXwwB3WNQAaePFAPDaEwC6OjwARhhGAFV1XwDSvfUAbpLGAKwuXQAORO0AHD5CAGHEhwAp/ekA59bzACJ8ygBvkTUACODFAP/XjQBuauIAsP3GAJMIwQB8XXQAa62yAM1unQA+cnsAxhFqAPfPqQApc98Atcm6ALcAUQDisg0AdLokAOV9YAB02IoADRUsAIEYDAB+ZpQAASkWAJ96dgD9/b4AVkXvANl+NgDs2RMAi7q5AMSX/AAxqCcA8W7DAJTFNgDYqFYAtKi1AM/MDgASiS0Ab1c0ACxWiQCZzuMA1iC5AGteqgA+KpwAEV/MAP0LSgDh9PsAjjttAOKGLADp1IQA/LSpAO/u0QAuNckALzlhADghRAAb2cgAgfwKAPtKagAvHNgAU7SEAE6ZjABUIswAKlXcAMDG1gALGZYAGnC4AGmVZAAmWmAAP1LuAH8RDwD0tREA/Mv1ADS8LQA0vO4A6F3MAN1eYABnjpsAkjPvAMkXuABhWJsA4Ve8AFGDxgDYPhAA3XFIAC0c3QCvGKEAISxGAFnz1wDZepgAnlTAAE+G+gBWBvwA5XmuAIkiNgA4rSIAZ5PcAFXoqgCCJjgAyuebAFENpACZM7EAqdcOAGkFSABlsvAAf4inAIhMlwD50TYAIZKzAHuCSgCYzyEAQJ/cANxHVQDhdDoAZ+tCAP6d3wBe1F8Ae2ekALqsegBV9qIAK4gjAEG6VQBZbggAISqGADlHgwCJ4+YA5Z7UAEn7QAD/VukAHA/KAMVZigCU+isA08HFAA/FzwDbWq4AR8WGAIVDYgAhhjsALHmUABBhhwAqTHsAgCwaAEO/EgCIJpAAeDyJAKjE5ADl23sAxDrCACb06gD3Z4oADZK/AGWjKwA9k7EAvXwLAKRR3AAn3WMAaeHdAJqUGQCoKZUAaM4oAAnttABEnyAATpjKAHCCYwB+fCMAD7kyAKf1jgAUVucAIfEIALWdKgBvfk0ApRlRALX5qwCC39YAlt1hABY2AgDEOp8Ag6KhAHLtbQA5jXoAgripAGsyXABGJ1sAADTtANIAdwD89FUAAVlNAOBxgABBo+EAC60BQPsh+T8AAAAALUR0PgAAAICYRvg8AAAAYFHMeDsAAACAgxvwOQAAAEAgJXo4AAAAgCKC4zYAAAAAHfNpNf6CK2VHFWdAAAAAAAAAOEMAAPr+Qi52vzo7nrya9wy9vf3/////3z88VFVVVVXFP5ErF89VVaU/F9CkZxERgT8AAAAAAADIQu85+v5CLuY/JMSC/72/zj+19AzXCGusP8xQRtKrsoM/hDpOm+DXVT8AQd7iAAuCMfA/br+IGk87mzw1M/upPfbvP13c2JwTYHG8YYB3Pprs7z/RZocQel6QvIV/bugV4+8/E/ZnNVLSjDx0hRXTsNnvP/qO+SOAzou83vbdKWvQ7z9hyOZhTvdgPMibdRhFx+8/mdMzW+SjkDyD88bKPr7vP217g12mmpc8D4n5bFi17z/87/2SGrWOPPdHciuSrO8/0ZwvcD2+Pjyi0dMy7KPvPwtukIk0A2q8G9P+r2ab7z8OvS8qUlaVvFFbEtABk+8/VepOjO+AULzMMWzAvYrvPxb01bkjyZG84C2prpqC7z+vVVzp49OAPFGOpciYeu8/SJOl6hUbgLx7UX08uHLvPz0y3lXwH4+86o2MOPlq7z+/UxM/jImLPHXLb+tbY+8/JusRdpzZlrzUXASE4FvvP2AvOj737Jo8qrloMYdU7z+dOIbLguePvB3Z/CJQTe8/jcOmREFvijzWjGKIO0bvP30E5LAFeoA8ltx9kUk/7z+UqKjj/Y6WPDhidW56OO8/fUh08hhehzw/prJPzjHvP/LnH5grR4A83XziZUUr7z9eCHE/e7iWvIFj9eHfJO8/MasJbeH3gjzh3h/1nR7vP/q/bxqbIT28kNna0H8Y7z+0CgxygjeLPAsD5KaFEu8/j8vOiZIUbjxWLz6prwzvP7arsE11TYM8FbcxCv4G7z9MdKziAUKGPDHYTPxwAe8/SvjTXTndjzz/FmSyCPzuPwRbjjuAo4a88Z+SX8X27j9oUEvM7UqSvMupOjen8e4/ji1RG/gHmbxm2AVtruzuP9I2lD7o0XG895/lNNvn7j8VG86zGRmZvOWoE8Mt4+4/bUwqp0ifhTwiNBJMpt7uP4ppKHpgEpO8HICsBEXa7j9biRdIj6dYvCou9yEK1u4/G5pJZ5ssfLyXqFDZ9dHuPxGswmDtY0M8LYlhYAjO7j/vZAY7CWaWPFcAHe1Byu4/eQOh2uHMbjzQPMG1osbuPzASDz+O/5M83tPX8CrD7j+wr3q7zpB2PCcqNtXav+4/d+BU670dkzwN3f2ZsrzuP46jcQA0lI+8pyyddrK57j9Jo5PczN6HvEJmz6Latu4/XzgPvcbeeLyCT51WK7TuP/Zce+xGEoa8D5JdyqSx7j+O1/0YBTWTPNontTZHr+4/BZuKL7eYezz9x5fUEq3uPwlUHOLhY5A8KVRI3Qer7j/qxhlQhcc0PLdGWYomqe4/NcBkK+YylDxIIa0Vb6fuP592mWFK5Iy8Cdx2ueGl7j+oTe87xTOMvIVVOrB+pO4/rukriXhThLwgw8w0RqPuP1hYVnjdzpO8JSJVgjii7j9kGX6AqhBXPHOpTNRVoe4/KCJev++zk7zNO39mnqDuP4K5NIetEmq8v9oLdRKg7j/uqW2472djvC8aZTyyn+4/UYjgVD3cgLyElFH5fZ/uP88+Wn5kH3i8dF/s6HWf7j+wfYvASu6GvHSBpUian+4/iuZVHjIZhrzJZ0JW65/uP9PUCV7LnJA8P13eT2mg7j8dpU253DJ7vIcB63MUoe4/a8BnVP3slDwywTAB7aHuP1Vs1qvh62U8Yk7PNvOi7j9Cz7MvxaGIvBIaPlQnpO4/NDc78bZpk7wTzkyZiaXuPx7/GTqEXoC8rccjRhqn7j9uV3LYUNSUvO2SRJvZqO4/AIoOW2etkDyZZorZx6ruP7Tq8MEvt40826AqQuWs7j//58WcYLZlvIxEtRYyr+4/RF/zWYP2ezw2dxWZrrHuP4M9HqcfCZO8xv+RC1u07j8pHmyLuKldvOXFzbA3t+4/WbmQfPkjbLwPUsjLRLruP6r59CJDQ5K8UE7en4K97j9LjmbXbMqFvLoHynDxwO4/J86RK/yvcTyQ8KOCkcTuP7tzCuE10m08IyPjGWPI7j9jImIiBMWHvGXlXXtmzO4/1THi44YcizwzLUrsm9DuPxW7vNPRu5G8XSU+sgPV7j/SMe6cMcyQPFizMBOe2e4/s1pzboRphDy//XlVa97uP7SdjpfN34K8evPTv2vj7j+HM8uSdxqMPK3TWpmf6O4/+tnRSo97kLxmto0pB+7uP7qu3FbZw1W8+xVPuKLz7j9A9qY9DqSQvDpZ5Y1y+e4/NJOtOPTWaLxHXvvydv/uPzWKWGvi7pG8SgahMLAF7z/N3V8K1/90PNLBS5AeDO8/rJiS+vu9kbwJHtdbwhLvP7MMrzCubnM8nFKF3ZsZ7z+U/Z9cMuOOPHrQ/1+rIO8/rFkJ0Y/ghDxL0Vcu8SfvP2caTjivzWM8tecGlG0v7z9oGZJsLGtnPGmQ79wgN+8/0rXMgxiKgLz6w11VCz/vP2/6/z9drY+8fIkHSi1H7z9JqXU4rg2QvPKJDQiHT+8/pwc9poWjdDyHpPvcGFjvPw8iQCCekYK8mIPJFuNg7z+sksHVUFqOPIUy2wPmae8/S2sBrFk6hDxgtAHzIXPvPx8+tAch1YK8X5t7M5d87z/JDUc7uSqJvCmh9RRGhu8/04g6YAS2dDz2P4vnLpDvP3FynVHsxYM8g0zH+1Ga7z/wkdOPEvePvNqQpKKvpO8/fXQj4piujbzxZ44tSK/vPwggqkG8w448J1ph7hu67z8y66nDlCuEPJe6azcrxe8/7oXRMalkijxARW5bdtDvP+3jO+S6N468FL6crf3b7z+dzZFNO4l3PNiQnoHB5+8/icxgQcEFUzzxcY8rwvPvPwA4+v5CLuY/MGfHk1fzLj0BAAAAAADgv1swUVVVVdU/kEXr////z78RAfEks5nJP5/IBuV1VcW/AAAAAAAA4L93VVVVVVXVP8v9/////8+/DN2VmZmZyT+nRWdVVVXFvzDeRKMkScI/ZT1CpP//v7/K1ioohHG8P/9osEPrmbm/hdCv94KBtz/NRdF1E1K1v5/e4MPwNPc/AJDmeX/M178f6SxqeBP3PwAADcLub9e/oLX6CGDy9j8A4FET4xPXv32MEx+m0fY/AHgoOFu41r/RtMULSbH2PwB4gJBVXda/ugwvM0eR9j8AABh20ALWvyNCIhifcfY/AJCQhsqo1b/ZHqWZT1L2PwBQA1ZDT9W/xCSPqlYz9j8AQGvDN/bUvxTcnWuzFPY/AFCo/aed1L9MXMZSZPb1PwCoiTmSRdS/TyyRtWfY9T8AuLA59O3Tv96QW8u8uvU/AHCPRM6W0794GtnyYZ31PwCgvRceQNO/h1ZGElaA9T8AgEbv4unSv9Nr586XY/U/AOAwOBuU0r+Tf6fiJUf1PwCI2ozFPtK/g0UGQv8q9T8AkCcp4enRv9+9stsiD/U/APhIK22V0b/X3jRHj/P0PwD4uZpnQdG/QCjez0PY9D8AmO+U0O3Qv8ijeMA+vfQ/ABDbGKWa0L+KJeDDf6L0PwC4Y1LmR9C/NITUJAWI9D8A8IZFIuvPvwstGRvObfQ/ALAXdUpHz79UGDnT2VP0PwAwED1EpM6/WoS0RCc69D8AsOlEDQLOv/v4FUG1IPQ/APB3KaJgzb+x9D7aggf0PwCQlQQBwMy/j/5XXY/u8z8AEIlWKSDMv+lMC6DZ1fM/ABCBjReBy78rwRDAYL3zPwDQ08zJ4sq/uNp1KySl8z8AkBIuQEXKvwLQn80ijfM/APAdaHeoyb8ceoTFW3XzPwAwSGltDMm/4jatSc5d8z8AwEWmIHHIv0DUTZh5RvM/ADAUtI/Wx78ky//OXC/zPwBwYjy4PMe/SQ2hdXcY8z8AYDebmqPGv5A5PjfIAfM/AKC3VDELxr9B+JW7TuvyPwAwJHZ9c8W/0akZAgrV8j8AMMKPe9zEvyr9t6j5vvI/AADSUSxGxL+rGwx6HKnyPwAAg7yKsMO/MLUUYHKT8j8AAElrmRvDv/WhV1f6ffI/AECkkFSHwr+/Ox2bs2jyPwCgefi588G/vfWPg51T8j8AoCwlyGDBvzsIyaq3PvI/ACD3V3/OwL+2QKkrASryPwCg/kncPMC/MkHMlnkV8j8AgEu8vVe/v5v80h0gAfI/AEBAlgg3vr8LSE1J9OzxPwBA+T6YF72/aWWPUvXY8T8AoNhOZ/m7v3x+VxEjxfE/AGAvIHncur/pJst0fLHxPwCAKOfDwLm/thosDAGe8T8AwHKzRqa4v71wtnuwivE/AACsswGNt7+2vO8linfxPwAAOEXxdLa/2jFMNY1k8T8AgIdtDl61v91fJ5C5UfE/AOCh3lxItL9M0jKkDj/xPwCgak3ZM7O/2vkQcoss8T8AYMX4eSCyvzG17CgwGvE/ACBimEYOsb+vNITa+wfxPwAA0mps+q+/s2tOD+718D8AQHdKjdqtv86fKl0G5PA/AACF5Oy8q78hpSxjRNLwPwDAEkCJoam/GpjifKfA8D8AwAIzWIinv9E2xoMvr/A/AIDWZ15xpb85E6CY253wPwCAZUmKXKO/3+dSr6uM8D8AQBVk40mhv/soTi+fe/A/AIDrgsBynr8ZjzWMtWrwPwCAUlLxVZq/LPnspe5Z8D8AgIHPYj2Wv5As0c1JSfA/AACqjPsokr+prfDGxjjwPwAA+SB7MYy/qTJ5E2Uo8D8AAKpdNRmEv0hz6ickGPA/AADswgMSeL+VsRQGBAjwPwAAJHkJBGC/Gvom9x/g7z8AAJCE8+9vP3TqYcIcoe8/AAA9NUHchz8umYGwEGPvPwCAwsSjzpM/za3uPPYl7z8AAIkUwZ+bP+cTkQPI6e4/AAARztiwoT+rsct4gK7uPwDAAdBbiqU/mwydohp07j8AgNhAg1ypP7WZCoOROu4/AIBX72onrT9WmmAJ4AHuPwDAmOWYdbA/mLt35QHK7T8AIA3j9VOyPwORfAvyku0/AAA4i90utD/OXPtmrFztPwDAV4dZBrY/nd5eqiwn7T8AAGo1dtq3P80saz5u8uw/AGAcTkOruT8Ceaeibb7sPwBgDbvHeLs/bQg3bSaL7D8AIOcyE0O9PwRYXb2UWOw/AGDecTEKvz+Mn7sztSbsPwBAkSsVZ8A/P+fs7oP16z8AsJKChUfBP8GW23X9xOs/ADDKzW4mwj8oSoYMHpXrPwBQxabXA8M/LD7vxeJl6z8AEDM8w9/DP4uIyWdIN+s/AIB6aza6xD9KMB0hSwnrPwDw0Sg5k8U/fu/yhejb6j8A8BgkzWrGP6I9YDEdr+o/AJBm7PhAxz+nWNM/5oLqPwDwGvXAFcg/i3MJ70BX6j8AgPZUKenIPydLq5AqLOo/AED4Aja7yT/R8pMToAHqPwAALBzti8o/GzzbJJ/X6T8A0AFcUVvLP5CxxwUlruk/AMC8zGcpzD8vzpfyLoXpPwBgSNU19sw/dUuk7rpc6T8AwEY0vcHNPzhI553GNOk/AODPuAGMzj/mUmcvTw3pPwCQF8AJVc8/ndf/jlLm6D8AuB8SbA7QP3wAzJ/Ov+g/ANCTDrhx0D8Ow77awJnoPwBwhp5r1NA/+xcjqid06D8A0EszhzbRPwias6wAT+g/AEgjZw2Y0T9VPmXoSSroPwCAzOD/+NE/YAL0lQEG6D8AaGPXX1nSPymj4GMl4uc/AKgUCTC50j+ttdx3s77nPwBgQxByGNM/wiWXZ6qb5z8AGOxtJnfTP1cGF/IHeec/ADCv+0/V0z8ME9bbylbnPwDgL+PuMtQ/a7ZPAQAQ5j88W0KRbAJ+PJW0TQMAMOY/QV0ASOq/jTx41JQNAFDmP7el1oanf448rW9OBwBw5j9MJVRr6vxhPK4P3/7/j+Y//Q5ZTCd+fLy8xWMHALDmPwHa3EhowYq89sFcHgDQ5j8Rk0mdHD+DPD72Bev/7+Y/Uy3iGgSAfryAl4YOABDnP1J5CXFm/3s8Euln/P8v5z8kh70m4gCMPGoRgd//T+c/0gHxbpECbryQnGcPAHDnP3ScVM1x/Ge8Nch++v+P5z+DBPWewb6BPObCIP7/r+c/ZWTMKRd+cLwAyT/t/8/nPxyLewhygIC8dhom6f/v5z+u+Z1tKMCNPOijnAQAEOg/M0zlUdJ/iTyPLJMXADDoP4HzMLbp/oq8nHMzBgBQ6D+8NWVrv7+JPMaJQiAAcOg/dXsR82W/i7wEefXr/4/oP1fLPaJuAIm83wS8IgCw6D8KS+A43wB9vIobDOX/z+g/BZ//RnEAiLxDjpH8/+/oPzhwetB7gYM8x1/6HgAQ6T8DtN92kT6JPLl7RhMAMOk/dgKYS06AfzxvB+7m/0/pPy5i/9nwfo+80RI83v9v6T+6OCaWqoJwvA2KRfT/j+k/76hkkRuAh7w+Lpjd/6/pPzeTWorgQIe8ZvtJ7f/P6T8A4JvBCM4/PFGc8SAA8Ok/CluIJ6o/irwGsEURABDqP1baWJlI/3Q8+va7BwAw6j8YbSuKq76MPHkdlxAAUOo/MHl43cr+iDxILvUdAHDqP9ur2D12QY+8UjNZHACQ6j8SdsKEAr+OvEs+TyoAsOo/Xz//PAT9abzRHq7X/8/qP7RwkBLnPoK8eARR7v/v6j+j3g7gPgZqPFsNZdv/D+s/uQofOMgGWjxXyqr+/y/rPx08I3QeAXm83LqV2f9P6z+fKoZoEP95vJxlniQAcOs/Pk+G0EX/ijxAFof5/4/rP/nDwpZ3/nw8T8sE0v+v6z/EK/LuJ/9jvEVcQdL/z+s/Ieo77rf/bLzfCWP4/+/rP1wLLpcDQYG8U3a14f8P7D8ZareUZMGLPONX+vH/L+w/7cYwje/+ZLwk5L/c/0/sP3VH7LxoP4S897lU7f9v7D/s4FPwo36EPNWPmev/j+w/8ZL5jQaDczyaISUhALDsPwQOGGSO/Wi8nEaU3f/P7D9y6sccvn6OPHbE/er/7+w//oifrTm+jjwr+JoWABDtP3FauaiRfXU8HfcPDQAw7T/ax3BpkMGJPMQPeer/T+0/DP5YxTcOWLzlh9wuAHDtP0QPwU3WgH+8qoLcIQCQ7T9cXP2Uj3x0vIMCa9j/r+0/fmEhxR1/jDw5R2wpANDtP1Ox/7KeAYg89ZBE5f/v7T+JzFLG0gBuPJT2q83/D+4/0mktIECDf7zdyFLb/y/uP2QIG8rBAHs87xZC8v9P7j9Rq5SwqP9yPBFeiuj/b+4/Wb7vsXP2V7wN/54RAJDuPwHIC16NgIS8RBel3/+v7j+1IEPVBgB4PKF/EhoA0O4/klxWYPgCULzEvLoHAPDuPxHmNV1EQIW8Ao169f8P7z8Fke85MftPvMeK5R4AMO8/VRFz8qyBijyUNIL1/0/vP0PH19RBP4o8a0yp/P9v7z91eJgc9AJivEHE+eH/j+8/S+d39NF9dzx+4+DS/6/vPzGjfJoZAW+8nuR3HADQ7z+xrM5L7oFxPDHD4Pf/7+8/WodwATcFbrxuYGX0/w/wP9oKHEmtfoq8WHqG8/8v8D/gsvzDaX+XvBcN/P3/T/A/W5TLNP6/lzyCTc0DAHDwP8tW5MCDAII86Mvy+f+P8D8adTe+3/9tvGXaDAEAsPA/6ybmrn8/kbw406QBANDwP/efSHn6fYA8/f3a+v/v8D/Aa9ZwBQR3vJb9ugsAEPE/YgtthNSAjjxd9OX6/y/xP+82/WT6v5082ZrVDQBQ8T+uUBJwdwCaPJpVIQ8AcPE/7t7j4vn9jTwmVCf8/4/xP3NyO9wwAJE8WTw9EgCw8T+IAQOAeX+ZPLeeKfj/z/E/Z4yfqzL5ZbwA1Ir0/+/xP+tbp52/f5M8pIaLDAAQ8j8iW/2Ra4CfPANDhQMAMPI/M7+f68L/kzyE9rz//0/yP3IuLn7nAXY82SEp9f9v8j9hDH92u/x/PDw6kxQAkPI/K0ECPMoCcrwTY1UUALDyPwIf8jOCgJK8O1L+6//P8j/y3E84fv+IvJatuAsA8PI/xUEwUFH/hbyv4nr7/w/zP50oXohxAIG8f1+s/v8v8z8Vt7c/Xf+RvFZnpgwAUPM/vYKLIoJ/lTwh9/sRAHDzP8zVDcS6AIA8uS9Z+f+P8z9Rp7ItnT+UvELS3QQAsPM/4Th2cGt/hTxXybL1/8/zPzESvxA6Ano8GLSw6v/v8z+wUrFmbX+YPPSvMhUAEPQ/JIUZXzf4Zzwpi0cXADD0P0NR3HLmAYM8Y7SV5/9P9D9aibK4af+JPOB1BOj/b/Q/VPLCm7HAlbznwW/v/4/0P3IqOvIJQJs8BKe+5f+v9D9FfQ2/t/+UvN4nEBcA0PQ/PWrccWTAmbziPvAPAPD0PxxThQuJf5c80UvcEgAQ9T82pGZxZQRgPHonBRYAMPU/CTIjzs6/lrxMcNvs/0/1P9ehBQVyAom8qVRf7/9v9T8SZMkO5r+bPBIQ5hcAkPU/kO+vgcV+iDySPskDALD1P8AMvwoIQZ+8vBlJHQDQ9T8pRyX7KoGYvIl6uOf/7/U/BGntgLd+lLwAQeCTAQsD4EsB";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["c"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["o"];addOnInit(Module["asm"]["d"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){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);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(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){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";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 HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort("invalid type for getValue: "+type)}return null}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort("invalid type for setValue: "+type)}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ASSERTIONS=false;var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var asmLibraryArg={"b":_emscripten_memcpy_big,"a":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["e"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["f"]).apply(null,arguments)};var _shine_check_config=Module["_shine_check_config"]=function(){return(_shine_check_config=Module["_shine_check_config"]=Module["asm"]["g"]).apply(null,arguments)};var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=function(){return(_shine_samples_per_pass=Module["_shine_samples_per_pass"]=Module["asm"]["h"]).apply(null,arguments)};var _shine_encode_buffer=Module["_shine_encode_buffer"]=function(){return(_shine_encode_buffer=Module["_shine_encode_buffer"]=Module["asm"]["i"]).apply(null,arguments)};var _shine_flush=Module["_shine_flush"]=function(){return(_shine_flush=Module["_shine_flush"]=Module["asm"]["j"]).apply(null,arguments)};var _shine_close=Module["_shine_close"]=function(){return(_shine_close=Module["_shine_close"]=Module["asm"]["k"]).apply(null,arguments)};var _shine_js_int16_len=Module["_shine_js_int16_len"]=function(){return(_shine_js_int16_len=Module["_shine_js_int16_len"]=Module["asm"]["l"]).apply(null,arguments)};var _shine_js_ptr_len=Module["_shine_js_ptr_len"]=function(){return(_shine_js_ptr_len=Module["_shine_js_ptr_len"]=Module["asm"]["m"]).apply(null,arguments)};var _shine_js_init=Module["_shine_js_init"]=function(){return(_shine_js_init=Module["_shine_js_init"]=Module["asm"]["n"]).apply(null,arguments)};Module["setValue"]=setValue;Module["getValue"]=getValue;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); ++ ++ ++ return createModule.ready ++} ++); ++})(); ++export default createModule; +\ No newline at end of file +diff --git a/js/dist/libshine_node.js b/js/dist/libshine_node.js +new file mode 100644 +index 0000000..02d7990 +--- /dev/null ++++ b/js/dist/libshine_node.js +@@ -0,0 +1 @@ ++var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};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){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(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_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,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 INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}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(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,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/LECIAMoAtCyAmsiBiAGQR91IgZzIAZraiADKAL4sQIiBiADKALMsgJrIgggCEEfdSIIcyAIa2ogAygC9LECIAMoAsiyAiIIayIKIApBH3UiCnMgCmtqIAMoAvCxAiADKALEsgIiCmsiByAHQR91IgdzIAdraiADKALssQIgAygCwLICayIHIAdBH3UiB3MgB2tqIAMoAuixAiIHIAMoAryyAmsiCyALQR91IgtzIAtramogAygC4LECIAMoArSyAiILayIOIA5BH3UiDnMgDmtqIAMoAtyxAiADKAKwsgIiDmsiEiASQR91IhJzIBJraiADKALYsQIiEiADKAKssgJrIhMgE0EfdSITcyATa2pqaiADKALMsQIgAygCoLICIhNrIhQgFEEfdSIUcyAUa2ogAygCyLECIhQgAygCnLICayIWIBZBH3UiFnMgFmtqQeQASWpBBkcEQCAMQgA3AnwgDEIANwKEAQwBCyAMQQA2AnwgDCAAIAFqIAMoAtyxAiAOayIAIABBH3UiAHMgAGtqIBIgAygCrLICayIAIABBH3UiAHMgAGtqIAMoAsyxAiATayIAIABBH3UiAHMgAGtqIBQgAygCnLICayIAIABBH3UiAHMgAGtqQQpJIAMoAoCzAiADKALUswJrIgAgAEEfdSIAcyAAayADKAKEswIgAygC2LMCayIAIABBH3UiAHMgAGtqIAMoAvyyAiADKALQswJrIgAgAEEfdSIAcyAAa2ogAygC+LICIAMoAsyzAmsiACAAQR91IgBzIABraiADKAL0sgIgAygCyLMCayIAIABBH3UiAHMgAGtqIAMoAvCyAiADKALEswJrIgAgAEEfdSIAcyAAa2pBCklxNgJ8IAxBADYCgAEgDCADKALwsQIgCmsiACAAQR91IgBzIABrIARqIAMoAuyxAiADKALAsgJrIgAgAEEfdSIAcyAAa2ogByADKAK8sgJrIgAgAEEfdSIAcyAAa2ogAygC4LECIAtrIgAgAEEfdSIAcyAAa2pBCkkgAygClLMCIAMoAuizAmsiACAAQR91IgBzIABrIAMoApizAiADKALsswJrIgAgAEEfdSIAcyAAa2ogAygCkLMCIAMoAuSzAmsiACAAQR91IgBzIABraiADKAKMswIgAygC4LMCayIAIABBH3UiAHMgAGtqIAMoAoizAiADKALcswJrIgAgAEEfdSIAcyAAa2pBCklxNgKAASAMQQA2AoQBIAwgAygCgLICIAMoAtSyAmsiACAAQR91IgBzIABrIAMoAoSyAiAFayIAIABBH3UiAHMgAGtqIAMoAvyxAiADKALQsgJrIgAgAEEfdSIAcyAAa2ogBiADKALMsgJrIgAgAEEfdSIAcyAAa2ogAygC9LECIAhrIgAgAEEfdSIAcyAAa2pBCkkgAygCqLMCIAMoAvyzAmsiACAAQR91IgBzIABrIAMoAqyzAiADKAKAtAJrIgAgAEEfdSIAcyAAa2ogAygCpLMCIAMoAvizAmsiACAAQR91IgBzIABraiADKAKgswIgAygC9LMCayIAIABBH3UiAHMgAGtqIAMoApyzAiADKALwswJrIgAgAEEfdSIAcyAAa2pBCklxNgKEASAMQQA2AogBIAwgAygClLICIAMoAuiyAmsiACAAQR91IgBzIABrIAMoApiyAiADKALssgJrIgAgAEEfdSIAcyAAa2ogAygCkLICIAMoAuSyAmsiACAAQR91IgBzIABraiADKAKMsgIgAygC4LICayIAIABBH3UiAHMgAGtqIAMoAoiyAiADKALcsgJrIgAgAEEfdSIAcyAAa2pBCkkgAygCvLMCIAMoApC0AmsiACAAQR91IgBzIABrIAMoAsCzAiADKAKUtAJrIgAgAEEfdSIAcyAAa2ogAygCuLMCIAMoAoy0AmsiACAAQR91IgBzIABraiADKAK0swIgAygCiLQCayIAIABBH3UiAHMgAGtqIAMoArCzAiADKAKEtAJrIgAgAEEfdSIAcyAAa2pBCklxNgKIAQtB/x8gAygCkAQgAygCAG0iBCAEQf8fThshACADKAK0jQIiBQRAQQAhAUH/HyAAISMgAygCsI0CIgYgBUEDdEF2bWoiBSEiAn8gDCANQQN0akGQEWorAwBEzczMzMzMCECiIAS3oSJImUQAAAAAAADgQWMEQCBIqgwBC0GAgICAeAsiBEHlAE4EQCAGQQZsQQptIgEgBCABIARIGyEBCyAjICIgASABIAVIG2oiACAAQf8fThshAAsgGSANQbABbGogEEHYAGxqQdgAEAcgAyANQbgCbGogEEGcAWxqQZgMakGcARAHIAlCADcCCCAJQgA3AgAgEUIANwKsASARQQA2AqQBIBFCADcCnAEgEUIA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BQAHAAEABgABAAEAAAABAwYHAwMGBwYGBwgHBgcIBwADAAUAAQAGAAIAAwACAAUABAAEAAEAAwADAAIAAAADAwUHAwIEBQQEBQYGBQYHAQACAAoAEwAQAAoAAwADAAcACgAFAAMACwAEAA0AEQAIAAQADAALABIADwALAAIABwAGAAkADgADAAEABgAEAAUAAwACAEGACgskAQMGCAgJAwQGBwcIBgUHCAgJBwcICQkJBwcICQkKCAgJCgoKAEGwCgtFAwAEAAYAEgAMAAUABQABAAIAEAAJAAMABwADAAUADgAHAAMAEwARAA8ADQAKAAQADQAFAAgACwAFAAEADAAEAAQAAQABAEGACwskAgMGCAgJAwIECAgIBgQGCAgJCAgICQkKCAcICQoKCQgJCQsLAEGwCwtFBwAFAAkADgAPAAcABgAEAAUABQAGAAcABwAGAAgACAAIAAUADwAGAAkACgAFAAEACwAHAAkABgAEAAEADgAEAAYAAgAGAEGADAskAwMFBggJAwMEBQYIBAQFBgcIBgUGBwcIBwYHBwgJCAcICAkJAEGwDAugHQEAAgAKABcAIwAeAAwAEQADAAMACAAMABIAFQAMAAcACwAJAA8AFQAgACgAEwAGAA4ADQAWACIALgAXABIABwAUABMAIQAvABsAFgAJAAMAHwAWACkAGgAVABQABQADAA4ADQAKAAsAEAAGAAUAAQAJAAgABwAIAAQABAACAAAAAQMGCAkJCQoDBAYHCAkICAYGBwgJCgkJBwcICQoKCQoICAkKCgoKCgkJCgoLCwoLCAgJCgoKCwsJCAkKCgsLCwMABAAKABgAIgAhABUADwAFAAMABAAKACAAEQALAAoACwAHAA0AEgAeAB8AFAAFABkACwATADsAGwASAAwABQAjACEAHwA6AB4AEAAHAAUAHAAaACAAEwARAA8ACAAOAA4ADAAJAA0ADgAJAAQAAQALAAQABgAGAAYAAwACAAAAAgMFBwgJCAkDAwQGCAgHCAUFBgcICQgIBwYHCQgKCAkICAgJCQoJCggICQoKCwoLCAcHCAkKCgoIBwgJCgoKCgkABgAQACEAKQAnACYAGgAHAAUABgAJABcAEAAaAAsAEQAHAAsADgAVAB4ACgAHABEACgAPAAwAEgAcAA4ABQAgAA0AFgATABIAEAAJAAUAKAARAB8AHQARAA0ABAACABsADAALAA8ACgAHAAQAAQAbAAwACAAMAAYAAwABAAAABAMFBwgJCQkDAwQFBwcICAUEBQYHCAcIBgUGBgcICAgHBgcHCAgICQgHCAgICQgJCAcHCAgJCQoJCAgJCQkJCgEABQAOABUAIgAzAC4ARwAqADQARAA0AEMALAArABMAAwAEAAwAEwAfABoALAAhAB8AGAAgABgAHwAjABYADgAPAA0AFwAkADsAMQBNAEEAHQAoAB4AKAAbACEAKgAQABYAFAAlAD0AOABPAEkAQAArAEwAOAAlABoAHwAZAA4AIwAQADwAOQBhAEsAcgBbADYASQA3ACkAMAA1ABcAGAA6ABsAMgBgAEwARgBdAFQATQA6AE8AHQBKADEAKQARAC8ALQBOAEoAcwBeAFoATwBFAFMARwAyADsAJgAkAA8ASAAiADgAXwBcAFUAWwBaAFYASQBNAEEAMwAsACsAKgArABQAHgAsADcATgBIAFcATgA9AC4ANgAlAB4AFAAQADUAGQApACUALAA7ADYAUQBCAEwAOQA2ACUAEgAnAAsAIwAhAB8AOQAqAFIASABQAC8AOgA3ABUAFgAaACYAFgA1ABkAFwAmAEYAPAAzACQANwAaACIAFwAbAA4ACQAHACIAIAAcACcAMQBLAB4ANAAwACgANAAcABIAEQAJAAUALQAVACIAQAA4ADIAMQAtAB8AEwAMAA8ACgAHAAYAAwAwABcAFAAnACQAIwA1ABUAEAAXAA0ACgAGAAEABAACABAADwARABsAGQAUAB0ACwARAAwAEAAIAAEAAQAAAAEAAQQGBwgJCQoJCgsLDAwNDQMEBgcICAkJCQkKCgsMDAwGBgcICQkKCgkKCgsLDA0NBwcICQkKCgoKCwsLCwwNDQgHCQkKCgsLCgsLDAwNDQ4JCAkKCgoLCwsLDAsNDQ4OCQkKCgsLCwsLDAwMDQ0ODgoJCgsLCwwMDAwNDQ0OEBAJCAkKCgsLDAwMDA0NDg8PCgkKCgsLCw0MDQ0ODg4QDwoKCgsLDAwNDA0ODQ4PEBELCgoLDAwMDA0NDQ4PDw8QCwsLDAwNDA0ODg8PDxAQEAwLDA0NDQ4ODg4ODxAPEBANDAwNDQ0PDg4RDw8PERAQDAwNDg4ODw4PDxAQExITEAcADAASADUALwBMAHwAbABZAHsAbAB3AGsAUQB6AD8ADQAFABAAGwAuACQAPQAzACoARgA0AFMAQQApADsAJAATABEADwAYACkAIgA7ADAAKABAADIATgA+AFAAOAAhAB0AHAAZACsAJwA/ADcAXQBMADsAXQBIADYASwAyAB0ANAAWACoAKABDADkAXwBPAEgAOQBZAEUAMQBCAC4AGwBNACUAIwBCADoANABbAEoAPgAwAE8APwBaAD4AKAAmAH0AIAA8ADgAMgBcAE4AQQA3AFcARwAzAEkAMwBGAB4AbQA1ADEAXgBYAEsAQgB6AFsASQA4ACoAQAAsABUAGQBaACsAKQBNAEkAPwA4AFwATQBCAC8AQwAwADUAJAAUAEcAIgBDADwAOgAxAFgATABDAGoARwA2ACYAJwAXAA8AbQA1ADMALwBaAFIAOgA5ADAASAA5ACkAFwAbAD4ACQBWACoAKAAlAEYAQAA0ACsARgA3ACoAGQAdABIACwALAHYARAAeADcAMgAuAEoAQQAxACcAGAAQABYADQAOAAcAWwAsACcAJgAiAD8ANAAtAB8ANAAcABMADgAIAAkAAwB7ADwAOgA1AC8AKwAgABYAJQAYABEADAAPAAoAAgABAEcAJQAiAB4AHAAUABEAGgAVABAACgAGAAgABgACAAAAAwQFBwcICQkJCgoLCwsMDQQDBQYHBwgICAkJCgoKCwsFBQUGBwcICAgJCQoKCwsLBgYGBwcICAkJCQoKCgsLCwcGBwcICAkJCQkKCgoLCwsIBwcICAgJCQkJCgoLCwsMCQcICAgJCQkJCgoKCwsMDAkICAkJCQkKCgoKCgsLCwwJCAgJCQkJCgoKCgsLDAwMCQgJCQkJCgoKCwsLCwwMDAoJCQkKCgoKCgsLCwsMDQwKCQkJCgoKCgsLCwsMDAwNCwoJCgoKCwsLCwsLDAwNDQsKCgoKCwsLCwwMDAwMDQ0MCwsLCwsLCwwMDAwNDQwNDAsLCwsLCwwMDAwMDQ0NDQEABQAOACwASgA/AG4AXQCsAJUAigDyAOEAwwB4AREAAwAEAAwAFAAjAD4ANQAvAFMASwBEAHcAyQBrAM8ACQAPAA0AFwAmAEMAOgBnAFoAoQBIAH8AdQBuANEAzgAQAC0AFQAnAEUAQAByAGMAVwCeAIwA/ADUAMcAgwFtARoASwAkAEQAQQBzAGUAswCkAJsACAH2AOIAiwF+AWoBCQBCAB4AOwA4AGYAuQCtAAkBjgD9AOgAkAGEAXoBvQEQAG8ANgA0AGQAuACyAKAAhQABAfQA5ADZAIEBbgHLAgoAYgAwAFsAWAClAJ0AlAAFAfgAlwGNAXQBfAF5A3QDCABVAFQAUQCfAJwAjwAEAfkAqwGRAYgBfwHXAskCxAIHAJoATABJAI0AgwAAAfUAqgGWAYoBgAHfAmcBxgJgAQsAiwCBAEMAfQD3AOkA5QDbAIkB5wLhAtACdQNyA7cBBADzAHgAdgBzAOMA3wCMAeoC5gLgAtECyALCAt8AtAEGAMoA4ADeANoA2ACFAYIBfQFsAXgDuwHDArgBtQHABgQA6wLTANIA0AByAXsB3gLTAsoCxwZzA20DbAODDWEDAgB5AXEBZgC7ANYC0gJmAccCxQJiA8YGZwOCDWYDsgEAAAwACgAHAAsACgARAAsACQANAAwACgAHAAUAAwABAAMAAQQGCAkJCgoLCwsMDAwNCQMEBgcICQkJCgoKCwwLDAgGBgcICQkKCgsKCwsLDAwJCAcICQkKCgoLCwwMDA0NCgkICQkKCgsLCwwMDA0NDQkJCAkJCgsLDAsMDA0NDQ4KCgkJCgsLCwsMDAwMDQ0OCgoJCgoLCwsMDA0NDQ0PDwoKCgoLCwsMDA0NDQ0ODg4KCwoKCwsMDA0NDQ0ODQ4NCwsLCgsMDAwMDQ4ODg8PDgoMCwsLDAwNDg4ODg4ODQ4LDAwMDAwNDQ0NDw4ODg4QCw4MDAwNDQ4ODhAPDw8RDwsNDQsMDg4NDg4PEA8RDw4LCQgICQkKCgoLCwsLCwsLCA8ADQAuAFAAkgAGAfgAsgGqAZ0CjQKJAm0CBQIIBFgADgAMABUAJgBHAIIAegDYANEAxgBHAVkBPwEpARcBKgAvABYAKQBKAEQAgAB4AN0AzwDCALYAVAE7AScBHQISAFEAJwBLAEYAhgB9AHQA3ADMAL4AsgBFATcBJQEPARAAkwBIAEUAhwB/AHYAcADSAMgAvABgAUMBMgEdARwCDgAHAUIAgQB+AHcAcgDWAMoAwAC0AFUBPQEtARkBBgEMAPkAewB5AHUAcQDXAM4AwwC5AFsBSgE0ASMBEAEIAgoAswFzAG8AbQDTAMsAxAC7AGEBTAE5ASoBGwETAn0BEQCrAdQA0ADNAMkAwQC6ALEAqQBAAS8BHgEMAQICeQEQAE8BxwDFAL8AvQC1AK4ATQFBATEBIQETAQkCewFzAQsAnAK4ALcAswCvAFgBSwE6ATABIgEVARICfwF1AW4BCgCMAloBqwCoAKQAPgE1ASsBHwEUAQcBAQJ3AXABagEGAIgCQgE8ATgBMwEuASQBHAENAQUBAAJ4AXIBbAFnAQQAbAIsASgBJgEgARoBEQEKAQMCfAF2AXEBbQFpAWUBAgAJBBgBFgESAQsBCAEDAX4BegF0AW8BawFoAWYBZAEAACsAFAATABEADwANAAsACQAHAAYABAAHAAUAAwABAAMABAQGBwgJCQoKCwsLCwsMCQQEBQYHCAgJCQkKCgoKCggGBQYHBwgICQkJCQoKCgsHBwYHBwgICAkJCQkKCgoKBwgHBwgICAgJCQkKCgoKCwcJBwgICAgJCQkJCgoKCgoHCQgICAgJCQkJCgoKCgoLBwoICAgJCQkJCgoKCgoLCwgKCQkJCQkJCQkKCgoKCwsICgkJCQkJCQoKCgoKCwsLCAsJCQkJCgoKCgoKCwsLCwgLCgkJCQoKCgoKCgsLCwsICwoKCgoKCgoKCgsLCwsLCAsKCgoKCgoKCwsLCwsLCwgMCgoKCgoKCwsLCwsLCwsICAcHBwcHBwcHBwcICAgIBAEABQAEAAUABgAFAAQABAAHAAMABgAAAAcAAgADAAEAAQQEBQQGBQYEBQUGBQYGBg8ADgANAAwACwAKAAkACAAHAAYABQAEAAMAAgABAAAABAQEBAQEBAQEBAQEBAQEBABB6CkLBQIAAAACAEH5KQsMBAAACAQAAAMAAAADAEGQKgsNEAQAACIEAAADAAAAAwBBqCoLBjAEAABCBABByCoLBQQAAAAEAEHYKgsNUAQAAHAEAAAEAAAABABB8CoLDYAEAACgBAAABgAAAAYAQYgrCw2wBAAAAAUAAAYAAAAGAEGgKwsNMAUAAIAFAAAGAAAABgBBuCsLDbAFAAAABgAACAAAAAgAQdArCw0wBgAAsAYAAAgAAAAIAEHoKwsN8AYAAHAHAAAIAAAACABBgCwLDbAHAAAwCAAAEAAAABAAQZgsCwZwCAAAcAoAQbgsCwUQAAAAEABByCwLjQNwCwAAcA0AABAAAAAQAAAAAQAAAAEAAABwDgAAcBAAABAAAAAQAAAAAgAAAAMAAABwDgAAcBAAABAAAAAQAAAAAwAAAAcAAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwDgAAcBAAABAAAAAQAAAABgAAAD8AAABwDgAAcBAAABAAAAAQAAAACAAAAP8AAABwDgAAcBAAABAAAAAQAAAACgAAAP8DAABwDgAAcBAAABAAAAAQAAAADQAAAP8fAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwEQAAcBMAABAAAAAQAAAABQAAAB8AAABwEQAAcBMAABAAAAAQAAAABgAAAD8AAABwEQAAcBMAABAAAAAQAAAABwAAAH8AAABwEQAAcBMAABAAAAAQAAAACAAAAP8AAABwEQAAcBMAABAAAAAQAAAACQAAAP8BAABwEQAAcBMAABAAAAAQAAAACwAAAP8HAABwEQAAcBMAABAAAAAQAAAADQAAAP8fAABwEQAAcBMAAAEAAAAQAEHgLwsNcBQAAJAUAAABAAAAEABB+C8LBqAUAADAFABBrDALiQEBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAIAAAADAAAAAwAAAAQAAAADAAAABAAAAAMAAAAEAAAABAAAAAUAAAAEAAAABQAAAAQAAAAGAAAABQAAAAYAAAAFAAAABgAAAAUAAAAHAAAABgAAAAcAAAAGAAAABwBBwDELDQEAAAD/////AQAAAAIAQeAxC5IBAwAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAQAAAAEAAAAAAAAAAEAAAACAAAAAwAAAAAAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAACAAAAAwAAAESsAACAuwAAAH0AACJWAADAXQAAgD4AABErAADgLgAAQB8AQYAzC7oI/////////////////////wgAAAD/////CAAAACAAAAAQAAAA/////xAAAAAoAAAAGAAAAP////8YAAAAMAAAACAAAAD/////IAAAADgAAAAoAAAA/////ygAAABAAAAAMAAAAP////8wAAAAUAAAADgAAAD/////OAAAAGAAAABAAAAA/////0AAAABwAAAA//////////9QAAAAgAAAAP//////////YAAAAKAAAAD//////////3AAAADAAAAA//////////+AAAAA4AAAAP//////////kAAAAAABAAD//////////6AAAABAAQAA/////////////////////wAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAeAAAAJAAAACwAAAA0AAAAPgAAAEoAAABaAAAAbgAAAIYAAACiAAAAxAAAAO4AAAAgAQAAVgEAAKIBAABAAgAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAB4AAAAkAAAAKgAAADIAAAA8AAAASAAAAFgAAABqAAAAgAAAAJwAAAC+AAAA5gAAABQBAABKAQAAgAEAAEACAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABSAAAAZgAAAH4AAACcAAAAwgAAAPAAAAAoAQAAbAEAAMABAAAmAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAcgAAAIgAAACiAAAAwgAAAOgAAAAWAQAASgEAAIoBAADQAQAAHAIAAEACAAAAAAAABgAAAAwAAAASAAAAGAAAAB4AAAAkAAAALAAAAC0AAABCAAAAUAAAAGAAAAB0AAAAjAAAAKgAAADIAAAA7gAAAPgAAABQAQAAjAEAANABAAAKAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAdAAAAIwAAACoAAAAyAAAAO4AAAAcAQAAUAEAAIwBAADQAQAACgIAAEACAAAAAAAADAAAABgAAAAkAAAAMAAAADwAAABIAAAAWAAAAGwAAACEAAAAoAAAAMAAAADoAAAAGAEAAFABAACQAQAA3AEAADYCAAA4AgAAOgIAADwCAAA+AgAAQAIAQdw7C8oPnff//533//+d9///nff//533//+d9///Ou///zrv//86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";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){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){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["c"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["o"];addOnInit(Module["asm"]["d"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){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);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}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{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";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 HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort("invalid type for getValue: "+type)}return null}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort("invalid type for setValue: "+type)}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ASSERTIONS=false;var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE=="boolean"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,"base64");return new Uint8Array(buf["buffer"],buf["byteOffset"],buf["byteLength"])}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var asmLibraryArg={"b":_emscripten_memcpy_big,"a":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["e"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["f"]).apply(null,arguments)};var _shine_check_config=Module["_shine_check_config"]=function(){return(_shine_check_config=Module["_shine_check_config"]=Module["asm"]["g"]).apply(null,arguments)};var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=function(){return(_shine_samples_per_pass=Module["_shine_samples_per_pass"]=Module["asm"]["h"]).apply(null,arguments)};var _shine_encode_buffer=Module["_shine_encode_buffer"]=function(){return(_shine_encode_buffer=Module["_shine_encode_buffer"]=Module["asm"]["i"]).apply(null,arguments)};var _shine_flush=Module["_shine_flush"]=function(){return(_shine_flush=Module["_shine_flush"]=Module["asm"]["j"]).apply(null,arguments)};var _shine_close=Module["_shine_close"]=function(){return(_shine_close=Module["_shine_close"]=Module["asm"]["k"]).apply(null,arguments)};var _shine_js_int16_len=Module["_shine_js_int16_len"]=function(){return(_shine_js_int16_len=Module["_shine_js_int16_len"]=Module["asm"]["l"]).apply(null,arguments)};var _shine_js_ptr_len=Module["_shine_js_ptr_len"]=function(){return(_shine_js_ptr_len=Module["_shine_js_ptr_len"]=Module["asm"]["m"]).apply(null,arguments)};var _shine_js_init=Module["_shine_js_init"]=function(){return(_shine_js_init=Module["_shine_js_init"]=Module["asm"]["n"]).apply(null,arguments)};Module["setValue"]=setValue;Module["getValue"]=getValue;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();var ShineModule;var int16Len;var ptrLen;function shineInit(){int16Len=ShineModule._shine_js_int16_len();ptrLen=ShineModule._shine_js_ptr_len()}function Shine(args){if(ShineModule._shine_check_config(args.samplerate,args.bitrate)<0)throw"Invalid configuration";var stereoMode;if(!args.stereoMode){if(args.channels===1){stereoMode=Shine.MONO}else{stereoMode=Shine.JOINT_STEREO}}else{stereoMode=args.stereoMode}this._handle=ShineModule._shine_js_init(args.channels,args.samplerate,stereoMode,args.bitrate);this._channels=args.channels;this._samples_per_pass=ShineModule._shine_samples_per_pass(this._handle);this._buffer=ShineModule._malloc(this._channels*ptrLen);this._pcm=new Array(this._channels);this._rem=new Array(this._channels);this._written=ShineModule._malloc(int16Len);var _tmp,chan;for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array;_tmp=ShineModule._malloc(this._samples_per_pass*int16Len);ShineModule.setValue(this._buffer+chan*ptrLen,_tmp,"*");this._pcm[chan]=ShineModule.HEAP16.subarray(_tmp/int16Len,_tmp/int16Len+this._samples_per_pass)}return this}Shine.checkConfig=function(samplerate,bitrate){return ShineModule._shine_check_config(samplerate,bitrate)>=0};Shine.prototype._encodePass=function(data){if(!this._handle)throw"Closed";var chan;for(chan=0;chan<this._channels;chan++)this._pcm[chan].set(data[chan]);var _buf=ShineModule._shine_encode_buffer(this._handle,this._buffer,this._written);var written=ShineModule.getValue(this._written,"i16");return ShineModule.HEAPU8.subarray(_buf,_buf+written)};function concat(ctr,a,b){if(typeof b==="undefined"){return a}var ret=new ctr(a.length+b.length);ret.set(a);ret.subarray(a.length).set(b);return ret}function clip(x){return x>1?1:x<-1?-1:x}function convertFloat32(buf){var ret=new Array(buf.length);var samples=buf[0].length;var chan,i;for(chan=0;chan<buf.length;chan++){ret[chan]=new Int16Array(samples);for(i=0;i<samples;i++){ret[chan][i]=parseInt(clip(buf[chan][i])*32767)}}return ret}Shine.prototype.encode=function(data){if(data.length!=this._channels)throw"Invalid data";var encoded=new Uint8Array;var tmp=new Array(this._channels);if(data[0]instanceof Float32Array){data=convertFloat32(data)}var chan;for(chan=0;chan<this._channels;chan++){tmp[chan]=new Float32Array;this._rem[chan]=concat(Int16Array,this._rem[chan],data[chan])}var i,enc;for(i=0;i<this._rem[0].length;i+=this._samples_per_pass){for(chan=0;chan<this._channels;chan++){tmp[chan]=this._rem[chan].subarray(i,i+this._samples_per_pass)}if(tmp[0].length<this._samples_per_pass){break}else{enc=this._encodePass(tmp);if(enc.length>0){encoded=concat(Uint8Array,encoded,enc)}}}if(tmp[0].length<this._samples_per_pass){this._rem=tmp}else{for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array}}return encoded};Shine.prototype.close=function(){if(!this._handle){throw"Closed"}var _buf=ShineModule._shine_flush(this._handle,this._written);var written=ShineModule.getValue(this._written,"i16");var encoded=new Uint8Array(written);encoded.set(ShineModule.HEAPU8.subarray(_buf,_buf+written));ShineModule._free(this._written);ShineModule._shine_close(this._handle);this._handle=null;var chan;for(chan=0;chan<this._channels;chan++){ShineModule._free(ShineModule.getValue(this._buffer+chan*ptrLen,"*"))}ShineModule._free(this._buffer);return encoded};Shine.initialized=new Promise(function(resolve){Module["onRuntimeInitialized"]=function(){ShineModule=Module;shineInit();resolve()}});Module["Shine"]=Shine;Module["StereoMode"]={0:"STEREO",1:"JOINT_STEREO",2:"DUAL_CHANNEL",3:"MONO",STEREO:0,JOINT_STEREO:1,DUAL_CHANNEL:2,MONO:3}; +diff --git a/js/libshine.d.ts b/js/libshine.d.ts +new file mode 100644 +index 0000000..8f00edc +--- /dev/null ++++ b/js/libshine.d.ts +@@ -0,0 +1,19 @@ ++export type Data = Int16Array | Float32Array; ++export declare enum StereoMode { ++ STEREO = 0, ++ JOINT_STEREO = 1, ++ DUAL_CHANNEL = 2, ++ MONO = 3 ++} ++export class Shine { ++ static initialized: Promise<void>; ++ static checkConfig(samplerate: number, bitrate: number): boolean; ++ constructor(args: { ++ samplerate: number; ++ bitrate: number; ++ channels: number; ++ stereoMode?: StereoMode; ++ }); ++ encode(data: Data[]): Uint8Array; ++ close(): Uint8Array; ++} +diff --git a/js/package-lock.json b/js/package-lock.json +new file mode 100644 +index 0000000..38b374d +--- /dev/null ++++ b/js/package-lock.json +@@ -0,0 +1,18 @@ ++{ ++ "name": "@toots/shine.js", ++ "version": "1.0.1", ++ "lockfileVersion": 3, ++ "requires": true, ++ "packages": { ++ "": { ++ "name": "@toots/shine.js", ++ "version": "1.0.1", ++ "license": "LGPL-2.0-only" ++ }, ++ "stubs": { ++ "version": "1.0.0", ++ "extraneous": true, ++ "license": "ISC" ++ } ++ } ++} +diff --git a/js/package.json b/js/package.json +new file mode 100644 +index 0000000..0c83619 +--- /dev/null ++++ b/js/package.json +@@ -0,0 +1,24 @@ ++{ ++ "name": "@toots/shine.js", ++ "version": "1.0.3", ++ "description": "Shine fixed-point mp3 encoder", ++ "main": "dist/libshine_node.js", ++ "browser": "dist/libshine_browser.js", ++ "types": "libshine.d.ts", ++ "repository": { ++ "type": "git", ++ "url": "git+https://github.com/toots/shine.git" ++ }, ++ "keywords": [ ++ "mp3", ++ "encoder", ++ "wasm", ++ "fixed-point" ++ ], ++ "author": "Romain Beauxis <toots@rastageeks.org>", ++ "license": "LGPL-2.0-only", ++ "bugs": { ++ "url": "https://github.com/toots/shine/issues" ++ }, ++ "homepage": "https://github.com/toots/shine#readme" ++} +diff --git a/js/src/libshine_browser_wrapper.js b/js/src/libshine_browser_wrapper.js +new file mode 100644 +index 0000000..f0ef04e +--- /dev/null ++++ b/js/src/libshine_browser_wrapper.js +@@ -0,0 +1,10 @@ ++var createModule = require("./libshine_browser_stubs").default; ++ ++Shine.initialized = (createModule()).then(function (Module) { ++ ShineModule = Module; ++ shineInit(); ++}); ++ ++module.exports.Shine = Shine; ++ ++module.exports.StereoMode = StereoMode; +diff --git a/js/src/post.js b/js/src/libshine_class.js +similarity index 57% +rename from js/src/post.js +rename to js/src/libshine_class.js +index f6a07e6..5d88d9e 100644 +--- a/js/src/post.js ++++ b/js/src/libshine_class.js +@@ -1,50 +1,64 @@ + // libshine function wrappers + +-var isNode = typeof process === "object" && typeof require === "function"; ++var StereoMode = { ++ '0': 'STEREO', ++ '1': 'JOINT_STEREO', ++ '2': 'DUAL_CHANNEL', ++ '3': 'MONO', ++ STEREO: 0, ++ JOINT_STEREO: 1, ++ DUAL_CHANNEL: 2, ++ MONO: 3 ++}; ++ ++var ShineModule; ++var int16Len; ++var ptrLen; + +-var int16Len = Module.HEAP16.BYTES_PER_ELEMENT; +-var ptrLen = Module.HEAP32.BYTES_PER_ELEMENT; ++function shineInit() { ++ int16Len = ShineModule._shine_js_int16_len(); ++ ptrLen = ShineModule._shine_js_ptr_len(); ++}; + + function Shine(args) { +- if (_shine_check_config(args.samplerate, args.bitrate) < 0) ++ if (ShineModule._shine_check_config(args.samplerate, args.bitrate) < 0) + throw "Invalid configuration"; + +- var mode; +- if (!args.mode) { ++ var stereoMode; ++ if (!args.stereoMode) { + if (args.channels === 1) { +- mode = Shine.MONO; ++ stereoMode = Shine.MONO; + } else { +- mode = Shine.JOINT_STEREO; ++ stereoMode = Shine.JOINT_STEREO; + } + } else { +- mode = args.mode; ++ stereoMode = args.stereoMode; + } + +- this._handle = _shine_js_init(args.channels, args.samplerate, mode, args.bitrate); ++ this._handle = ShineModule._shine_js_init(args.channels, args.samplerate, stereoMode, args.bitrate); + + this._channels = args.channels; +- this._samples_per_pass = _shine_samples_per_pass(this._handle); ++ this._samples_per_pass = ShineModule._shine_samples_per_pass(this._handle); + +- this._buffer = _malloc(this._channels * ptrLen); ++ this._buffer = ShineModule._malloc(this._channels * ptrLen); + this._pcm = new Array(this._channels); + this._rem = new Array(this._channels); +- this._written = _malloc(int16Len); ++ this._written = ShineModule._malloc(int16Len); + + var _tmp, chan; + for (chan=0; chan<this._channels; chan++) { + this._rem[chan] = new Int16Array; +- _tmp = _malloc(this._samples_per_pass * int16Len); +- setValue(this._buffer + chan*ptrLen, _tmp, "*") +- this._pcm[chan] = Module.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass) ++ _tmp = ShineModule._malloc(this._samples_per_pass * int16Len); ++ ShineModule.setValue(this._buffer + chan*ptrLen, _tmp, "*") ++ this._pcm[chan] = ShineModule.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass) + } + + return this; + }; + +-Shine.STEREO = 0; +-Shine.JOINT_STEREO = 1; +-Shine.DUAL_CHANNEL = 2; +-Shine.MONO = 3; ++Shine.checkConfig = function (samplerate, bitrate) { ++ return ShineModule._shine_check_config(samplerate, bitrate) >= 0; ++}; + + Shine.prototype._encodePass = function (data) { + if (!this._handle) +@@ -54,11 +68,11 @@ Shine.prototype._encodePass = function (data) { + for (chan=0;chan<this._channels;chan++) + this._pcm[chan].set(data[chan]); + +- var _buf = _shine_encode_buffer(this._handle, this._buffer, this._written); ++ var _buf = ShineModule._shine_encode_buffer(this._handle, this._buffer, this._written); + +- var written = getValue(this._written, "i16"); ++ var written = ShineModule.getValue(this._written, "i16"); + +- return Module.HEAPU8.subarray(_buf, _buf+written); ++ return ShineModule.HEAPU8.subarray(_buf, _buf+written); + }; + + function concat(ctr, a, b) { +@@ -138,30 +152,22 @@ Shine.prototype.close = function () { + throw "Closed"; + } + +- var _buf = _shine_flush(this._handle, this._written); ++ var _buf = ShineModule._shine_flush(this._handle, this._written); + +- var written = getValue(this._written, "i16"); ++ var written = ShineModule.getValue(this._written, "i16"); + var encoded = new Uint8Array(written); + +- encoded.set(Module.HEAPU8.subarray(_buf, _buf + written)); ++ encoded.set(ShineModule.HEAPU8.subarray(_buf, _buf + written)); + +- _free(this._written); +- _shine_close(this._handle); ++ ShineModule._free(this._written); ++ ShineModule._shine_close(this._handle); + this._handle = null; + + var chan; + for (chan=0; chan<this._channels; chan++) { +- _free(getValue(this._buffer + chan*ptrLen, "*")); ++ ShineModule._free(ShineModule.getValue(this._buffer + chan*ptrLen, "*")); + } +- _free(this._buffer); ++ ShineModule._free(this._buffer); + + return encoded; + }; +- +-if (isNode) { +- module.exports = Shine; +-} +- +-return Shine; +- +-}).call(context)})(); +diff --git a/js/src/libshine_node_wrapper.js b/js/src/libshine_node_wrapper.js +new file mode 100644 +index 0000000..aaaf28c +--- /dev/null ++++ b/js/src/libshine_node_wrapper.js +@@ -0,0 +1,10 @@ ++Shine.initialized = new Promise(function (resolve) { ++ Module['onRuntimeInitialized'] = function () { ++ ShineModule = Module; ++ shineInit(); ++ resolve(); ++ } ++}) ++ ++Module["Shine"] = Shine; ++Module["StereoMode"] = StereoMode; +diff --git a/js/src/pre.js b/js/src/pre.js +deleted file mode 100644 +index 8078b87..0000000 +--- a/js/src/pre.js ++++ /dev/null +@@ -1,9 +0,0 @@ +-// libshine.js - port of libshine to JavaScript using emscripten +-// by Romain Beauxis <toots@rastageeks.org> from code by +-// Andreas Krennmair <ak@synflood.at> +- +- +-var Shine = (function() { +- var Module; +- var context = {}; +- return (function() { +diff --git a/js/src/wrapper.c b/js/src/wrapper.c +index 506570d..375b35c 100644 +--- a/js/src/wrapper.c ++++ b/js/src/wrapper.c +@@ -1,7 +1,16 @@ ++#include "layer3.h" ++#include "types.h" + #include <stdlib.h> + #include <string.h> +-#include "types.h" +-#include "layer3.h" ++#include <stdint.h> ++ ++size_t shine_js_int16_len() { ++ return sizeof(int16_t); ++} ++ ++size_t shine_js_ptr_len() { ++ return sizeof(void*); ++} + + shine_t shine_js_init(int channels, int samplerate, int mode, int bitr) { + shine_config_t config; +@@ -13,4 +22,4 @@ shine_t shine_js_init(int channels, int samplerate, int mode, int bitr) { + config.mpeg.bitr = bitr; + + return shine_initialise(&config); +-} ++} +diff --git a/js/test/browser/Makefile b/js/test/browser/Makefile +index b3eedc8..befc1ce 100644 +--- a/js/test/browser/Makefile ++++ b/js/test/browser/Makefile +@@ -1,2 +1,2 @@ + all: +- python -m SimpleHTTPServer ++ python -m http.server +diff --git a/js/test/browser/encode.js b/js/test/browser/encode.js +index 65e009d..af17116 100644 +--- a/js/test/browser/encode.js ++++ b/js/test/browser/encode.js +@@ -4,24 +4,22 @@ function runEncodeTest(log, callback) { + var samplerate = 44100; + var channels = 2; + var bitrate = 128; +- var mode = Shine.STEREO; + + var shine = new Shine({ + samplerate: samplerate, + channels: channels, + bitrate: bitrate, +- mode: mode + }); + +- var started = new Date; ++ var started = new Date(); + var duration = 0.0; + var encoded = []; + + var xhr = new XMLHttpRequest(); + xhr.open("GET", "encode.wav", true); + xhr.responseType = "arraybuffer"; +- xhr.onload = function() { +- var samples = xhr.response.byteLength / (2*channels); ++ xhr.onload = function () { ++ var samples = xhr.response.byteLength / (2 * channels); + var data = new Int16Array(xhr.response); + var buf = convertInterleavedBuffer(data, channels, samples); + duration += parseFloat(samples) / samplerate; +@@ -33,12 +31,12 @@ function runEncodeTest(log, callback) { + xhr.addEventListener("load", function () { + encoded.push(shine.close()); + +- var ended = new Date +- var encodingTime = (ended.getTime() - started.getTime())/1000 ++ var ended = new Date(); ++ var encodingTime = (ended.getTime() - started.getTime()) / 1000; + log("Done encoding."); + log("File duration: " + duration.toFixed(2) + " seconds"); + log("Encoding time: " + encodingTime.toFixed(2) + " seconds"); +- log("Encoding rate: " + (duration/encodingTime).toFixed(2) + "X"); ++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X"); + callback(new Blob(encoded)); + }); + +@@ -48,10 +46,10 @@ function runEncodeTest(log, callback) { + function convertInterleavedBuffer(buf, channels, samples) { + var chan, i; + ret = new Array(channels); +- for (chan=0; chan<channels; chan++) { ++ for (chan = 0; chan < channels; chan++) { + ret[chan] = new Int16Array(samples); +- for (i=0; i<samples; i++) { +- ret[chan][i] = buf[i*channels + chan]; ++ for (i = 0; i < samples; i++) { ++ ret[chan][i] = buf[i * channels + chan]; + } + } + return ret; +diff --git a/js/test/browser/index.html b/js/test/browser/index.html +index b3a4ee3..6496e46 100644 +--- a/js/test/browser/index.html ++++ b/js/test/browser/index.html +@@ -1,4 +1,4 @@ +-<script src="libshine.js"></script> ++<script src="libshine_node.js"></script> + <script src="encode.js"></script> + <script src="rounds.js"></script> + <script> +@@ -7,20 +7,21 @@ + el.innerHTML = el.innerHTML + "<br>" + msg; + }; + +- var load = function() { +- runEncodeTest(log, function (blob) { +- if (typeof window.URL !== "undefined") { +- var link = document.getElementById("download-link"); +- link.href = URL.createObjectURL(blob); +- link.download = "encoded.mp3"; +- } ++ function onLoad() { ++ Shine.initialized.then(function () { ++ runEncodeTest(log, function (blob) { ++ if (typeof window.URL !== "undefined") { ++ var link = document.getElementById("download-link"); ++ link.href = URL.createObjectURL(blob); ++ link.download = "encoded.mp3"; ++ } + +- log(""); +- runRoundsTest(Shine, log); ++ log(""); ++ runRoundsTest(Shine, log); ++ }); + }); + }; +- +- window.addEventListener("load", load, false); ++ window.addEventListener("load", onLoad, false); + </script> + <a href="#" id="download-link">Download encoded file</a> + <div id="output"></div> +diff --git a/js/test/browser/libshine.js b/js/test/browser/libshine.js +deleted file mode 120000 +index fb57470..0000000 +--- a/js/test/browser/libshine.js ++++ /dev/null +@@ -1 +0,0 @@ +-../../dist/libshine.js +\ No newline at end of file +diff --git a/js/test/browser/libshine_node.js b/js/test/browser/libshine_node.js +new file mode 120000 +index 0000000..07f07a4 +--- /dev/null ++++ b/js/test/browser/libshine_node.js +@@ -0,0 +1 @@ ++../../dist/libshine_node.js +\ No newline at end of file +diff --git a/js/test/lib/rounds.js b/js/test/lib/rounds.js +index f76410a..1b388b5 100644 +--- a/js/test/lib/rounds.js ++++ b/js/test/lib/rounds.js +@@ -1,39 +1,35 @@ + var channels = 2; // test.wav is stereo + var samplerate = 44100; // ditto + +-var runRoundsTest = function(Shine, log) { ++var runRoundsTest = function (Shine, log) { + log("Executing rounds test"); + + var nPasses = 50; + var frameSize = 4096; + var data = new Array(channels); + var chan; +- for (chan=0; chan<channels; chan++) +- data[chan] = new Int16Array(frameSize); ++ for (chan = 0; chan < channels; chan++) data[chan] = new Int16Array(frameSize); + + log("Encoding " + nPasses + " buffers of " + frameSize + " samples"); +- var started = new Date; ++ var started = new Date(); + + var shine = new Shine({ + samplerate: samplerate, + bitrate: 128, + channels: channels, +- model: Shine.STEREO + }); + + var i; +- for (i=0; i < nPasses; i++) +- shine.encode(data); ++ for (i = 0; i < nPasses; i++) shine.encode(data); + shine.close(); + +- var ended = new Date; +- var duration = (parseFloat(nPasses*frameSize) / parseFloat(samplerate)).toFixed(2); +- var encodingTime = (ended.getTime() - started.getTime())/1000; ++ var ended = new Date(); ++ var duration = (parseFloat(nPasses * frameSize) / parseFloat(samplerate)).toFixed(2); ++ var encodingTime = (ended.getTime() - started.getTime()) / 1000; + log("Done encoding"); + log("Total duration: " + duration); + log("Encoding time: " + encodingTime.toFixed(2)); +- log("Encoding rate: " + (duration/encodingTime).toFixed(2) + "X"); ++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X"); + }; + +-if (typeof process === "object" && typeof require === "function") +- module.exports = runRoundsTest; ++if (typeof process === "object" && typeof require === "function") module.exports = runRoundsTest; +diff --git a/js/test/nextjs/.eslintrc.json b/js/test/nextjs/.eslintrc.json +new file mode 100644 +index 0000000..bffb357 +--- /dev/null ++++ b/js/test/nextjs/.eslintrc.json +@@ -0,0 +1,3 @@ ++{ ++ "extends": "next/core-web-vitals" ++} +diff --git a/js/test/nextjs/.gitignore b/js/test/nextjs/.gitignore +new file mode 100644 +index 0000000..c87c9b3 +--- /dev/null ++++ b/js/test/nextjs/.gitignore +@@ -0,0 +1,36 @@ ++# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. ++ ++# dependencies ++/node_modules ++/.pnp ++.pnp.js ++ ++# testing ++/coverage ++ ++# next.js ++/.next/ ++/out/ ++ ++# production ++/build ++ ++# misc ++.DS_Store ++*.pem ++ ++# debug ++npm-debug.log* ++yarn-debug.log* ++yarn-error.log* ++.pnpm-debug.log* ++ ++# local env files ++.env*.local ++ ++# vercel ++.vercel ++ ++# typescript ++*.tsbuildinfo ++next-env.d.ts +diff --git a/js/test/nextjs/.prettierignore b/js/test/nextjs/.prettierignore +new file mode 100644 +index 0000000..799a1ca +--- /dev/null ++++ b/js/test/nextjs/.prettierignore +@@ -0,0 +1,4 @@ ++.next/ ++out/ ++public/audio ++__ENV.js +diff --git a/js/test/nextjs/.prettierrc b/js/test/nextjs/.prettierrc +new file mode 100644 +index 0000000..a36a92f +--- /dev/null ++++ b/js/test/nextjs/.prettierrc +@@ -0,0 +1,12 @@ ++{ ++ "singleQuote": false, ++ "quoteProps": "as-needed", ++ "arrowParens": "avoid", ++ "tabWidth": 2, ++ "trailingComma": "es5", ++ "semi": false, ++ "jsxSingleQuote": true, ++ "bracketSameLine": false, ++ "printWidth": 120, ++ "parser": "typescript" ++} +diff --git a/js/test/nextjs/README.md b/js/test/nextjs/README.md +new file mode 100644 +index 0000000..fb9bcc9 +--- /dev/null ++++ b/js/test/nextjs/README.md +@@ -0,0 +1,36 @@ ++This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). ++ ++## Getting Started ++ ++First, run the development server: ++ ++```bash ++npm run dev ++# or ++yarn dev ++``` ++ ++Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. ++ ++You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. ++ ++[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. ++ ++The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. ++ ++This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. ++ ++## Learn More ++ ++To learn more about Next.js, take a look at the following resources: ++ ++- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. ++- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. ++ ++You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! ++ ++## Deploy on Vercel ++ ++The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. ++ ++Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +diff --git a/js/test/nextjs/lib/encode.ts b/js/test/nextjs/lib/encode.ts +new file mode 100644 +index 0000000..6e1ef2d +--- /dev/null ++++ b/js/test/nextjs/lib/encode.ts +@@ -0,0 +1,59 @@ ++import { Shine } from "@toots/shine.js" ++ ++const convertInterleavedBuffer = (buf: Int16Array, channels: number, samples: number) => { ++ const ret = new Array(channels) ++ for (let chan = 0; chan < channels; chan++) { ++ ret[chan] = new Int16Array(samples) ++ for (let i = 0; i < samples; i++) { ++ ret[chan][i] = buf[i * channels + chan] ++ } ++ } ++ return ret ++} ++ ++export const runEncodeTest = (log: (_: string) => void, callback: (_: Blob) => void) => { ++ log("Executing encoding test") ++ ++ const samplerate = 44100 ++ const channels = 2 ++ const bitrate = 128 ++ //const stereoMode = StereoMode.STEREO ++ ++ const shine = new Shine({ ++ samplerate: samplerate, ++ channels: channels, ++ bitrate: bitrate, ++ // stereoMode: stereoMode, ++ }) ++ ++ const started = new Date() ++ let duration = 0.0 ++ const encoded: Uint8Array[] = [] ++ ++ const xhr = new XMLHttpRequest() ++ xhr.open("GET", "encode.wav", true) ++ xhr.responseType = "arraybuffer" ++ xhr.onload = () => { ++ const samples = xhr.response.byteLength / (2 * channels) ++ const data = new Int16Array(xhr.response) ++ const buf = convertInterleavedBuffer(data, channels, samples) ++ duration += samples / samplerate ++ encoded.push(shine.encode(buf)) ++ } ++ ++ log("Got WAV file.") ++ log("Encoding..") ++ xhr.addEventListener("load", () => { ++ encoded.push(shine.close()) ++ ++ const ended = new Date() ++ const encodingTime = (ended.getTime() - started.getTime()) / 1000 ++ log("Done encoding.") ++ log("File duration: " + duration.toFixed(2) + " seconds") ++ log("Encoding time: " + encodingTime.toFixed(2) + " seconds") ++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X") ++ callback(new Blob(encoded)) ++ }) ++ ++ xhr.send() ++} +diff --git a/js/test/nextjs/lib/encode.wav b/js/test/nextjs/lib/encode.wav +new file mode 100644 +index 0000000..c8cd595 +Binary files /dev/null and b/js/test/nextjs/lib/encode.wav differ +diff --git a/js/test/nextjs/lib/rounds.ts b/js/test/nextjs/lib/rounds.ts +new file mode 100644 +index 0000000..fab9b7c +--- /dev/null ++++ b/js/test/nextjs/lib/rounds.ts +@@ -0,0 +1,34 @@ ++import { Shine, StereoMode } from "@toots/shine.js" ++ ++const channels = 2 // test.wav is stereo ++const samplerate = 44100 // ditto ++ ++export const runRoundsTest = (log: (_: string) => void) => { ++ log("Executing rounds test") ++ ++ const nPasses = 50 ++ const frameSize = 4096 ++ const data = new Array(channels) ++ for (let chan = 0; chan < channels; chan++) data[chan] = new Int16Array(frameSize) ++ ++ log("Encoding " + nPasses + " buffers of " + frameSize + " samples") ++ const started = new Date() ++ ++ const shine = new Shine({ ++ samplerate: samplerate, ++ bitrate: 128, ++ channels: channels, ++ stereoMode: StereoMode.STEREO, ++ }) ++ ++ for (let i = 0; i < nPasses; i++) shine.encode(data) ++ shine.close() ++ ++ const ended = new Date() ++ const duration = (nPasses * frameSize) / samplerate ++ const encodingTime = (ended.getTime() - started.getTime()) / 1000 ++ log("Done encoding") ++ log("Total duration: " + duration.toFixed(2)) ++ log("Encoding time: " + encodingTime.toFixed(2)) ++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X") ++} +diff --git a/js/test/nextjs/next.config.js b/js/test/nextjs/next.config.js +new file mode 100644 +index 0000000..a843cbe +--- /dev/null ++++ b/js/test/nextjs/next.config.js +@@ -0,0 +1,6 @@ ++/** @type {import('next').NextConfig} */ ++const nextConfig = { ++ reactStrictMode: true, ++} ++ ++module.exports = nextConfig +diff --git a/js/test/nextjs/package-lock.json b/js/test/nextjs/package-lock.json +new file mode 100644 +index 0000000..02208b0 +--- /dev/null ++++ b/js/test/nextjs/package-lock.json +@@ -0,0 +1,3084 @@ ++{ ++ "name": "shine-nextjs-test-app", ++ "version": "0.1.0", ++ "lockfileVersion": 3, ++ "requires": true, ++ "packages": { ++ "": { ++ "name": "shine-nextjs-test-app", ++ "version": "0.1.0", ++ "dependencies": { ++ "@next/font": "13.1.1", ++ "@toots/shine.js": "file:../..", ++ "@types/node": "18.11.18", ++ "@types/react": "18.0.26", ++ "@types/react-dom": "18.0.10", ++ "eslint": "8.31.0", ++ "eslint-config-next": "13.1.1", ++ "next": "13.1.1", ++ "react": "18.2.0", ++ "react-dom": "18.2.0", ++ "typescript": "4.9.4" ++ }, ++ "devDependencies": { ++ "prettier": "^2.8.1" ++ } ++ }, ++ "node_modules/@babel/runtime": { ++ "version": "7.20.7", ++ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", ++ "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", ++ "dependencies": { ++ "regenerator-runtime": "^0.13.11" ++ }, ++ "engines": { ++ "node": ">=6.9.0" ++ } ++ }, ++ "node_modules/@babel/runtime-corejs3": { ++ "version": "7.20.7", ++ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz", ++ "integrity": "sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==", ++ "dependencies": { ++ "core-js-pure": "^3.25.1", ++ "regenerator-runtime": "^0.13.11" ++ }, ++ "engines": { ++ "node": ">=6.9.0" ++ } ++ }, ++ "node_modules/@eslint/eslintrc": { ++ "version": "1.4.1", ++ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", ++ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", ++ "dependencies": { ++ "ajv": "^6.12.4", ++ "debug": "^4.3.2", ++ "espree": "^9.4.0", ++ "globals": "^13.19.0", ++ "ignore": "^5.2.0", ++ "import-fresh": "^3.2.1", ++ "js-yaml": "^4.1.0", ++ "minimatch": "^3.1.2", ++ "strip-json-comments": "^3.1.1" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/@humanwhocodes/config-array": { ++ "version": "0.11.8", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", ++ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", ++ "dependencies": { ++ "@humanwhocodes/object-schema": "^1.2.1", ++ "debug": "^4.1.1", ++ "minimatch": "^3.0.5" ++ }, ++ "engines": { ++ "node": ">=10.10.0" ++ } ++ }, ++ "node_modules/@humanwhocodes/module-importer": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", ++ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", ++ "engines": { ++ "node": ">=12.22" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/nzakas" ++ } ++ }, ++ "node_modules/@humanwhocodes/object-schema": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", ++ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" ++ }, ++ "node_modules/@next/env": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/env/-/env-13.1.1.tgz", ++ "integrity": "sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw==" ++ }, ++ "node_modules/@next/eslint-plugin-next": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.1.tgz", ++ "integrity": "sha512-SBrOFS8PC3nQ5aeZmawJkjKkWjwK9RoxvBSv/86nZp0ubdoVQoko8r8htALd9ufp16NhacCdqhu9bzZLDWtALQ==", ++ "dependencies": { ++ "glob": "7.1.7" ++ } ++ }, ++ "node_modules/@next/font": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/font/-/font-13.1.1.tgz", ++ "integrity": "sha512-amygRorS05hYK1/XQRZo5qBl7l2fpHnezeKU/cNveWU5QJg+sg8gMGkUXHtvesNKpiKIJshBRH1TzvO+2sKpvQ==" ++ }, ++ "node_modules/@next/swc-android-arm-eabi": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.1.tgz", ++ "integrity": "sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==", ++ "cpu": [ ++ "arm" ++ ], ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-android-arm64": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.1.1.tgz", ++ "integrity": "sha512-eCiZhTzjySubNqUnNkQCjU3Fh+ep3C6b5DCM5FKzsTH/3Gr/4Y7EiaPZKILbvnXmhWtKPIdcY6Zjx51t4VeTfA==", ++ "cpu": [ ++ "arm64" ++ ], ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-darwin-arm64": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.1.tgz", ++ "integrity": "sha512-9zRJSSIwER5tu9ADDkPw5rIZ+Np44HTXpYMr0rkM656IvssowPxmhK0rTreC1gpUCYwFsRbxarUJnJsTWiutPg==", ++ "cpu": [ ++ "arm64" ++ ], ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-darwin-x64": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.1.tgz", ++ "integrity": "sha512-qWr9qEn5nrnlhB0rtjSdR00RRZEtxg4EGvicIipqZWEyayPxhUu6NwKiG8wZiYZCLfJ5KWr66PGSNeDMGlNaiA==", ++ "cpu": [ ++ "x64" ++ ], ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-freebsd-x64": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.1.tgz", ++ "integrity": "sha512-UwP4w/NcQ7V/VJEj3tGVszgb4pyUCt3lzJfUhjDMUmQbzG9LDvgiZgAGMYH6L21MoyAATJQPDGiAMWAPKsmumA==", ++ "cpu": [ ++ "x64" ++ ], ++ "optional": true, ++ "os": [ ++ "freebsd" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-linux-arm-gnueabihf": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.1.tgz", ++ "integrity": "sha512-CnsxmKHco9sosBs1XcvCXP845Db+Wx1G0qouV5+Gr+HT/ZlDYEWKoHVDgnJXLVEQzq4FmHddBNGbXvgqM1Gfkg==", ++ "cpu": [ ++ "arm" ++ ], ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-linux-arm64-gnu": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.1.tgz", ++ "integrity": "sha512-JfDq1eri5Dif+VDpTkONRd083780nsMCOKoFG87wA0sa4xL8LGcXIBAkUGIC1uVy9SMsr2scA9CySLD/i+Oqiw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-linux-arm64-musl": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.1.tgz", ++ "integrity": "sha512-GA67ZbDq2AW0CY07zzGt07M5b5Yaq5qUpFIoW3UFfjOPgb0Sqf3DAW7GtFMK1sF4ROHsRDMGQ9rnT0VM2dVfKA==", ++ "cpu": [ ++ "arm64" ++ ], ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-linux-x64-gnu": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.1.tgz", ++ "integrity": "sha512-nnjuBrbzvqaOJaV+XgT8/+lmXrSCOt1YYZn/irbDb2fR2QprL6Q7WJNgwsZNxiLSfLdv+2RJGGegBx9sLBEzGA==", ++ "cpu": [ ++ "x64" ++ ], ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-linux-x64-musl": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.1.tgz", ++ "integrity": "sha512-CM9xnAQNIZ8zf/igbIT/i3xWbQZYaF397H+JroF5VMOCUleElaMdQLL5riJml8wUfPoN3dtfn2s4peSr3azz/g==", ++ "cpu": [ ++ "x64" ++ ], ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-win32-arm64-msvc": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.1.tgz", ++ "integrity": "sha512-pzUHOGrbgfGgPlOMx9xk3QdPJoRPU+om84hqVoe6u+E0RdwOG0Ho/2UxCgDqmvpUrMab1Deltlt6RqcXFpnigQ==", ++ "cpu": [ ++ "arm64" ++ ], ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-win32-ia32-msvc": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.1.tgz", ++ "integrity": "sha512-WeX8kVS46aobM9a7Xr/kEPcrTyiwJqQv/tbw6nhJ4fH9xNZ+cEcyPoQkwPo570dCOLz3Zo9S2q0E6lJ/EAUOBg==", ++ "cpu": [ ++ "ia32" ++ ], ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@next/swc-win32-x64-msvc": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.1.tgz", ++ "integrity": "sha512-mVF0/3/5QAc5EGVnb8ll31nNvf3BWpPY4pBb84tk+BfQglWLqc5AC9q1Ht/YMWiEgs8ALNKEQ3GQnbY0bJF2Gg==", ++ "cpu": [ ++ "x64" ++ ], ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@nodelib/fs.scandir": { ++ "version": "2.1.5", ++ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", ++ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", ++ "dependencies": { ++ "@nodelib/fs.stat": "2.0.5", ++ "run-parallel": "^1.1.9" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/@nodelib/fs.stat": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", ++ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/@nodelib/fs.walk": { ++ "version": "1.2.8", ++ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", ++ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", ++ "dependencies": { ++ "@nodelib/fs.scandir": "2.1.5", ++ "fastq": "^1.6.0" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/@pkgr/utils": { ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", ++ "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", ++ "dependencies": { ++ "cross-spawn": "^7.0.3", ++ "is-glob": "^4.0.3", ++ "open": "^8.4.0", ++ "picocolors": "^1.0.0", ++ "tiny-glob": "^0.2.9", ++ "tslib": "^2.4.0" ++ }, ++ "engines": { ++ "node": "^12.20.0 || ^14.18.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/unts" ++ } ++ }, ++ "node_modules/@rushstack/eslint-patch": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", ++ "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" ++ }, ++ "node_modules/@swc/helpers": { ++ "version": "0.4.14", ++ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", ++ "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", ++ "dependencies": { ++ "tslib": "^2.4.0" ++ } ++ }, ++ "node_modules/@toots/shine.js": { ++ "version": "1.0.1", ++ "resolved": "file:../..", ++ "license": "LGPL-2.0-only" ++ }, ++ "node_modules/@types/json5": { ++ "version": "0.0.29", ++ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", ++ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" ++ }, ++ "node_modules/@types/node": { ++ "version": "18.11.18", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", ++ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" ++ }, ++ "node_modules/@types/prop-types": { ++ "version": "15.7.5", ++ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", ++ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" ++ }, ++ "node_modules/@types/react": { ++ "version": "18.0.26", ++ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", ++ "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", ++ "dependencies": { ++ "@types/prop-types": "*", ++ "@types/scheduler": "*", ++ "csstype": "^3.0.2" ++ } ++ }, ++ "node_modules/@types/react-dom": { ++ "version": "18.0.10", ++ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", ++ "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", ++ "dependencies": { ++ "@types/react": "*" ++ } ++ }, ++ "node_modules/@types/scheduler": { ++ "version": "0.16.2", ++ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", ++ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" ++ }, ++ "node_modules/@typescript-eslint/parser": { ++ "version": "5.47.1", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.1.tgz", ++ "integrity": "sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==", ++ "dependencies": { ++ "@typescript-eslint/scope-manager": "5.47.1", ++ "@typescript-eslint/types": "5.47.1", ++ "@typescript-eslint/typescript-estree": "5.47.1", ++ "debug": "^4.3.4" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@typescript-eslint/scope-manager": { ++ "version": "5.47.1", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", ++ "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", ++ "dependencies": { ++ "@typescript-eslint/types": "5.47.1", ++ "@typescript-eslint/visitor-keys": "5.47.1" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ } ++ }, ++ "node_modules/@typescript-eslint/types": { ++ "version": "5.47.1", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", ++ "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ } ++ }, ++ "node_modules/@typescript-eslint/typescript-estree": { ++ "version": "5.47.1", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", ++ "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", ++ "dependencies": { ++ "@typescript-eslint/types": "5.47.1", ++ "@typescript-eslint/visitor-keys": "5.47.1", ++ "debug": "^4.3.4", ++ "globby": "^11.1.0", ++ "is-glob": "^4.0.3", ++ "semver": "^7.3.7", ++ "tsutils": "^3.21.0" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@typescript-eslint/visitor-keys": { ++ "version": "5.47.1", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", ++ "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", ++ "dependencies": { ++ "@typescript-eslint/types": "5.47.1", ++ "eslint-visitor-keys": "^3.3.0" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ } ++ }, ++ "node_modules/acorn": { ++ "version": "8.8.1", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", ++ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", ++ "bin": { ++ "acorn": "bin/acorn" ++ }, ++ "engines": { ++ "node": ">=0.4.0" ++ } ++ }, ++ "node_modules/acorn-jsx": { ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", ++ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", ++ "peerDependencies": { ++ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ } ++ }, ++ "node_modules/ajv": { ++ "version": "6.12.6", ++ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", ++ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", ++ "dependencies": { ++ "fast-deep-equal": "^3.1.1", ++ "fast-json-stable-stringify": "^2.0.0", ++ "json-schema-traverse": "^0.4.1", ++ "uri-js": "^4.2.2" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/epoberezkin" ++ } ++ }, ++ "node_modules/ansi-regex": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", ++ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/ansi-styles": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", ++ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", ++ "dependencies": { ++ "color-convert": "^2.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-styles?sponsor=1" ++ } ++ }, ++ "node_modules/argparse": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", ++ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" ++ }, ++ "node_modules/aria-query": { ++ "version": "4.2.2", ++ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", ++ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", ++ "dependencies": { ++ "@babel/runtime": "^7.10.2", ++ "@babel/runtime-corejs3": "^7.10.2" ++ }, ++ "engines": { ++ "node": ">=6.0" ++ } ++ }, ++ "node_modules/array-includes": { ++ "version": "3.1.6", ++ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", ++ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4", ++ "get-intrinsic": "^1.1.3", ++ "is-string": "^1.0.7" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/array-union": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", ++ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/array.prototype.flat": { ++ "version": "1.3.1", ++ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", ++ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4", ++ "es-shim-unscopables": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/array.prototype.flatmap": { ++ "version": "1.3.1", ++ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", ++ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4", ++ "es-shim-unscopables": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/array.prototype.tosorted": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", ++ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4", ++ "es-shim-unscopables": "^1.0.0", ++ "get-intrinsic": "^1.1.3" ++ } ++ }, ++ "node_modules/ast-types-flow": { ++ "version": "0.0.7", ++ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", ++ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" ++ }, ++ "node_modules/axe-core": { ++ "version": "4.6.1", ++ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.1.tgz", ++ "integrity": "sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==", ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/axobject-query": { ++ "version": "2.2.0", ++ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", ++ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" ++ }, ++ "node_modules/balanced-match": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", ++ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" ++ }, ++ "node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/braces": { ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", ++ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", ++ "dependencies": { ++ "fill-range": "^7.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/call-bind": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", ++ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", ++ "dependencies": { ++ "function-bind": "^1.1.1", ++ "get-intrinsic": "^1.0.2" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/callsites": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", ++ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/caniuse-lite": { ++ "version": "1.0.30001441", ++ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", ++ "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/browserslist" ++ }, ++ { ++ "type": "tidelift", ++ "url": "https://tidelift.com/funding/github/npm/caniuse-lite" ++ } ++ ] ++ }, ++ "node_modules/chalk": { ++ "version": "4.1.2", ++ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ++ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", ++ "dependencies": { ++ "ansi-styles": "^4.1.0", ++ "supports-color": "^7.1.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/chalk?sponsor=1" ++ } ++ }, ++ "node_modules/client-only": { ++ "version": "0.0.1", ++ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", ++ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" ++ }, ++ "node_modules/color-convert": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ++ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", ++ "dependencies": { ++ "color-name": "~1.1.4" ++ }, ++ "engines": { ++ "node": ">=7.0.0" ++ } ++ }, ++ "node_modules/color-name": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", ++ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" ++ }, ++ "node_modules/concat-map": { ++ "version": "0.0.1", ++ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", ++ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" ++ }, ++ "node_modules/core-js-pure": { ++ "version": "3.27.1", ++ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz", ++ "integrity": "sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==", ++ "hasInstallScript": true, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/core-js" ++ } ++ }, ++ "node_modules/cross-spawn": { ++ "version": "7.0.3", ++ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", ++ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", ++ "dependencies": { ++ "path-key": "^3.1.0", ++ "shebang-command": "^2.0.0", ++ "which": "^2.0.1" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/csstype": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", ++ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" ++ }, ++ "node_modules/damerau-levenshtein": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", ++ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" ++ }, ++ "node_modules/debug": { ++ "version": "4.3.4", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", ++ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", ++ "dependencies": { ++ "ms": "2.1.2" ++ }, ++ "engines": { ++ "node": ">=6.0" ++ }, ++ "peerDependenciesMeta": { ++ "supports-color": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/deep-is": { ++ "version": "0.1.4", ++ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", ++ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" ++ }, ++ "node_modules/define-lazy-prop": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", ++ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/define-properties": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", ++ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", ++ "dependencies": { ++ "has-property-descriptors": "^1.0.0", ++ "object-keys": "^1.1.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/dir-glob": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", ++ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", ++ "dependencies": { ++ "path-type": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/doctrine": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", ++ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", ++ "dependencies": { ++ "esutils": "^2.0.2" ++ }, ++ "engines": { ++ "node": ">=6.0.0" ++ } ++ }, ++ "node_modules/emoji-regex": { ++ "version": "9.2.2", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", ++ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" ++ }, ++ "node_modules/enhanced-resolve": { ++ "version": "5.12.0", ++ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", ++ "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", ++ "dependencies": { ++ "graceful-fs": "^4.2.4", ++ "tapable": "^2.2.0" ++ }, ++ "engines": { ++ "node": ">=10.13.0" ++ } ++ }, ++ "node_modules/es-abstract": { ++ "version": "1.20.5", ++ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", ++ "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "es-to-primitive": "^1.2.1", ++ "function-bind": "^1.1.1", ++ "function.prototype.name": "^1.1.5", ++ "get-intrinsic": "^1.1.3", ++ "get-symbol-description": "^1.0.0", ++ "gopd": "^1.0.1", ++ "has": "^1.0.3", ++ "has-property-descriptors": "^1.0.0", ++ "has-symbols": "^1.0.3", ++ "internal-slot": "^1.0.3", ++ "is-callable": "^1.2.7", ++ "is-negative-zero": "^2.0.2", ++ "is-regex": "^1.1.4", ++ "is-shared-array-buffer": "^1.0.2", ++ "is-string": "^1.0.7", ++ "is-weakref": "^1.0.2", ++ "object-inspect": "^1.12.2", ++ "object-keys": "^1.1.1", ++ "object.assign": "^4.1.4", ++ "regexp.prototype.flags": "^1.4.3", ++ "safe-regex-test": "^1.0.0", ++ "string.prototype.trimend": "^1.0.6", ++ "string.prototype.trimstart": "^1.0.6", ++ "unbox-primitive": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/es-shim-unscopables": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", ++ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", ++ "dependencies": { ++ "has": "^1.0.3" ++ } ++ }, ++ "node_modules/es-to-primitive": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", ++ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", ++ "dependencies": { ++ "is-callable": "^1.1.4", ++ "is-date-object": "^1.0.1", ++ "is-symbol": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/escape-string-regexp": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", ++ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/eslint": { ++ "version": "8.31.0", ++ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", ++ "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", ++ "dependencies": { ++ "@eslint/eslintrc": "^1.4.1", ++ "@humanwhocodes/config-array": "^0.11.8", ++ "@humanwhocodes/module-importer": "^1.0.1", ++ "@nodelib/fs.walk": "^1.2.8", ++ "ajv": "^6.10.0", ++ "chalk": "^4.0.0", ++ "cross-spawn": "^7.0.2", ++ "debug": "^4.3.2", ++ "doctrine": "^3.0.0", ++ "escape-string-regexp": "^4.0.0", ++ "eslint-scope": "^7.1.1", ++ "eslint-utils": "^3.0.0", ++ "eslint-visitor-keys": "^3.3.0", ++ "espree": "^9.4.0", ++ "esquery": "^1.4.0", ++ "esutils": "^2.0.2", ++ "fast-deep-equal": "^3.1.3", ++ "file-entry-cache": "^6.0.1", ++ "find-up": "^5.0.0", ++ "glob-parent": "^6.0.2", ++ "globals": "^13.19.0", ++ "grapheme-splitter": "^1.0.4", ++ "ignore": "^5.2.0", ++ "import-fresh": "^3.0.0", ++ "imurmurhash": "^0.1.4", ++ "is-glob": "^4.0.0", ++ "is-path-inside": "^3.0.3", ++ "js-sdsl": "^4.1.4", ++ "js-yaml": "^4.1.0", ++ "json-stable-stringify-without-jsonify": "^1.0.1", ++ "levn": "^0.4.1", ++ "lodash.merge": "^4.6.2", ++ "minimatch": "^3.1.2", ++ "natural-compare": "^1.4.0", ++ "optionator": "^0.9.1", ++ "regexpp": "^3.2.0", ++ "strip-ansi": "^6.0.1", ++ "strip-json-comments": "^3.1.0", ++ "text-table": "^0.2.0" ++ }, ++ "bin": { ++ "eslint": "bin/eslint.js" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/eslint-config-next": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.1.1.tgz", ++ "integrity": "sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==", ++ "dependencies": { ++ "@next/eslint-plugin-next": "13.1.1", ++ "@rushstack/eslint-patch": "^1.1.3", ++ "@typescript-eslint/parser": "^5.42.0", ++ "eslint-import-resolver-node": "^0.3.6", ++ "eslint-import-resolver-typescript": "^3.5.2", ++ "eslint-plugin-import": "^2.26.0", ++ "eslint-plugin-jsx-a11y": "^6.5.1", ++ "eslint-plugin-react": "^7.31.7", ++ "eslint-plugin-react-hooks": "^4.5.0" ++ }, ++ "peerDependencies": { ++ "eslint": "^7.23.0 || ^8.0.0", ++ "typescript": ">=3.3.1" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/eslint-import-resolver-node": { ++ "version": "0.3.6", ++ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", ++ "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", ++ "dependencies": { ++ "debug": "^3.2.7", ++ "resolve": "^1.20.0" ++ } ++ }, ++ "node_modules/eslint-import-resolver-node/node_modules/debug": { ++ "version": "3.2.7", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", ++ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", ++ "dependencies": { ++ "ms": "^2.1.1" ++ } ++ }, ++ "node_modules/eslint-import-resolver-typescript": { ++ "version": "3.5.2", ++ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz", ++ "integrity": "sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==", ++ "dependencies": { ++ "debug": "^4.3.4", ++ "enhanced-resolve": "^5.10.0", ++ "get-tsconfig": "^4.2.0", ++ "globby": "^13.1.2", ++ "is-core-module": "^2.10.0", ++ "is-glob": "^4.0.3", ++ "synckit": "^0.8.4" ++ }, ++ "engines": { ++ "node": "^14.18.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" ++ }, ++ "peerDependencies": { ++ "eslint": "*", ++ "eslint-plugin-import": "*" ++ } ++ }, ++ "node_modules/eslint-import-resolver-typescript/node_modules/globby": { ++ "version": "13.1.3", ++ "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", ++ "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", ++ "dependencies": { ++ "dir-glob": "^3.0.1", ++ "fast-glob": "^3.2.11", ++ "ignore": "^5.2.0", ++ "merge2": "^1.4.1", ++ "slash": "^4.0.0" ++ }, ++ "engines": { ++ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/eslint-import-resolver-typescript/node_modules/slash": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", ++ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/eslint-module-utils": { ++ "version": "2.7.4", ++ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", ++ "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", ++ "dependencies": { ++ "debug": "^3.2.7" ++ }, ++ "engines": { ++ "node": ">=4" ++ }, ++ "peerDependenciesMeta": { ++ "eslint": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/eslint-module-utils/node_modules/debug": { ++ "version": "3.2.7", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", ++ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", ++ "dependencies": { ++ "ms": "^2.1.1" ++ } ++ }, ++ "node_modules/eslint-plugin-import": { ++ "version": "2.26.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", ++ "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", ++ "dependencies": { ++ "array-includes": "^3.1.4", ++ "array.prototype.flat": "^1.2.5", ++ "debug": "^2.6.9", ++ "doctrine": "^2.1.0", ++ "eslint-import-resolver-node": "^0.3.6", ++ "eslint-module-utils": "^2.7.3", ++ "has": "^1.0.3", ++ "is-core-module": "^2.8.1", ++ "is-glob": "^4.0.3", ++ "minimatch": "^3.1.2", ++ "object.values": "^1.1.5", ++ "resolve": "^1.22.0", ++ "tsconfig-paths": "^3.14.1" ++ }, ++ "engines": { ++ "node": ">=4" ++ }, ++ "peerDependencies": { ++ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" ++ } ++ }, ++ "node_modules/eslint-plugin-import/node_modules/debug": { ++ "version": "2.6.9", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", ++ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", ++ "dependencies": { ++ "ms": "2.0.0" ++ } ++ }, ++ "node_modules/eslint-plugin-import/node_modules/doctrine": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", ++ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", ++ "dependencies": { ++ "esutils": "^2.0.2" ++ }, ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/eslint-plugin-import/node_modules/ms": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", ++ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" ++ }, ++ "node_modules/eslint-plugin-jsx-a11y": { ++ "version": "6.6.1", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", ++ "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", ++ "dependencies": { ++ "@babel/runtime": "^7.18.9", ++ "aria-query": "^4.2.2", ++ "array-includes": "^3.1.5", ++ "ast-types-flow": "^0.0.7", ++ "axe-core": "^4.4.3", ++ "axobject-query": "^2.2.0", ++ "damerau-levenshtein": "^1.0.8", ++ "emoji-regex": "^9.2.2", ++ "has": "^1.0.3", ++ "jsx-ast-utils": "^3.3.2", ++ "language-tags": "^1.0.5", ++ "minimatch": "^3.1.2", ++ "semver": "^6.3.0" ++ }, ++ "engines": { ++ "node": ">=4.0" ++ }, ++ "peerDependencies": { ++ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" ++ } ++ }, ++ "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { ++ "version": "6.3.0", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", ++ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", ++ "bin": { ++ "semver": "bin/semver.js" ++ } ++ }, ++ "node_modules/eslint-plugin-react": { ++ "version": "7.31.11", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", ++ "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", ++ "dependencies": { ++ "array-includes": "^3.1.6", ++ "array.prototype.flatmap": "^1.3.1", ++ "array.prototype.tosorted": "^1.1.1", ++ "doctrine": "^2.1.0", ++ "estraverse": "^5.3.0", ++ "jsx-ast-utils": "^2.4.1 || ^3.0.0", ++ "minimatch": "^3.1.2", ++ "object.entries": "^1.1.6", ++ "object.fromentries": "^2.0.6", ++ "object.hasown": "^1.1.2", ++ "object.values": "^1.1.6", ++ "prop-types": "^15.8.1", ++ "resolve": "^2.0.0-next.3", ++ "semver": "^6.3.0", ++ "string.prototype.matchall": "^4.0.8" ++ }, ++ "engines": { ++ "node": ">=4" ++ }, ++ "peerDependencies": { ++ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" ++ } ++ }, ++ "node_modules/eslint-plugin-react-hooks": { ++ "version": "4.6.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", ++ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", ++ "engines": { ++ "node": ">=10" ++ }, ++ "peerDependencies": { ++ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" ++ } ++ }, ++ "node_modules/eslint-plugin-react/node_modules/doctrine": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", ++ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", ++ "dependencies": { ++ "esutils": "^2.0.2" ++ }, ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/eslint-plugin-react/node_modules/resolve": { ++ "version": "2.0.0-next.4", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", ++ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", ++ "dependencies": { ++ "is-core-module": "^2.9.0", ++ "path-parse": "^1.0.7", ++ "supports-preserve-symlinks-flag": "^1.0.0" ++ }, ++ "bin": { ++ "resolve": "bin/resolve" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/eslint-plugin-react/node_modules/semver": { ++ "version": "6.3.0", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", ++ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", ++ "bin": { ++ "semver": "bin/semver.js" ++ } ++ }, ++ "node_modules/eslint-scope": { ++ "version": "7.1.1", ++ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", ++ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", ++ "dependencies": { ++ "esrecurse": "^4.3.0", ++ "estraverse": "^5.2.0" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ } ++ }, ++ "node_modules/eslint-utils": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", ++ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", ++ "dependencies": { ++ "eslint-visitor-keys": "^2.0.0" ++ }, ++ "engines": { ++ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/mysticatea" ++ }, ++ "peerDependencies": { ++ "eslint": ">=5" ++ } ++ }, ++ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", ++ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/eslint-visitor-keys": { ++ "version": "3.3.0", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", ++ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ } ++ }, ++ "node_modules/espree": { ++ "version": "9.4.1", ++ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", ++ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", ++ "dependencies": { ++ "acorn": "^8.8.0", ++ "acorn-jsx": "^5.3.2", ++ "eslint-visitor-keys": "^3.3.0" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/esquery": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", ++ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", ++ "dependencies": { ++ "estraverse": "^5.1.0" ++ }, ++ "engines": { ++ "node": ">=0.10" ++ } ++ }, ++ "node_modules/esrecurse": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", ++ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", ++ "dependencies": { ++ "estraverse": "^5.2.0" ++ }, ++ "engines": { ++ "node": ">=4.0" ++ } ++ }, ++ "node_modules/estraverse": { ++ "version": "5.3.0", ++ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", ++ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", ++ "engines": { ++ "node": ">=4.0" ++ } ++ }, ++ "node_modules/esutils": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", ++ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/fast-deep-equal": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", ++ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" ++ }, ++ "node_modules/fast-glob": { ++ "version": "3.2.12", ++ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", ++ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", ++ "dependencies": { ++ "@nodelib/fs.stat": "^2.0.2", ++ "@nodelib/fs.walk": "^1.2.3", ++ "glob-parent": "^5.1.2", ++ "merge2": "^1.3.0", ++ "micromatch": "^4.0.4" ++ }, ++ "engines": { ++ "node": ">=8.6.0" ++ } ++ }, ++ "node_modules/fast-glob/node_modules/glob-parent": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", ++ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", ++ "dependencies": { ++ "is-glob": "^4.0.1" ++ }, ++ "engines": { ++ "node": ">= 6" ++ } ++ }, ++ "node_modules/fast-json-stable-stringify": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", ++ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" ++ }, ++ "node_modules/fast-levenshtein": { ++ "version": "2.0.6", ++ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", ++ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" ++ }, ++ "node_modules/fastq": { ++ "version": "1.14.0", ++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", ++ "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", ++ "dependencies": { ++ "reusify": "^1.0.4" ++ } ++ }, ++ "node_modules/file-entry-cache": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", ++ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", ++ "dependencies": { ++ "flat-cache": "^3.0.4" ++ }, ++ "engines": { ++ "node": "^10.12.0 || >=12.0.0" ++ } ++ }, ++ "node_modules/fill-range": { ++ "version": "7.0.1", ++ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", ++ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", ++ "dependencies": { ++ "to-regex-range": "^5.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/find-up": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", ++ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", ++ "dependencies": { ++ "locate-path": "^6.0.0", ++ "path-exists": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/flat-cache": { ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", ++ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", ++ "dependencies": { ++ "flatted": "^3.1.0", ++ "rimraf": "^3.0.2" ++ }, ++ "engines": { ++ "node": "^10.12.0 || >=12.0.0" ++ } ++ }, ++ "node_modules/flatted": { ++ "version": "3.2.7", ++ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", ++ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" ++ }, ++ "node_modules/fs.realpath": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", ++ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" ++ }, ++ "node_modules/function-bind": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", ++ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" ++ }, ++ "node_modules/function.prototype.name": { ++ "version": "1.1.5", ++ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", ++ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.3", ++ "es-abstract": "^1.19.0", ++ "functions-have-names": "^1.2.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/functions-have-names": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", ++ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/get-intrinsic": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", ++ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", ++ "dependencies": { ++ "function-bind": "^1.1.1", ++ "has": "^1.0.3", ++ "has-symbols": "^1.0.3" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/get-symbol-description": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", ++ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "get-intrinsic": "^1.1.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/get-tsconfig": { ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.2.0.tgz", ++ "integrity": "sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==", ++ "funding": { ++ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" ++ } ++ }, ++ "node_modules/glob": { ++ "version": "7.1.7", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", ++ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", ++ "dependencies": { ++ "fs.realpath": "^1.0.0", ++ "inflight": "^1.0.4", ++ "inherits": "2", ++ "minimatch": "^3.0.4", ++ "once": "^1.3.0", ++ "path-is-absolute": "^1.0.0" ++ }, ++ "engines": { ++ "node": "*" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/glob-parent": { ++ "version": "6.0.2", ++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", ++ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", ++ "dependencies": { ++ "is-glob": "^4.0.3" ++ }, ++ "engines": { ++ "node": ">=10.13.0" ++ } ++ }, ++ "node_modules/globals": { ++ "version": "13.19.0", ++ "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", ++ "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", ++ "dependencies": { ++ "type-fest": "^0.20.2" ++ }, ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/globalyzer": { ++ "version": "0.1.0", ++ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", ++ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" ++ }, ++ "node_modules/globby": { ++ "version": "11.1.0", ++ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", ++ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", ++ "dependencies": { ++ "array-union": "^2.1.0", ++ "dir-glob": "^3.0.1", ++ "fast-glob": "^3.2.9", ++ "ignore": "^5.2.0", ++ "merge2": "^1.4.1", ++ "slash": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/globrex": { ++ "version": "0.1.2", ++ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", ++ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" ++ }, ++ "node_modules/gopd": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", ++ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", ++ "dependencies": { ++ "get-intrinsic": "^1.1.3" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/graceful-fs": { ++ "version": "4.2.10", ++ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", ++ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" ++ }, ++ "node_modules/grapheme-splitter": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", ++ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" ++ }, ++ "node_modules/has": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", ++ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", ++ "dependencies": { ++ "function-bind": "^1.1.1" ++ }, ++ "engines": { ++ "node": ">= 0.4.0" ++ } ++ }, ++ "node_modules/has-bigints": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", ++ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/has-flag": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", ++ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/has-property-descriptors": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", ++ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", ++ "dependencies": { ++ "get-intrinsic": "^1.1.1" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/has-symbols": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", ++ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/has-tostringtag": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", ++ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", ++ "dependencies": { ++ "has-symbols": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/ignore": { ++ "version": "5.2.4", ++ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", ++ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", ++ "engines": { ++ "node": ">= 4" ++ } ++ }, ++ "node_modules/import-fresh": { ++ "version": "3.3.0", ++ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", ++ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", ++ "dependencies": { ++ "parent-module": "^1.0.0", ++ "resolve-from": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/imurmurhash": { ++ "version": "0.1.4", ++ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", ++ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", ++ "engines": { ++ "node": ">=0.8.19" ++ } ++ }, ++ "node_modules/inflight": { ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", ++ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", ++ "dependencies": { ++ "once": "^1.3.0", ++ "wrappy": "1" ++ } ++ }, ++ "node_modules/inherits": { ++ "version": "2.0.4", ++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", ++ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" ++ }, ++ "node_modules/internal-slot": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", ++ "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", ++ "dependencies": { ++ "get-intrinsic": "^1.1.3", ++ "has": "^1.0.3", ++ "side-channel": "^1.0.4" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/is-bigint": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", ++ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", ++ "dependencies": { ++ "has-bigints": "^1.0.1" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-boolean-object": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", ++ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-callable": { ++ "version": "1.2.7", ++ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", ++ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-core-module": { ++ "version": "2.11.0", ++ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", ++ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", ++ "dependencies": { ++ "has": "^1.0.3" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-date-object": { ++ "version": "1.0.5", ++ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", ++ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", ++ "dependencies": { ++ "has-tostringtag": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-docker": { ++ "version": "2.2.1", ++ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", ++ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", ++ "bin": { ++ "is-docker": "cli.js" ++ }, ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/is-extglob": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ++ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/is-glob": { ++ "version": "4.0.3", ++ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", ++ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", ++ "dependencies": { ++ "is-extglob": "^2.1.1" ++ }, ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/is-negative-zero": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", ++ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-number": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", ++ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", ++ "engines": { ++ "node": ">=0.12.0" ++ } ++ }, ++ "node_modules/is-number-object": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", ++ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", ++ "dependencies": { ++ "has-tostringtag": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-path-inside": { ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", ++ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/is-regex": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", ++ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-shared-array-buffer": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", ++ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", ++ "dependencies": { ++ "call-bind": "^1.0.2" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-string": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", ++ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", ++ "dependencies": { ++ "has-tostringtag": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-symbol": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", ++ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", ++ "dependencies": { ++ "has-symbols": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-weakref": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", ++ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", ++ "dependencies": { ++ "call-bind": "^1.0.2" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-wsl": { ++ "version": "2.2.0", ++ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", ++ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", ++ "dependencies": { ++ "is-docker": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/isexe": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", ++ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" ++ }, ++ "node_modules/js-sdsl": { ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", ++ "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/js-sdsl" ++ } ++ }, ++ "node_modules/js-tokens": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", ++ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" ++ }, ++ "node_modules/js-yaml": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", ++ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", ++ "dependencies": { ++ "argparse": "^2.0.1" ++ }, ++ "bin": { ++ "js-yaml": "bin/js-yaml.js" ++ } ++ }, ++ "node_modules/json-schema-traverse": { ++ "version": "0.4.1", ++ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", ++ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" ++ }, ++ "node_modules/json-stable-stringify-without-jsonify": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", ++ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" ++ }, ++ "node_modules/json5": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", ++ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", ++ "dependencies": { ++ "minimist": "^1.2.0" ++ }, ++ "bin": { ++ "json5": "lib/cli.js" ++ } ++ }, ++ "node_modules/jsx-ast-utils": { ++ "version": "3.3.3", ++ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", ++ "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", ++ "dependencies": { ++ "array-includes": "^3.1.5", ++ "object.assign": "^4.1.3" ++ }, ++ "engines": { ++ "node": ">=4.0" ++ } ++ }, ++ "node_modules/language-subtag-registry": { ++ "version": "0.3.22", ++ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", ++ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" ++ }, ++ "node_modules/language-tags": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.7.tgz", ++ "integrity": "sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==", ++ "dependencies": { ++ "language-subtag-registry": "^0.3.20" ++ } ++ }, ++ "node_modules/levn": { ++ "version": "0.4.1", ++ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", ++ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", ++ "dependencies": { ++ "prelude-ls": "^1.2.1", ++ "type-check": "~0.4.0" ++ }, ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/locate-path": { ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", ++ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", ++ "dependencies": { ++ "p-locate": "^5.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/lodash.merge": { ++ "version": "4.6.2", ++ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", ++ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" ++ }, ++ "node_modules/loose-envify": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", ++ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", ++ "dependencies": { ++ "js-tokens": "^3.0.0 || ^4.0.0" ++ }, ++ "bin": { ++ "loose-envify": "cli.js" ++ } ++ }, ++ "node_modules/lru-cache": { ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", ++ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", ++ "dependencies": { ++ "yallist": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/merge2": { ++ "version": "1.4.1", ++ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", ++ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/micromatch": { ++ "version": "4.0.5", ++ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", ++ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", ++ "dependencies": { ++ "braces": "^3.0.2", ++ "picomatch": "^2.3.1" ++ }, ++ "engines": { ++ "node": ">=8.6" ++ } ++ }, ++ "node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, ++ "node_modules/minimist": { ++ "version": "1.2.7", ++ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", ++ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/ms": { ++ "version": "2.1.2", ++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", ++ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" ++ }, ++ "node_modules/nanoid": { ++ "version": "3.3.4", ++ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", ++ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", ++ "bin": { ++ "nanoid": "bin/nanoid.cjs" ++ }, ++ "engines": { ++ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" ++ } ++ }, ++ "node_modules/natural-compare": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", ++ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" ++ }, ++ "node_modules/next": { ++ "version": "13.1.1", ++ "resolved": "https://registry.npmjs.org/next/-/next-13.1.1.tgz", ++ "integrity": "sha512-R5eBAaIa3X7LJeYvv1bMdGnAVF4fVToEjim7MkflceFPuANY3YyvFxXee/A+acrSYwYPvOvf7f6v/BM/48ea5w==", ++ "dependencies": { ++ "@next/env": "13.1.1", ++ "@swc/helpers": "0.4.14", ++ "caniuse-lite": "^1.0.30001406", ++ "postcss": "8.4.14", ++ "styled-jsx": "5.1.1" ++ }, ++ "bin": { ++ "next": "dist/bin/next" ++ }, ++ "engines": { ++ "node": ">=14.6.0" ++ }, ++ "optionalDependencies": { ++ "@next/swc-android-arm-eabi": "13.1.1", ++ "@next/swc-android-arm64": "13.1.1", ++ "@next/swc-darwin-arm64": "13.1.1", ++ "@next/swc-darwin-x64": "13.1.1", ++ "@next/swc-freebsd-x64": "13.1.1", ++ "@next/swc-linux-arm-gnueabihf": "13.1.1", ++ "@next/swc-linux-arm64-gnu": "13.1.1", ++ "@next/swc-linux-arm64-musl": "13.1.1", ++ "@next/swc-linux-x64-gnu": "13.1.1", ++ "@next/swc-linux-x64-musl": "13.1.1", ++ "@next/swc-win32-arm64-msvc": "13.1.1", ++ "@next/swc-win32-ia32-msvc": "13.1.1", ++ "@next/swc-win32-x64-msvc": "13.1.1" ++ }, ++ "peerDependencies": { ++ "fibers": ">= 3.1.0", ++ "node-sass": "^6.0.0 || ^7.0.0", ++ "react": "^18.2.0", ++ "react-dom": "^18.2.0", ++ "sass": "^1.3.0" ++ }, ++ "peerDependenciesMeta": { ++ "fibers": { ++ "optional": true ++ }, ++ "node-sass": { ++ "optional": true ++ }, ++ "sass": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/object-assign": { ++ "version": "4.1.1", ++ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", ++ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/object-inspect": { ++ "version": "1.12.2", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", ++ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/object-keys": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", ++ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/object.assign": { ++ "version": "4.1.4", ++ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", ++ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "has-symbols": "^1.0.3", ++ "object-keys": "^1.1.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/object.entries": { ++ "version": "1.1.6", ++ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", ++ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/object.fromentries": { ++ "version": "2.0.6", ++ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", ++ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/object.hasown": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", ++ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", ++ "dependencies": { ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/object.values": { ++ "version": "1.1.6", ++ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", ++ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/once": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", ++ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", ++ "dependencies": { ++ "wrappy": "1" ++ } ++ }, ++ "node_modules/open": { ++ "version": "8.4.0", ++ "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", ++ "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", ++ "dependencies": { ++ "define-lazy-prop": "^2.0.0", ++ "is-docker": "^2.1.1", ++ "is-wsl": "^2.2.0" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/optionator": { ++ "version": "0.9.1", ++ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", ++ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", ++ "dependencies": { ++ "deep-is": "^0.1.3", ++ "fast-levenshtein": "^2.0.6", ++ "levn": "^0.4.1", ++ "prelude-ls": "^1.2.1", ++ "type-check": "^0.4.0", ++ "word-wrap": "^1.2.3" ++ }, ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/p-limit": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", ++ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", ++ "dependencies": { ++ "yocto-queue": "^0.1.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/p-locate": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", ++ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", ++ "dependencies": { ++ "p-limit": "^3.0.2" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/parent-module": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", ++ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", ++ "dependencies": { ++ "callsites": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/path-exists": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", ++ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/path-is-absolute": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", ++ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/path-key": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", ++ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/path-parse": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", ++ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" ++ }, ++ "node_modules/path-type": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", ++ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/picocolors": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", ++ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" ++ }, ++ "node_modules/picomatch": { ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", ++ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", ++ "engines": { ++ "node": ">=8.6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/jonschlinkert" ++ } ++ }, ++ "node_modules/postcss": { ++ "version": "8.4.14", ++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", ++ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/postcss/" ++ }, ++ { ++ "type": "tidelift", ++ "url": "https://tidelift.com/funding/github/npm/postcss" ++ } ++ ], ++ "dependencies": { ++ "nanoid": "^3.3.4", ++ "picocolors": "^1.0.0", ++ "source-map-js": "^1.0.2" ++ }, ++ "engines": { ++ "node": "^10 || ^12 || >=14" ++ } ++ }, ++ "node_modules/prelude-ls": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", ++ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/prettier": { ++ "version": "2.8.1", ++ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", ++ "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", ++ "dev": true, ++ "bin": { ++ "prettier": "bin-prettier.js" ++ }, ++ "engines": { ++ "node": ">=10.13.0" ++ }, ++ "funding": { ++ "url": "https://github.com/prettier/prettier?sponsor=1" ++ } ++ }, ++ "node_modules/prop-types": { ++ "version": "15.8.1", ++ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", ++ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", ++ "dependencies": { ++ "loose-envify": "^1.4.0", ++ "object-assign": "^4.1.1", ++ "react-is": "^16.13.1" ++ } ++ }, ++ "node_modules/punycode": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", ++ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/queue-microtask": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", ++ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/feross" ++ }, ++ { ++ "type": "patreon", ++ "url": "https://www.patreon.com/feross" ++ }, ++ { ++ "type": "consulting", ++ "url": "https://feross.org/support" ++ } ++ ] ++ }, ++ "node_modules/react": { ++ "version": "18.2.0", ++ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", ++ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", ++ "dependencies": { ++ "loose-envify": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/react-dom": { ++ "version": "18.2.0", ++ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", ++ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", ++ "dependencies": { ++ "loose-envify": "^1.1.0", ++ "scheduler": "^0.23.0" ++ }, ++ "peerDependencies": { ++ "react": "^18.2.0" ++ } ++ }, ++ "node_modules/react-is": { ++ "version": "16.13.1", ++ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", ++ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" ++ }, ++ "node_modules/regenerator-runtime": { ++ "version": "0.13.11", ++ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", ++ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" ++ }, ++ "node_modules/regexp.prototype.flags": { ++ "version": "1.4.3", ++ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", ++ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.3", ++ "functions-have-names": "^1.2.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/regexpp": { ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", ++ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/mysticatea" ++ } ++ }, ++ "node_modules/resolve": { ++ "version": "1.22.1", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", ++ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", ++ "dependencies": { ++ "is-core-module": "^2.9.0", ++ "path-parse": "^1.0.7", ++ "supports-preserve-symlinks-flag": "^1.0.0" ++ }, ++ "bin": { ++ "resolve": "bin/resolve" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/resolve-from": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", ++ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/reusify": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", ++ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", ++ "engines": { ++ "iojs": ">=1.0.0", ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/rimraf": { ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", ++ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", ++ "dependencies": { ++ "glob": "^7.1.3" ++ }, ++ "bin": { ++ "rimraf": "bin.js" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/run-parallel": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", ++ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/feross" ++ }, ++ { ++ "type": "patreon", ++ "url": "https://www.patreon.com/feross" ++ }, ++ { ++ "type": "consulting", ++ "url": "https://feross.org/support" ++ } ++ ], ++ "dependencies": { ++ "queue-microtask": "^1.2.2" ++ } ++ }, ++ "node_modules/safe-regex-test": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", ++ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "get-intrinsic": "^1.1.3", ++ "is-regex": "^1.1.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/scheduler": { ++ "version": "0.23.0", ++ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", ++ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", ++ "dependencies": { ++ "loose-envify": "^1.1.0" ++ } ++ }, ++ "node_modules/semver": { ++ "version": "7.3.8", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", ++ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", ++ "dependencies": { ++ "lru-cache": "^6.0.0" ++ }, ++ "bin": { ++ "semver": "bin/semver.js" ++ }, ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/shebang-command": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", ++ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", ++ "dependencies": { ++ "shebang-regex": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/shebang-regex": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", ++ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/side-channel": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", ++ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", ++ "dependencies": { ++ "call-bind": "^1.0.0", ++ "get-intrinsic": "^1.0.2", ++ "object-inspect": "^1.9.0" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/slash": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", ++ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/source-map-js": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", ++ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/string.prototype.matchall": { ++ "version": "4.0.8", ++ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", ++ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4", ++ "get-intrinsic": "^1.1.3", ++ "has-symbols": "^1.0.3", ++ "internal-slot": "^1.0.3", ++ "regexp.prototype.flags": "^1.4.3", ++ "side-channel": "^1.0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/string.prototype.trimend": { ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", ++ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/string.prototype.trimstart": { ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", ++ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.1.4", ++ "es-abstract": "^1.20.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/strip-ansi": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", ++ "dependencies": { ++ "ansi-regex": "^5.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/strip-bom": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", ++ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/strip-json-comments": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", ++ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/styled-jsx": { ++ "version": "5.1.1", ++ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", ++ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", ++ "dependencies": { ++ "client-only": "0.0.1" ++ }, ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" ++ }, ++ "peerDependenciesMeta": { ++ "@babel/core": { ++ "optional": true ++ }, ++ "babel-plugin-macros": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/supports-color": { ++ "version": "7.2.0", ++ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", ++ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", ++ "dependencies": { ++ "has-flag": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/supports-preserve-symlinks-flag": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", ++ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/synckit": { ++ "version": "0.8.4", ++ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", ++ "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", ++ "dependencies": { ++ "@pkgr/utils": "^2.3.1", ++ "tslib": "^2.4.0" ++ }, ++ "engines": { ++ "node": "^14.18.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/unts" ++ } ++ }, ++ "node_modules/tapable": { ++ "version": "2.2.1", ++ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", ++ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/text-table": { ++ "version": "0.2.0", ++ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", ++ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" ++ }, ++ "node_modules/tiny-glob": { ++ "version": "0.2.9", ++ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", ++ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", ++ "dependencies": { ++ "globalyzer": "0.1.0", ++ "globrex": "^0.1.2" ++ } ++ }, ++ "node_modules/to-regex-range": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", ++ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", ++ "dependencies": { ++ "is-number": "^7.0.0" ++ }, ++ "engines": { ++ "node": ">=8.0" ++ } ++ }, ++ "node_modules/tsconfig-paths": { ++ "version": "3.14.1", ++ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", ++ "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", ++ "dependencies": { ++ "@types/json5": "^0.0.29", ++ "json5": "^1.0.1", ++ "minimist": "^1.2.6", ++ "strip-bom": "^3.0.0" ++ } ++ }, ++ "node_modules/tslib": { ++ "version": "2.4.1", ++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", ++ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" ++ }, ++ "node_modules/tsutils": { ++ "version": "3.21.0", ++ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", ++ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", ++ "dependencies": { ++ "tslib": "^1.8.1" ++ }, ++ "engines": { ++ "node": ">= 6" ++ }, ++ "peerDependencies": { ++ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" ++ } ++ }, ++ "node_modules/tsutils/node_modules/tslib": { ++ "version": "1.14.1", ++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", ++ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" ++ }, ++ "node_modules/type-check": { ++ "version": "0.4.0", ++ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", ++ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", ++ "dependencies": { ++ "prelude-ls": "^1.2.1" ++ }, ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/type-fest": { ++ "version": "0.20.2", ++ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", ++ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/typescript": { ++ "version": "4.9.4", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", ++ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", ++ "bin": { ++ "tsc": "bin/tsc", ++ "tsserver": "bin/tsserver" ++ }, ++ "engines": { ++ "node": ">=4.2.0" ++ } ++ }, ++ "node_modules/unbox-primitive": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", ++ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", ++ "dependencies": { ++ "call-bind": "^1.0.2", ++ "has-bigints": "^1.0.2", ++ "has-symbols": "^1.0.3", ++ "which-boxed-primitive": "^1.0.2" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/uri-js": { ++ "version": "4.4.1", ++ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", ++ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", ++ "dependencies": { ++ "punycode": "^2.1.0" ++ } ++ }, ++ "node_modules/which": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", ++ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", ++ "dependencies": { ++ "isexe": "^2.0.0" ++ }, ++ "bin": { ++ "node-which": "bin/node-which" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/which-boxed-primitive": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", ++ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", ++ "dependencies": { ++ "is-bigint": "^1.0.1", ++ "is-boolean-object": "^1.1.0", ++ "is-number-object": "^1.0.4", ++ "is-string": "^1.0.5", ++ "is-symbol": "^1.0.3" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/word-wrap": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", ++ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/wrappy": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", ++ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" ++ }, ++ "node_modules/yallist": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", ++ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" ++ }, ++ "node_modules/yocto-queue": { ++ "version": "0.1.0", ++ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", ++ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ } ++ } ++} +diff --git a/js/test/nextjs/package.json b/js/test/nextjs/package.json +new file mode 100644 +index 0000000..f57e111 +--- /dev/null ++++ b/js/test/nextjs/package.json +@@ -0,0 +1,28 @@ ++{ ++ "name": "shine-nextjs-test-app", ++ "version": "0.1.0", ++ "private": true, ++ "scripts": { ++ "dev": "next dev", ++ "lint": "next lint --fix", ++ "build": "next build && next export && touch out/.nojekyll", ++ "format": "prettier '**/*.{ts,tsx,js,jsx}' --write", ++ "typecheck": "tsc --noEmit" ++ }, ++ "dependencies": { ++ "@next/font": "13.1.1", ++ "@toots/shine.js": "file:../..", ++ "@types/node": "18.11.18", ++ "@types/react": "18.0.26", ++ "@types/react-dom": "18.0.10", ++ "eslint": "8.31.0", ++ "eslint-config-next": "13.1.1", ++ "next": "13.1.1", ++ "react": "18.2.0", ++ "react-dom": "18.2.0", ++ "typescript": "4.9.4" ++ }, ++ "devDependencies": { ++ "prettier": "^2.8.1" ++ } ++} +diff --git a/js/test/nextjs/pages/index.tsx b/js/test/nextjs/pages/index.tsx +new file mode 100644 +index 0000000..4bf771a +--- /dev/null ++++ b/js/test/nextjs/pages/index.tsx +@@ -0,0 +1,50 @@ ++import { Fragment, useEffect, useState, useCallback } from "react" ++import { runEncodeTest } from "@shine/lib/encode" ++import { runRoundsTest } from "@shine/lib/rounds" ++ ++const logEntries: string[] = [] ++let encoderStarted = false ++ ++export default function Home() { ++ const [logs, setLogs] = useState(logEntries) ++ const [encodedBlobUrl, setEncodedBlobUrl] = useState<string | undefined>() ++ ++ const log = useCallback( ++ (entry: string) => { ++ logEntries.push(entry) ++ setLogs(logEntries) ++ }, ++ [setLogs] ++ ) ++ ++ useEffect(() => { ++ if (encoderStarted) return ++ ++ runEncodeTest(log, blob => { ++ if (!encodedBlobUrl) setEncodedBlobUrl(URL.createObjectURL(blob)) ++ ++ log("") ++ runRoundsTest(log) ++ }) ++ ++ encoderStarted = true ++ }, [log, encodedBlobUrl, setEncodedBlobUrl]) ++ ++ return ( ++ <> ++ {encodedBlobUrl && ( ++ <a href={encodedBlobUrl} download='encoded.mp3'> ++ Download encoded file ++ </a> ++ )} ++ <div> ++ {logs.map(entry => ( ++ <Fragment key={entry}> ++ {entry} ++ <br /> ++ </Fragment> ++ ))} ++ </div> ++ </> ++ ) ++} +diff --git a/js/test/nextjs/pnpm-lock.yaml b/js/test/nextjs/pnpm-lock.yaml +new file mode 100644 +index 0000000..562cc68 +--- /dev/null ++++ b/js/test/nextjs/pnpm-lock.yaml +@@ -0,0 +1,2032 @@ ++lockfileVersion: 5.4 ++ ++specifiers: ++ '@next/font': 13.1.1 ++ '@toots/shine.js': file:../.. ++ '@types/node': 18.11.18 ++ '@types/react': 18.0.26 ++ '@types/react-dom': 18.0.10 ++ eslint: 8.31.0 ++ eslint-config-next: 13.1.1 ++ next: 13.1.1 ++ prettier: ^2.8.1 ++ react: 18.2.0 ++ react-dom: 18.2.0 ++ typescript: 4.9.4 ++ ++dependencies: ++ '@next/font': 13.1.1 ++ '@toots/shine.js': file:../.. ++ '@types/node': 18.11.18 ++ '@types/react': 18.0.26 ++ '@types/react-dom': 18.0.10 ++ eslint: 8.31.0 ++ eslint-config-next: 13.1.1_iukboom6ndih5an6iafl45j2fe ++ next: 13.1.1_biqbaboplfbrettd7655fr4n2y ++ react: 18.2.0 ++ react-dom: 18.2.0_react@18.2.0 ++ typescript: 4.9.4 ++ ++devDependencies: ++ prettier: 2.8.1 ++ ++packages: ++ ++ /@babel/runtime-corejs3/7.20.7: ++ resolution: {integrity: sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==} ++ engines: {node: '>=6.9.0'} ++ dependencies: ++ core-js-pure: 3.27.1 ++ regenerator-runtime: 0.13.11 ++ dev: false ++ ++ /@babel/runtime/7.20.7: ++ resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} ++ engines: {node: '>=6.9.0'} ++ dependencies: ++ regenerator-runtime: 0.13.11 ++ dev: false ++ ++ /@eslint/eslintrc/1.4.1: ++ resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ dependencies: ++ ajv: 6.12.6 ++ debug: 4.3.4 ++ espree: 9.4.1 ++ globals: 13.19.0 ++ ignore: 5.2.4 ++ import-fresh: 3.3.0 ++ js-yaml: 4.1.0 ++ minimatch: 3.1.2 ++ strip-json-comments: 3.1.1 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /@humanwhocodes/config-array/0.11.8: ++ resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} ++ engines: {node: '>=10.10.0'} ++ dependencies: ++ '@humanwhocodes/object-schema': 1.2.1 ++ debug: 4.3.4 ++ minimatch: 3.1.2 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /@humanwhocodes/module-importer/1.0.1: ++ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} ++ engines: {node: '>=12.22'} ++ dev: false ++ ++ /@humanwhocodes/object-schema/1.2.1: ++ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} ++ dev: false ++ ++ /@next/env/13.1.1: ++ resolution: {integrity: sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw==} ++ dev: false ++ ++ /@next/eslint-plugin-next/13.1.1: ++ resolution: {integrity: sha512-SBrOFS8PC3nQ5aeZmawJkjKkWjwK9RoxvBSv/86nZp0ubdoVQoko8r8htALd9ufp16NhacCdqhu9bzZLDWtALQ==} ++ dependencies: ++ glob: 7.1.7 ++ dev: false ++ ++ /@next/font/13.1.1: ++ resolution: {integrity: sha512-amygRorS05hYK1/XQRZo5qBl7l2fpHnezeKU/cNveWU5QJg+sg8gMGkUXHtvesNKpiKIJshBRH1TzvO+2sKpvQ==} ++ dev: false ++ ++ /@next/swc-android-arm-eabi/13.1.1: ++ resolution: {integrity: sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==} ++ engines: {node: '>= 10'} ++ cpu: [arm] ++ os: [android] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-android-arm64/13.1.1: ++ resolution: {integrity: sha512-eCiZhTzjySubNqUnNkQCjU3Fh+ep3C6b5DCM5FKzsTH/3Gr/4Y7EiaPZKILbvnXmhWtKPIdcY6Zjx51t4VeTfA==} ++ engines: {node: '>= 10'} ++ cpu: [arm64] ++ os: [android] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-darwin-arm64/13.1.1: ++ resolution: {integrity: sha512-9zRJSSIwER5tu9ADDkPw5rIZ+Np44HTXpYMr0rkM656IvssowPxmhK0rTreC1gpUCYwFsRbxarUJnJsTWiutPg==} ++ engines: {node: '>= 10'} ++ cpu: [arm64] ++ os: [darwin] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-darwin-x64/13.1.1: ++ resolution: {integrity: sha512-qWr9qEn5nrnlhB0rtjSdR00RRZEtxg4EGvicIipqZWEyayPxhUu6NwKiG8wZiYZCLfJ5KWr66PGSNeDMGlNaiA==} ++ engines: {node: '>= 10'} ++ cpu: [x64] ++ os: [darwin] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-freebsd-x64/13.1.1: ++ resolution: {integrity: sha512-UwP4w/NcQ7V/VJEj3tGVszgb4pyUCt3lzJfUhjDMUmQbzG9LDvgiZgAGMYH6L21MoyAATJQPDGiAMWAPKsmumA==} ++ engines: {node: '>= 10'} ++ cpu: [x64] ++ os: [freebsd] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-linux-arm-gnueabihf/13.1.1: ++ resolution: {integrity: sha512-CnsxmKHco9sosBs1XcvCXP845Db+Wx1G0qouV5+Gr+HT/ZlDYEWKoHVDgnJXLVEQzq4FmHddBNGbXvgqM1Gfkg==} ++ engines: {node: '>= 10'} ++ cpu: [arm] ++ os: [linux] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-linux-arm64-gnu/13.1.1: ++ resolution: {integrity: sha512-JfDq1eri5Dif+VDpTkONRd083780nsMCOKoFG87wA0sa4xL8LGcXIBAkUGIC1uVy9SMsr2scA9CySLD/i+Oqiw==} ++ engines: {node: '>= 10'} ++ cpu: [arm64] ++ os: [linux] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-linux-arm64-musl/13.1.1: ++ resolution: {integrity: sha512-GA67ZbDq2AW0CY07zzGt07M5b5Yaq5qUpFIoW3UFfjOPgb0Sqf3DAW7GtFMK1sF4ROHsRDMGQ9rnT0VM2dVfKA==} ++ engines: {node: '>= 10'} ++ cpu: [arm64] ++ os: [linux] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-linux-x64-gnu/13.1.1: ++ resolution: {integrity: sha512-nnjuBrbzvqaOJaV+XgT8/+lmXrSCOt1YYZn/irbDb2fR2QprL6Q7WJNgwsZNxiLSfLdv+2RJGGegBx9sLBEzGA==} ++ engines: {node: '>= 10'} ++ cpu: [x64] ++ os: [linux] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-linux-x64-musl/13.1.1: ++ resolution: {integrity: sha512-CM9xnAQNIZ8zf/igbIT/i3xWbQZYaF397H+JroF5VMOCUleElaMdQLL5riJml8wUfPoN3dtfn2s4peSr3azz/g==} ++ engines: {node: '>= 10'} ++ cpu: [x64] ++ os: [linux] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-win32-arm64-msvc/13.1.1: ++ resolution: {integrity: sha512-pzUHOGrbgfGgPlOMx9xk3QdPJoRPU+om84hqVoe6u+E0RdwOG0Ho/2UxCgDqmvpUrMab1Deltlt6RqcXFpnigQ==} ++ engines: {node: '>= 10'} ++ cpu: [arm64] ++ os: [win32] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-win32-ia32-msvc/13.1.1: ++ resolution: {integrity: sha512-WeX8kVS46aobM9a7Xr/kEPcrTyiwJqQv/tbw6nhJ4fH9xNZ+cEcyPoQkwPo570dCOLz3Zo9S2q0E6lJ/EAUOBg==} ++ engines: {node: '>= 10'} ++ cpu: [ia32] ++ os: [win32] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@next/swc-win32-x64-msvc/13.1.1: ++ resolution: {integrity: sha512-mVF0/3/5QAc5EGVnb8ll31nNvf3BWpPY4pBb84tk+BfQglWLqc5AC9q1Ht/YMWiEgs8ALNKEQ3GQnbY0bJF2Gg==} ++ engines: {node: '>= 10'} ++ cpu: [x64] ++ os: [win32] ++ requiresBuild: true ++ dev: false ++ optional: true ++ ++ /@nodelib/fs.scandir/2.1.5: ++ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} ++ engines: {node: '>= 8'} ++ dependencies: ++ '@nodelib/fs.stat': 2.0.5 ++ run-parallel: 1.2.0 ++ dev: false ++ ++ /@nodelib/fs.stat/2.0.5: ++ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} ++ engines: {node: '>= 8'} ++ dev: false ++ ++ /@nodelib/fs.walk/1.2.8: ++ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} ++ engines: {node: '>= 8'} ++ dependencies: ++ '@nodelib/fs.scandir': 2.1.5 ++ fastq: 1.14.0 ++ dev: false ++ ++ /@pkgr/utils/2.3.1: ++ resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} ++ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} ++ dependencies: ++ cross-spawn: 7.0.3 ++ is-glob: 4.0.3 ++ open: 8.4.0 ++ picocolors: 1.0.0 ++ tiny-glob: 0.2.9 ++ tslib: 2.4.1 ++ dev: false ++ ++ /@rushstack/eslint-patch/1.2.0: ++ resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} ++ dev: false ++ ++ /@swc/helpers/0.4.14: ++ resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} ++ dependencies: ++ tslib: 2.4.1 ++ dev: false ++ ++ /@types/json5/0.0.29: ++ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} ++ dev: false ++ ++ /@types/node/18.11.18: ++ resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} ++ dev: false ++ ++ /@types/prop-types/15.7.5: ++ resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} ++ dev: false ++ ++ /@types/react-dom/18.0.10: ++ resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==} ++ dependencies: ++ '@types/react': 18.0.26 ++ dev: false ++ ++ /@types/react/18.0.26: ++ resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} ++ dependencies: ++ '@types/prop-types': 15.7.5 ++ '@types/scheduler': 0.16.2 ++ csstype: 3.1.1 ++ dev: false ++ ++ /@types/scheduler/0.16.2: ++ resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} ++ dev: false ++ ++ /@typescript-eslint/parser/5.47.1_iukboom6ndih5an6iafl45j2fe: ++ resolution: {integrity: sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ peerDependencies: ++ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 ++ typescript: '*' ++ peerDependenciesMeta: ++ typescript: ++ optional: true ++ dependencies: ++ '@typescript-eslint/scope-manager': 5.47.1 ++ '@typescript-eslint/types': 5.47.1 ++ '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 ++ debug: 4.3.4 ++ eslint: 8.31.0 ++ typescript: 4.9.4 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /@typescript-eslint/scope-manager/5.47.1: ++ resolution: {integrity: sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ dependencies: ++ '@typescript-eslint/types': 5.47.1 ++ '@typescript-eslint/visitor-keys': 5.47.1 ++ dev: false ++ ++ /@typescript-eslint/types/5.47.1: ++ resolution: {integrity: sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ dev: false ++ ++ /@typescript-eslint/typescript-estree/5.47.1_typescript@4.9.4: ++ resolution: {integrity: sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ peerDependencies: ++ typescript: '*' ++ peerDependenciesMeta: ++ typescript: ++ optional: true ++ dependencies: ++ '@typescript-eslint/types': 5.47.1 ++ '@typescript-eslint/visitor-keys': 5.47.1 ++ debug: 4.3.4 ++ globby: 11.1.0 ++ is-glob: 4.0.3 ++ semver: 7.3.8 ++ tsutils: 3.21.0_typescript@4.9.4 ++ typescript: 4.9.4 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /@typescript-eslint/visitor-keys/5.47.1: ++ resolution: {integrity: sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ dependencies: ++ '@typescript-eslint/types': 5.47.1 ++ eslint-visitor-keys: 3.3.0 ++ dev: false ++ ++ /acorn-jsx/5.3.2_acorn@8.8.1: ++ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} ++ peerDependencies: ++ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 ++ dependencies: ++ acorn: 8.8.1 ++ dev: false ++ ++ /acorn/8.8.1: ++ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} ++ engines: {node: '>=0.4.0'} ++ hasBin: true ++ dev: false ++ ++ /ajv/6.12.6: ++ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ++ dependencies: ++ fast-deep-equal: 3.1.3 ++ fast-json-stable-stringify: 2.1.0 ++ json-schema-traverse: 0.4.1 ++ uri-js: 4.4.1 ++ dev: false ++ ++ /ansi-regex/5.0.1: ++ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /ansi-styles/4.3.0: ++ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} ++ engines: {node: '>=8'} ++ dependencies: ++ color-convert: 2.0.1 ++ dev: false ++ ++ /argparse/2.0.1: ++ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} ++ dev: false ++ ++ /aria-query/4.2.2: ++ resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} ++ engines: {node: '>=6.0'} ++ dependencies: ++ '@babel/runtime': 7.20.7 ++ '@babel/runtime-corejs3': 7.20.7 ++ dev: false ++ ++ /array-includes/3.1.6: ++ resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ get-intrinsic: 1.1.3 ++ is-string: 1.0.7 ++ dev: false ++ ++ /array-union/2.1.0: ++ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /array.prototype.flat/1.3.1: ++ resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ es-shim-unscopables: 1.0.0 ++ dev: false ++ ++ /array.prototype.flatmap/1.3.1: ++ resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ es-shim-unscopables: 1.0.0 ++ dev: false ++ ++ /array.prototype.tosorted/1.1.1: ++ resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ es-shim-unscopables: 1.0.0 ++ get-intrinsic: 1.1.3 ++ dev: false ++ ++ /ast-types-flow/0.0.7: ++ resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} ++ dev: false ++ ++ /axe-core/4.6.1: ++ resolution: {integrity: sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==} ++ engines: {node: '>=4'} ++ dev: false ++ ++ /axobject-query/2.2.0: ++ resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} ++ dev: false ++ ++ /balanced-match/1.0.2: ++ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} ++ dev: false ++ ++ /brace-expansion/1.1.11: ++ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} ++ dependencies: ++ balanced-match: 1.0.2 ++ concat-map: 0.0.1 ++ dev: false ++ ++ /braces/3.0.2: ++ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} ++ engines: {node: '>=8'} ++ dependencies: ++ fill-range: 7.0.1 ++ dev: false ++ ++ /call-bind/1.0.2: ++ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} ++ dependencies: ++ function-bind: 1.1.1 ++ get-intrinsic: 1.1.3 ++ dev: false ++ ++ /callsites/3.1.0: ++ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} ++ engines: {node: '>=6'} ++ dev: false ++ ++ /caniuse-lite/1.0.30001441: ++ resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==} ++ dev: false ++ ++ /chalk/4.1.2: ++ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} ++ engines: {node: '>=10'} ++ dependencies: ++ ansi-styles: 4.3.0 ++ supports-color: 7.2.0 ++ dev: false ++ ++ /client-only/0.0.1: ++ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} ++ dev: false ++ ++ /color-convert/2.0.1: ++ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} ++ engines: {node: '>=7.0.0'} ++ dependencies: ++ color-name: 1.1.4 ++ dev: false ++ ++ /color-name/1.1.4: ++ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} ++ dev: false ++ ++ /concat-map/0.0.1: ++ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} ++ dev: false ++ ++ /core-js-pure/3.27.1: ++ resolution: {integrity: sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==} ++ requiresBuild: true ++ dev: false ++ ++ /cross-spawn/7.0.3: ++ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} ++ engines: {node: '>= 8'} ++ dependencies: ++ path-key: 3.1.1 ++ shebang-command: 2.0.0 ++ which: 2.0.2 ++ dev: false ++ ++ /csstype/3.1.1: ++ resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} ++ dev: false ++ ++ /damerau-levenshtein/1.0.8: ++ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} ++ dev: false ++ ++ /debug/2.6.9: ++ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} ++ peerDependencies: ++ supports-color: '*' ++ peerDependenciesMeta: ++ supports-color: ++ optional: true ++ dependencies: ++ ms: 2.0.0 ++ dev: false ++ ++ /debug/3.2.7: ++ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} ++ peerDependencies: ++ supports-color: '*' ++ peerDependenciesMeta: ++ supports-color: ++ optional: true ++ dependencies: ++ ms: 2.1.3 ++ dev: false ++ ++ /debug/4.3.4: ++ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} ++ engines: {node: '>=6.0'} ++ peerDependencies: ++ supports-color: '*' ++ peerDependenciesMeta: ++ supports-color: ++ optional: true ++ dependencies: ++ ms: 2.1.2 ++ dev: false ++ ++ /deep-is/0.1.4: ++ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} ++ dev: false ++ ++ /define-lazy-prop/2.0.0: ++ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /define-properties/1.1.4: ++ resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ has-property-descriptors: 1.0.0 ++ object-keys: 1.1.1 ++ dev: false ++ ++ /dir-glob/3.0.1: ++ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} ++ engines: {node: '>=8'} ++ dependencies: ++ path-type: 4.0.0 ++ dev: false ++ ++ /doctrine/2.1.0: ++ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} ++ engines: {node: '>=0.10.0'} ++ dependencies: ++ esutils: 2.0.3 ++ dev: false ++ ++ /doctrine/3.0.0: ++ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} ++ engines: {node: '>=6.0.0'} ++ dependencies: ++ esutils: 2.0.3 ++ dev: false ++ ++ /emoji-regex/9.2.2: ++ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} ++ dev: false ++ ++ /enhanced-resolve/5.12.0: ++ resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} ++ engines: {node: '>=10.13.0'} ++ dependencies: ++ graceful-fs: 4.2.10 ++ tapable: 2.2.1 ++ dev: false ++ ++ /es-abstract/1.20.5: ++ resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ es-to-primitive: 1.2.1 ++ function-bind: 1.1.1 ++ function.prototype.name: 1.1.5 ++ get-intrinsic: 1.1.3 ++ get-symbol-description: 1.0.0 ++ gopd: 1.0.1 ++ has: 1.0.3 ++ has-property-descriptors: 1.0.0 ++ has-symbols: 1.0.3 ++ internal-slot: 1.0.4 ++ is-callable: 1.2.7 ++ is-negative-zero: 2.0.2 ++ is-regex: 1.1.4 ++ is-shared-array-buffer: 1.0.2 ++ is-string: 1.0.7 ++ is-weakref: 1.0.2 ++ object-inspect: 1.12.2 ++ object-keys: 1.1.1 ++ object.assign: 4.1.4 ++ regexp.prototype.flags: 1.4.3 ++ safe-regex-test: 1.0.0 ++ string.prototype.trimend: 1.0.6 ++ string.prototype.trimstart: 1.0.6 ++ unbox-primitive: 1.0.2 ++ dev: false ++ ++ /es-shim-unscopables/1.0.0: ++ resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} ++ dependencies: ++ has: 1.0.3 ++ dev: false ++ ++ /es-to-primitive/1.2.1: ++ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ is-callable: 1.2.7 ++ is-date-object: 1.0.5 ++ is-symbol: 1.0.4 ++ dev: false ++ ++ /escape-string-regexp/4.0.0: ++ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} ++ engines: {node: '>=10'} ++ dev: false ++ ++ /eslint-config-next/13.1.1_iukboom6ndih5an6iafl45j2fe: ++ resolution: {integrity: sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==} ++ peerDependencies: ++ eslint: ^7.23.0 || ^8.0.0 ++ typescript: '>=3.3.1' ++ peerDependenciesMeta: ++ typescript: ++ optional: true ++ dependencies: ++ '@next/eslint-plugin-next': 13.1.1 ++ '@rushstack/eslint-patch': 1.2.0 ++ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe ++ eslint: 8.31.0 ++ eslint-import-resolver-node: 0.3.6 ++ eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4 ++ eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi ++ eslint-plugin-jsx-a11y: 6.6.1_eslint@8.31.0 ++ eslint-plugin-react: 7.31.11_eslint@8.31.0 ++ eslint-plugin-react-hooks: 4.6.0_eslint@8.31.0 ++ typescript: 4.9.4 ++ transitivePeerDependencies: ++ - eslint-import-resolver-webpack ++ - supports-color ++ dev: false ++ ++ /eslint-import-resolver-node/0.3.6: ++ resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} ++ dependencies: ++ debug: 3.2.7 ++ resolve: 1.22.1 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /eslint-import-resolver-typescript/3.5.2_ol7jqilc3wemtdbq3nzhywgxq4: ++ resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} ++ engines: {node: ^14.18.0 || >=16.0.0} ++ peerDependencies: ++ eslint: '*' ++ eslint-plugin-import: '*' ++ dependencies: ++ debug: 4.3.4 ++ enhanced-resolve: 5.12.0 ++ eslint: 8.31.0 ++ eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi ++ get-tsconfig: 4.2.0 ++ globby: 13.1.3 ++ is-core-module: 2.11.0 ++ is-glob: 4.0.3 ++ synckit: 0.8.4 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /eslint-module-utils/2.7.4_of6uaipqaoaobv57tu2gvxhnhu: ++ resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} ++ engines: {node: '>=4'} ++ peerDependencies: ++ '@typescript-eslint/parser': '*' ++ eslint: '*' ++ eslint-import-resolver-node: '*' ++ eslint-import-resolver-typescript: '*' ++ eslint-import-resolver-webpack: '*' ++ peerDependenciesMeta: ++ '@typescript-eslint/parser': ++ optional: true ++ eslint: ++ optional: true ++ eslint-import-resolver-node: ++ optional: true ++ eslint-import-resolver-typescript: ++ optional: true ++ eslint-import-resolver-webpack: ++ optional: true ++ dependencies: ++ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe ++ debug: 3.2.7 ++ eslint: 8.31.0 ++ eslint-import-resolver-node: 0.3.6 ++ eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /eslint-plugin-import/2.26.0_bpx4furzt4ibermwbsj75osuwi: ++ resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} ++ engines: {node: '>=4'} ++ peerDependencies: ++ '@typescript-eslint/parser': '*' ++ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 ++ peerDependenciesMeta: ++ '@typescript-eslint/parser': ++ optional: true ++ dependencies: ++ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe ++ array-includes: 3.1.6 ++ array.prototype.flat: 1.3.1 ++ debug: 2.6.9 ++ doctrine: 2.1.0 ++ eslint: 8.31.0 ++ eslint-import-resolver-node: 0.3.6 ++ eslint-module-utils: 2.7.4_of6uaipqaoaobv57tu2gvxhnhu ++ has: 1.0.3 ++ is-core-module: 2.11.0 ++ is-glob: 4.0.3 ++ minimatch: 3.1.2 ++ object.values: 1.1.6 ++ resolve: 1.22.1 ++ tsconfig-paths: 3.14.1 ++ transitivePeerDependencies: ++ - eslint-import-resolver-typescript ++ - eslint-import-resolver-webpack ++ - supports-color ++ dev: false ++ ++ /eslint-plugin-jsx-a11y/6.6.1_eslint@8.31.0: ++ resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==} ++ engines: {node: '>=4.0'} ++ peerDependencies: ++ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 ++ dependencies: ++ '@babel/runtime': 7.20.7 ++ aria-query: 4.2.2 ++ array-includes: 3.1.6 ++ ast-types-flow: 0.0.7 ++ axe-core: 4.6.1 ++ axobject-query: 2.2.0 ++ damerau-levenshtein: 1.0.8 ++ emoji-regex: 9.2.2 ++ eslint: 8.31.0 ++ has: 1.0.3 ++ jsx-ast-utils: 3.3.3 ++ language-tags: 1.0.7 ++ minimatch: 3.1.2 ++ semver: 6.3.0 ++ dev: false ++ ++ /eslint-plugin-react-hooks/4.6.0_eslint@8.31.0: ++ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} ++ engines: {node: '>=10'} ++ peerDependencies: ++ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 ++ dependencies: ++ eslint: 8.31.0 ++ dev: false ++ ++ /eslint-plugin-react/7.31.11_eslint@8.31.0: ++ resolution: {integrity: sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==} ++ engines: {node: '>=4'} ++ peerDependencies: ++ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 ++ dependencies: ++ array-includes: 3.1.6 ++ array.prototype.flatmap: 1.3.1 ++ array.prototype.tosorted: 1.1.1 ++ doctrine: 2.1.0 ++ eslint: 8.31.0 ++ estraverse: 5.3.0 ++ jsx-ast-utils: 3.3.3 ++ minimatch: 3.1.2 ++ object.entries: 1.1.6 ++ object.fromentries: 2.0.6 ++ object.hasown: 1.1.2 ++ object.values: 1.1.6 ++ prop-types: 15.8.1 ++ resolve: 2.0.0-next.4 ++ semver: 6.3.0 ++ string.prototype.matchall: 4.0.8 ++ dev: false ++ ++ /eslint-scope/7.1.1: ++ resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ dependencies: ++ esrecurse: 4.3.0 ++ estraverse: 5.3.0 ++ dev: false ++ ++ /eslint-utils/3.0.0_eslint@8.31.0: ++ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} ++ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} ++ peerDependencies: ++ eslint: '>=5' ++ dependencies: ++ eslint: 8.31.0 ++ eslint-visitor-keys: 2.1.0 ++ dev: false ++ ++ /eslint-visitor-keys/2.1.0: ++ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} ++ engines: {node: '>=10'} ++ dev: false ++ ++ /eslint-visitor-keys/3.3.0: ++ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ dev: false ++ ++ /eslint/8.31.0: ++ resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ hasBin: true ++ dependencies: ++ '@eslint/eslintrc': 1.4.1 ++ '@humanwhocodes/config-array': 0.11.8 ++ '@humanwhocodes/module-importer': 1.0.1 ++ '@nodelib/fs.walk': 1.2.8 ++ ajv: 6.12.6 ++ chalk: 4.1.2 ++ cross-spawn: 7.0.3 ++ debug: 4.3.4 ++ doctrine: 3.0.0 ++ escape-string-regexp: 4.0.0 ++ eslint-scope: 7.1.1 ++ eslint-utils: 3.0.0_eslint@8.31.0 ++ eslint-visitor-keys: 3.3.0 ++ espree: 9.4.1 ++ esquery: 1.4.0 ++ esutils: 2.0.3 ++ fast-deep-equal: 3.1.3 ++ file-entry-cache: 6.0.1 ++ find-up: 5.0.0 ++ glob-parent: 6.0.2 ++ globals: 13.19.0 ++ grapheme-splitter: 1.0.4 ++ ignore: 5.2.4 ++ import-fresh: 3.3.0 ++ imurmurhash: 0.1.4 ++ is-glob: 4.0.3 ++ is-path-inside: 3.0.3 ++ js-sdsl: 4.2.0 ++ js-yaml: 4.1.0 ++ json-stable-stringify-without-jsonify: 1.0.1 ++ levn: 0.4.1 ++ lodash.merge: 4.6.2 ++ minimatch: 3.1.2 ++ natural-compare: 1.4.0 ++ optionator: 0.9.1 ++ regexpp: 3.2.0 ++ strip-ansi: 6.0.1 ++ strip-json-comments: 3.1.1 ++ text-table: 0.2.0 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /espree/9.4.1: ++ resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} ++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ++ dependencies: ++ acorn: 8.8.1 ++ acorn-jsx: 5.3.2_acorn@8.8.1 ++ eslint-visitor-keys: 3.3.0 ++ dev: false ++ ++ /esquery/1.4.0: ++ resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} ++ engines: {node: '>=0.10'} ++ dependencies: ++ estraverse: 5.3.0 ++ dev: false ++ ++ /esrecurse/4.3.0: ++ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} ++ engines: {node: '>=4.0'} ++ dependencies: ++ estraverse: 5.3.0 ++ dev: false ++ ++ /estraverse/5.3.0: ++ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} ++ engines: {node: '>=4.0'} ++ dev: false ++ ++ /esutils/2.0.3: ++ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} ++ engines: {node: '>=0.10.0'} ++ dev: false ++ ++ /fast-deep-equal/3.1.3: ++ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} ++ dev: false ++ ++ /fast-glob/3.2.12: ++ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} ++ engines: {node: '>=8.6.0'} ++ dependencies: ++ '@nodelib/fs.stat': 2.0.5 ++ '@nodelib/fs.walk': 1.2.8 ++ glob-parent: 5.1.2 ++ merge2: 1.4.1 ++ micromatch: 4.0.5 ++ dev: false ++ ++ /fast-json-stable-stringify/2.1.0: ++ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} ++ dev: false ++ ++ /fast-levenshtein/2.0.6: ++ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} ++ dev: false ++ ++ /fastq/1.14.0: ++ resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} ++ dependencies: ++ reusify: 1.0.4 ++ dev: false ++ ++ /file-entry-cache/6.0.1: ++ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} ++ engines: {node: ^10.12.0 || >=12.0.0} ++ dependencies: ++ flat-cache: 3.0.4 ++ dev: false ++ ++ /fill-range/7.0.1: ++ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} ++ engines: {node: '>=8'} ++ dependencies: ++ to-regex-range: 5.0.1 ++ dev: false ++ ++ /find-up/5.0.0: ++ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} ++ engines: {node: '>=10'} ++ dependencies: ++ locate-path: 6.0.0 ++ path-exists: 4.0.0 ++ dev: false ++ ++ /flat-cache/3.0.4: ++ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} ++ engines: {node: ^10.12.0 || >=12.0.0} ++ dependencies: ++ flatted: 3.2.7 ++ rimraf: 3.0.2 ++ dev: false ++ ++ /flatted/3.2.7: ++ resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} ++ dev: false ++ ++ /fs.realpath/1.0.0: ++ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} ++ dev: false ++ ++ /function-bind/1.1.1: ++ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} ++ dev: false ++ ++ /function.prototype.name/1.1.5: ++ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ functions-have-names: 1.2.3 ++ dev: false ++ ++ /functions-have-names/1.2.3: ++ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} ++ dev: false ++ ++ /get-intrinsic/1.1.3: ++ resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} ++ dependencies: ++ function-bind: 1.1.1 ++ has: 1.0.3 ++ has-symbols: 1.0.3 ++ dev: false ++ ++ /get-symbol-description/1.0.0: ++ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ get-intrinsic: 1.1.3 ++ dev: false ++ ++ /get-tsconfig/4.2.0: ++ resolution: {integrity: sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==} ++ dev: false ++ ++ /glob-parent/5.1.2: ++ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} ++ engines: {node: '>= 6'} ++ dependencies: ++ is-glob: 4.0.3 ++ dev: false ++ ++ /glob-parent/6.0.2: ++ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} ++ engines: {node: '>=10.13.0'} ++ dependencies: ++ is-glob: 4.0.3 ++ dev: false ++ ++ /glob/7.1.7: ++ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} ++ dependencies: ++ fs.realpath: 1.0.0 ++ inflight: 1.0.6 ++ inherits: 2.0.4 ++ minimatch: 3.1.2 ++ once: 1.4.0 ++ path-is-absolute: 1.0.1 ++ dev: false ++ ++ /glob/7.2.3: ++ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} ++ dependencies: ++ fs.realpath: 1.0.0 ++ inflight: 1.0.6 ++ inherits: 2.0.4 ++ minimatch: 3.1.2 ++ once: 1.4.0 ++ path-is-absolute: 1.0.1 ++ dev: false ++ ++ /globals/13.19.0: ++ resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} ++ engines: {node: '>=8'} ++ dependencies: ++ type-fest: 0.20.2 ++ dev: false ++ ++ /globalyzer/0.1.0: ++ resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} ++ dev: false ++ ++ /globby/11.1.0: ++ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} ++ engines: {node: '>=10'} ++ dependencies: ++ array-union: 2.1.0 ++ dir-glob: 3.0.1 ++ fast-glob: 3.2.12 ++ ignore: 5.2.4 ++ merge2: 1.4.1 ++ slash: 3.0.0 ++ dev: false ++ ++ /globby/13.1.3: ++ resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} ++ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} ++ dependencies: ++ dir-glob: 3.0.1 ++ fast-glob: 3.2.12 ++ ignore: 5.2.4 ++ merge2: 1.4.1 ++ slash: 4.0.0 ++ dev: false ++ ++ /globrex/0.1.2: ++ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} ++ dev: false ++ ++ /gopd/1.0.1: ++ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} ++ dependencies: ++ get-intrinsic: 1.1.3 ++ dev: false ++ ++ /graceful-fs/4.2.10: ++ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} ++ dev: false ++ ++ /grapheme-splitter/1.0.4: ++ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} ++ dev: false ++ ++ /has-bigints/1.0.2: ++ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} ++ dev: false ++ ++ /has-flag/4.0.0: ++ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /has-property-descriptors/1.0.0: ++ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} ++ dependencies: ++ get-intrinsic: 1.1.3 ++ dev: false ++ ++ /has-symbols/1.0.3: ++ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} ++ engines: {node: '>= 0.4'} ++ dev: false ++ ++ /has-tostringtag/1.0.0: ++ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ has-symbols: 1.0.3 ++ dev: false ++ ++ /has/1.0.3: ++ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} ++ engines: {node: '>= 0.4.0'} ++ dependencies: ++ function-bind: 1.1.1 ++ dev: false ++ ++ /ignore/5.2.4: ++ resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} ++ engines: {node: '>= 4'} ++ dev: false ++ ++ /import-fresh/3.3.0: ++ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} ++ engines: {node: '>=6'} ++ dependencies: ++ parent-module: 1.0.1 ++ resolve-from: 4.0.0 ++ dev: false ++ ++ /imurmurhash/0.1.4: ++ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} ++ engines: {node: '>=0.8.19'} ++ dev: false ++ ++ /inflight/1.0.6: ++ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} ++ dependencies: ++ once: 1.4.0 ++ wrappy: 1.0.2 ++ dev: false ++ ++ /inherits/2.0.4: ++ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ++ dev: false ++ ++ /internal-slot/1.0.4: ++ resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ get-intrinsic: 1.1.3 ++ has: 1.0.3 ++ side-channel: 1.0.4 ++ dev: false ++ ++ /is-bigint/1.0.4: ++ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} ++ dependencies: ++ has-bigints: 1.0.2 ++ dev: false ++ ++ /is-boolean-object/1.1.2: ++ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ has-tostringtag: 1.0.0 ++ dev: false ++ ++ /is-callable/1.2.7: ++ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} ++ engines: {node: '>= 0.4'} ++ dev: false ++ ++ /is-core-module/2.11.0: ++ resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} ++ dependencies: ++ has: 1.0.3 ++ dev: false ++ ++ /is-date-object/1.0.5: ++ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ has-tostringtag: 1.0.0 ++ dev: false ++ ++ /is-docker/2.2.1: ++ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} ++ engines: {node: '>=8'} ++ hasBin: true ++ dev: false ++ ++ /is-extglob/2.1.1: ++ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} ++ engines: {node: '>=0.10.0'} ++ dev: false ++ ++ /is-glob/4.0.3: ++ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} ++ engines: {node: '>=0.10.0'} ++ dependencies: ++ is-extglob: 2.1.1 ++ dev: false ++ ++ /is-negative-zero/2.0.2: ++ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} ++ engines: {node: '>= 0.4'} ++ dev: false ++ ++ /is-number-object/1.0.7: ++ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ has-tostringtag: 1.0.0 ++ dev: false ++ ++ /is-number/7.0.0: ++ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} ++ engines: {node: '>=0.12.0'} ++ dev: false ++ ++ /is-path-inside/3.0.3: ++ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /is-regex/1.1.4: ++ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ has-tostringtag: 1.0.0 ++ dev: false ++ ++ /is-shared-array-buffer/1.0.2: ++ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} ++ dependencies: ++ call-bind: 1.0.2 ++ dev: false ++ ++ /is-string/1.0.7: ++ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ has-tostringtag: 1.0.0 ++ dev: false ++ ++ /is-symbol/1.0.4: ++ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ has-symbols: 1.0.3 ++ dev: false ++ ++ /is-weakref/1.0.2: ++ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} ++ dependencies: ++ call-bind: 1.0.2 ++ dev: false ++ ++ /is-wsl/2.2.0: ++ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} ++ engines: {node: '>=8'} ++ dependencies: ++ is-docker: 2.2.1 ++ dev: false ++ ++ /isexe/2.0.0: ++ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} ++ dev: false ++ ++ /js-sdsl/4.2.0: ++ resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} ++ dev: false ++ ++ /js-tokens/4.0.0: ++ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} ++ dev: false ++ ++ /js-yaml/4.1.0: ++ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} ++ hasBin: true ++ dependencies: ++ argparse: 2.0.1 ++ dev: false ++ ++ /json-schema-traverse/0.4.1: ++ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} ++ dev: false ++ ++ /json-stable-stringify-without-jsonify/1.0.1: ++ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} ++ dev: false ++ ++ /json5/1.0.2: ++ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} ++ hasBin: true ++ dependencies: ++ minimist: 1.2.7 ++ dev: false ++ ++ /jsx-ast-utils/3.3.3: ++ resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} ++ engines: {node: '>=4.0'} ++ dependencies: ++ array-includes: 3.1.6 ++ object.assign: 4.1.4 ++ dev: false ++ ++ /language-subtag-registry/0.3.22: ++ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} ++ dev: false ++ ++ /language-tags/1.0.7: ++ resolution: {integrity: sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==} ++ dependencies: ++ language-subtag-registry: 0.3.22 ++ dev: false ++ ++ /levn/0.4.1: ++ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} ++ engines: {node: '>= 0.8.0'} ++ dependencies: ++ prelude-ls: 1.2.1 ++ type-check: 0.4.0 ++ dev: false ++ ++ /locate-path/6.0.0: ++ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} ++ engines: {node: '>=10'} ++ dependencies: ++ p-locate: 5.0.0 ++ dev: false ++ ++ /lodash.merge/4.6.2: ++ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} ++ dev: false ++ ++ /loose-envify/1.4.0: ++ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} ++ hasBin: true ++ dependencies: ++ js-tokens: 4.0.0 ++ dev: false ++ ++ /lru-cache/6.0.0: ++ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} ++ engines: {node: '>=10'} ++ dependencies: ++ yallist: 4.0.0 ++ dev: false ++ ++ /merge2/1.4.1: ++ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} ++ engines: {node: '>= 8'} ++ dev: false ++ ++ /micromatch/4.0.5: ++ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} ++ engines: {node: '>=8.6'} ++ dependencies: ++ braces: 3.0.2 ++ picomatch: 2.3.1 ++ dev: false ++ ++ /minimatch/3.1.2: ++ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} ++ dependencies: ++ brace-expansion: 1.1.11 ++ dev: false ++ ++ /minimist/1.2.7: ++ resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} ++ dev: false ++ ++ /ms/2.0.0: ++ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ++ dev: false ++ ++ /ms/2.1.2: ++ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} ++ dev: false ++ ++ /ms/2.1.3: ++ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} ++ dev: false ++ ++ /nanoid/3.3.4: ++ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} ++ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} ++ hasBin: true ++ dev: false ++ ++ /natural-compare/1.4.0: ++ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} ++ dev: false ++ ++ /next/13.1.1_biqbaboplfbrettd7655fr4n2y: ++ resolution: {integrity: sha512-R5eBAaIa3X7LJeYvv1bMdGnAVF4fVToEjim7MkflceFPuANY3YyvFxXee/A+acrSYwYPvOvf7f6v/BM/48ea5w==} ++ engines: {node: '>=14.6.0'} ++ hasBin: true ++ peerDependencies: ++ fibers: '>= 3.1.0' ++ node-sass: ^6.0.0 || ^7.0.0 ++ react: ^18.2.0 ++ react-dom: ^18.2.0 ++ sass: ^1.3.0 ++ peerDependenciesMeta: ++ fibers: ++ optional: true ++ node-sass: ++ optional: true ++ sass: ++ optional: true ++ dependencies: ++ '@next/env': 13.1.1 ++ '@swc/helpers': 0.4.14 ++ caniuse-lite: 1.0.30001441 ++ postcss: 8.4.14 ++ react: 18.2.0 ++ react-dom: 18.2.0_react@18.2.0 ++ styled-jsx: 5.1.1_react@18.2.0 ++ optionalDependencies: ++ '@next/swc-android-arm-eabi': 13.1.1 ++ '@next/swc-android-arm64': 13.1.1 ++ '@next/swc-darwin-arm64': 13.1.1 ++ '@next/swc-darwin-x64': 13.1.1 ++ '@next/swc-freebsd-x64': 13.1.1 ++ '@next/swc-linux-arm-gnueabihf': 13.1.1 ++ '@next/swc-linux-arm64-gnu': 13.1.1 ++ '@next/swc-linux-arm64-musl': 13.1.1 ++ '@next/swc-linux-x64-gnu': 13.1.1 ++ '@next/swc-linux-x64-musl': 13.1.1 ++ '@next/swc-win32-arm64-msvc': 13.1.1 ++ '@next/swc-win32-ia32-msvc': 13.1.1 ++ '@next/swc-win32-x64-msvc': 13.1.1 ++ transitivePeerDependencies: ++ - '@babel/core' ++ - babel-plugin-macros ++ dev: false ++ ++ /object-assign/4.1.1: ++ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} ++ engines: {node: '>=0.10.0'} ++ dev: false ++ ++ /object-inspect/1.12.2: ++ resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} ++ dev: false ++ ++ /object-keys/1.1.1: ++ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} ++ engines: {node: '>= 0.4'} ++ dev: false ++ ++ /object.assign/4.1.4: ++ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ has-symbols: 1.0.3 ++ object-keys: 1.1.1 ++ dev: false ++ ++ /object.entries/1.1.6: ++ resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ dev: false ++ ++ /object.fromentries/2.0.6: ++ resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ dev: false ++ ++ /object.hasown/1.1.2: ++ resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} ++ dependencies: ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ dev: false ++ ++ /object.values/1.1.6: ++ resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ dev: false ++ ++ /once/1.4.0: ++ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} ++ dependencies: ++ wrappy: 1.0.2 ++ dev: false ++ ++ /open/8.4.0: ++ resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} ++ engines: {node: '>=12'} ++ dependencies: ++ define-lazy-prop: 2.0.0 ++ is-docker: 2.2.1 ++ is-wsl: 2.2.0 ++ dev: false ++ ++ /optionator/0.9.1: ++ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} ++ engines: {node: '>= 0.8.0'} ++ dependencies: ++ deep-is: 0.1.4 ++ fast-levenshtein: 2.0.6 ++ levn: 0.4.1 ++ prelude-ls: 1.2.1 ++ type-check: 0.4.0 ++ word-wrap: 1.2.3 ++ dev: false ++ ++ /p-limit/3.1.0: ++ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} ++ engines: {node: '>=10'} ++ dependencies: ++ yocto-queue: 0.1.0 ++ dev: false ++ ++ /p-locate/5.0.0: ++ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} ++ engines: {node: '>=10'} ++ dependencies: ++ p-limit: 3.1.0 ++ dev: false ++ ++ /parent-module/1.0.1: ++ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} ++ engines: {node: '>=6'} ++ dependencies: ++ callsites: 3.1.0 ++ dev: false ++ ++ /path-exists/4.0.0: ++ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /path-is-absolute/1.0.1: ++ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} ++ engines: {node: '>=0.10.0'} ++ dev: false ++ ++ /path-key/3.1.1: ++ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /path-parse/1.0.7: ++ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} ++ dev: false ++ ++ /path-type/4.0.0: ++ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /picocolors/1.0.0: ++ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} ++ dev: false ++ ++ /picomatch/2.3.1: ++ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} ++ engines: {node: '>=8.6'} ++ dev: false ++ ++ /postcss/8.4.14: ++ resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} ++ engines: {node: ^10 || ^12 || >=14} ++ dependencies: ++ nanoid: 3.3.4 ++ picocolors: 1.0.0 ++ source-map-js: 1.0.2 ++ dev: false ++ ++ /prelude-ls/1.2.1: ++ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} ++ engines: {node: '>= 0.8.0'} ++ dev: false ++ ++ /prettier/2.8.1: ++ resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} ++ engines: {node: '>=10.13.0'} ++ hasBin: true ++ dev: true ++ ++ /prop-types/15.8.1: ++ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} ++ dependencies: ++ loose-envify: 1.4.0 ++ object-assign: 4.1.1 ++ react-is: 16.13.1 ++ dev: false ++ ++ /punycode/2.1.1: ++ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} ++ engines: {node: '>=6'} ++ dev: false ++ ++ /queue-microtask/1.2.3: ++ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} ++ dev: false ++ ++ /react-dom/18.2.0_react@18.2.0: ++ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} ++ peerDependencies: ++ react: ^18.2.0 ++ dependencies: ++ loose-envify: 1.4.0 ++ react: 18.2.0 ++ scheduler: 0.23.0 ++ dev: false ++ ++ /react-is/16.13.1: ++ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} ++ dev: false ++ ++ /react/18.2.0: ++ resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} ++ engines: {node: '>=0.10.0'} ++ dependencies: ++ loose-envify: 1.4.0 ++ dev: false ++ ++ /regenerator-runtime/0.13.11: ++ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} ++ dev: false ++ ++ /regexp.prototype.flags/1.4.3: ++ resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} ++ engines: {node: '>= 0.4'} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ functions-have-names: 1.2.3 ++ dev: false ++ ++ /regexpp/3.2.0: ++ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /resolve-from/4.0.0: ++ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} ++ engines: {node: '>=4'} ++ dev: false ++ ++ /resolve/1.22.1: ++ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} ++ hasBin: true ++ dependencies: ++ is-core-module: 2.11.0 ++ path-parse: 1.0.7 ++ supports-preserve-symlinks-flag: 1.0.0 ++ dev: false ++ ++ /resolve/2.0.0-next.4: ++ resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} ++ hasBin: true ++ dependencies: ++ is-core-module: 2.11.0 ++ path-parse: 1.0.7 ++ supports-preserve-symlinks-flag: 1.0.0 ++ dev: false ++ ++ /reusify/1.0.4: ++ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} ++ engines: {iojs: '>=1.0.0', node: '>=0.10.0'} ++ dev: false ++ ++ /rimraf/3.0.2: ++ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} ++ hasBin: true ++ dependencies: ++ glob: 7.2.3 ++ dev: false ++ ++ /run-parallel/1.2.0: ++ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} ++ dependencies: ++ queue-microtask: 1.2.3 ++ dev: false ++ ++ /safe-regex-test/1.0.0: ++ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} ++ dependencies: ++ call-bind: 1.0.2 ++ get-intrinsic: 1.1.3 ++ is-regex: 1.1.4 ++ dev: false ++ ++ /scheduler/0.23.0: ++ resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} ++ dependencies: ++ loose-envify: 1.4.0 ++ dev: false ++ ++ /semver/6.3.0: ++ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} ++ hasBin: true ++ dev: false ++ ++ /semver/7.3.8: ++ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} ++ engines: {node: '>=10'} ++ hasBin: true ++ dependencies: ++ lru-cache: 6.0.0 ++ dev: false ++ ++ /shebang-command/2.0.0: ++ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} ++ engines: {node: '>=8'} ++ dependencies: ++ shebang-regex: 3.0.0 ++ dev: false ++ ++ /shebang-regex/3.0.0: ++ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /side-channel/1.0.4: ++ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} ++ dependencies: ++ call-bind: 1.0.2 ++ get-intrinsic: 1.1.3 ++ object-inspect: 1.12.2 ++ dev: false ++ ++ /slash/3.0.0: ++ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /slash/4.0.0: ++ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} ++ engines: {node: '>=12'} ++ dev: false ++ ++ /source-map-js/1.0.2: ++ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} ++ engines: {node: '>=0.10.0'} ++ dev: false ++ ++ /string.prototype.matchall/4.0.8: ++ resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ get-intrinsic: 1.1.3 ++ has-symbols: 1.0.3 ++ internal-slot: 1.0.4 ++ regexp.prototype.flags: 1.4.3 ++ side-channel: 1.0.4 ++ dev: false ++ ++ /string.prototype.trimend/1.0.6: ++ resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ dev: false ++ ++ /string.prototype.trimstart/1.0.6: ++ resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} ++ dependencies: ++ call-bind: 1.0.2 ++ define-properties: 1.1.4 ++ es-abstract: 1.20.5 ++ dev: false ++ ++ /strip-ansi/6.0.1: ++ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} ++ engines: {node: '>=8'} ++ dependencies: ++ ansi-regex: 5.0.1 ++ dev: false ++ ++ /strip-bom/3.0.0: ++ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} ++ engines: {node: '>=4'} ++ dev: false ++ ++ /strip-json-comments/3.1.1: ++ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} ++ engines: {node: '>=8'} ++ dev: false ++ ++ /styled-jsx/5.1.1_react@18.2.0: ++ resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} ++ engines: {node: '>= 12.0.0'} ++ peerDependencies: ++ '@babel/core': '*' ++ babel-plugin-macros: '*' ++ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' ++ peerDependenciesMeta: ++ '@babel/core': ++ optional: true ++ babel-plugin-macros: ++ optional: true ++ dependencies: ++ client-only: 0.0.1 ++ react: 18.2.0 ++ dev: false ++ ++ /supports-color/7.2.0: ++ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} ++ engines: {node: '>=8'} ++ dependencies: ++ has-flag: 4.0.0 ++ dev: false ++ ++ /supports-preserve-symlinks-flag/1.0.0: ++ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} ++ engines: {node: '>= 0.4'} ++ dev: false ++ ++ /synckit/0.8.4: ++ resolution: {integrity: sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==} ++ engines: {node: ^14.18.0 || >=16.0.0} ++ dependencies: ++ '@pkgr/utils': 2.3.1 ++ tslib: 2.4.1 ++ dev: false ++ ++ /tapable/2.2.1: ++ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} ++ engines: {node: '>=6'} ++ dev: false ++ ++ /text-table/0.2.0: ++ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} ++ dev: false ++ ++ /tiny-glob/0.2.9: ++ resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} ++ dependencies: ++ globalyzer: 0.1.0 ++ globrex: 0.1.2 ++ dev: false ++ ++ /to-regex-range/5.0.1: ++ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} ++ engines: {node: '>=8.0'} ++ dependencies: ++ is-number: 7.0.0 ++ dev: false ++ ++ /tsconfig-paths/3.14.1: ++ resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} ++ dependencies: ++ '@types/json5': 0.0.29 ++ json5: 1.0.2 ++ minimist: 1.2.7 ++ strip-bom: 3.0.0 ++ dev: false ++ ++ /tslib/1.14.1: ++ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} ++ dev: false ++ ++ /tslib/2.4.1: ++ resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} ++ dev: false ++ ++ /tsutils/3.21.0_typescript@4.9.4: ++ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} ++ engines: {node: '>= 6'} ++ peerDependencies: ++ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' ++ dependencies: ++ tslib: 1.14.1 ++ typescript: 4.9.4 ++ dev: false ++ ++ /type-check/0.4.0: ++ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} ++ engines: {node: '>= 0.8.0'} ++ dependencies: ++ prelude-ls: 1.2.1 ++ dev: false ++ ++ /type-fest/0.20.2: ++ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} ++ engines: {node: '>=10'} ++ dev: false ++ ++ /typescript/4.9.4: ++ resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} ++ engines: {node: '>=4.2.0'} ++ hasBin: true ++ dev: false ++ ++ /unbox-primitive/1.0.2: ++ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} ++ dependencies: ++ call-bind: 1.0.2 ++ has-bigints: 1.0.2 ++ has-symbols: 1.0.3 ++ which-boxed-primitive: 1.0.2 ++ dev: false ++ ++ /uri-js/4.4.1: ++ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} ++ dependencies: ++ punycode: 2.1.1 ++ dev: false ++ ++ /which-boxed-primitive/1.0.2: ++ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} ++ dependencies: ++ is-bigint: 1.0.4 ++ is-boolean-object: 1.1.2 ++ is-number-object: 1.0.7 ++ is-string: 1.0.7 ++ is-symbol: 1.0.4 ++ dev: false ++ ++ /which/2.0.2: ++ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} ++ engines: {node: '>= 8'} ++ hasBin: true ++ dependencies: ++ isexe: 2.0.0 ++ dev: false ++ ++ /word-wrap/1.2.3: ++ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} ++ engines: {node: '>=0.10.0'} ++ dev: false ++ ++ /wrappy/1.0.2: ++ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} ++ dev: false ++ ++ /yallist/4.0.0: ++ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} ++ dev: false ++ ++ /yocto-queue/0.1.0: ++ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} ++ engines: {node: '>=10'} ++ dev: false ++ ++ file:../..: ++ resolution: {directory: ../.., type: directory} ++ name: '@toots/shine.js' ++ version: 1.0.1 ++ dev: false +diff --git a/js/test/nextjs/public/encode.wav b/js/test/nextjs/public/encode.wav +new file mode 120000 +index 0000000..0f5f127 +--- /dev/null ++++ b/js/test/nextjs/public/encode.wav +@@ -0,0 +1 @@ ++../lib/encode.wav +\ No newline at end of file +diff --git a/js/test/nextjs/tsconfig.json b/js/test/nextjs/tsconfig.json +new file mode 100644 +index 0000000..66151f2 +--- /dev/null ++++ b/js/test/nextjs/tsconfig.json +@@ -0,0 +1,23 @@ ++{ ++ "compilerOptions": { ++ "target": "es5", ++ "lib": ["dom", "dom.iterable", "esnext"], ++ "allowJs": true, ++ "skipLibCheck": true, ++ "strict": true, ++ "forceConsistentCasingInFileNames": true, ++ "noEmit": true, ++ "esModuleInterop": true, ++ "module": "esnext", ++ "moduleResolution": "node", ++ "resolveJsonModule": true, ++ "isolatedModules": true, ++ "jsx": "preserve", ++ "incremental": true, ++ "paths": { ++ "@shine/*": ["./*"] ++ } ++ }, ++ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], ++ "exclude": ["node_modules"] ++} +diff --git a/js/test/node/encode.coffee b/js/test/node/encode.coffee +deleted file mode 100644 +index 3e1ba72..0000000 +--- a/js/test/node/encode.coffee ++++ /dev/null +@@ -1,58 +0,0 @@ +-Shine = require "../../dist/libshine.js" +-{Reader} = require "wav" +-fs = require "fs" +- +-console.log "" +-console.log "Executing encoding test" +- +-bitrate = 128 +-str = fs.createReadStream "../lib/encode.wav" +-fd = fs.openSync "./encode.mp3", "w" +-reader = new Reader +- +-str.pipe reader +- +-write = (encoded) -> +- return unless encoded.length > 0 +- buf = new Buffer encoded +- fs.writeSync fd, buf, 0, buf.length +- +-reader.on "format", (format) -> +- console.log "Got WAV file." +- +- shine = new Shine +- bitrate: bitrate +- samplerate: format.sampleRate +- channels: format.channels +- +- console.log "Encoding.." +- started = new Date +- duration = 0.0 +- samplerate = parseFloat format.sampleRate +- +- reader.on "data", (buf) -> +- samples = buf.length/(2*format.channels) +- +- duration += parseFloat(samples) / samplerate +- +- write shine.encode(convertInterleavedBuffer(buf, format.channels, samples)) +- +- reader.on "end", -> +- write shine.close() +- +- ended = new Date +- encodingTime = (ended.getTime() - started.getTime())/1000 +- console.log "Done encoding." +- console.log "File duration: #{duration.toFixed(2)} seconds" +- console.log "Encoding time: #{encodingTime.toFixed(2)} seconds" +- console.log "Encoding rate: #{(duration/encodingTime).toFixed(2)}X" +- process.exit 0 +- +-convertInterleavedBuffer = (buf, channels, samples) -> +- ret = new Array channels +- for chan in [0..channels-1] +- ret[chan] = new Int16Array samples +- for i in [0..samples-1] +- ret[chan][i] = buf.readInt16LE 2*(i*channels + chan) +- +- ret +diff --git a/js/test/node/encode.ts b/js/test/node/encode.ts +new file mode 100644 +index 0000000..cc971e1 +--- /dev/null ++++ b/js/test/node/encode.ts +@@ -0,0 +1,73 @@ ++import { Shine } from "@toots/shine.js"; ++import { Reader } from "wav"; ++import fs from "fs"; ++ ++const convertInterleavedBuffer = (buf, channels, samples) => { ++ const ret = new Array(channels); ++ for (let chan = 0; chan < channels; chan++) { ++ ret[chan] = new Int16Array(samples); ++ for (let i = 0; i < samples; i++) { ++ ret[chan][i] = buf.readInt16LE(2 * (i * channels + chan)); ++ } ++ } ++ ++ return ret; ++}; ++ ++const exec = async () => { ++ await Shine.initialized; ++ ++ console.log(""); ++ console.log("Executing encoding test"); ++ ++ const bitrate = 128; ++ const str = fs.createReadStream("../lib/encode.wav"); ++ const fd = fs.openSync("./encode.mp3", "w"); ++ const reader = new Reader(); ++ ++ str.pipe(reader); ++ ++ const write = encoded => { ++ if (encoded.length <= 0) return; ++ ++ const buf = Buffer.from(encoded); ++ fs.writeSync(fd, buf, 0, buf.length); ++ }; ++ ++ reader.on("format", format => { ++ console.log("Got WAV file."); ++ ++ const shine = new Shine({ ++ bitrate: bitrate, ++ samplerate: format.sampleRate, ++ channels: format.channels, ++ }); ++ ++ console.log("Encoding.."); ++ const started = new Date(); ++ let duration = 0.0; ++ const samplerate = format.sampleRate; ++ ++ reader.on("data", buf => { ++ const samples = buf.length / (2 * format.channels); ++ ++ duration += samples / samplerate; ++ ++ write(shine.encode(convertInterleavedBuffer(buf, format.channels, samples))); ++ }); ++ ++ reader.on("end", () => { ++ write(shine.close()); ++ ++ const ended = new Date(); ++ const encodingTime = (ended.getTime() - started.getTime()) / 1000; ++ console.log("Done encoding."); ++ console.log(`File duration: ${duration.toFixed(2)} seconds`); ++ console.log(`Encoding time: ${encodingTime.toFixed(2)} seconds`); ++ console.log(`Encoding rate: ${(duration / encodingTime).toFixed(2)}X`); ++ process.exit(0); ++ }); ++ }); ++}; ++ ++exec(); +diff --git a/js/test/node/package-lock.json b/js/test/node/package-lock.json +index 0096742..752a7c7 100644 +--- a/js/test/node/package-lock.json ++++ b/js/test/node/package-lock.json +@@ -1,49 +1,493 @@ + { + "name": "shine-js-test", + "version": "0.0.1", +- "lockfileVersion": 1, ++ "lockfileVersion": 2, + "requires": true, ++ "packages": { ++ "": { ++ "name": "shine-js-test", ++ "version": "0.0.1", ++ "dependencies": { ++ "@toots/shine.js": "file:../..", ++ "@types/node": "^18.11.18", ++ "ts-node": "^10.9.1", ++ "typescript": "^4.9.4", ++ "wav": "^1.0.2" ++ } ++ }, ++ "../..": { ++ "name": "@toots/shine.js", ++ "version": "1.0.1", ++ "license": "LGPL-2.0-only" ++ }, ++ "node_modules/@cspotcode/source-map-support": { ++ "version": "0.8.1", ++ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", ++ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", ++ "dependencies": { ++ "@jridgewell/trace-mapping": "0.3.9" ++ }, ++ "engines": { ++ "node": ">=12" ++ } ++ }, ++ "node_modules/@jridgewell/resolve-uri": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", ++ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", ++ "engines": { ++ "node": ">=6.0.0" ++ } ++ }, ++ "node_modules/@jridgewell/sourcemap-codec": { ++ "version": "1.4.14", ++ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", ++ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" ++ }, ++ "node_modules/@jridgewell/trace-mapping": { ++ "version": "0.3.9", ++ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", ++ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", ++ "dependencies": { ++ "@jridgewell/resolve-uri": "^3.0.3", ++ "@jridgewell/sourcemap-codec": "^1.4.10" ++ } ++ }, ++ "node_modules/@toots/shine.js": { ++ "resolved": "../..", ++ "link": true ++ }, ++ "node_modules/@tsconfig/node10": { ++ "version": "1.0.9", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", ++ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" ++ }, ++ "node_modules/@tsconfig/node12": { ++ "version": "1.0.11", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", ++ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" ++ }, ++ "node_modules/@tsconfig/node14": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", ++ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" ++ }, ++ "node_modules/@tsconfig/node16": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", ++ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" ++ }, ++ "node_modules/@types/node": { ++ "version": "18.11.18", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", ++ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" ++ }, ++ "node_modules/acorn": { ++ "version": "8.8.1", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", ++ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", ++ "bin": { ++ "acorn": "bin/acorn" ++ }, ++ "engines": { ++ "node": ">=0.4.0" ++ } ++ }, ++ "node_modules/acorn-walk": { ++ "version": "8.2.0", ++ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", ++ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", ++ "engines": { ++ "node": ">=0.4.0" ++ } ++ }, ++ "node_modules/arg": { ++ "version": "4.1.3", ++ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", ++ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" ++ }, ++ "node_modules/buffer-alloc": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", ++ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", ++ "dependencies": { ++ "buffer-alloc-unsafe": "^1.1.0", ++ "buffer-fill": "^1.0.0" ++ } ++ }, ++ "node_modules/buffer-alloc-unsafe": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", ++ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" ++ }, ++ "node_modules/buffer-fill": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", ++ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" ++ }, ++ "node_modules/buffer-from": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", ++ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" ++ }, ++ "node_modules/core-util-is": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", ++ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" ++ }, ++ "node_modules/create-require": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", ++ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" ++ }, ++ "node_modules/debug": { ++ "version": "2.6.9", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", ++ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", ++ "dependencies": { ++ "ms": "2.0.0" ++ } ++ }, ++ "node_modules/diff": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", ++ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", ++ "engines": { ++ "node": ">=0.3.1" ++ } ++ }, ++ "node_modules/inherits": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", ++ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" ++ }, ++ "node_modules/isarray": { ++ "version": "0.0.1", ++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", ++ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" ++ }, ++ "node_modules/make-error": { ++ "version": "1.3.6", ++ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", ++ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" ++ }, ++ "node_modules/ms": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", ++ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" ++ }, ++ "node_modules/readable-stream": { ++ "version": "1.1.14", ++ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", ++ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", ++ "dependencies": { ++ "core-util-is": "~1.0.0", ++ "inherits": "~2.0.1", ++ "isarray": "0.0.1", ++ "string_decoder": "~0.10.x" ++ } ++ }, ++ "node_modules/stream-parser": { ++ "version": "0.3.1", ++ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", ++ "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", ++ "dependencies": { ++ "debug": "2" ++ } ++ }, ++ "node_modules/string_decoder": { ++ "version": "0.10.31", ++ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", ++ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" ++ }, ++ "node_modules/ts-node": { ++ "version": "10.9.1", ++ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", ++ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", ++ "dependencies": { ++ "@cspotcode/source-map-support": "^0.8.0", ++ "@tsconfig/node10": "^1.0.7", ++ "@tsconfig/node12": "^1.0.7", ++ "@tsconfig/node14": "^1.0.0", ++ "@tsconfig/node16": "^1.0.2", ++ "acorn": "^8.4.1", ++ "acorn-walk": "^8.1.1", ++ "arg": "^4.1.0", ++ "create-require": "^1.1.0", ++ "diff": "^4.0.1", ++ "make-error": "^1.1.1", ++ "v8-compile-cache-lib": "^3.0.1", ++ "yn": "3.1.1" ++ }, ++ "bin": { ++ "ts-node": "dist/bin.js", ++ "ts-node-cwd": "dist/bin-cwd.js", ++ "ts-node-esm": "dist/bin-esm.js", ++ "ts-node-script": "dist/bin-script.js", ++ "ts-node-transpile-only": "dist/bin-transpile.js", ++ "ts-script": "dist/bin-script-deprecated.js" ++ }, ++ "peerDependencies": { ++ "@swc/core": ">=1.2.50", ++ "@swc/wasm": ">=1.2.50", ++ "@types/node": "*", ++ "typescript": ">=2.7" ++ }, ++ "peerDependenciesMeta": { ++ "@swc/core": { ++ "optional": true ++ }, ++ "@swc/wasm": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/typescript": { ++ "version": "4.9.4", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", ++ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", ++ "bin": { ++ "tsc": "bin/tsc", ++ "tsserver": "bin/tsserver" ++ }, ++ "engines": { ++ "node": ">=4.2.0" ++ } ++ }, ++ "node_modules/v8-compile-cache-lib": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", ++ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" ++ }, ++ "node_modules/wav": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/wav/-/wav-1.0.2.tgz", ++ "integrity": "sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==", ++ "dependencies": { ++ "buffer-alloc": "^1.1.0", ++ "buffer-from": "^1.0.0", ++ "debug": "^2.2.0", ++ "readable-stream": "^1.1.14", ++ "stream-parser": "^0.3.1" ++ } ++ }, ++ "node_modules/yn": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", ++ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", ++ "engines": { ++ "node": ">=6" ++ } ++ } ++ }, + "dependencies": { +- "coffee-script": { +- "version": "1.6.3", +- "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz", +- "integrity": "sha1-Y1XTLPGwTN/2tITl5xF4Ky8MOb4=" ++ "@cspotcode/source-map-support": { ++ "version": "0.8.1", ++ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", ++ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", ++ "requires": { ++ "@jridgewell/trace-mapping": "0.3.9" ++ } ++ }, ++ "@jridgewell/resolve-uri": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", ++ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" ++ }, ++ "@jridgewell/sourcemap-codec": { ++ "version": "1.4.14", ++ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", ++ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" ++ }, ++ "@jridgewell/trace-mapping": { ++ "version": "0.3.9", ++ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", ++ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", ++ "requires": { ++ "@jridgewell/resolve-uri": "^3.0.3", ++ "@jridgewell/sourcemap-codec": "^1.4.10" ++ } ++ }, ++ "@toots/shine.js": { ++ "version": "file:../.." ++ }, ++ "@tsconfig/node10": { ++ "version": "1.0.9", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", ++ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" ++ }, ++ "@tsconfig/node12": { ++ "version": "1.0.11", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", ++ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" ++ }, ++ "@tsconfig/node14": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", ++ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" ++ }, ++ "@tsconfig/node16": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", ++ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" ++ }, ++ "@types/node": { ++ "version": "18.11.18", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", ++ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" ++ }, ++ "acorn": { ++ "version": "8.8.1", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", ++ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" ++ }, ++ "acorn-walk": { ++ "version": "8.2.0", ++ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", ++ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" ++ }, ++ "arg": { ++ "version": "4.1.3", ++ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", ++ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" ++ }, ++ "buffer-alloc": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", ++ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", ++ "requires": { ++ "buffer-alloc-unsafe": "^1.1.0", ++ "buffer-fill": "^1.0.0" ++ } ++ }, ++ "buffer-alloc-unsafe": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", ++ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" ++ }, ++ "buffer-fill": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", ++ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" ++ }, ++ "buffer-from": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", ++ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" ++ }, ++ "core-util-is": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", ++ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" ++ }, ++ "create-require": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", ++ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "debug": { +- "version": "2.6.8", +- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", +- "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", ++ "version": "2.6.9", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", ++ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, ++ "diff": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", ++ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" ++ }, ++ "inherits": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", ++ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" ++ }, ++ "isarray": { ++ "version": "0.0.1", ++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", ++ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" ++ }, ++ "make-error": { ++ "version": "1.3.6", ++ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", ++ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" ++ }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "readable-stream": { +- "version": "0.0.4", +- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-0.0.4.tgz", +- "integrity": "sha1-8y124/uGM0SlSNeZIwBxc2ZbO40=" ++ "version": "1.1.14", ++ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", ++ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", ++ "requires": { ++ "core-util-is": "~1.0.0", ++ "inherits": "~2.0.1", ++ "isarray": "0.0.1", ++ "string_decoder": "~0.10.x" ++ } + }, + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "requires": { +- "debug": "2.6.8" ++ "debug": "2" + } + }, ++ "string_decoder": { ++ "version": "0.10.31", ++ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", ++ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" ++ }, ++ "ts-node": { ++ "version": "10.9.1", ++ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", ++ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", ++ "requires": { ++ "@cspotcode/source-map-support": "^0.8.0", ++ "@tsconfig/node10": "^1.0.7", ++ "@tsconfig/node12": "^1.0.7", ++ "@tsconfig/node14": "^1.0.0", ++ "@tsconfig/node16": "^1.0.2", ++ "acorn": "^8.4.1", ++ "acorn-walk": "^8.1.1", ++ "arg": "^4.1.0", ++ "create-require": "^1.1.0", ++ "diff": "^4.0.1", ++ "make-error": "^1.1.1", ++ "v8-compile-cache-lib": "^3.0.1", ++ "yn": "3.1.1" ++ } ++ }, ++ "typescript": { ++ "version": "4.9.4", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", ++ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==" ++ }, ++ "v8-compile-cache-lib": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", ++ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" ++ }, + "wav": { +- "version": "0.1.0", +- "resolved": "https://registry.npmjs.org/wav/-/wav-0.1.0.tgz", +- "integrity": "sha1-5wTSp2nqIz858tZ5Xout1l9YsAk=", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/wav/-/wav-1.0.2.tgz", ++ "integrity": "sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==", + "requires": { +- "debug": "2.6.8", +- "readable-stream": "0.0.4", +- "stream-parser": "0.3.1" ++ "buffer-alloc": "^1.1.0", ++ "buffer-from": "^1.0.0", ++ "debug": "^2.2.0", ++ "readable-stream": "^1.1.14", ++ "stream-parser": "^0.3.1" + } ++ }, ++ "yn": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", ++ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } + } +diff --git a/js/test/node/package.json b/js/test/node/package.json +index 5160dab..650299c 100644 +--- a/js/test/node/package.json ++++ b/js/test/node/package.json +@@ -2,26 +2,16 @@ + "name": "shine-js-test", + "description": "Test encoder for libshine.js", + "version": "0.0.1", +- "homepage": "https://github.com/savonet/shine", + "author": "Romain Beauxis <toots@rastageeks.org", +- "repository": { +- "type": "git", +- "url": "git://github.com/savonet/shine" +- }, +- "bugs": { +- "mail": "toots@rastageeks.org", +- "url": "http://github.com/savonet/shine/issues" +- }, +- "main": "test.coffee", + "scripts": { +- "test": "coffee ./encode.coffee && coffee ./rounds.coffee" +- }, +- "engine": { +- "node": ">= 0.10.7", +- "npm": "1" ++ "test": "ts-node ./encode.ts && ts-node ./rounds.ts" + }, + "dependencies": { +- "coffee-script": "1.6.3", +- "wav": "0.1.0" ++ "@toots/shine.js": "file:../..", ++ "@types/node": "^18.11.18", ++ "@types/wav": "^1.0.1", ++ "ts-node": "^10.9.1", ++ "typescript": "^4.9.4", ++ "wav": "^1.0.2" + } + } +diff --git a/js/test/node/pnpm-lock.yaml b/js/test/node/pnpm-lock.yaml +new file mode 100644 +index 0000000..58a8b69 +--- /dev/null ++++ b/js/test/node/pnpm-lock.yaml +@@ -0,0 +1,227 @@ ++lockfileVersion: 5.4 ++ ++specifiers: ++ '@toots/shine.js': file:../.. ++ '@types/node': ^18.11.18 ++ '@types/wav': ^1.0.1 ++ ts-node: ^10.9.1 ++ typescript: ^4.9.4 ++ wav: ^1.0.2 ++ ++dependencies: ++ '@toots/shine.js': file:../.. ++ '@types/node': 18.11.18 ++ '@types/wav': 1.0.1 ++ ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq ++ typescript: 4.9.4 ++ wav: 1.0.2 ++ ++packages: ++ ++ /@cspotcode/source-map-support/0.8.1: ++ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} ++ engines: {node: '>=12'} ++ dependencies: ++ '@jridgewell/trace-mapping': 0.3.9 ++ dev: false ++ ++ /@jridgewell/resolve-uri/3.1.0: ++ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} ++ engines: {node: '>=6.0.0'} ++ dev: false ++ ++ /@jridgewell/sourcemap-codec/1.4.14: ++ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} ++ dev: false ++ ++ /@jridgewell/trace-mapping/0.3.9: ++ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} ++ dependencies: ++ '@jridgewell/resolve-uri': 3.1.0 ++ '@jridgewell/sourcemap-codec': 1.4.14 ++ dev: false ++ ++ /@tsconfig/node10/1.0.9: ++ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} ++ dev: false ++ ++ /@tsconfig/node12/1.0.11: ++ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} ++ dev: false ++ ++ /@tsconfig/node14/1.0.3: ++ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} ++ dev: false ++ ++ /@tsconfig/node16/1.0.3: ++ resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} ++ dev: false ++ ++ /@types/node/18.11.18: ++ resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} ++ dev: false ++ ++ /@types/wav/1.0.1: ++ resolution: {integrity: sha512-AKJeM5mqO1pdR2/HaTUQzSCm12No36KUM1larivXUmsLx+4JmMuC2Tv0kCdZzTx66h7IH2Xr92DGc9NQsXxa9Q==} ++ dependencies: ++ '@types/node': 18.11.18 ++ dev: false ++ ++ /acorn-walk/8.2.0: ++ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} ++ engines: {node: '>=0.4.0'} ++ dev: false ++ ++ /acorn/8.8.1: ++ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} ++ engines: {node: '>=0.4.0'} ++ hasBin: true ++ dev: false ++ ++ /arg/4.1.3: ++ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} ++ dev: false ++ ++ /buffer-alloc-unsafe/1.1.0: ++ resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} ++ dev: false ++ ++ /buffer-alloc/1.2.0: ++ resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} ++ dependencies: ++ buffer-alloc-unsafe: 1.1.0 ++ buffer-fill: 1.0.0 ++ dev: false ++ ++ /buffer-fill/1.0.0: ++ resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} ++ dev: false ++ ++ /buffer-from/1.1.2: ++ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} ++ dev: false ++ ++ /core-util-is/1.0.3: ++ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} ++ dev: false ++ ++ /create-require/1.1.1: ++ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} ++ dev: false ++ ++ /debug/2.6.9: ++ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} ++ peerDependencies: ++ supports-color: '*' ++ peerDependenciesMeta: ++ supports-color: ++ optional: true ++ dependencies: ++ ms: 2.0.0 ++ dev: false ++ ++ /diff/4.0.2: ++ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} ++ engines: {node: '>=0.3.1'} ++ dev: false ++ ++ /inherits/2.0.4: ++ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ++ dev: false ++ ++ /isarray/0.0.1: ++ resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} ++ dev: false ++ ++ /make-error/1.3.6: ++ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} ++ dev: false ++ ++ /ms/2.0.0: ++ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ++ dev: false ++ ++ /readable-stream/1.1.14: ++ resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} ++ dependencies: ++ core-util-is: 1.0.3 ++ inherits: 2.0.4 ++ isarray: 0.0.1 ++ string_decoder: 0.10.31 ++ dev: false ++ ++ /stream-parser/0.3.1: ++ resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} ++ dependencies: ++ debug: 2.6.9 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /string_decoder/0.10.31: ++ resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} ++ dev: false ++ ++ /ts-node/10.9.1_awa2wsr5thmg3i7jqycphctjfq: ++ resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} ++ hasBin: true ++ peerDependencies: ++ '@swc/core': '>=1.2.50' ++ '@swc/wasm': '>=1.2.50' ++ '@types/node': '*' ++ typescript: '>=2.7' ++ peerDependenciesMeta: ++ '@swc/core': ++ optional: true ++ '@swc/wasm': ++ optional: true ++ dependencies: ++ '@cspotcode/source-map-support': 0.8.1 ++ '@tsconfig/node10': 1.0.9 ++ '@tsconfig/node12': 1.0.11 ++ '@tsconfig/node14': 1.0.3 ++ '@tsconfig/node16': 1.0.3 ++ '@types/node': 18.11.18 ++ acorn: 8.8.1 ++ acorn-walk: 8.2.0 ++ arg: 4.1.3 ++ create-require: 1.1.1 ++ diff: 4.0.2 ++ make-error: 1.3.6 ++ typescript: 4.9.4 ++ v8-compile-cache-lib: 3.0.1 ++ yn: 3.1.1 ++ dev: false ++ ++ /typescript/4.9.4: ++ resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} ++ engines: {node: '>=4.2.0'} ++ hasBin: true ++ dev: false ++ ++ /v8-compile-cache-lib/3.0.1: ++ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} ++ dev: false ++ ++ /wav/1.0.2: ++ resolution: {integrity: sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==} ++ dependencies: ++ buffer-alloc: 1.2.0 ++ buffer-from: 1.1.2 ++ debug: 2.6.9 ++ readable-stream: 1.1.14 ++ stream-parser: 0.3.1 ++ transitivePeerDependencies: ++ - supports-color ++ dev: false ++ ++ /yn/3.1.1: ++ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} ++ engines: {node: '>=6'} ++ dev: false ++ ++ file:../..: ++ resolution: {directory: ../.., type: directory} ++ name: '@toots/shine.js' ++ version: 1.0.3 ++ dev: false +diff --git a/js/test/node/rounds.coffee b/js/test/node/rounds.coffee +deleted file mode 100644 +index 7be6690..0000000 +--- a/js/test/node/rounds.coffee ++++ /dev/null +@@ -1,6 +0,0 @@ +-Shine = require "../../dist/libshine.js" +-runRoundsTest = require "../lib/rounds.js" +- +-console.log "" +-runRoundsTest Shine, (s) -> +- console.log s +diff --git a/js/test/node/rounds.ts b/js/test/node/rounds.ts +new file mode 100644 +index 0000000..6f3e664 +--- /dev/null ++++ b/js/test/node/rounds.ts +@@ -0,0 +1,11 @@ ++import { Shine } from "@toots/shine.js"; ++import runRoundsTest from "../lib/rounds"; ++ ++const exec = async () => { ++ await Shine.initialized; ++ ++ console.log(""); ++ runRoundsTest(Shine, s => console.log(s)); ++}; ++ ++exec(); +diff --git a/js/test/node/tsconfig.json b/js/test/node/tsconfig.json +new file mode 100644 +index 0000000..d1045e4 +--- /dev/null ++++ b/js/test/node/tsconfig.json +@@ -0,0 +1,8 @@ ++{ ++ "include": ["**/*.ts"], ++ "compilerOptions": { ++ "allowJs": true, ++ "skipLibCheck": true, ++ "esModuleInterop": true ++ } ++} +diff --git a/src/bin/main.c b/src/bin/main.c +index ab16fea..b7b70a4 100644 +--- a/src/bin/main.c ++++ b/src/bin/main.c +@@ -35,32 +35,25 @@ int _verbose = 0; + int stereo = STEREO; + int force_mono = 0; + +-int verbose() +-{ +- return _verbose; +-} ++int verbose() { return _verbose; } + + /* Write out the MP3 file */ +-int write_mp3(long bytes, void *buffer, void *config) +-{ +- return fwrite(buffer, sizeof(unsigned char), bytes, outfile) / sizeof(unsigned char); ++int write_mp3(long bytes, void *buffer, void *config) { ++ return fwrite(buffer, sizeof(unsigned char), bytes, outfile) / ++ sizeof(unsigned char); + } + + /* Output error message and exit */ +-void error(char *s) +-{ ++void error(char *s) { + fprintf(stderr, "Error: %s\n", s); + exit(1); + } + +-static void print_name() +-{ +- printf("shineenc (Liquidsoap version)\n"); +-} ++static void print_name() { printf("shineenc (Liquidsoap version)\n"); } + +-static void print_usage() +-{ ++static void print_usage() { + printf("Usage: shineenc [options] <infile> <outfile>\n\n"); ++ printf("Use \"-\" for standard input or output.\n\n"); + printf("Options:\n"); + printf(" -h this help message\n"); + printf(" -b <bitrate> set the bitrate [8-320], default 128kbit\n"); +@@ -73,88 +66,88 @@ static void print_usage() + } + + /* Use these default settings, can be overridden */ +-static void set_defaults(shine_config_t *config) +-{ ++static void set_defaults(shine_config_t *config) { + shine_set_config_mpeg_defaults(&config->mpeg); + } + + /* Parse command line arguments */ +-static int parse_command(int argc, char** argv, shine_config_t *config) +-{ ++static int parse_command(int argc, char **argv, shine_config_t *config) { + int i = 0; + +- if(argc < 3) return 0; ++ if (argc < 3) ++ return 0; + + while (argv[++i][0] == '-' && argv[i][1] != '\000' && argv[i][1] != ' ') + switch (argv[i][1]) { +- case 'b': +- config->mpeg.bitr = atoi(argv[++i]); +- break; +- +- case 'm': +- force_mono = 1; +- break; +- +- case 'j': +- stereo = JOINT_STEREO; +- break; +- +- case 'd': +- stereo = DUAL_CHANNEL; +- break; +- +- case 'c': +- config->mpeg.copyright = 1; +- break; +- +- case 'q': +- quiet = 1; +- _verbose = 0; +- break; +- +- case 'v': +- _verbose = 1; +- quiet = 0; +- break; +- +- case 'h': +- default : +- return 0; ++ case 'b': ++ config->mpeg.bitr = atoi(argv[++i]); ++ break; ++ ++ case 'm': ++ force_mono = 1; ++ break; ++ ++ case 'j': ++ stereo = JOINT_STEREO; ++ break; ++ ++ case 'd': ++ stereo = DUAL_CHANNEL; ++ break; ++ ++ case 'c': ++ config->mpeg.copyright = 1; ++ break; ++ ++ case 'q': ++ quiet = 1; ++ _verbose = 0; ++ break; ++ ++ case 'v': ++ _verbose = 1; ++ quiet = 0; ++ break; ++ ++ case 'h': ++ default: ++ return 0; + } + +- if (argc - i != 2) return 0; ++ if (argc - i != 2) ++ return 0; + infname = argv[i++]; + outfname = argv[i]; + return 1; + } + + /* Print some info about what we're going to encode */ +-static void check_config(shine_config_t *config) +-{ +- static char *version_names[4] = { "2.5", "reserved", "II", "I" }; +- static char *mode_names[4] = { "stereo", "joint-stereo", "dual-channel", "mono" }; +- static char *demp_names[4] = { "none", "50/15us", "", "CITT" }; ++static void check_config(shine_config_t *config) { ++ static char *version_names[4] = {"2.5", "reserved", "II", "I"}; ++ static char *mode_names[4] = {"stereo", "joint-stereo", "dual-channel", ++ "mono"}; ++ static char *demp_names[4] = {"none", "50/15us", "", "CITT"}; + + printf("MPEG-%s layer III, %s Psychoacoustic Model: Shine\n", +- version_names[shine_check_config(config->wave.samplerate, config->mpeg.bitr)], +- mode_names[config->mpeg.mode]); ++ version_names[shine_check_config(config->wave.samplerate, ++ config->mpeg.bitr)], ++ mode_names[config->mpeg.mode]); + printf("Bitrate: %d kbps ", config->mpeg.bitr); +- printf("De-emphasis: %s %s %s\n", +- demp_names[config->mpeg.emph], +- ((config->mpeg.original) ? "Original" : ""), +- ((config->mpeg.copyright) ? "(C)" : "")); ++ printf("De-emphasis: %s %s %s\n", demp_names[config->mpeg.emph], ++ ((config->mpeg.original) ? "Original" : ""), ++ ((config->mpeg.copyright) ? "(C)" : "")); + printf("Encoding \"%s\" to \"%s\"\n", infname, outfname); + } + +-int main(int argc, char **argv) +-{ +- wave_t wave; +- time_t start_time, end_time; +- int16_t buffer[2*SHINE_MAX_SAMPLES]; ++int main(int argc, char **argv) { ++ wave_t wave; ++ time_t start_time, end_time; ++ int16_t buffer[2 * SHINE_MAX_SAMPLES]; + shine_config_t config; +- shine_t s; +- int written; +- unsigned char *data; ++ shine_t s; ++ int written; ++ unsigned char *data; ++ int samples_per_pass; + + time(&start_time); + +@@ -168,7 +161,8 @@ int main(int argc, char **argv) + + quiet = quiet || !strcmp(outfname, "-"); + +- if (!quiet) print_name(); ++ if (!quiet) ++ print_name(); + + /* Open the input file and fill the config shine_wave_t header */ + if (!wave_open(infname, &wave, &config, quiet)) +@@ -205,17 +199,17 @@ int main(int argc, char **argv) + // assert(s != NULL); + + /* Print some info about the file about to be created (optional) */ +- if (!quiet) check_config(&config); ++ if (!quiet) ++ check_config(&config); + +- int samples_per_pass = shine_samples_per_pass(s); ++ samples_per_pass = shine_samples_per_pass(s); + + /* All the magic happens here */ + while (wave_get(buffer, &wave, samples_per_pass)) { + data = shine_encode_buffer_interleaved(s, buffer, &written); +- if ( write_mp3(written, data, &config) != written ) +- { +- fprintf(stderr, "shineenc: write error\n"); +- return 1; ++ if (write_mp3(written, data, &config) != written) { ++ fprintf(stderr, "shineenc: write error\n"); ++ return 1; + } + } + +@@ -235,7 +229,9 @@ int main(int argc, char **argv) + time(&end_time); + end_time -= start_time; + if (!quiet) +- printf("Finished in %02ld:%02ld:%02ld (%01.1fx realtime)\n", end_time / 3600, (end_time / 60) % 60, end_time % 60, (float)wave.duration / (float)end_time); ++ printf("Finished in %02ld:%02ld:%02ld (%01.1fx realtime)\n", ++ end_time / 3600, (end_time / 60) % 60, end_time % 60, ++ (float)wave.duration / (float)end_time); + + return 0; + } +diff --git a/src/bin/main.h b/src/bin/main.h +index 52fbbb2..7ab9691 100644 +--- a/src/bin/main.h ++++ b/src/bin/main.h +@@ -2,6 +2,6 @@ + #define MAIN_H + + void error(char *s); +-int verbose(); ++int verbose(); + + #endif +diff --git a/src/bin/wave.c b/src/bin/wave.c +index 5d19004..3c7ab81 100644 +--- a/src/bin/wave.c ++++ b/src/bin/wave.c +@@ -9,17 +9,32 @@ + #include "layer3.h" + + /* Local header */ +-#include <stdint.h> +-#include <string.h> + #include "main.h" + #include "wave.h" ++#include <stdint.h> ++#include <string.h> + + /* RISC OS specifics */ +-#define WAVE 0xfb1 /* Wave filetype */ +-#define DATA 0xffd /* Data filetype */ ++#define WAVE 0xfb1 /* Wave filetype */ ++#define DATA 0xffd /* Data filetype */ + + #define MODE_MONO 3 + ++#ifdef SHINE_BIG_ENDIAN ++#if defined(SHINE_HAVE_BSWAP_H) ++#include <byteswap.h> ++#elif defined(__GNUC__) && \ ++ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) ++#define bswap_16(x) __builtin_bswap16(x) ++#define bswap_32(x) __builtin_bswap32(x) ++#else ++#define bswap_16(x) ((((x) >> 8) & 0xff) | (((x)&0xff) << 8)) ++#define bswap_32(x) \ ++ ((((x)&0xFF) << 24) | (((x) >> 24) & 0xFF) | (((x)&0x0000FF00) << 8) | \ ++ (((x)&0x00FF0000) >> 8)) ++#endif ++#endif ++ + typedef struct { + char id[4]; + uint32_t length; +@@ -32,14 +47,28 @@ typedef struct { + + typedef struct { + riff_chunk_header_t header; +- uint16_t format; /* MS PCM = 1 */ +- uint16_t channels; /* channels, mono = 1, stereo = 2 */ +- uint32_t sample_rate; /* samples per second = 44100 */ +- uint32_t byte_rate; /* bytes per second = samp_rate * byte_samp = 176400 */ +- uint16_t frame_size; /* block align (bytes per sample) = channels * bits_per_sample / 8 = 4 */ +- uint16_t depth; /* bits per sample = 16 for MS PCM (format specific) */ ++ uint16_t format; /* MS PCM = 1 */ ++ uint16_t channels; /* channels, mono = 1, stereo = 2 */ ++ uint32_t sample_rate; /* samples per second = 44100 */ ++ uint32_t byte_rate; /* bytes per second = samp_rate * byte_samp = 176400 */ ++ uint16_t frame_size; /* block align (bytes per sample) = channels * ++ bits_per_sample / 8 = 4 */ ++ uint16_t depth; /* bits per sample = 16 for MS PCM (format specific) */ + } fmt_chunk_t; + ++#ifdef SHINE_BIG_ENDIAN ++#define native_fmt_chunk(fmt) \ ++ { \ ++ fmt.header.length = bswap_32(fmt.header.length); \ ++ fmt.format = bswap_16(fmt.format); \ ++ fmt.channels = bswap_16(fmt.channels); \ ++ fmt.sample_rate = bswap_32(fmt.sample_rate); \ ++ fmt.byte_rate = bswap_32(fmt.byte_rate); \ ++ fmt.frame_size = bswap_16(fmt.frame_size); \ ++ fmt.depth = bswap_16(fmt.depth); \ ++ } ++#endif ++ + void wave_seek(FILE *file, int has_seek, uint32_t bytes) { + uint32_t i; + if (has_seek == 1) +@@ -50,15 +79,15 @@ void wave_seek(FILE *file, int has_seek, uint32_t bytes) { + } + } + +-unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4], riff_chunk_header_t *header) +-{ ++unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4], ++ riff_chunk_header_t *header) { + unsigned char found = 0; + uint32_t chunk_length; + + if (verbose()) + fprintf(stderr, "Looking for chunk '%s'\n", id); + +- while(!found) { ++ while (!found) { + if (fread(header, sizeof(riff_chunk_header_t), 1, file) != 1) { + if (feof(file)) + return 0; +@@ -69,24 +98,20 @@ unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4], + /* chunks must be word-aligned, chunk data doesn't need to */ + chunk_length = header->length + header->length % 2; + if (verbose()) { +- fprintf(stderr, "Found chunk '%.4s', length: %u\n", header->id, header->length); ++ fprintf(stderr, "Found chunk '%.4s', length: %u\n", header->id, ++ header->length); + } + + if (strncmp(header->id, id, 4) == 0) + return 1; +- ++ + wave_seek(file, has_seek, chunk_length); + } + + return 1; + } + +- +-void wave_close(wave_t *wave) +-{ +- fclose(wave->file); +-} +- ++void wave_close(wave_t *wave) { fclose(wave->file); } + + /* + * wave_open: +@@ -94,16 +119,17 @@ void wave_close(wave_t *wave) + * Opens and verifies the header of the Input Wave file. The file pointer is + * left pointing to the start of the samples. + */ +-unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, int quiet) +-{ +- static char *channel_mappings[] = { NULL, "mono", "stereo" }; ++unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, ++ int quiet) { ++ static char *channel_mappings[] = {NULL, "mono", "stereo"}; + wave_chunk_t wave_chunk; + fmt_chunk_t fmt_chunk; + riff_chunk_header_t data_chunk; + uint32_t fmt_data, fmt_length; + + if (!strcmp(fname, "-")) { +- /* TODO: support raw PCM stream with commandline parameters specifying format */ ++ /* TODO: support raw PCM stream with commandline parameters specifying ++ * format */ + wave->file = stdin; + wave->has_seek = 0; + } else { +@@ -124,14 +150,19 @@ unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, + error("Not a WAVE audio file"); + + /* Check the fmt chunk */ +- if (!wave_get_chunk_header(wave->file, wave->has_seek, "fmt ", (riff_chunk_header_t *)&fmt_chunk)) ++ if (!wave_get_chunk_header(wave->file, wave->has_seek, "fmt ", ++ (riff_chunk_header_t *)&fmt_chunk)) + error("WAVE fmt chunk not found"); + + fmt_data = sizeof(fmt_chunk_t) - sizeof(riff_chunk_header_t); + +- if(fread(&fmt_chunk.format, fmt_data, 1, wave->file) != 1) ++ if (fread(&fmt_chunk.format, fmt_data, 1, wave->file) != 1) + error("Read error"); + ++#ifdef SHINE_BIG_ENDIAN ++ native_fmt_chunk(fmt_chunk); ++#endif ++ + if (verbose()) + fprintf(stderr, "WAVE format: %u\n", fmt_chunk.format); + +@@ -153,34 +184,31 @@ unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, + if (!wave_get_chunk_header(wave->file, wave->has_seek, "data", &data_chunk)) + error("WAVE data chunk not found"); + +- config->wave.channels = fmt_chunk.channels; ++ config->wave.channels = fmt_chunk.channels; + config->wave.samplerate = fmt_chunk.sample_rate; + + wave->channels = fmt_chunk.channels; +- wave->length = data_chunk.length; ++ wave->length = data_chunk.length; + wave->duration = data_chunk.length / fmt_chunk.byte_rate; + + if (!quiet) + printf("%s, %s %ldHz %ldbit, duration: %02ld:%02ld:%02ld\n", +- "WAVE PCM Data", channel_mappings[fmt_chunk.channels], (long)fmt_chunk.sample_rate, (long)fmt_chunk.depth, +- (long)wave->duration / 3600, (long)(wave->duration / 60) % 60, (long)wave->duration % 60); ++ "WAVE PCM Data", channel_mappings[fmt_chunk.channels], ++ (long)fmt_chunk.sample_rate, (long)fmt_chunk.depth, ++ (long)wave->duration / 3600, (long)(wave->duration / 60) % 60, ++ (long)wave->duration % 60); + return 1; + } + + #ifdef SHINE_BIG_ENDIAN +-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) +-#define bswap_16(x) __builtin_bswap16(x) +-#else +-#define bswap_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)) +-#endif +- +-void swap_buffer(int16_t *sample_buffer, int length) +-{ ++void swap_buffer(int16_t *sample_buffer, int length) { + int16_t *end = sample_buffer + length; + + if (length >= 2 * sizeof(long) / sizeof(int16_t)) { +- const unsigned long mask = (~0UL / 0xffff) * 0xff; /* 0x00ff00ff or 0x00ff00ff00ff00ff */ +- unsigned long *long_ptr = (unsigned long *)((unsigned long)sample_buffer & -sizeof(long)); ++ const unsigned long mask = ++ (~0UL / 0xffff) * 0xff; /* 0x00ff00ff or 0x00ff00ff00ff00ff */ ++ unsigned long *long_ptr = ++ (unsigned long *)((unsigned long)sample_buffer & -sizeof(long)); + + /* make sample_buffer aligned on word boundary */ + if ((int16_t *)long_ptr != sample_buffer) { +@@ -212,18 +240,19 @@ void swap_buffer(int16_t *sample_buffer, int length) + */ + + /* TODO: respect data chunk length */ +-int read_samples(int16_t *sample_buffer, int frame_size, FILE *file) +-{ +- int samples_read=0; ++int read_samples(int16_t *sample_buffer, int frame_size, FILE *file) { ++ int samples_read = 0; + +- samples_read = fread(sample_buffer,sizeof(int16_t),frame_size, file); ++ samples_read = fread(sample_buffer, sizeof(int16_t), frame_size, file); + + #ifdef SHINE_BIG_ENDIAN + swap_buffer(sample_buffer, samples_read); + #endif + +- if(samples_read<frame_size && samples_read>0) { /* Pad sample with zero's */ +- memset(sample_buffer + samples_read, 0, (frame_size - samples_read) * sizeof(int16_t)); ++ if (samples_read < frame_size && ++ samples_read > 0) { /* Pad sample with zero's */ ++ memset(sample_buffer + samples_read, 0, ++ (frame_size - samples_read) * sizeof(int16_t)); + samples_read = frame_size; + } + +@@ -236,8 +265,6 @@ int read_samples(int16_t *sample_buffer, int frame_size, FILE *file) + * Expects an interleaved 16bit pcm stream from read_samples, which it + * reads into the given buffer. + */ +-int wave_get(int16_t *buffer, wave_t *wave, int samp_per_pass) +-{ +- return read_samples(buffer,samp_per_pass*wave->channels, wave->file); ++int wave_get(int16_t *buffer, wave_t *wave, int samp_per_pass) { ++ return read_samples(buffer, samp_per_pass * wave->channels, wave->file); + } +- +diff --git a/src/bin/wave.h b/src/bin/wave.h +index 5a290a0..b77f0b5 100644 +--- a/src/bin/wave.h ++++ b/src/bin/wave.h +@@ -4,15 +4,16 @@ + #include <stdio.h> + + typedef struct { +- FILE *file; +- int has_seek; +- int channels; +- long length; +- long duration; ++ FILE *file; ++ int has_seek; ++ int channels; ++ long length; ++ long duration; + } wave_t; + +-unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, int quiet); +-int wave_get(int16_t *buffer, wave_t *wave, int samp_per_frame); ++unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, ++ int quiet); ++int wave_get(int16_t *buffer, wave_t *wave, int samp_per_frame); + void wave_close(wave_t *wave); + + #endif +diff --git a/src/lib/bitstream.c b/src/lib/bitstream.c +index 29afcb1..9408f2c 100644 +--- a/src/lib/bitstream.c ++++ b/src/lib/bitstream.c +@@ -7,17 +7,16 @@ + * Removed unused functions. Feb 2001 P.Everett + */ + +-#include "types.h" + #include "bitstream.h" ++#include "types.h" + +-#if !defined(__APPLE__) ++#if !defined(__APPLE__) && !defined(__FreeBSD__) + #include <malloc.h> + #endif + + /* open the device to write the bit stream into it */ +-void shine_open_bit_stream(bitstream_t *bs, int size) +-{ +- bs->data = (unsigned char *)malloc(size*sizeof(unsigned char)); ++void shine_open_bit_stream(bitstream_t *bs, int size) { ++ bs->data = (unsigned char *)malloc(size * sizeof(unsigned char)); + bs->data_size = size; + bs->data_position = 0; + bs->cache = 0; +@@ -25,8 +24,7 @@ void shine_open_bit_stream(bitstream_t *bs, int size) + } + + /*close the device containing the bit stream */ +-void shine_close_bit_stream(bitstream_t *bs) +-{ ++void shine_close_bit_stream(bitstream_t *bs) { + if (bs->data) + free(bs->data); + } +@@ -39,42 +37,40 @@ void shine_close_bit_stream(bitstream_t *bs) + * val = value to write into the buffer + * N = number of bits of val + */ +-void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N) +-{ ++void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N) { + #ifdef DEBUG +- if (N > 32) +- printf("Cannot write more than 32 bits at a time.\n"); +- if (N < 32 && (val >> N) != 0) +- printf("Upper bits (higher than %d) are not all zeros.\n", N); ++ if (N > 32) ++ printf("Cannot write more than 32 bits at a time.\n"); ++ if (N < 32 && (val >> N) != 0) ++ printf("Upper bits (higher than %d) are not all zeros.\n", N); + #endif + +- if (bs->cache_bits > N) { +- bs->cache_bits -= N; +- bs->cache |= val << bs->cache_bits; +- } else { +- if (bs->data_position + sizeof(unsigned int) >= bs->data_size) { +- bs->data = (unsigned char *)realloc(bs->data, bs->data_size + (bs->data_size / 2)); +- bs->data_size += (bs->data_size / 2); +- } ++ if (bs->cache_bits > N) { ++ bs->cache_bits -= N; ++ bs->cache |= val << bs->cache_bits; ++ } else { ++ if (bs->data_position + sizeof(unsigned int) >= bs->data_size) { ++ bs->data = (unsigned char *)realloc(bs->data, ++ bs->data_size + (bs->data_size / 2)); ++ bs->data_size += (bs->data_size / 2); ++ } + +- N -= bs->cache_bits; +- bs->cache |= val >> N; ++ N -= bs->cache_bits; ++ bs->cache |= val >> N; + #ifdef SHINE_BIG_ENDIAN +- *(unsigned int*)(bs->data + bs->data_position) = bs->cache; ++ *(unsigned int *)(bs->data + bs->data_position) = bs->cache; + #else +- *(unsigned int*)(bs->data + bs->data_position) = SWAB32(bs->cache); ++ *(unsigned int *)(bs->data + bs->data_position) = SWAB32(bs->cache); + #endif +- bs->data_position += sizeof(unsigned int); +- bs->cache_bits = 32 - N; +- if (N != 0) +- bs->cache = val << bs->cache_bits; +- else +- bs->cache = 0; +- } ++ bs->data_position += sizeof(unsigned int); ++ bs->cache_bits = 32 - N; ++ if (N != 0) ++ bs->cache = val << bs->cache_bits; ++ else ++ bs->cache = 0; ++ } + } + +-int shine_get_bits_count(bitstream_t *bs) +-{ +- return bs->data_position * 8 + 32 - bs->cache_bits; ++int shine_get_bits_count(bitstream_t *bs) { ++ return bs->data_position * 8 + 32 - bs->cache_bits; + } +- +diff --git a/src/lib/bitstream.h b/src/lib/bitstream.h +index d910ef9..4f7efb6 100644 +--- a/src/lib/bitstream.h ++++ b/src/lib/bitstream.h +@@ -1,28 +1,29 @@ + #ifndef BITSTREAM_H + #define BITSTREAM_H + +-typedef struct bit_stream_struc { +- unsigned char *data; /* Processed data */ +- int data_size; /* Total data size */ +- int data_position; /* Data position */ +- unsigned int cache; /* bit stream cache */ +- int cache_bits; /* free bits in cache */ ++typedef struct bit_stream_struc { ++ unsigned char *data; /* Processed data */ ++ int data_size; /* Total data size */ ++ int data_position; /* Data position */ ++ unsigned int cache; /* bit stream cache */ ++ int cache_bits; /* free bits in cache */ + } bitstream_t; + + /* "bit_stream.h" Definitions */ + +-#define MINIMUM 4 /* Minimum size of the buffer in bytes */ +-#define MAX_LENGTH 32 /* Maximum length of word written or +- read from bit stream */ ++#define MINIMUM 4 /* Minimum size of the buffer in bytes */ ++#define MAX_LENGTH \ ++ 32 /* Maximum length of word written or \ ++ read from bit stream */ + +-#define BUFFER_SIZE 4096 ++#define BUFFER_SIZE 4096 + +-#define MIN(A, B) ((A) < (B) ? (A) : (B)) +-#define MAX(A, B) ((A) > (B) ? (A) : (B)) ++#define MIN(A, B) ((A) < (B) ? (A) : (B)) ++#define MAX(A, B) ((A) > (B) ? (A) : (B)) + +-void shine_open_bit_stream(bitstream_t *bs,const int size); ++void shine_open_bit_stream(bitstream_t *bs, const int size); + void shine_close_bit_stream(bitstream_t *bs); +-void shine_putbits(bitstream_t *bs,unsigned int val, unsigned int N); +-int shine_get_bits_count(bitstream_t *bs); ++void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N); ++int shine_get_bits_count(bitstream_t *bs); + + #endif +diff --git a/src/lib/huffman.c b/src/lib/huffman.c +index d4bd6aa..854ae41 100644 +--- a/src/lib/huffman.c ++++ b/src/lib/huffman.c +@@ -1,120 +1,248 @@ + /* huffman.c */ + +-#include "types.h" + #include "huffman.h" + #include "bitstream.h" + #include "l3bitstream.h" ++#include "types.h" + +-const HUFFBITS dmask = 1 << (((sizeof(HUFFBITS))<<3)-1); +-const unsigned int hs = sizeof(HUFFBITS)<<3; ++const HUFFBITS dmask = 1 << (((sizeof(HUFFBITS)) << 3) - 1); ++const unsigned int hs = sizeof(HUFFBITS) << 3; + +-static const HUFFBITS t1HB[] = {1, 1, 1, 0}; +-static const HUFFBITS t2HB[] = {1, 2, 1, 3, 1, 1, 3, 2, 0}; +-static const HUFFBITS t3HB[] = {3, 2, 1, 1, 1, 1, 3, 2, 0}; +-static const HUFFBITS t5HB[] = {1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0}; +-static const HUFFBITS t6HB[] = {7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0}; +-static const HUFFBITS t7HB[] = {1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3, 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, 11, 2, 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0}; +-static const HUFFBITS t8HB[] = {3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3, 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, 4, 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0}; +-static const HUFFBITS t9HB[] = {7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1, 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0}; +-static const HUFFBITS t10HB[] = {1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7, 11, 9, 15, 21, 32, 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7, 20, 19, 33, 47, 27, 22, 9, 3, 31, 22, 41, 26, 21, 20, 5, 3, 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4 , 4, 2, 0}; +-static const HUFFBITS t11HB[] = {3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10, 11, 7, 13, 18, 30, 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5, 35, 33, 31, 58, 30, 16, 7, 5, 28, 26, 32, 19, 17, 15, 8, 14, 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, 0}; +-static const HUFFBITS t12HB[] = {9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11, 17, 7, 11, 14, 21, 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5, 32, 13, 22, 19, 18, 16, 9, 5, 40, 17, 31, 29, 17, 13, 4, 2, 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12 , 6, 3, 1, 0}; +-static const HUFFBITS t13HB[] = {1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4, 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36, 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22, +- 20, 37, 61, 56, 79, 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91, 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, 47, +- 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, 53, +- 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32, +- 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25, +- 20, 29, 11, 17, 12, 16, 8, 1, 1, 0, 1}; +-static const HUFFBITS t15HB[] = {7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, +- 33, 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38, +- 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20, +- 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15, 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11, +- 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, 71, +- 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0}; +-static const HUFFBITS t16HB[] = {1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, 127, 117, +- 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101, 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56, 102, +- 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54, 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10, 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372, +- 380, 889, 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383, 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, 406, 394, 384, 735, 359, 710, 352, 11, 139, 129, 67, 125, +- 247, 233, 229, 219, 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223, 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218, 216, 389, 386, 381, 364, 888, +- 443, 707, 440, 437, 1728, 4, 747, 211, 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2, 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870, 434, +- 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, 5, 3, 1, 3}; +-static const HUFFBITS t24HB[] = {15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, 47, 22, 41, 74, 68, 128, 120, 221, +- 207, 194, 182, 340, 315, 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285, +- 540, 14, 263, 66, 129, 126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, 249, 123, 121, 117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, 435, 115, 111, +- 109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, 208, 205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, 197, 191, 189, 181, 174, 333, +- 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, 183, 179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, 171, 168, 164, 318, 309, 299, 287, 276, 263, 513, 375, +- 368, 362, 6, 648, 322, 316, 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300, 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033, 280, 278, +- 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3}; +-static const HUFFBITS t32HB[] = {1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1}; +-static const HUFFBITS t33HB[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; ++static const HUFFBITS t1HB[] = {1, 1, 1, 0}; ++static const HUFFBITS t2HB[] = {1, 2, 1, 3, 1, 1, 3, 2, 0}; ++static const HUFFBITS t3HB[] = {3, 2, 1, 1, 1, 1, 3, 2, 0}; ++static const HUFFBITS t5HB[] = {1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0}; ++static const HUFFBITS t6HB[] = {7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0}; ++static const HUFFBITS t7HB[] = {1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3, ++ 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, 11, 2, ++ 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0}; ++static const HUFFBITS t8HB[] = {3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3, ++ 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, 4, ++ 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0}; ++static const HUFFBITS t9HB[] = {7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7, ++ 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1, ++ 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0}; ++static const HUFFBITS t10HB[] = { ++ 1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7, ++ 11, 9, 15, 21, 32, 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7, ++ 20, 19, 33, 47, 27, 22, 9, 3, 31, 22, 41, 26, 21, 20, 5, 3, ++ 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4, 4, 2, 0}; ++static const HUFFBITS t11HB[] = { ++ 3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10, ++ 11, 7, 13, 18, 30, 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5, ++ 35, 33, 31, 58, 30, 16, 7, 5, 28, 26, 32, 19, 17, 15, 8, 14, ++ 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, 0}; ++static const HUFFBITS t12HB[] = { ++ 9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11, ++ 17, 7, 11, 14, 21, 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5, ++ 32, 13, 22, 19, 18, 16, 9, 5, 40, 17, 31, 29, 17, 13, 4, 2, ++ 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12, 6, 3, 1, 0}; ++static const HUFFBITS t13HB[] = { ++ 1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4, ++ 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36, ++ 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22, 20, 37, 61, 56, 79, ++ 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91, ++ 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, ++ 79, 29, 74, 49, 41, 17, 47, 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, ++ 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, ++ 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, ++ 53, 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33, ++ 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38, ++ 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32, 28, 39, 49, 75, ++ 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45, ++ 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, ++ 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25, 20, 29, 11, 17, 12, 16, 8, ++ 1, 1, 0, 1}; ++static const HUFFBITS t15HB[] = { ++ 7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, ++ 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, ++ 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, 33, ++ 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, ++ 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, ++ 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38, ++ 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, ++ 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, ++ 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20, ++ 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15, ++ 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, ++ 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11, ++ 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, ++ 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, ++ 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, ++ 71, 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0}; ++static const HUFFBITS t16HB[] = { ++ 1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, ++ 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, ++ 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, ++ 127, 117, 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, 99, 87, ++ 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101, ++ 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56, ++ 102, 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54, ++ 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10, ++ 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372, 380, 889, ++ 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383, ++ 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, 406, 394, ++ 384, 735, 359, 710, 352, 11, 139, 129, 67, 125, 247, 233, 229, 219, ++ 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223, ++ 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218, ++ 216, 389, 386, 381, 364, 888, 443, 707, 440, 437, 1728, 4, 747, 211, ++ 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2, ++ 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870, ++ 434, 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, ++ 5, 3, 1, 3}; ++static const HUFFBITS t24HB[] = { ++ 15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, ++ 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, ++ 279, 42, 47, 22, 41, 74, 68, 128, 120, 221, 207, 194, 182, 340, 315, ++ 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, ++ 311, 293, 271, 16, 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352, ++ 323, 306, 285, 540, 14, 263, 66, 129, 126, 119, 114, 214, 202, 192, 180, ++ 341, 317, 301, 281, 262, 12, 249, 123, 121, 117, 113, 215, 206, 195, 185, ++ 347, 330, 308, 291, 272, 520, 10, 435, 115, 111, 109, 211, 203, 196, 187, ++ 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, 208, 205, 201, 193, 186, ++ 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, 197, 191, 189, 181, ++ 174, 333, 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, 183, 179, 175, ++ 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, 171, 168, ++ 164, 318, 309, 299, 287, 276, 263, 513, 375, 368, 362, 6, 648, 322, 316, ++ 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300, ++ 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033, ++ 280, 278, 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, ++ 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, ++ 3}; ++static const HUFFBITS t32HB[] = {1, 5, 4, 5, 6, 5, 4, 4, ++ 7, 3, 6, 0, 7, 2, 3, 1}; ++static const HUFFBITS t33HB[] = {15, 14, 13, 12, 11, 10, 9, 8, ++ 7, 6, 5, 4, 3, 2, 1, 0}; + +-static const unsigned char t1l[] = {1, 3, 2, 3}; +-static const unsigned char t2l[] = {1, 3, 6, 3, 3, 5, 5, 5, 6}; +-static const unsigned char t3l[] = {2, 2, 6, 3, 2, 5, 5, 5, 6}; +-static const unsigned char t5l[] = {1, 3, 6, 7, 3, 3, 6, 7, 6, 6, 7, 8, 7, 6, 7, 8}; +-static const unsigned char t6l[] = {3, 3, 5, 7, 3, 2, 4, 5, 4, 4, 5, 6, 6, 5, 6, 7}; +-static const unsigned char t7l[] = {1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9, 7, 7, 8, 9, 9, 10, 8, 8, 9, 10, 10, 10}; +-static const unsigned char t8l[] = {2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10, 8, 7, 8, 9, 10, 10, 9, 8, 9, 9, 11, 11}; +-static const unsigned char t9l[] = {3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8, 7, 6, 7, 7, 8, 9, 8, 7, 8, 8, 9, 9}; +-static const unsigned char t10l[] = {1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8, 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10, 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11, 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11}; +-static const unsigned char t11l[] = {2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8, 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9, 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11, 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10}; +-static const unsigned char t12l[] = {4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8, 7, 8, 6, 5, 6, 6, 7, 8, 8, 8, 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8, 8, 9, 8, 9, 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10}; +-static const unsigned char t13l[] = {1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9, 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13, +-8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10, +-10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13, 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, 15, 16, 11, 11, 11, 12, 12, +-13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13, 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15, 14, 15, 15, 16, 16, 19, 18, 19, 16}; +-static const unsigned char t15l[] = {3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 7, 6, 7, +- 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, +- 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13, +-11, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13}; +-static const unsigned char t16l[] = {1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6, 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9, 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, +- 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10, +- 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 14, 11, 12, 12, +- 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14, 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12, 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8}; +-static const unsigned char t24l[] = {4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8, +- 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, +-8, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10, +- 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 4}; +-static const unsigned char t32l[] = {1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6}; +-static const unsigned char t33l[] = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; ++static const unsigned char t1l[] = {1, 3, 2, 3}; ++static const unsigned char t2l[] = {1, 3, 6, 3, 3, 5, 5, 5, 6}; ++static const unsigned char t3l[] = {2, 2, 6, 3, 2, 5, 5, 5, 6}; ++static const unsigned char t5l[] = {1, 3, 6, 7, 3, 3, 6, 7, ++ 6, 6, 7, 8, 7, 6, 7, 8}; ++static const unsigned char t6l[] = {3, 3, 5, 7, 3, 2, 4, 5, ++ 4, 4, 5, 6, 6, 5, 6, 7}; ++static const unsigned char t7l[] = {1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, ++ 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9, ++ 7, 7, 8, 9, 9, 10, 8, 8, 9, 10, 10, 10}; ++static const unsigned char t8l[] = {2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, ++ 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10, ++ 8, 7, 8, 9, 10, 10, 9, 8, 9, 9, 11, 11}; ++static const unsigned char t9l[] = {3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, ++ 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8, ++ 7, 6, 7, 7, 8, 9, 8, 7, 8, 8, 9, 9}; ++static const unsigned char t10l[] = { ++ 1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8, ++ 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10, ++ 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11, ++ 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11}; ++static const unsigned char t11l[] = { ++ 2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8, ++ 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9, ++ 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11, ++ 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10}; ++static const unsigned char t12l[] = { ++ 4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8, ++ 7, 8, 6, 5, 6, 6, 7, 8, 8, 8, 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8, ++ 8, 9, 8, 9, 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10}; ++static const unsigned char t13l[] = { ++ 1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, ++ 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9, ++ 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10, ++ 11, 11, 11, 11, 12, 13, 13, 8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, ++ 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, ++ 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9, ++ 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10, 10, ++ 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13, ++ 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, ++ 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, ++ 15, 16, 11, 11, 11, 12, 12, 13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12, ++ 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13, ++ 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15, ++ 14, 15, 15, 16, 16, 19, 18, 19, 16}; ++static const unsigned char t15l[] = { ++ 3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5, ++ 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7, ++ 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9, ++ 9, 10, 10, 10, 11, 11, 11, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, ++ 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, ++ 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8, ++ 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9, ++ 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10, ++ 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, ++ 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, ++ 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13, 11, ++ 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11, ++ 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11, ++ 12, 12, 12, 12, 12, 13, 13, 13, 13}; ++static const unsigned char t16l[] = { ++ 1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6, ++ 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9, ++ 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11, ++ 11, 12, 12, 12, 13, 13, 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, ++ 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, ++ 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9, ++ 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10, 10, 11, 11, ++ 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13, ++ 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, ++ 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, ++ 14, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14, ++ 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12, ++ 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10, ++ 10, 11, 11, 11, 11, 11, 11, 11, 8}; ++static const unsigned char t24l[] = { ++ 4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5, ++ 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8, ++ 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, ++ 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, ++ 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, ++ 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8, ++ 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, ++ 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 10, ++ 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, ++ 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, ++ 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, ++ 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10, ++ 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7, ++ 7, 7, 7, 7, 8, 8, 8, 8, 4}; ++static const unsigned char t32l[] = {1, 4, 4, 5, 4, 6, 5, 6, ++ 4, 5, 5, 6, 5, 6, 6, 6}; ++static const unsigned char t33l[] = {4, 4, 4, 4, 4, 4, 4, 4, ++ 4, 4, 4, 4, 4, 4, 4, 4}; + + #define NOREF -1 +-const struct huffcodetab shine_huffman_table[HTN] = +-{ +-{ 0, 0, 0, 0,NULL,NULL}, +-{ 2, 2, 0, 0,t1HB, t1l}, +-{ 3, 3, 0, 0,t2HB, t2l}, +-{ 3, 3, 0, 0,t3HB, t3l}, +-{ 0, 0, 0, 0,NULL,NULL},/* Apparently not used*/ +-{ 4, 4, 0, 0,t5HB, t5l}, +-{ 4, 4, 0, 0,t6HB, t6l}, +-{ 6, 6, 0, 0,t7HB, t7l}, +-{ 6, 6, 0, 0,t8HB, t8l}, +-{ 6, 6, 0, 0,t9HB, t9l}, +-{ 8, 8, 0, 0,t10HB, t10l}, +-{ 8, 8, 0, 0,t11HB, t11l}, +-{ 8, 8, 0, 0,t12HB, t12l}, +-{16,16, 0, 0,t13HB, t13l}, +-{ 0, 0, 0, 0,NULL,NULL},/* Apparently not used*/ +-{16,16, 0, 0,t15HB, t15l}, +-{16,16, 1, 1,t16HB, t16l}, +-{16,16, 2, 3,t16HB, t16l}, +-{16,16, 3, 7,t16HB, t16l}, +-{16,16, 4, 15,t16HB, t16l}, +-{16,16, 6, 63,t16HB, t16l}, +-{16,16, 8, 255,t16HB, t16l}, +-{16,16,10,1023,t16HB, t16l}, +-{16,16,13,8191,t16HB, t16l}, +-{16,16, 4, 15,t24HB, t24l}, +-{16,16, 5, 31,t24HB, t24l}, +-{16,16, 6, 63,t24HB, t24l}, +-{16,16, 7, 127,t24HB, t24l}, +-{16,16, 8, 255,t24HB, t24l}, +-{16,16, 9, 511,t24HB, t24l}, +-{16,16,11,2047,t24HB, t24l}, +-{16,16,13,8191,t24HB, t24l}, +-{ 1,16, 0, 0,t32HB, t32l}, +-{ 1,16, 0, 0,t33HB, t33l}, ++const struct huffcodetab shine_huffman_table[HTN] = { ++ {0, 0, 0, 0, NULL, NULL}, ++ {2, 2, 0, 0, t1HB, t1l}, ++ {3, 3, 0, 0, t2HB, t2l}, ++ {3, 3, 0, 0, t3HB, t3l}, ++ {0, 0, 0, 0, NULL, NULL}, /* Apparently not used*/ ++ {4, 4, 0, 0, t5HB, t5l}, ++ {4, 4, 0, 0, t6HB, t6l}, ++ {6, 6, 0, 0, t7HB, t7l}, ++ {6, 6, 0, 0, t8HB, t8l}, ++ {6, 6, 0, 0, t9HB, t9l}, ++ {8, 8, 0, 0, t10HB, t10l}, ++ {8, 8, 0, 0, t11HB, t11l}, ++ {8, 8, 0, 0, t12HB, t12l}, ++ {16, 16, 0, 0, t13HB, t13l}, ++ {0, 0, 0, 0, NULL, NULL}, /* Apparently not used*/ ++ {16, 16, 0, 0, t15HB, t15l}, ++ {16, 16, 1, 1, t16HB, t16l}, ++ {16, 16, 2, 3, t16HB, t16l}, ++ {16, 16, 3, 7, t16HB, t16l}, ++ {16, 16, 4, 15, t16HB, t16l}, ++ {16, 16, 6, 63, t16HB, t16l}, ++ {16, 16, 8, 255, t16HB, t16l}, ++ {16, 16, 10, 1023, t16HB, t16l}, ++ {16, 16, 13, 8191, t16HB, t16l}, ++ {16, 16, 4, 15, t24HB, t24l}, ++ {16, 16, 5, 31, t24HB, t24l}, ++ {16, 16, 6, 63, t24HB, t24l}, ++ {16, 16, 7, 127, t24HB, t24l}, ++ {16, 16, 8, 255, t24HB, t24l}, ++ {16, 16, 9, 511, t24HB, t24l}, ++ {16, 16, 11, 2047, t24HB, t24l}, ++ {16, 16, 13, 8191, t24HB, t24l}, ++ {1, 16, 0, 0, t32HB, t32l}, ++ {1, 16, 0, 0, t33HB, t33l}, + }; +- +- +diff --git a/src/lib/huffman.h b/src/lib/huffman.h +index d2d5b51..6a341c7 100644 +--- a/src/lib/huffman.h ++++ b/src/lib/huffman.h +@@ -1,6 +1,8 @@ ++#include <stdint.h> ++ + #define HUFFBITS uint16_t +-#define HTN 34 +-#define MXOFF 250 ++#define HTN 34 ++#define MXOFF 250 + + struct huffcodetab { + unsigned int xlen; /*max. x-index+ */ +@@ -11,9 +13,8 @@ struct huffcodetab { + const unsigned char *hlen; /*pointer to array[xlen][ylen] */ + }; + +-extern const struct huffcodetab shine_huffman_table[HTN];/* global memory block */ +- /* array of all huffcodtable headers */ +- /* 0..31 Huffman code table 0..31 */ +- /* 32,33 count1-tables */ +- +- ++extern const struct huffcodetab ++ shine_huffman_table[HTN]; /* global memory block */ ++ /* array of all huffcodtable headers */ ++ /* 0..31 Huffman code table 0..31 */ ++ /* 32,33 count1-tables */ +diff --git a/src/lib/l3bitstream.c b/src/lib/l3bitstream.c +index ba788e6..1b2849e 100644 +--- a/src/lib/l3bitstream.c ++++ b/src/lib/l3bitstream.c +@@ -1,20 +1,22 @@ + /* l3bitstrea.c */ + +-#include "types.h" +-#include "l3mdct.h" ++#include "l3bitstream.h" /* the public interface */ ++#include "bitstream.h" ++#include "huffman.h" + #include "l3loop.h" ++#include "l3mdct.h" + #include "layer3.h" +-#include "huffman.h" +-#include "bitstream.h" + #include "tables.h" +-#include "l3bitstream.h" /* the public interface */ ++#include "types.h" + + static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y); +-static void shine_huffman_coder_count1(bitstream_t *bs, const struct huffcodetab *h, int v, int w, int x, int y); ++static void shine_huffman_coder_count1(bitstream_t *bs, ++ const struct huffcodetab *h, int v, ++ int w, int x, int y); + +-static void encodeSideInfo( shine_global_config *config ); +-static void encodeMainData( shine_global_config *config ); +-static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi); ++static void encodeSideInfo(shine_global_config *config); ++static void encodeMainData(shine_global_config *config); ++static void Huffmancodebits(shine_global_config *config, int *ix, gr_info *gi); + + /* + shine_format_bitstream() +@@ -27,130 +29,121 @@ static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi); + in the IS). + */ + +-void +-shine_format_bitstream(shine_global_config *config) +-{ ++void shine_format_bitstream(shine_global_config *config) { + int gr, ch, i; + +- for ( ch = 0; ch < config->wave.channels; ch++ ) +- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ ) +- { +- int *pi = &config->l3_enc[ch][gr][0]; +- int32_t *pr = &config->mdct_freq[ch][gr][0]; +- for ( i = 0; i < GRANULE_SIZE; i++ ) +- { +- if ( (pr[i] < 0) && (pi[i] > 0) ) +- pi[i] *= -1; +- } ++ for (ch = 0; ch < config->wave.channels; ch++) ++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) { ++ int *pi = &config->l3_enc[ch][gr][0]; ++ int32_t *pr = &config->mdct_freq[ch][gr][0]; ++ for (i = 0; i < GRANULE_SIZE; i++) { ++ if ((pr[i] < 0) && (pi[i] > 0)) ++ pi[i] *= -1; + } ++ } + +- encodeSideInfo( config ); +- encodeMainData( config ); ++ encodeSideInfo(config); ++ encodeMainData(config); + } + +-static void encodeMainData(shine_global_config *config) +-{ ++static void encodeMainData(shine_global_config *config) { + int gr, ch, sfb; +- shine_side_info_t si = config->side_info; +- +- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ ) +- { +- for ( ch = 0; ch < config->wave.channels; ch++ ) +- { +- gr_info *gi = &(si.gr[gr].ch[ch].tt); +- unsigned slen1 = shine_slen1_tab[ gi->scalefac_compress ]; +- unsigned slen2 = shine_slen2_tab[ gi->scalefac_compress ]; +- int *ix = &config->l3_enc[ch][gr][0]; +- +- if ( gr == 0 || si.scfsi[ch][0] == 0 ) +- for ( sfb = 0; sfb < 6; sfb++ ) +- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen1 ); +- if ( gr == 0 || si.scfsi[ch][1] == 0 ) +- for ( sfb = 6; sfb < 11; sfb++ ) +- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen1 ); +- if ( gr == 0 || si.scfsi[ch][2] == 0 ) +- for ( sfb = 11; sfb < 16; sfb++ ) +- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen2 ); +- if ( gr == 0 || si.scfsi[ch][3] == 0 ) +- for ( sfb = 16; sfb < 21; sfb++ ) +- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen2 ); +- +- Huffmancodebits( config, ix, gi ); +- } ++ shine_side_info_t si = config->side_info; ++ ++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) { ++ for (ch = 0; ch < config->wave.channels; ch++) { ++ gr_info *gi = &(si.gr[gr].ch[ch].tt); ++ unsigned slen1 = shine_slen1_tab[gi->scalefac_compress]; ++ unsigned slen2 = shine_slen2_tab[gi->scalefac_compress]; ++ int *ix = &config->l3_enc[ch][gr][0]; ++ ++ if (gr == 0 || si.scfsi[ch][0] == 0) ++ for (sfb = 0; sfb < 6; sfb++) ++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1); ++ if (gr == 0 || si.scfsi[ch][1] == 0) ++ for (sfb = 6; sfb < 11; sfb++) ++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1); ++ if (gr == 0 || si.scfsi[ch][2] == 0) ++ for (sfb = 11; sfb < 16; sfb++) ++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2); ++ if (gr == 0 || si.scfsi[ch][3] == 0) ++ for (sfb = 16; sfb < 21; sfb++) ++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2); ++ ++ Huffmancodebits(config, ix, gi); + } ++ } + } + +-static void encodeSideInfo( shine_global_config *config ) +-{ ++static void encodeSideInfo(shine_global_config *config) { + int gr, ch, scfsi_band, region; +- shine_side_info_t si = config->side_info; +- +- shine_putbits( &config->bs, 0x7ff, 11 ); +- shine_putbits( &config->bs, config->mpeg.version, 2 ); +- shine_putbits( &config->bs, config->mpeg.layer, 2 ); +- shine_putbits( &config->bs, !config->mpeg.crc, 1 ); +- shine_putbits( &config->bs, config->mpeg.bitrate_index, 4 ); +- shine_putbits( &config->bs, config->mpeg.samplerate_index % 3, 2 ); +- shine_putbits( &config->bs, config->mpeg.padding, 1 ); +- shine_putbits( &config->bs, config->mpeg.ext, 1 ); +- shine_putbits( &config->bs, config->mpeg.mode, 2 ); +- shine_putbits( &config->bs, config->mpeg.mode_ext, 2 ); +- shine_putbits( &config->bs, config->mpeg.copyright, 1 ); +- shine_putbits( &config->bs, config->mpeg.original, 1 ); +- shine_putbits( &config->bs, config->mpeg.emph, 2 ); +- +- if ( config->mpeg.version == MPEG_I ) { +- shine_putbits( &config->bs, 0, 9 ); +- if ( config->wave.channels == 2 ) +- shine_putbits( &config->bs, si.private_bits, 3 ); ++ shine_side_info_t si = config->side_info; ++ ++ shine_putbits(&config->bs, 0x7ff, 11); ++ shine_putbits(&config->bs, config->mpeg.version, 2); ++ shine_putbits(&config->bs, config->mpeg.layer, 2); ++ shine_putbits(&config->bs, !config->mpeg.crc, 1); ++ shine_putbits(&config->bs, config->mpeg.bitrate_index, 4); ++ shine_putbits(&config->bs, config->mpeg.samplerate_index % 3, 2); ++ shine_putbits(&config->bs, config->mpeg.padding, 1); ++ shine_putbits(&config->bs, config->mpeg.ext, 1); ++ shine_putbits(&config->bs, config->mpeg.mode, 2); ++ shine_putbits(&config->bs, config->mpeg.mode_ext, 2); ++ shine_putbits(&config->bs, config->mpeg.copyright, 1); ++ shine_putbits(&config->bs, config->mpeg.original, 1); ++ shine_putbits(&config->bs, config->mpeg.emph, 2); ++ ++ if (config->mpeg.version == MPEG_I) { ++ shine_putbits(&config->bs, 0, 9); ++ if (config->wave.channels == 2) ++ shine_putbits(&config->bs, si.private_bits, 3); + else +- shine_putbits( &config->bs, si.private_bits, 5 ); ++ shine_putbits(&config->bs, si.private_bits, 5); + } else { +- shine_putbits( &config->bs, 0, 8 ); +- if ( config->wave.channels == 2 ) +- shine_putbits( &config->bs, si.private_bits, 2 ); ++ shine_putbits(&config->bs, 0, 8); ++ if (config->wave.channels == 2) ++ shine_putbits(&config->bs, si.private_bits, 2); + else +- shine_putbits( &config->bs, si.private_bits, 1 ); ++ shine_putbits(&config->bs, si.private_bits, 1); + } + +- if ( config->mpeg.version == MPEG_I ) +- for ( ch = 0; ch < config->wave.channels; ch++ ) { +- for ( scfsi_band = 0; scfsi_band < 4; scfsi_band++ ) +- shine_putbits( &config->bs, si.scfsi[ch][scfsi_band], 1 ); ++ if (config->mpeg.version == MPEG_I) ++ for (ch = 0; ch < config->wave.channels; ch++) { ++ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++) ++ shine_putbits(&config->bs, si.scfsi[ch][scfsi_band], 1); + } + +- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ ) +- for ( ch = 0; ch < config->wave.channels ; ch++ ) +- { +- gr_info *gi = &(si.gr[gr].ch[ch].tt); +- +- shine_putbits( &config->bs, gi->part2_3_length, 12 ); +- shine_putbits( &config->bs, gi->big_values, 9 ); +- shine_putbits( &config->bs, gi->global_gain, 8 ); +- if ( config->mpeg.version == MPEG_I ) +- shine_putbits( &config->bs, gi->scalefac_compress, 4 ); +- else +- shine_putbits( &config->bs, gi->scalefac_compress, 9 ); +- shine_putbits( &config->bs, 0, 1 ); +- +- for ( region = 0; region < 3; region++ ) +- shine_putbits( &config->bs, gi->table_select[region], 5 ); +- +- shine_putbits( &config->bs, gi->region0_count, 4 ); +- shine_putbits( &config->bs, gi->region1_count, 3 ); +- +- if ( config->mpeg.version == MPEG_I ) +- shine_putbits( &config->bs, gi->preflag, 1 ); +- shine_putbits( &config->bs, gi->scalefac_scale, 1 ); +- shine_putbits( &config->bs, gi->count1table_select, 1 ); +- } ++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) ++ for (ch = 0; ch < config->wave.channels; ch++) { ++ gr_info *gi = &(si.gr[gr].ch[ch].tt); ++ ++ shine_putbits(&config->bs, gi->part2_3_length, 12); ++ shine_putbits(&config->bs, gi->big_values, 9); ++ shine_putbits(&config->bs, gi->global_gain, 8); ++ if (config->mpeg.version == MPEG_I) ++ shine_putbits(&config->bs, gi->scalefac_compress, 4); ++ else ++ shine_putbits(&config->bs, gi->scalefac_compress, 9); ++ shine_putbits(&config->bs, 0, 1); ++ ++ for (region = 0; region < 3; region++) ++ shine_putbits(&config->bs, gi->table_select[region], 5); ++ ++ shine_putbits(&config->bs, gi->region0_count, 4); ++ shine_putbits(&config->bs, gi->region1_count, 3); ++ ++ if (config->mpeg.version == MPEG_I) ++ shine_putbits(&config->bs, gi->preflag, 1); ++ shine_putbits(&config->bs, gi->scalefac_scale, 1); ++ shine_putbits(&config->bs, gi->count1table_select, 1); ++ } + } + + /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS, as + well as the definitions of the side information on pages 26 and 27. */ +-static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi ) +-{ +- const int *scalefac = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0]; ++static void Huffmancodebits(shine_global_config *config, int *ix, gr_info *gi) { ++ const int *scalefac = ++ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0]; + unsigned scalefac_index; + int region1Start, region2Start; + int i, bigvalues, count1End; +@@ -164,168 +157,153 @@ static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi ) + bigvalues = gi->big_values << 1; + + scalefac_index = gi->region0_count + 1; +- region1Start = scalefac[ scalefac_index ]; ++ region1Start = scalefac[scalefac_index]; + scalefac_index += gi->region1_count + 1; +- region2Start = scalefac[ scalefac_index ]; +- +- for ( i = 0; i < bigvalues; i += 2 ) +- { +- /* get table pointer */ +- int idx = (i >= region1Start) + (i >= region2Start); +- unsigned tableindex = gi->table_select[idx]; +- /* get huffman code */ +- if ( tableindex ) +- { +- x = ix[i]; +- y = ix[i + 1]; +- shine_HuffmanCode( &config->bs, tableindex, x, y ); +- } ++ region2Start = scalefac[scalefac_index]; ++ ++ for (i = 0; i < bigvalues; i += 2) { ++ /* get table pointer */ ++ int idx = (i >= region1Start) + (i >= region2Start); ++ unsigned tableindex = gi->table_select[idx]; ++ /* get huffman code */ ++ if (tableindex) { ++ x = ix[i]; ++ y = ix[i + 1]; ++ shine_HuffmanCode(&config->bs, tableindex, x, y); + } ++ } + + /* 2: Write count1 area */ + h = &shine_huffman_table[gi->count1table_select + 32]; +- count1End = bigvalues + (gi->count1 <<2); +- for ( i = bigvalues; i < count1End; i += 4 ) +- { +- v = ix[i]; +- w = ix[i+1]; +- x = ix[i+2]; +- y = ix[i+3]; +- shine_huffman_coder_count1( &config->bs, h, v, w, x, y ); +- } ++ count1End = bigvalues + (gi->count1 << 2); ++ for (i = bigvalues; i < count1End; i += 4) { ++ v = ix[i]; ++ w = ix[i + 1]; ++ x = ix[i + 2]; ++ y = ix[i + 3]; ++ shine_huffman_coder_count1(&config->bs, h, v, w, x, y); ++ } + + bits = shine_get_bits_count(&config->bs) - bits; + bits = gi->part2_3_length - gi->part2_length - bits; +- if (bits) +- { +- int stuffingWords = bits / 32; +- int remainingBits = bits % 32; +- +- /* Due to the nature of the Huffman code tables, we will pad with ones */ +- while ( stuffingWords-- ) +- shine_putbits( &config->bs, ~0, 32 ); +- if ( remainingBits ) +- shine_putbits( &config->bs, (1UL << remainingBits) - 1, remainingBits ); +- } ++ if (bits) { ++ int stuffingWords = bits / 32; ++ int remainingBits = bits % 32; ++ ++ /* Due to the nature of the Huffman code tables, we will pad with ones */ ++ while (stuffingWords--) ++ shine_putbits(&config->bs, ~0, 32); ++ if (remainingBits) ++ shine_putbits(&config->bs, (1UL << remainingBits) - 1, remainingBits); ++ } + } + +-static inline int shine_abs_and_sign( int *x ) +-{ +- if ( *x > 0 ) return 0; ++static inline int shine_abs_and_sign(int *x) { ++ if (*x > 0) ++ return 0; + *x *= -1; + return 1; + } + +-static void shine_huffman_coder_count1( bitstream_t *bs, const struct huffcodetab *h, int v, int w, int x, int y ) +-{ ++static void shine_huffman_coder_count1(bitstream_t *bs, ++ const struct huffcodetab *h, int v, ++ int w, int x, int y) { + unsigned int signv, signw, signx, signy; + unsigned int code = 0; + int p, cbits = 0; + +- signv = shine_abs_and_sign( &v ); +- signw = shine_abs_and_sign( &w ); +- signx = shine_abs_and_sign( &x ); +- signy = shine_abs_and_sign( &y ); ++ signv = shine_abs_and_sign(&v); ++ signw = shine_abs_and_sign(&w); ++ signx = shine_abs_and_sign(&x); ++ signy = shine_abs_and_sign(&y); + + p = v + (w << 1) + (x << 2) + (y << 3); +- shine_putbits( bs, h->table[p], h->hlen[p] ); ++ shine_putbits(bs, h->table[p], h->hlen[p]); + +- if ( v ) { ++ if (v) { + code = signv; + cbits = 1; + } +- if ( w ) { ++ if (w) { + code = (code << 1) | signw; + cbits++; + } +- if ( x ) { ++ if (x) { + code = (code << 1) | signx; + cbits++; + } +- if ( y ) { ++ if (y) { + code = (code << 1) | signy; + cbits++; + } +- shine_putbits( bs, code, cbits ); ++ shine_putbits(bs, code, cbits); + } + + /* Implements the pseudocode of page 98 of the IS */ +-static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y) +-{ ++static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y) { + int cbits = 0, xbits = 0; + unsigned int code = 0, ext = 0; + unsigned signx, signy, ylen, idx; + const struct huffcodetab *h; + +- signx = shine_abs_and_sign( &x ); +- signy = shine_abs_and_sign( &y ); ++ signx = shine_abs_and_sign(&x); ++ signy = shine_abs_and_sign(&y); + + h = &(shine_huffman_table[table_select]); + ylen = h->ylen; + +- if ( table_select > 15 ) +- { /* ESC-table is used */ +- unsigned linbitsx = 0, linbitsy = 0, linbits = h->linbits; +- +- if ( x > 14 ) +- { +- linbitsx = x - 15; +- x = 15; +- } +- if ( y > 14 ) +- { +- linbitsy = y - 15; +- y = 15; +- } +- +- idx = (x * ylen) + y; +- code = h->table[idx]; +- cbits = h->hlen [idx]; +- if ( x > 14 ) +- { +- ext |= linbitsx; +- xbits += linbits; +- } +- if ( x != 0 ) +- { +- ext <<= 1; +- ext |= signx; +- xbits += 1; +- } +- if ( y > 14 ) +- { +- ext <<= linbits; +- ext |= linbitsy; +- xbits += linbits; +- } +- if ( y != 0 ) +- { +- ext <<= 1; +- ext |= signy; +- xbits += 1; +- } +- +- shine_putbits( bs, code, cbits); +- shine_putbits( bs, ext, xbits); ++ if (table_select > 15) { /* ESC-table is used */ ++ unsigned linbitsx = 0, linbitsy = 0, linbits = h->linbits; ++ ++ if (x > 14) { ++ linbitsx = x - 15; ++ x = 15; ++ } ++ if (y > 14) { ++ linbitsy = y - 15; ++ y = 15; ++ } ++ ++ idx = (x * ylen) + y; ++ code = h->table[idx]; ++ cbits = h->hlen[idx]; ++ if (x > 14) { ++ ext |= linbitsx; ++ xbits += linbits; + } +- else +- { /* No ESC-words */ +- idx = (x * ylen) + y; +- code = h->table[idx]; +- cbits = h->hlen[idx]; +- if ( x != 0 ) +- { +- code <<= 1; +- code |= signx; +- cbits += 1; +- } +- if ( y != 0 ) +- { +- code <<= 1; +- code |= signy; +- cbits += 1; +- } +- +- shine_putbits( bs, code, cbits); ++ if (x != 0) { ++ ext <<= 1; ++ ext |= signx; ++ xbits += 1; + } ++ if (y > 14) { ++ ext <<= linbits; ++ ext |= linbitsy; ++ xbits += linbits; ++ } ++ if (y != 0) { ++ ext <<= 1; ++ ext |= signy; ++ xbits += 1; ++ } ++ ++ shine_putbits(bs, code, cbits); ++ shine_putbits(bs, ext, xbits); ++ } else { /* No ESC-words */ ++ idx = (x * ylen) + y; ++ code = h->table[idx]; ++ cbits = h->hlen[idx]; ++ if (x != 0) { ++ code <<= 1; ++ code |= signx; ++ cbits += 1; ++ } ++ if (y != 0) { ++ code <<= 1; ++ code |= signy; ++ cbits += 1; ++ } ++ ++ shine_putbits(bs, code, cbits); ++ } + } +diff --git a/src/lib/l3bitstream.h b/src/lib/l3bitstream.h +index 6e165f5..fa61899 100644 +--- a/src/lib/l3bitstream.h ++++ b/src/lib/l3bitstream.h +@@ -1,6 +1,8 @@ + #ifndef shine_BITSTREAM_H + #define shine_BITSTREAM_H + ++#include "types.h" ++ + void shine_format_bitstream(shine_global_config *config); + + #endif +diff --git a/src/lib/l3loop.c b/src/lib/l3loop.c +index 609c2b2..d3799fb 100644 +--- a/src/lib/l3loop.c ++++ b/src/lib/l3loop.c +@@ -1,34 +1,40 @@ + /* l3loop.c */ + +-#include "types.h" +-#include "tables.h" + #include "l3loop.h" +-#include "layer3.h" +-#include "huffman.h" + #include "bitstream.h" ++#include "huffman.h" + #include "l3bitstream.h" ++#include "layer3.h" + #include "reservoir.h" ++#include "tables.h" ++#include "types.h" + +-#define e 2.71828182845 +-#define CBLIMIT 21 ++#define e 2.71828182845 ++#define CBLIMIT 21 + #define SFB_LMAX 22 + #define en_tot_krit 10 + #define en_dif_krit 100 + #define en_scfsi_band_krit 10 + #define xm_scfsi_band_krit 10 + +-static void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr, shine_global_config *config); ++static void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr, ++ shine_global_config *config); + static int part2_length(int gr, int ch, shine_global_config *config); +-static int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE], gr_info * cod_info, shine_global_config *config); +-static int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end, unsigned int table ); ++static int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE], ++ gr_info *cod_info, shine_global_config *config); ++static int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end, ++ unsigned int table); + static int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi); +-static int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end ); +-static void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info ); +-static void subdivide(gr_info *cod_info, shine_global_config *config ); +-static int count1_bitcount( int ix[ GRANULE_SIZE ], gr_info *cod_info ); +-static void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info ); +-static void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info, shine_psy_xmin_t *l3_xmin, int gr, int ch ); +-static int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config); ++static int new_choose_table(int ix[GRANULE_SIZE], unsigned int begin, ++ unsigned int end); ++static void bigv_tab_select(int ix[GRANULE_SIZE], gr_info *cod_info); ++static void subdivide(gr_info *cod_info, shine_global_config *config); ++static int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info); ++static void calc_runlen(int ix[GRANULE_SIZE], gr_info *cod_info); ++static void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info, ++ shine_psy_xmin_t *l3_xmin, int gr, int ch); ++static int quantize(int ix[GRANULE_SIZE], int stepsize, ++ shine_global_config *config); + + /* + * shine_inner_loop: +@@ -36,25 +42,22 @@ static int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *con + * The code selects the best quantizerStepSize for a particular set + * of scalefacs. + */ +-int shine_inner_loop(int ix[GRANULE_SIZE], +- int max_bits, gr_info *cod_info, int gr, int ch, +- shine_global_config *config ) +-{ ++int shine_inner_loop(int ix[GRANULE_SIZE], int max_bits, gr_info *cod_info, ++ int gr, int ch, shine_global_config *config) { + int bits, c1bits, bvbits; + +- if(max_bits<0) ++ if (max_bits < 0) + cod_info->quantizerStepSize--; +- do +- { +- while(quantize(ix,++cod_info->quantizerStepSize,config) > 8192); /* within table range? */ +- +- calc_runlen(ix,cod_info); /* rzero,count1,big_values*/ +- bits = c1bits = count1_bitcount(ix,cod_info); /* count1_table selection*/ +- subdivide(cod_info, config); /* bigvalues sfb division */ +- bigv_tab_select(ix,cod_info); /* codebook selection*/ +- bits += bvbits = bigv_bitcount( ix, cod_info ); /* bit count */ +- } +- while(bits>max_bits); ++ do { ++ while (quantize(ix, ++cod_info->quantizerStepSize, config) > 8192) ++ ; /* within table range? */ ++ ++ calc_runlen(ix, cod_info); /* rzero,count1,big_values*/ ++ bits = c1bits = count1_bitcount(ix, cod_info); /* count1_table selection*/ ++ subdivide(cod_info, config); /* bigvalues sfb division */ ++ bigv_tab_select(ix, cod_info); /* codebook selection*/ ++ bits += bvbits = bigv_bitcount(ix, cod_info); /* bit count */ ++ } while (bits > max_bits); + return bits; + } + +@@ -66,21 +69,22 @@ int shine_inner_loop(int ix[GRANULE_SIZE], + * global gain. This module calls the inner iteration loop. + */ + +-int shine_outer_loop( int max_bits, +- shine_psy_xmin_t *l3_xmin, /* the allowed distortion of the scalefactor */ +- int ix[GRANULE_SIZE], /* vector of quantized values ix(0..575) */ +- int gr, int ch, shine_global_config *config) +-{ ++int shine_outer_loop( ++ int max_bits, ++ shine_psy_xmin_t *l3_xmin, /* the allowed distortion of the scalefactor */ ++ int ix[GRANULE_SIZE], /* vector of quantized values ix(0..575) */ ++ int gr, int ch, shine_global_config *config) { + int bits, huff_bits; +- shine_side_info_t *side_info = &config->side_info; ++ shine_side_info_t *side_info = &config->side_info; + gr_info *cod_info = &side_info->gr[gr].ch[ch].tt; + +- cod_info->quantizerStepSize = bin_search_StepSize(max_bits,ix,cod_info, config); ++ cod_info->quantizerStepSize = ++ bin_search_StepSize(max_bits, ix, cod_info, config); + +- cod_info->part2_length = part2_length(gr,ch,config); ++ cod_info->part2_length = part2_length(gr, ch, config); + huff_bits = max_bits - cod_info->part2_length; + +- bits = shine_inner_loop(ix, huff_bits, cod_info, gr, ch, config ); ++ bits = shine_inner_loop(ix, huff_bits, cod_info, gr, ch, config); + cod_info->part2_3_length = cod_info->part2_length + bits; + + return cod_info->part2_3_length; +@@ -90,18 +94,15 @@ int shine_outer_loop( int max_bits, + * shine_iteration_loop: + * ------------------ + */ +-void shine_iteration_loop(shine_global_config *config) +-{ ++void shine_iteration_loop(shine_global_config *config) { + shine_psy_xmin_t l3_xmin; + gr_info *cod_info; + int max_bits; + int ch, gr, i; + int *ix; + +- for(ch=config->wave.channels; ch--; ) +- { +- for(gr=0; gr<config->mpeg.granules_per_frame; gr++) +- { ++ for (ch = config->wave.channels; ch--;) { ++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) { + /* setup pointers */ + ix = config->l3_enc[ch][gr]; + config->l3loop.xr = config->mdct_freq[ch][gr]; +@@ -109,56 +110,58 @@ void shine_iteration_loop(shine_global_config *config) + /* Precalculate the square, abs, and maximum, + * for use later on. + */ +- for (i=GRANULE_SIZE, config->l3loop.xrmax=0; i--;) +- { +- config->l3loop.xrsq[i] = mulsr(config->l3loop.xr[i],config->l3loop.xr[i]); ++ for (i = GRANULE_SIZE, config->l3loop.xrmax = 0; i--;) { ++ config->l3loop.xrsq[i] = ++ mulsr(config->l3loop.xr[i], config->l3loop.xr[i]); + config->l3loop.xrabs[i] = labs(config->l3loop.xr[i]); +- if(config->l3loop.xrabs[i]>config->l3loop.xrmax) +- config->l3loop.xrmax=config->l3loop.xrabs[i]; ++ if (config->l3loop.xrabs[i] > config->l3loop.xrmax) ++ config->l3loop.xrmax = config->l3loop.xrabs[i]; + } + +- cod_info = (gr_info *) &(config->side_info.gr[gr].ch[ch]); ++ cod_info = (gr_info *)&(config->side_info.gr[gr].ch[ch]); + cod_info->sfb_lmax = SFB_LMAX - 1; /* gr_deco */ + +- calc_xmin(&config->ratio, cod_info, &l3_xmin, gr, ch ); ++ calc_xmin(&config->ratio, cod_info, &l3_xmin, gr, ch); + +- if ( config->mpeg.version == MPEG_I ) +- calc_scfsi(&l3_xmin,ch,gr,config); ++ if (config->mpeg.version == MPEG_I) ++ calc_scfsi(&l3_xmin, ch, gr, config); + + /* calculation of number of available bit( per granule ) */ +- max_bits = shine_max_reservoir_bits(&config->pe[ch][gr],config); ++ max_bits = shine_max_reservoir_bits(&config->pe[ch][gr], config); + + /* reset of iteration variables */ +- memset(config->scalefactor.l[gr][ch],0,sizeof(config->scalefactor.l[gr][ch])); +- memset(config->scalefactor.s[gr][ch],0,sizeof(config->scalefactor.s[gr][ch])); ++ memset(config->scalefactor.l[gr][ch], 0, ++ sizeof(config->scalefactor.l[gr][ch])); ++ memset(config->scalefactor.s[gr][ch], 0, ++ sizeof(config->scalefactor.s[gr][ch])); + +- for ( i=4; i--; ) ++ for (i = 4; i--;) + cod_info->slen[i] = 0; + +- cod_info->part2_3_length = 0; +- cod_info->big_values = 0; +- cod_info->count1 = 0; ++ cod_info->part2_3_length = 0; ++ cod_info->big_values = 0; ++ cod_info->count1 = 0; + cod_info->scalefac_compress = 0; +- cod_info->table_select[0] = 0; +- cod_info->table_select[1] = 0; +- cod_info->table_select[2] = 0; +- cod_info->region0_count = 0; +- cod_info->region1_count = 0; +- cod_info->part2_length = 0; +- cod_info->preflag = 0; +- cod_info->scalefac_scale = 0; +- cod_info->count1table_select= 0; ++ cod_info->table_select[0] = 0; ++ cod_info->table_select[1] = 0; ++ cod_info->table_select[2] = 0; ++ cod_info->region0_count = 0; ++ cod_info->region1_count = 0; ++ cod_info->part2_length = 0; ++ cod_info->preflag = 0; ++ cod_info->scalefac_scale = 0; ++ cod_info->count1table_select = 0; + + /* all spectral values zero ? */ +- if(config->l3loop.xrmax) +- cod_info->part2_3_length = shine_outer_loop(max_bits,&l3_xmin,ix, +- gr,ch,config); ++ if (config->l3loop.xrmax) ++ cod_info->part2_3_length = ++ shine_outer_loop(max_bits, &l3_xmin, ix, gr, ch, config); + +- shine_ResvAdjust(cod_info, config ); +- cod_info->global_gain = cod_info->quantizerStepSize+210; ++ shine_ResvAdjust(cod_info, config); ++ cod_info->global_gain = cod_info->quantizerStepSize + 210; + + } /* for gr */ +- } /* for ch */ ++ } /* for ch */ + + shine_ResvFrameEnd(config); + } +@@ -168,21 +171,20 @@ void shine_iteration_loop(shine_global_config *config) + * ----------- + * calculation of the scalefactor select information ( scfsi ). + */ +-void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr, +- shine_global_config *config ) +-{ ++void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr, ++ shine_global_config *config) { + shine_side_info_t *l3_side = &config->side_info; + /* This is the scfsi_band table from 2.4.2.7 of the IS */ +- static const int scfsi_band_long[5] = { 0, 6, 11, 16, 21 }; ++ static const int scfsi_band_long[5] = {0, 6, 11, 16, 21}; + + int scfsi_band; +- unsigned scfsi_set; + + int sfb, start, end, i; + int condition = 0; + int temp; + +- const int *scalefac_band_long = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0]; ++ const int *scalefac_band_long = ++ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0]; + + /* note. it goes quite a bit faster if you uncomment the next bit and exit + early from scfsi, but you then loose the advantage of common scale factors. +@@ -194,82 +196,75 @@ void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr, + */ + + config->l3loop.xrmaxl[gr] = config->l3loop.xrmax; +- scfsi_set = 0; + + /* the total energy of the granule */ +- for ( temp = 0, i =GRANULE_SIZE; i--; ) +- temp += config->l3loop.xrsq[i]>>10; /* a bit of scaling to avoid overflow, (not very good) */ +- if ( temp ) +- config->l3loop.en_tot[gr] = log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */ ++ for (temp = 0, i = GRANULE_SIZE; i--;) ++ temp += config->l3loop.xrsq[i] >> ++ 10; /* a bit of scaling to avoid overflow, (not very good) */ ++ if (temp) ++ config->l3loop.en_tot[gr] = ++ log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */ + else + config->l3loop.en_tot[gr] = 0; + + /* the energy of each scalefactor band, en */ + /* the allowed distortion of each scalefactor band, xm */ + +- for(sfb=21; sfb--; ) +- { +- start = scalefac_band_long[ sfb ]; +- end = scalefac_band_long[ sfb+1 ]; ++ for (sfb = 21; sfb--;) { ++ start = scalefac_band_long[sfb]; ++ end = scalefac_band_long[sfb + 1]; + +- for ( temp = 0, i = start; i < end; i++ ) +- temp += config->l3loop.xrsq[i]>>10; +- if ( temp ) +- config->l3loop.en[gr][sfb] = log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */ ++ for (temp = 0, i = start; i < end; i++) ++ temp += config->l3loop.xrsq[i] >> 10; ++ if (temp) ++ config->l3loop.en[gr][sfb] = ++ log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */ + else + config->l3loop.en[gr][sfb] = 0; + +- if ( l3_xmin->l[gr][ch][sfb]) +- config->l3loop.xm[gr][sfb] = log( l3_xmin->l[gr][ch][sfb] ) / LN2; ++ if (l3_xmin->l[gr][ch][sfb]) ++ config->l3loop.xm[gr][sfb] = log(l3_xmin->l[gr][ch][sfb]) / LN2; + else + config->l3loop.xm[gr][sfb] = 0; + } + +- if(gr==1) +- { ++ if (gr == 1) { + int gr2, tp; + +- for(gr2=2; gr2--; ) +- { ++ for (gr2 = 2; gr2--;) { + /* The spectral values are not all zero */ +- if(config->l3loop.xrmaxl[gr2]) ++ if (config->l3loop.xrmaxl[gr2]) + condition++; + + condition++; + } +- if(abs(config->l3loop.en_tot[0]-config->l3loop.en_tot[1]) < en_tot_krit) ++ if (abs(config->l3loop.en_tot[0] - config->l3loop.en_tot[1]) < en_tot_krit) + condition++; +- for(tp=0,sfb=21; sfb--; ) +- tp += abs(config->l3loop.en[0][sfb]-config->l3loop.en[1][sfb]); ++ for (tp = 0, sfb = 21; sfb--;) ++ tp += abs(config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb]); + if (tp < en_dif_krit) + condition++; + +- if(condition==6) +- { +- for(scfsi_band=0;scfsi_band<4;scfsi_band++) +- { ++ if (condition == 6) { ++ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++) { + int sum0 = 0, sum1 = 0; + l3_side->scfsi[ch][scfsi_band] = 0; + start = scfsi_band_long[scfsi_band]; +- end = scfsi_band_long[scfsi_band+1]; +- for ( sfb = start; sfb < end; sfb++ ) +- { +- sum0 += abs( config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb] ); +- sum1 += abs( config->l3loop.xm[0][sfb] - config->l3loop.xm[1][sfb] ); ++ end = scfsi_band_long[scfsi_band + 1]; ++ for (sfb = start; sfb < end; sfb++) { ++ sum0 += abs(config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb]); ++ sum1 += abs(config->l3loop.xm[0][sfb] - config->l3loop.xm[1][sfb]); + } + +- if(sum0<en_scfsi_band_krit && sum1<xm_scfsi_band_krit) +- { ++ if (sum0 < en_scfsi_band_krit && sum1 < xm_scfsi_band_krit) { + l3_side->scfsi[ch][scfsi_band] = 1; +- scfsi_set |= (1 << scfsi_band); +- } +- else ++ } else + l3_side->scfsi[ch][scfsi_band] = 0; + } /* for scfsi_band */ +- } /* if condition == 6 */ ++ } /* if condition == 6 */ + else +- for(scfsi_band=0;scfsi_band<4;scfsi_band++) +- l3_side->scfsi[ch][scfsi_band] = 0; ++ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++) ++ l3_side->scfsi[ch][scfsi_band] = 0; + } /* if gr == 1 */ + } + +@@ -279,27 +274,26 @@ void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr, + * calculates the number of bits needed to encode the scalefacs in the + * main data block. + */ +-int part2_length(int gr, int ch, shine_global_config *config) +-{ ++int part2_length(int gr, int ch, shine_global_config *config) { + int slen1, slen2, bits; + gr_info *gi = &config->side_info.gr[gr].ch[ch].tt; + + bits = 0; + + { +- slen1 = shine_slen1_tab[ gi->scalefac_compress ]; +- slen2 = shine_slen2_tab[ gi->scalefac_compress ]; ++ slen1 = shine_slen1_tab[gi->scalefac_compress]; ++ slen2 = shine_slen2_tab[gi->scalefac_compress]; + +- if ( !gr || !(config->side_info.scfsi[ch][0]) ) ++ if (!gr || !(config->side_info.scfsi[ch][0])) + bits += (6 * slen1); + +- if ( !gr || !(config->side_info.scfsi[ch][1]) ) ++ if (!gr || !(config->side_info.scfsi[ch][1])) + bits += (5 * slen1); + +- if ( !gr || !(config->side_info.scfsi[ch][2]) ) ++ if (!gr || !(config->side_info.scfsi[ch][2])) + bits += (5 * slen2); + +- if ( !gr || !(config->side_info.scfsi[ch][3]) ) ++ if (!gr || !(config->side_info.scfsi[ch][3])) + bits += (5 * slen2); + } + return bits; +@@ -312,26 +306,22 @@ int part2_length(int gr, int ch, shine_global_config *config) + * as determined by the psychoacoustic model. + * xmin(sb) = ratio(sb) * en(sb) / bw(sb) + */ +-void calc_xmin(shine_psy_ratio_t *ratio, +- gr_info *cod_info, +- shine_psy_xmin_t *l3_xmin, +- int gr, int ch ) +-{ ++void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info, ++ shine_psy_xmin_t *l3_xmin, int gr, int ch) { + int sfb; + +- for ( sfb = cod_info->sfb_lmax; sfb--; ) +- { +-/* note. xmin will always be zero with no psychoacoustic model ++ for (sfb = cod_info->sfb_lmax; sfb--;) { ++ /* note. xmin will always be zero with no psychoacoustic model + +- start = scalefac_band_long[ sfb ]; +- end = scalefac_band_long[ sfb+1 ]; +- bw = end - start; ++ start = scalefac_band_long[ sfb ]; ++ end = scalefac_band_long[ sfb+1 ]; ++ bw = end - start; + +- for ( en = 0, l = start; l < end; l++ ) +- en += config->l3loop.xrsq[l]; ++ for ( en = 0, l = start; l < end; l++ ) ++ en += config->l3loop.xrsq[l]; + +- l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en / bw; +-*/ ++ l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en / bw; ++ */ + l3_xmin->l[gr][ch][sfb] = 0; + } + } +@@ -341,8 +331,7 @@ void calc_xmin(shine_psy_ratio_t *ratio, + * ------------------- + * Calculates the look up tables used by the iteration loop. + */ +-void shine_loop_initialise(shine_global_config *config) +-{ ++void shine_loop_initialise(shine_global_config *config) { + int i; + + /* quantize: stepsize conversion, fourth root of 2 table. +@@ -350,24 +339,26 @@ void shine_loop_initialise(shine_global_config *config) + * in the spec because it is quicker to do x*y than x/y. + * The 0.5 is for rounding. + */ +- for(i=128; i--;) +- { +- config->l3loop.steptab[i] = pow(2.0,(double)(127-i)/4); +- if((config->l3loop.steptab[i]*2)>0x7fffffff) /* MAXINT = 2**31 = 2**(124/4) */ +- config->l3loop.steptabi[i]=0x7fffffff; ++ for (i = 128; i--;) { ++ config->l3loop.steptab[i] = pow(2.0, (double)(127 - i) / 4); ++ if ((config->l3loop.steptab[i] * 2) > ++ 0x7fffffff) /* MAXINT = 2**31 = 2**(124/4) */ ++ config->l3loop.steptabi[i] = 0x7fffffff; + else + /* The table is multiplied by 2 to give an extra bit of accuracy. + * In quantize, the long multiply does not shift it's result left one + * bit to compensate. + */ +- config->l3loop.steptabi[i] = (int32_t)((config->l3loop.steptab[i]*2) + 0.5); ++ config->l3loop.steptabi[i] = ++ (int32_t)((config->l3loop.steptab[i] * 2) + 0.5); + } + + /* quantize: vector conversion, three quarter power table. + * The 0.5 is for rounding, the .0946 comes from the spec. + */ +- for(i=10000; i--;) +- config->l3loop.int2idx[i] = (int)(sqrt(sqrt((double)i)*(double)i) - 0.0946 + 0.5); ++ for (i = 10000; i--;) ++ config->l3loop.int2idx[i] = ++ (int)(sqrt(sqrt((double)i) * (double)i) - 0.0946 + 0.5); + } + + /* +@@ -376,39 +367,37 @@ void shine_loop_initialise(shine_global_config *config) + * Function: Quantization of the vector xr ( -> ix). + * Returns maximum value of ix. + */ +-int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config ) +-{ ++int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config) { + int i, max, ln; + int32_t scalei; + double scale, dbl; + +- scalei = config->l3loop.steptabi[stepsize+127]; /* 2**(-stepsize/4) */ ++ scalei = config->l3loop.steptabi[stepsize + 127]; /* 2**(-stepsize/4) */ + + /* a quick check to see if ixmax will be less than 8192 */ + /* this speeds up the early calls to bin_search_StepSize */ +- if((mulr(config->l3loop.xrmax,scalei)) > 165140) /* 8192**(4/3) */ ++ if ((mulr(config->l3loop.xrmax, scalei)) > 165140) /* 8192**(4/3) */ + max = 16384; /* no point in continuing, stepsize not big enough */ + else +- for(i=0, max=0;i<GRANULE_SIZE;i++) +- { ++ for (i = 0, max = 0; i < GRANULE_SIZE; i++) { + /* This calculation is very sensitive. The multiply must round it's + * result or bad things happen to the quality. + */ +- ln = mulr(labs(config->l3loop.xr[i]),scalei); ++ ln = mulr(labs(config->l3loop.xr[i]), scalei); + +- if(ln<10000) /* ln < 10000 catches most values */ ++ if (ln < 10000) /* ln < 10000 catches most values */ + ix[i] = config->l3loop.int2idx[ln]; /* quick look up method */ +- else +- { ++ else { + /* outside table range so have to do it using floats */ +- scale = config->l3loop.steptab[stepsize+127]; /* 2**(-stepsize/4) */ +- dbl = ((double)config->l3loop.xrabs[i]) * scale * 4.656612875e-10; /* 0x7fffffff */ +- ix[i] = (int)sqrt(sqrt(dbl)*dbl); /* dbl**(3/4) */ ++ scale = config->l3loop.steptab[stepsize + 127]; /* 2**(-stepsize/4) */ ++ dbl = ((double)config->l3loop.xrabs[i]) * scale * ++ 4.656612875e-10; /* 0x7fffffff */ ++ ix[i] = (int)sqrt(sqrt(dbl) * dbl); /* dbl**(3/4) */ + } + + /* calculate ixmax while we're here */ + /* note. ix cannot be negative */ +- if(max < ix[i]) ++ if (max < ix[i]) + max = ix[i]; + } + +@@ -420,13 +409,13 @@ int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config ) + * ------- + * Function: Calculate the maximum of ix from 0 to 575 + */ +-static inline int ix_max( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end ) +-{ ++static inline int ix_max(int ix[GRANULE_SIZE], unsigned int begin, ++ unsigned int end) { + register int i; + register int max = 0; + +- for(i=begin;i<end;i++) +- if(max < ix[i]) ++ for (i = begin; i < end; i++) ++ if (max < ix[i]) + max = ix[i]; + return max; + } +@@ -437,28 +426,24 @@ static inline int ix_max( int ix[GRANULE_SIZE], unsigned int begin, unsigned int + * Function: Calculation of rzero, count1, big_values + * (Partitions ix into big values, quadruples and zeros). + */ +-void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info ) +-{ ++void calc_runlen(int ix[GRANULE_SIZE], gr_info *cod_info) { + int i; + int rzero = 0; + +- for ( i = GRANULE_SIZE; i > 1; i -= 2 ) +- if ( !ix[i-1] && !ix[i-2] ) ++ for (i = GRANULE_SIZE; i > 1; i -= 2) ++ if (!ix[i - 1] && !ix[i - 2]) + rzero++; + else + break; + +- cod_info->count1 = 0 ; +- for ( ; i > 3; i -= 4 ) +- if ( ix[i-1] <= 1 +- && ix[i-2] <= 1 +- && ix[i-3] <= 1 +- && ix[i-4] <= 1 ) ++ cod_info->count1 = 0; ++ for (; i > 3; i -= 4) ++ if (ix[i - 1] <= 1 && ix[i - 2] <= 1 && ix[i - 3] <= 1 && ix[i - 4] <= 1) + cod_info->count1++; + else + break; + +- cod_info->big_values = i>>1; ++ cod_info->big_values = i >> 1; + } + + /* +@@ -466,27 +451,29 @@ void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info ) + * ---------------- + * Determines the number of bits to encode the quadruples. + */ +-int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info) +-{ ++int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info) { + int p, i, k; + int v, w, x, y, signbits; +- int sum0 = 0, +- sum1 = 0; ++ int sum0 = 0, sum1 = 0; + +- for(i=cod_info->big_values<<1, k=0; k<cod_info->count1; i+=4, k++) +- { ++ for (i = cod_info->big_values << 1, k = 0; k < cod_info->count1; ++ i += 4, k++) { + v = ix[i]; +- w = ix[i+1]; +- x = ix[i+2]; +- y = ix[i+3]; ++ w = ix[i + 1]; ++ x = ix[i + 2]; ++ y = ix[i + 3]; + +- p = v + (w<<1) + (x<<2) + (y<<3); ++ p = v + (w << 1) + (x << 2) + (y << 3); + + signbits = 0; +- if(v!=0) signbits++; +- if(w!=0) signbits++; +- if(x!=0) signbits++; +- if(y!=0) signbits++; ++ if (v != 0) ++ signbits++; ++ if (w != 0) ++ signbits++; ++ if (x != 0) ++ signbits++; ++ if (y != 0) ++ signbits++; + + sum0 += signbits; + sum1 += signbits; +@@ -495,13 +482,10 @@ int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info) + sum1 += shine_huffman_table[33].hlen[p]; + } + +- if(sum0<sum1) +- { ++ if (sum0 < sum1) { + cod_info->count1table_select = 0; + return sum0; +- } +- else +- { ++ } else { + cod_info->count1table_select = 1; + return sum1; + } +@@ -510,59 +494,56 @@ int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info) + /* + * subdivide: + * ---------- +- * presumable subdivides the bigvalue region which will use separate Huffman tables. ++ * presumable subdivides the bigvalue region which will use separate Huffman ++ * tables. + */ +-void subdivide(gr_info *cod_info, shine_global_config *config) +-{ +- static const struct +- { ++void subdivide(gr_info *cod_info, shine_global_config *config) { ++ static const struct { + unsigned region0_count; + unsigned region1_count; +- } subdv_table[ 23 ] = +- { +- {0, 0}, /* 0 bands */ +- {0, 0}, /* 1 bands */ +- {0, 0}, /* 2 bands */ +- {0, 0}, /* 3 bands */ +- {0, 0}, /* 4 bands */ +- {0, 1}, /* 5 bands */ +- {1, 1}, /* 6 bands */ +- {1, 1}, /* 7 bands */ +- {1, 2}, /* 8 bands */ +- {2, 2}, /* 9 bands */ +- {2, 3}, /* 10 bands */ +- {2, 3}, /* 11 bands */ +- {3, 4}, /* 12 bands */ +- {3, 4}, /* 13 bands */ +- {3, 4}, /* 14 bands */ +- {4, 5}, /* 15 bands */ +- {4, 5}, /* 16 bands */ +- {4, 6}, /* 17 bands */ +- {5, 6}, /* 18 bands */ +- {5, 6}, /* 19 bands */ +- {5, 7}, /* 20 bands */ +- {6, 7}, /* 21 bands */ +- {6, 7}, /* 22 bands */ ++ } subdv_table[23] = { ++ {0, 0}, /* 0 bands */ ++ {0, 0}, /* 1 bands */ ++ {0, 0}, /* 2 bands */ ++ {0, 0}, /* 3 bands */ ++ {0, 0}, /* 4 bands */ ++ {0, 1}, /* 5 bands */ ++ {1, 1}, /* 6 bands */ ++ {1, 1}, /* 7 bands */ ++ {1, 2}, /* 8 bands */ ++ {2, 2}, /* 9 bands */ ++ {2, 3}, /* 10 bands */ ++ {2, 3}, /* 11 bands */ ++ {3, 4}, /* 12 bands */ ++ {3, 4}, /* 13 bands */ ++ {3, 4}, /* 14 bands */ ++ {4, 5}, /* 15 bands */ ++ {4, 5}, /* 16 bands */ ++ {4, 6}, /* 17 bands */ ++ {5, 6}, /* 18 bands */ ++ {5, 6}, /* 19 bands */ ++ {5, 7}, /* 20 bands */ ++ {6, 7}, /* 21 bands */ ++ {6, 7}, /* 22 bands */ + }; + +- if (!cod_info->big_values) +- { /* no big_values region */ ++ if (!cod_info->big_values) { /* no big_values region */ + cod_info->region0_count = 0; + cod_info->region1_count = 0; +- } +- else +- { +- const int *scalefac_band_long = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0]; ++ } else { ++ const int *scalefac_band_long = ++ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0]; + int bigvalues_region, scfb_anz, thiscount; + + bigvalues_region = 2 * cod_info->big_values; + + /* Calculate scfb_anz */ + scfb_anz = 0; +- while ( scalefac_band_long[scfb_anz] < bigvalues_region ) ++ while (scalefac_band_long[scfb_anz] < bigvalues_region) + scfb_anz++; + +- for (thiscount = subdv_table[scfb_anz].region0_count; thiscount; thiscount--) { ++ for (thiscount = subdv_table[scfb_anz].region0_count; thiscount; ++ thiscount--) { + if (scalefac_band_long[thiscount + 1] <= bigvalues_region) + break; + } +@@ -571,7 +552,8 @@ void subdivide(gr_info *cod_info, shine_global_config *config) + + scalefac_band_long += cod_info->region0_count + 1; + +- for (thiscount = subdv_table[scfb_anz].region1_count; thiscount; thiscount--) { ++ for (thiscount = subdv_table[scfb_anz].region1_count; thiscount; ++ thiscount--) { + if (scalefac_band_long[thiscount + 1] <= bigvalues_region) + break; + } +@@ -587,21 +569,22 @@ void subdivide(gr_info *cod_info, shine_global_config *config) + * ---------------- + * Function: Select huffman code tables for bigvalues regions + */ +-void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info ) +-{ ++void bigv_tab_select(int ix[GRANULE_SIZE], gr_info *cod_info) { + cod_info->table_select[0] = 0; + cod_info->table_select[1] = 0; + cod_info->table_select[2] = 0; + + { +- if ( cod_info->address1 > 0 ) +- cod_info->table_select[0] = new_choose_table( ix, 0, cod_info->address1 ); ++ if (cod_info->address1 > 0) ++ cod_info->table_select[0] = new_choose_table(ix, 0, cod_info->address1); + +- if ( cod_info->address2 > cod_info->address1 ) +- cod_info->table_select[1] = new_choose_table( ix, cod_info->address1, cod_info->address2 ); ++ if (cod_info->address2 > cod_info->address1) ++ cod_info->table_select[1] = ++ new_choose_table(ix, cod_info->address1, cod_info->address2); + +- if ( cod_info->big_values<<1 > cod_info->address2 ) +- cod_info->table_select[2] = new_choose_table( ix, cod_info->address2, cod_info->big_values<<1 ); ++ if (cod_info->big_values << 1 > cod_info->address2) ++ cod_info->table_select[2] = ++ new_choose_table(ix, cod_info->address2, cod_info->big_values << 1); + } + } + +@@ -614,98 +597,89 @@ void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info ) + * of the Huffman tables as defined in the IS (Table B.7), and will not work + * with any arbitrary tables. + */ +-int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end ) +-{ ++int new_choose_table(int ix[GRANULE_SIZE], unsigned int begin, ++ unsigned int end) { + int i, max; + int choice[2]; + int sum[2]; + +- max = ix_max(ix,begin,end); +- if(!max) ++ max = ix_max(ix, begin, end); ++ if (!max) + return 0; + + choice[0] = 0; + choice[1] = 0; + +- if(max<15) +- { ++ if (max < 15) { + /* try tables with no linbits */ +- for ( i =14; i--; ) +- if ( shine_huffman_table[i].xlen > max ) +- { ++ for (i = 14; i--;) ++ if (shine_huffman_table[i].xlen > max) { + choice[0] = i; + break; + } + +- sum[0] = count_bit( ix, begin, end, choice[0] ); ++ sum[0] = count_bit(ix, begin, end, choice[0]); + +- switch (choice[0]) +- { +- case 2: +- sum[1] = count_bit( ix, begin, end, 3 ); +- if ( sum[1] <= sum[0] ) +- choice[0] = 3; +- break; ++ switch (choice[0]) { ++ case 2: ++ sum[1] = count_bit(ix, begin, end, 3); ++ if (sum[1] <= sum[0]) ++ choice[0] = 3; ++ break; + +- case 5: +- sum[1] = count_bit( ix, begin, end, 6 ); +- if ( sum[1] <= sum[0] ) +- choice[0] = 6; +- break; ++ case 5: ++ sum[1] = count_bit(ix, begin, end, 6); ++ if (sum[1] <= sum[0]) ++ choice[0] = 6; ++ break; + +- case 7: +- sum[1] = count_bit( ix, begin, end, 8 ); +- if ( sum[1] <= sum[0] ) +- { +- choice[0] = 8; +- sum[0] = sum[1]; +- } +- sum[1] = count_bit( ix, begin, end, 9 ); +- if ( sum[1] <= sum[0] ) +- choice[0] = 9; +- break; ++ case 7: ++ sum[1] = count_bit(ix, begin, end, 8); ++ if (sum[1] <= sum[0]) { ++ choice[0] = 8; ++ sum[0] = sum[1]; ++ } ++ sum[1] = count_bit(ix, begin, end, 9); ++ if (sum[1] <= sum[0]) ++ choice[0] = 9; ++ break; + +- case 10: +- sum[1] = count_bit( ix, begin, end, 11 ); +- if ( sum[1] <= sum[0] ) +- { +- choice[0] = 11; +- sum[0] = sum[1]; +- } +- sum[1] = count_bit( ix, begin, end, 12 ); +- if ( sum[1] <= sum[0] ) +- choice[0] = 12; +- break; ++ case 10: ++ sum[1] = count_bit(ix, begin, end, 11); ++ if (sum[1] <= sum[0]) { ++ choice[0] = 11; ++ sum[0] = sum[1]; ++ } ++ sum[1] = count_bit(ix, begin, end, 12); ++ if (sum[1] <= sum[0]) ++ choice[0] = 12; ++ break; + +- case 13: +- sum[1] = count_bit( ix, begin, end, 15 ); +- if ( sum[1] <= sum[0] ) +- choice[0] = 15; +- break; ++ case 13: ++ sum[1] = count_bit(ix, begin, end, 15); ++ if (sum[1] <= sum[0]) ++ choice[0] = 15; ++ break; + } +- } +- else +- { ++ } else { + /* try tables with linbits */ + max -= 15; + +- for(i=15;i<24;i++) +- if(shine_huffman_table[i].linmax>=max) +- { ++ for (i = 15; i < 24; i++) ++ if (shine_huffman_table[i].linmax >= max) { + choice[0] = i; + break; + } + +- for(i=24;i<32;i++) +- if(shine_huffman_table[i].linmax>=max) +- { ++ for (i = 24; i < 32; i++) ++ if (shine_huffman_table[i].linmax >= max) { + choice[1] = i; + break; + } + +- sum[0] = count_bit(ix,begin,end,choice[0]); +- sum[1] = count_bit(ix,begin,end,choice[1]); +- if (sum[1]<sum[0]) ++ sum[0] = count_bit(ix, begin, end, choice[0]); ++ sum[1] = count_bit(ix, begin, end, choice[1]); ++ if (sum[1] < sum[0]) + choice[0] = choice[1]; + } + return choice[0]; +@@ -716,17 +690,16 @@ int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end + * -------------- + * Function: Count the number of bits necessary to code the bigvalues region. + */ +-int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi) +-{ ++int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi) { + int bits = 0; + unsigned int table; + +- if( (table=gi->table_select[0])) /* region0 */ +- bits += count_bit(ix, 0, gi->address1, table ); +- if( (table=gi->table_select[1])) /* region1 */ +- bits += count_bit(ix, gi->address1, gi->address2, table ); +- if( (table=gi->table_select[2])) /* region2 */ +- bits += count_bit(ix, gi->address2, gi->address3, table ); ++ if ((table = gi->table_select[0])) /* region0 */ ++ bits += count_bit(ix, 0, gi->address1, table); ++ if ((table = gi->table_select[1])) /* region1 */ ++ bits += count_bit(ix, gi->address1, gi->address2, table); ++ if ((table = gi->table_select[2])) /* region2 */ ++ bits += count_bit(ix, gi->address2, gi->address3, table); + return bits; + } + +@@ -735,61 +708,51 @@ int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi) + * ---------- + * Function: Count the number of bits necessary to code the subregion. + */ +-int count_bit(int ix[GRANULE_SIZE], +- unsigned int start, +- unsigned int end, +- unsigned int table ) +-{ +- unsigned linbits, ylen; +- register int i, sum; +- register int x,y; ++int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end, ++ unsigned int table) { ++ unsigned linbits, ylen; ++ register int i, sum; ++ register int x, y; + const struct huffcodetab *h; + +- if(!table) ++ if (!table) + return 0; + +- h = &(shine_huffman_table[table]); ++ h = &(shine_huffman_table[table]); + sum = 0; + +- ylen = h->ylen; ++ ylen = h->ylen; + linbits = h->linbits; + +- if(table>15) +- { /* ESC-table is used */ +- for(i=start;i<end;i+=2) +- { ++ if (table > 15) { /* ESC-table is used */ ++ for (i = start; i < end; i += 2) { + x = ix[i]; +- y = ix[i+1]; +- if(x>14) +- { ++ y = ix[i + 1]; ++ if (x > 14) { + x = 15; + sum += linbits; + } +- if(y>14) +- { ++ if (y > 14) { + y = 15; + sum += linbits; + } + +- sum += h->hlen[(x*ylen)+y]; +- if(x) ++ sum += h->hlen[(x * ylen) + y]; ++ if (x) + sum++; +- if(y) ++ if (y) + sum++; + } +- } +- else +- { /* No ESC-words */ +- for(i=start;i<end;i+=2) +- { ++ } else { /* No ESC-words */ ++ for (i = start; i < end; i += 2) { + x = ix[i]; +- y = ix[i+1]; ++ y = ix[i + 1]; + +- sum += h->hlen[(x*ylen)+y]; ++ sum += h->hlen[(x * ylen) + y]; + +- if(x!=0) ++ if (x != 0) + sum++; +- if(y!=0) ++ if (y != 0) + sum++; + } + } +@@ -809,20 +772,18 @@ int count_bit(int ix[GRANULE_SIZE], + * returns a good starting quantizerStepSize. + */ + int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE], +- gr_info * cod_info, shine_global_config *config) +-{ ++ gr_info *cod_info, shine_global_config *config) { + int bit, next, count; + +- next = -120; ++ next = -120; + count = 120; + + do { + int half = count / 2; + + if (quantize(ix, next + half, config) > 8192) +- bit = 100000; /* fail */ +- else +- { ++ bit = 100000; /* fail */ ++ else { + calc_runlen(ix, cod_info); /* rzero,count1,big_values */ + bit = count1_bitcount(ix, cod_info); /* count1_table selection */ + subdivide(cod_info, config); /* bigvalues sfb division */ +@@ -832,8 +793,7 @@ int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE], + + if (bit < desired_rate) + count = half; +- else +- { ++ else { + next += half; + count -= half; + } +diff --git a/src/lib/l3loop.h b/src/lib/l3loop.h +index 0e71a91..94ecea3 100644 +--- a/src/lib/l3loop.h ++++ b/src/lib/l3loop.h +@@ -1,9 +1,10 @@ + #ifndef L3LOOP_H + #define L3LOOP_H + ++#include "types.h" ++ + void shine_loop_initialise(shine_global_config *config); + + void shine_iteration_loop(shine_global_config *config); + + #endif +- +diff --git a/src/lib/l3mdct.c b/src/lib/l3mdct.c +index 7553a54..a76b702 100644 +--- a/src/lib/l3mdct.c ++++ b/src/lib/l3mdct.c +@@ -1,88 +1,87 @@ + /* L3mdct */ + +-#include "types.h" + #include "l3mdct.h" + #include "l3subband.h" ++#include "types.h" + + /* This is table B.9: coefficients for aliasing reduction */ +-#define MDCT_CA(coef) (int32_t)(coef / sqrt(1.0 + (coef * coef)) * 0x7fffffff) +-#define MDCT_CS(coef) (int32_t)(1.0 / sqrt(1.0 + (coef * coef)) * 0x7fffffff) ++#define MDCT_CA(coef) (int32_t)(coef / sqrt(1.0 + (coef * coef)) * 0x7fffffff) ++#define MDCT_CS(coef) (int32_t)(1.0 / sqrt(1.0 + (coef * coef)) * 0x7fffffff) + +-#define MDCT_CA0 MDCT_CA(-0.6) +-#define MDCT_CA1 MDCT_CA(-0.535) +-#define MDCT_CA2 MDCT_CA(-0.33) +-#define MDCT_CA3 MDCT_CA(-0.185) +-#define MDCT_CA4 MDCT_CA(-0.095) +-#define MDCT_CA5 MDCT_CA(-0.041) +-#define MDCT_CA6 MDCT_CA(-0.0142) +-#define MDCT_CA7 MDCT_CA(-0.0037) ++#define MDCT_CA0 MDCT_CA(-0.6) ++#define MDCT_CA1 MDCT_CA(-0.535) ++#define MDCT_CA2 MDCT_CA(-0.33) ++#define MDCT_CA3 MDCT_CA(-0.185) ++#define MDCT_CA4 MDCT_CA(-0.095) ++#define MDCT_CA5 MDCT_CA(-0.041) ++#define MDCT_CA6 MDCT_CA(-0.0142) ++#define MDCT_CA7 MDCT_CA(-0.0037) + +-#define MDCT_CS0 MDCT_CS(-0.6) +-#define MDCT_CS1 MDCT_CS(-0.535) +-#define MDCT_CS2 MDCT_CS(-0.33) +-#define MDCT_CS3 MDCT_CS(-0.185) +-#define MDCT_CS4 MDCT_CS(-0.095) +-#define MDCT_CS5 MDCT_CS(-0.041) +-#define MDCT_CS6 MDCT_CS(-0.0142) +-#define MDCT_CS7 MDCT_CS(-0.0037) ++#define MDCT_CS0 MDCT_CS(-0.6) ++#define MDCT_CS1 MDCT_CS(-0.535) ++#define MDCT_CS2 MDCT_CS(-0.33) ++#define MDCT_CS3 MDCT_CS(-0.185) ++#define MDCT_CS4 MDCT_CS(-0.095) ++#define MDCT_CS5 MDCT_CS(-0.041) ++#define MDCT_CS6 MDCT_CS(-0.0142) ++#define MDCT_CS7 MDCT_CS(-0.0037) + + /* + * shine_mdct_initialise: + * ------------------- + */ +-void shine_mdct_initialise(shine_global_config *config) +-{ +- int m,k; ++void shine_mdct_initialise(shine_global_config *config) { ++ int m, k; + + /* prepare the mdct coefficients */ +- for(m=18; m--; ) +- for(k=36; k--; ) ++ for (m = 18; m--;) ++ for (k = 36; k--;) + /* combine window and mdct coefficients into a single table */ + /* scale and convert to fixed point before storing */ +- config->mdct.cos_l[m][k] = (int32_t)(sin(PI36*(k+0.5)) +- * cos((PI/72)*(2*k+19)*(2*m+1)) * 0x7fffffff); ++ config->mdct.cos_l[m][k] = ++ (int32_t)(sin(PI36 * (k + 0.5)) * ++ cos((PI / 72) * (2 * k + 19) * (2 * m + 1)) * 0x7fffffff); + } + + /* + * shine_mdct_sub: + * ------------ + */ +-void shine_mdct_sub(shine_global_config *config, int stride) +-{ ++void shine_mdct_sub(shine_global_config *config, int stride) { + /* note. we wish to access the array 'config->mdct_freq[2][2][576]' as + * [2][2][32][18]. (32*18=576), + */ +- int32_t (*mdct_enc)[18]; ++ int32_t(*mdct_enc)[18]; + +- int ch,gr,band,j,k; ++ int ch, gr, band, j, k; + int32_t mdct_in[36]; + +- for(ch=config->wave.channels; ch--; ) +- { +- for(gr=0; gr<config->mpeg.granules_per_frame; gr++) +- { ++ for (ch = config->wave.channels; ch--;) { ++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) { + /* set up pointer to the part of config->mdct_freq we're using */ +- mdct_enc = (int32_t (*)[18]) config->mdct_freq[ch][gr]; ++ mdct_enc = (int32_t(*)[18])config->mdct_freq[ch][gr]; + + /* polyphase filtering */ +- for(k=0; k<18; k+=2) +- { +- shine_window_filter_subband(&config->buffer[ch], &config->l3_sb_sample[ch][gr+1][k ][0], ch, config, stride); +- shine_window_filter_subband(&config->buffer[ch], &config->l3_sb_sample[ch][gr+1][k+1][0], ch, config, stride); ++ for (k = 0; k < 18; k += 2) { ++ shine_window_filter_subband(&config->buffer[ch], ++ &config->l3_sb_sample[ch][gr + 1][k][0], ch, ++ config, stride); ++ shine_window_filter_subband(&config->buffer[ch], ++ &config->l3_sb_sample[ch][gr + 1][k + 1][0], ++ ch, config, stride); + /* Compensate for inversion in the analysis filter + * (every odd index of band AND k) + */ +- for(band=1; band<32; band+=2) +- config->l3_sb_sample[ch][gr+1][k+1][band] *= -1; ++ for (band = 1; band < 32; band += 2) ++ config->l3_sb_sample[ch][gr + 1][k + 1][band] *= -1; + } + +- /* Perform imdct of 18 previous subband samples + 18 current subband samples */ +- for(band=0; band<32; band++) +- { +- for(k=18; k--; ) +- { +- mdct_in[k ] = config->l3_sb_sample[ch][gr ][k][band]; +- mdct_in[k+18] = config->l3_sb_sample[ch][gr+1][k][band]; ++ /* Perform imdct of 18 previous subband samples + 18 current subband ++ * samples */ ++ for (band = 0; band < 32; band++) { ++ for (k = 18; k--;) { ++ mdct_in[k] = config->l3_sb_sample[ch][gr][k][band]; ++ mdct_in[k + 18] = config->l3_sb_sample[ch][gr + 1][k][band]; + } + + /* Calculation of the MDCT +@@ -90,41 +89,61 @@ void shine_mdct_sub(shine_global_config *config, int stride) + * 36 coefficients in the time domain and 18 in the frequency + * domain. + */ +- for(k=18; k--; ) +- { ++ for (k = 18; k--;) { + int32_t vm; ++#ifdef __BORLANDC__ ++ uint32_t vm_lo; ++#else + uint32_t vm_lo __attribute__((unused)); ++#endif + + mul0(vm, vm_lo, mdct_in[35], config->mdct.cos_l[k][35]); +- for(j=35; j; j-=7) { +- muladd(vm, vm_lo, mdct_in[j-1], config->mdct.cos_l[k][j-1]); +- muladd(vm, vm_lo, mdct_in[j-2], config->mdct.cos_l[k][j-2]); +- muladd(vm, vm_lo, mdct_in[j-3], config->mdct.cos_l[k][j-3]); +- muladd(vm, vm_lo, mdct_in[j-4], config->mdct.cos_l[k][j-4]); +- muladd(vm, vm_lo, mdct_in[j-5], config->mdct.cos_l[k][j-5]); +- muladd(vm, vm_lo, mdct_in[j-6], config->mdct.cos_l[k][j-6]); +- muladd(vm, vm_lo, mdct_in[j-7], config->mdct.cos_l[k][j-7]); ++ for (j = 35; j; j -= 7) { ++ muladd(vm, vm_lo, mdct_in[j - 1], config->mdct.cos_l[k][j - 1]); ++ muladd(vm, vm_lo, mdct_in[j - 2], config->mdct.cos_l[k][j - 2]); ++ muladd(vm, vm_lo, mdct_in[j - 3], config->mdct.cos_l[k][j - 3]); ++ muladd(vm, vm_lo, mdct_in[j - 4], config->mdct.cos_l[k][j - 4]); ++ muladd(vm, vm_lo, mdct_in[j - 5], config->mdct.cos_l[k][j - 5]); ++ muladd(vm, vm_lo, mdct_in[j - 6], config->mdct.cos_l[k][j - 6]); ++ muladd(vm, vm_lo, mdct_in[j - 7], config->mdct.cos_l[k][j - 7]); + } + mulz(vm, vm_lo); + mdct_enc[band][k] = vm; + } + + /* Perform aliasing reduction butterfly */ +- if (band != 0) +- { +- cmuls(mdct_enc[band][0], mdct_enc[band-1][17-0], mdct_enc[band][0], mdct_enc[band-1][17-0], MDCT_CS0, MDCT_CA0); +- cmuls(mdct_enc[band][1], mdct_enc[band-1][17-1], mdct_enc[band][1], mdct_enc[band-1][17-1], MDCT_CS1, MDCT_CA1); +- cmuls(mdct_enc[band][2], mdct_enc[band-1][17-2], mdct_enc[band][2], mdct_enc[band-1][17-2], MDCT_CS2, MDCT_CA2); +- cmuls(mdct_enc[band][3], mdct_enc[band-1][17-3], mdct_enc[band][3], mdct_enc[band-1][17-3], MDCT_CS3, MDCT_CA3); +- cmuls(mdct_enc[band][4], mdct_enc[band-1][17-4], mdct_enc[band][4], mdct_enc[band-1][17-4], MDCT_CS4, MDCT_CA4); +- cmuls(mdct_enc[band][5], mdct_enc[band-1][17-5], mdct_enc[band][5], mdct_enc[band-1][17-5], MDCT_CS5, MDCT_CA5); +- cmuls(mdct_enc[band][6], mdct_enc[band-1][17-6], mdct_enc[band][6], mdct_enc[band-1][17-6], MDCT_CS6, MDCT_CA6); +- cmuls(mdct_enc[band][7], mdct_enc[band-1][17-7], mdct_enc[band][7], mdct_enc[band-1][17-7], MDCT_CS7, MDCT_CA7); ++ if (band != 0) { ++ cmuls(mdct_enc[band][0], mdct_enc[band - 1][17 - 0], ++ mdct_enc[band][0], mdct_enc[band - 1][17 - 0], MDCT_CS0, ++ MDCT_CA0); ++ cmuls(mdct_enc[band][1], mdct_enc[band - 1][17 - 1], ++ mdct_enc[band][1], mdct_enc[band - 1][17 - 1], MDCT_CS1, ++ MDCT_CA1); ++ cmuls(mdct_enc[band][2], mdct_enc[band - 1][17 - 2], ++ mdct_enc[band][2], mdct_enc[band - 1][17 - 2], MDCT_CS2, ++ MDCT_CA2); ++ cmuls(mdct_enc[band][3], mdct_enc[band - 1][17 - 3], ++ mdct_enc[band][3], mdct_enc[band - 1][17 - 3], MDCT_CS3, ++ MDCT_CA3); ++ cmuls(mdct_enc[band][4], mdct_enc[band - 1][17 - 4], ++ mdct_enc[band][4], mdct_enc[band - 1][17 - 4], MDCT_CS4, ++ MDCT_CA4); ++ cmuls(mdct_enc[band][5], mdct_enc[band - 1][17 - 5], ++ mdct_enc[band][5], mdct_enc[band - 1][17 - 5], MDCT_CS5, ++ MDCT_CA5); ++ cmuls(mdct_enc[band][6], mdct_enc[band - 1][17 - 6], ++ mdct_enc[band][6], mdct_enc[band - 1][17 - 6], MDCT_CS6, ++ MDCT_CA6); ++ cmuls(mdct_enc[band][7], mdct_enc[band - 1][17 - 7], ++ mdct_enc[band][7], mdct_enc[band - 1][17 - 7], MDCT_CS7, ++ MDCT_CA7); + } + } + } + + /* Save latest granule's subband samples to be used in the next mdct call */ +- memcpy(config->l3_sb_sample[ch][0], config->l3_sb_sample[ch][config->mpeg.granules_per_frame], sizeof(config->l3_sb_sample[0][0])); ++ memcpy(config->l3_sb_sample[ch][0], ++ config->l3_sb_sample[ch][config->mpeg.granules_per_frame], ++ sizeof(config->l3_sb_sample[0][0])); + } + } +diff --git a/src/lib/l3mdct.h b/src/lib/l3mdct.h +index 1288259..3018eb9 100644 +--- a/src/lib/l3mdct.h ++++ b/src/lib/l3mdct.h +@@ -1,7 +1,9 @@ + #ifndef shine_MDCT_H + #define shine_MDCT_H + +-void shine_mdct_initialise(); ++#include "types.h" ++ ++void shine_mdct_initialise(shine_global_config *config); + void shine_mdct_sub(shine_global_config *config, int stride); + + #endif +diff --git a/src/lib/l3subband.c b/src/lib/l3subband.c +index 58abf5f..78f428e 100644 +--- a/src/lib/l3subband.c ++++ b/src/lib/l3subband.c +@@ -1,8 +1,8 @@ + /* L3SubBand */ + +-#include "types.h" +-#include "tables.h" + #include "l3subband.h" ++#include "tables.h" ++#include "types.h" + + /* + * shine_subband_initialise: +@@ -11,23 +11,21 @@ + * 9th decimal place accuracy of the filterbank tables in the ISO + * document. The coefficients are stored in #filter# + */ +-void shine_subband_initialise(shine_global_config *config) +-{ +- int i,j; ++void shine_subband_initialise(shine_global_config *config) { ++ int i, j; + double filter; + +- for(i=MAX_CHANNELS; i-- ; ) { ++ for (i = MAX_CHANNELS; i--;) { + config->subband.off[i] = 0; + memset(config->subband.x[i], 0, sizeof(config->subband.x[i])); + } + +- for (i=SBLIMIT; i--; ) +- for (j=64; j--; ) +- { +- if ((filter = 1e9*cos((double)((2*i+1)*(16-j)*PI64))) >= 0) +- modf(filter+0.5, &filter); ++ for (i = SBLIMIT; i--;) ++ for (j = 64; j--;) { ++ if ((filter = 1e9 * cos((double)((2 * i + 1) * (16 - j) * PI64))) >= 0) ++ modf(filter + 0.5, &filter); + else +- modf(filter-0.5, &filter); ++ modf(filter - 0.5, &filter); + /* scale and convert to fixed point before storing */ + config->subband.fl[i][j] = (int32_t)(filter * (0x7fffffff * 1e-9)); + } +@@ -39,58 +37,90 @@ void shine_subband_initialise(shine_global_config *config) + * Overlapping window on PCM samples + * 32 16-bit pcm samples are scaled to fractional 2's complement and + * concatenated to the end of the window buffer #x#. The updated window +- * buffer #x# is then windowed by the analysis window #shine_enwindow# to produce +- * the windowed sample #z# +- * Calculates the analysis filter bank coefficients +- * The windowed samples #z# is filtered by the digital filter matrix #filter# +- * to produce the subband samples #s#. This done by first selectively +- * picking out values from the windowed samples, and then multiplying +- * them by the filter matrix, producing 32 subband samples. ++ * buffer #x# is then windowed by the analysis window #shine_enwindow# to ++ * produce the windowed sample #z# Calculates the analysis filter bank ++ * coefficients The windowed samples #z# is filtered by the digital filter ++ * matrix #filter# to produce the subband samples #s#. This done by first ++ * selectively picking out values from the windowed samples, and then ++ * multiplying them by the filter matrix, producing 32 subband samples. + */ +-void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int ch, shine_global_config *config, int stride) +-{ ++void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int ch, ++ shine_global_config *config, int stride) { + int32_t y[64]; +- int i,j; ++ int i, j; + int16_t *ptr = *buffer; + + /* replace 32 oldest samples with 32 new samples */ +- for (i=32;i--;) { +- config->subband.x[ch][i+config->subband.off[ch]] = ((int32_t)*ptr) << 16; ++ for (i = 32; i--;) { ++ config->subband.x[ch][i + config->subband.off[ch]] = ((int32_t)*ptr) << 16; + ptr += stride; + } + *buffer = ptr; + +- for (i=64; i--; ) { ++ for (i = 64; i--;) { + int32_t s_value; ++#ifdef __BORLANDC__ ++ uint32_t s_value_lo; ++#else + uint32_t s_value_lo __attribute__((unused)); ++#endif + +- mul0 (s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (0<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (0<<6)]); +- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (1<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (1<<6)]); +- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (2<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (2<<6)]); +- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (3<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (3<<6)]); +- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (4<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (4<<6)]); +- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (5<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (5<<6)]); +- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (6<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (6<<6)]); +- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (7<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (7<<6)]); +- mulz (s_value, s_value_lo); ++ mul0(s_value, s_value_lo, ++ config->subband ++ .x[ch][(config->subband.off[ch] + i + (0 << 6)) & (HAN_SIZE - 1)], ++ shine_enwindow[i + (0 << 6)]); ++ muladd(s_value, s_value_lo, ++ config->subband.x[ch][(config->subband.off[ch] + i + (1 << 6)) & ++ (HAN_SIZE - 1)], ++ shine_enwindow[i + (1 << 6)]); ++ muladd(s_value, s_value_lo, ++ config->subband.x[ch][(config->subband.off[ch] + i + (2 << 6)) & ++ (HAN_SIZE - 1)], ++ shine_enwindow[i + (2 << 6)]); ++ muladd(s_value, s_value_lo, ++ config->subband.x[ch][(config->subband.off[ch] + i + (3 << 6)) & ++ (HAN_SIZE - 1)], ++ shine_enwindow[i + (3 << 6)]); ++ muladd(s_value, s_value_lo, ++ config->subband.x[ch][(config->subband.off[ch] + i + (4 << 6)) & ++ (HAN_SIZE - 1)], ++ shine_enwindow[i + (4 << 6)]); ++ muladd(s_value, s_value_lo, ++ config->subband.x[ch][(config->subband.off[ch] + i + (5 << 6)) & ++ (HAN_SIZE - 1)], ++ shine_enwindow[i + (5 << 6)]); ++ muladd(s_value, s_value_lo, ++ config->subband.x[ch][(config->subband.off[ch] + i + (6 << 6)) & ++ (HAN_SIZE - 1)], ++ shine_enwindow[i + (6 << 6)]); ++ muladd(s_value, s_value_lo, ++ config->subband.x[ch][(config->subband.off[ch] + i + (7 << 6)) & ++ (HAN_SIZE - 1)], ++ shine_enwindow[i + (7 << 6)]); ++ mulz(s_value, s_value_lo); + y[i] = s_value; + } + +- config->subband.off[ch] = (config->subband.off[ch] + 480) & (HAN_SIZE-1); /* offset is modulo (HAN_SIZE)*/ ++ config->subband.off[ch] = (config->subband.off[ch] + 480) & ++ (HAN_SIZE - 1); /* offset is modulo (HAN_SIZE)*/ + +- for (i=SBLIMIT; i--; ) { ++ for (i = SBLIMIT; i--;) { + int32_t s_value; ++#ifdef __BORLANDC__ ++ uint32_t s_value_lo; ++#else + uint32_t s_value_lo __attribute__((unused)); ++#endif + + mul0(s_value, s_value_lo, config->subband.fl[i][63], y[63]); +- for (j=63; j; j-=7) { +- muladd(s_value, s_value_lo, config->subband.fl[i][j-1], y[j-1]); +- muladd(s_value, s_value_lo, config->subband.fl[i][j-2], y[j-2]); +- muladd(s_value, s_value_lo, config->subband.fl[i][j-3], y[j-3]); +- muladd(s_value, s_value_lo, config->subband.fl[i][j-4], y[j-4]); +- muladd(s_value, s_value_lo, config->subband.fl[i][j-5], y[j-5]); +- muladd(s_value, s_value_lo, config->subband.fl[i][j-6], y[j-6]); +- muladd(s_value, s_value_lo, config->subband.fl[i][j-7], y[j-7]); ++ for (j = 63; j; j -= 7) { ++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 1], y[j - 1]); ++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 2], y[j - 2]); ++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 3], y[j - 3]); ++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 4], y[j - 4]); ++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 5], y[j - 5]); ++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 6], y[j - 6]); ++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 7], y[j - 7]); + } + mulz(s_value, s_value_lo); + s[i] = s_value; +diff --git a/src/lib/l3subband.h b/src/lib/l3subband.h +index 9bfe861..5cfbef5 100644 +--- a/src/lib/l3subband.h ++++ b/src/lib/l3subband.h +@@ -1,9 +1,11 @@ + #ifndef L3SUBBAND_H + #define L3SUBBAND_H + ++#include "types.h" + #include <stdint.h> + +-void shine_subband_initialise( shine_global_config *config ); +-void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int k, shine_global_config *config, int stride); ++void shine_subband_initialise(shine_global_config *config); ++void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int k, ++ shine_global_config *config, int stride); + + #endif +diff --git a/src/lib/layer3.c b/src/lib/layer3.c +index 0b574ad..f3d1ecd 100644 +--- a/src/lib/layer3.c ++++ b/src/lib/layer3.c +@@ -1,28 +1,27 @@ + /* layer3.c */ + +-#include "types.h" +-#include "tables.h" + #include "layer3.h" +-#include "l3subband.h" +-#include "l3mdct.h" +-#include "l3loop.h" + #include "bitstream.h" + #include "l3bitstream.h" ++#include "l3loop.h" ++#include "l3mdct.h" ++#include "l3subband.h" ++#include "tables.h" ++#include "types.h" + + static int granules_per_frame[4] = { + 1, /* MPEG 2.5 */ +- -1, /* Reserved */ ++ -1, /* Reserved */ + 1, /* MPEG II */ +- 2 /* MPEG I */ ++ 2 /* MPEG I */ + }; + + /* Set default values for important vars */ +-void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg) +-{ ++void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg) { + mpeg->bitr = 128; + mpeg->emph = NONE; + mpeg->copyright = 0; +- mpeg->original = 1; ++ mpeg->original = 1; + } + + int shine_mpeg_version(int samplerate_index) { +@@ -38,56 +37,56 @@ int shine_mpeg_version(int samplerate_index) { + return MPEG_25; + } + +-int shine_find_samplerate_index(int freq) +-{ ++int shine_find_samplerate_index(int freq) { + int i; + +- for(i=0;i<9;i++) +- if(freq==samplerates[i]) return i; ++ for (i = 0; i < 9; i++) ++ if (freq == samplerates[i]) ++ return i; + + return -1; /* error - not a valid samplerate for encoder */ + } + +-int shine_find_bitrate_index(int bitr, int mpeg_version) +-{ ++int shine_find_bitrate_index(int bitr, int mpeg_version) { + int i; + +- for(i=0;i<16;i++) +- if(bitr==bitrates[i][mpeg_version]) return i; ++ for (i = 0; i < 16; i++) ++ if (bitr == bitrates[i][mpeg_version]) ++ return i; + + return -1; /* error - not a valid samplerate for encoder */ + } + +-int shine_check_config(int freq, int bitr) +-{ ++int shine_check_config(int freq, int bitr) { + int samplerate_index, bitrate_index, mpeg_version; + + samplerate_index = shine_find_samplerate_index(freq); +- if (samplerate_index < 0) return -1; ++ if (samplerate_index < 0) ++ return -1; + + mpeg_version = shine_mpeg_version(samplerate_index); + + bitrate_index = shine_find_bitrate_index(bitr, mpeg_version); +- if (bitrate_index < 0) return -1; ++ if (bitrate_index < 0) ++ return -1; + + return mpeg_version; + } + +-int shine_samples_per_pass(shine_t s) +-{ ++int shine_samples_per_pass(shine_t s) { + return s->mpeg.granules_per_frame * GRANULE_SIZE; + } + + /* Compute default encoding values. */ +-shine_global_config *shine_initialise(shine_config_t *pub_config) +-{ ++shine_global_config *shine_initialise(shine_config_t *pub_config) { + double avg_slots_per_frame; + shine_global_config *config; + +- if (shine_check_config(pub_config->wave.samplerate, pub_config->mpeg.bitr) < 0) ++ if (shine_check_config(pub_config->wave.samplerate, pub_config->mpeg.bitr) < ++ 0) + return NULL; + +- config = calloc(1,sizeof(shine_global_config)); ++ config = calloc(1, sizeof(shine_global_config)); + if (config == NULL) + return config; + +@@ -96,65 +95,71 @@ shine_global_config *shine_initialise(shine_config_t *pub_config) + shine_loop_initialise(config); + + /* Copy public config. */ +- config->wave.channels = pub_config->wave.channels; +- config->wave.samplerate = pub_config->wave.samplerate; +- config->mpeg.mode = pub_config->mpeg.mode; +- config->mpeg.bitr = pub_config->mpeg.bitr; +- config->mpeg.emph = pub_config->mpeg.emph; +- config->mpeg.copyright = pub_config->mpeg.copyright; +- config->mpeg.original = pub_config->mpeg.original; ++ config->wave.channels = pub_config->wave.channels; ++ config->wave.samplerate = pub_config->wave.samplerate; ++ config->mpeg.mode = pub_config->mpeg.mode; ++ config->mpeg.bitr = pub_config->mpeg.bitr; ++ config->mpeg.emph = pub_config->mpeg.emph; ++ config->mpeg.copyright = pub_config->mpeg.copyright; ++ config->mpeg.original = pub_config->mpeg.original; + + /* Set default values. */ +- config->ResvMax = 0; +- config->ResvSize = 0; +- config->mpeg.layer = LAYER_III; +- config->mpeg.crc = 0; +- config->mpeg.ext = 0; +- config->mpeg.mode_ext = 0; +- config->mpeg.bits_per_slot = 8; +- +- config->mpeg.samplerate_index = shine_find_samplerate_index(config->wave.samplerate); +- config->mpeg.version = shine_mpeg_version(config->mpeg.samplerate_index); +- config->mpeg.bitrate_index = shine_find_bitrate_index(config->mpeg.bitr, config->mpeg.version); ++ config->ResvMax = 0; ++ config->ResvSize = 0; ++ config->mpeg.layer = LAYER_III; ++ config->mpeg.crc = 0; ++ config->mpeg.ext = 0; ++ config->mpeg.mode_ext = 0; ++ config->mpeg.bits_per_slot = 8; ++ ++ config->mpeg.samplerate_index = ++ shine_find_samplerate_index(config->wave.samplerate); ++ config->mpeg.version = shine_mpeg_version(config->mpeg.samplerate_index); ++ config->mpeg.bitrate_index = ++ shine_find_bitrate_index(config->mpeg.bitr, config->mpeg.version); + config->mpeg.granules_per_frame = granules_per_frame[config->mpeg.version]; + + /* Figure average number of 'slots' per frame. */ +- avg_slots_per_frame = ((double)config->mpeg.granules_per_frame * GRANULE_SIZE / +- ((double)config->wave.samplerate)) * +- (1000*(double)config->mpeg.bitr / +- (double)config->mpeg.bits_per_slot); ++ avg_slots_per_frame = ++ ((double)config->mpeg.granules_per_frame * GRANULE_SIZE / ++ ((double)config->wave.samplerate)) * ++ (1000 * (double)config->mpeg.bitr / (double)config->mpeg.bits_per_slot); + +- config->mpeg.whole_slots_per_frame = (int)avg_slots_per_frame; ++ config->mpeg.whole_slots_per_frame = (int)avg_slots_per_frame; + +- config->mpeg.frac_slots_per_frame = avg_slots_per_frame - (double)config->mpeg.whole_slots_per_frame; +- config->mpeg.slot_lag = -config->mpeg.frac_slots_per_frame; ++ config->mpeg.frac_slots_per_frame = ++ avg_slots_per_frame - (double)config->mpeg.whole_slots_per_frame; ++ config->mpeg.slot_lag = -config->mpeg.frac_slots_per_frame; + +- if(config->mpeg.frac_slots_per_frame==0) ++ if (config->mpeg.frac_slots_per_frame == 0) + config->mpeg.padding = 0; + + shine_open_bit_stream(&config->bs, BUFFER_SIZE); + +- memset((char *)&config->side_info,0,sizeof(shine_side_info_t)); ++ memset((char *)&config->side_info, 0, sizeof(shine_side_info_t)); + + /* determine the mean bitrate for main data */ + if (config->mpeg.granules_per_frame == 2) /* MPEG 1 */ +- config->sideinfo_len = 8 * ((config->wave.channels==1) ? 4 + 17 : 4 + 32); +- else /* MPEG 2 */ +- config->sideinfo_len = 8 * ((config->wave.channels==1) ? 4 + 9 : 4 + 17); ++ config->sideinfo_len = 8 * ((config->wave.channels == 1) ? 4 + 17 : 4 + 32); ++ else /* MPEG 2 */ ++ config->sideinfo_len = 8 * ((config->wave.channels == 1) ? 4 + 9 : 4 + 17); + + return config; + } + +-static unsigned char *shine_encode_buffer_internal(shine_global_config *config, int *written, int stride) +-{ +- if(config->mpeg.frac_slots_per_frame) +- { +- config->mpeg.padding = (config->mpeg.slot_lag <= (config->mpeg.frac_slots_per_frame - 1.0)); +- config->mpeg.slot_lag += (config->mpeg.padding - config->mpeg.frac_slots_per_frame); ++static unsigned char *shine_encode_buffer_internal(shine_global_config *config, ++ int *written, int stride) { ++ if (config->mpeg.frac_slots_per_frame) { ++ config->mpeg.padding = ++ (config->mpeg.slot_lag <= (config->mpeg.frac_slots_per_frame - 1.0)); ++ config->mpeg.slot_lag += ++ (config->mpeg.padding - config->mpeg.frac_slots_per_frame); + } + +- config->mpeg.bits_per_frame = 8*(config->mpeg.whole_slots_per_frame + config->mpeg.padding); +- config->mean_bits = (config->mpeg.bits_per_frame - config->sideinfo_len)/config->mpeg.granules_per_frame; ++ config->mpeg.bits_per_frame = ++ 8 * (config->mpeg.whole_slots_per_frame + config->mpeg.padding); ++ config->mean_bits = (config->mpeg.bits_per_frame - config->sideinfo_len) / ++ config->mpeg.granules_per_frame; + + /* apply mdct to the polyphase output */ + shine_mdct_sub(config, stride); +@@ -172,8 +177,8 @@ static unsigned char *shine_encode_buffer_internal(shine_global_config *config, + return config->bs.data; + } + +-unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data, int *written) +-{ ++unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data, ++ int *written) { + config->buffer[0] = data[0]; + if (config->wave.channels == 2) + config->buffer[1] = data[1]; +@@ -181,8 +186,8 @@ unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data, + return shine_encode_buffer_internal(config, written, 1); + } + +-unsigned char *shine_encode_buffer_interleaved(shine_global_config *config, int16_t *data, int *written) +-{ ++unsigned char *shine_encode_buffer_interleaved(shine_global_config *config, ++ int16_t *data, int *written) { + config->buffer[0] = data; + if (config->wave.channels == 2) + config->buffer[1] = data + 1; +@@ -197,7 +202,6 @@ unsigned char *shine_flush(shine_global_config *config, int *written) { + return config->bs.data; + } + +- + void shine_close(shine_global_config *config) { + shine_close_bit_stream(&config->bs); + free(config); +diff --git a/src/lib/layer3.h b/src/lib/layer3.h +index 7fb11e0..d72b6a4 100644 +--- a/src/lib/layer3.h ++++ b/src/lib/layer3.h +@@ -5,48 +5,31 @@ + + /* This is the struct used to tell the encoder about the input PCM */ + +-enum channels { +- PCM_MONO = 1, +- PCM_STEREO = 2 +-}; ++enum channels { PCM_MONO = 1, PCM_STEREO = 2 }; + +-enum mpeg_versions { +- MPEG_I = 3, +- MPEG_II = 2, +- MPEG_25 = 0 +-}; ++enum mpeg_versions { MPEG_I = 3, MPEG_II = 2, MPEG_25 = 0 }; + + /* Only Layer III currently implemented. */ +-enum mpeg_layers { +- LAYER_III = 1 +-}; ++enum mpeg_layers { LAYER_III = 1 }; + + typedef struct { +- enum channels channels; +- int samplerate; ++ enum channels channels; ++ int samplerate; + } shine_wave_t; + +-/* This is the struct the encoder uses to tell the encoder about the output MP3 */ ++/* This is the struct the encoder uses to tell the encoder about the output MP3 ++ */ + +-enum modes { +- STEREO = 0, +- JOINT_STEREO = 1, +- DUAL_CHANNEL = 2, +- MONO = 3 +-}; ++enum modes { STEREO = 0, JOINT_STEREO = 1, DUAL_CHANNEL = 2, MONO = 3 }; + +-enum emph { +- NONE = 0, +- MU50_15 = 1, +- CITT = 3 +-}; ++enum emph { NONE = 0, MU50_15 = 1, CITT = 3 }; + + typedef struct { +- enum modes mode; /* Stereo mode */ +- int bitr; /* Must conform to known bitrate */ +- enum emph emph; /* De-emphasis */ +- int copyright; +- int original; ++ enum modes mode; /* Stereo mode */ ++ int bitr; /* Must conform to known bitrate */ ++ enum emph emph; /* De-emphasis */ ++ int copyright; ++ int original; + } shine_mpeg_t; + + typedef struct { +@@ -60,7 +43,7 @@ typedef struct { + * const int samplerates[9] = { + * 44100, 48000, 32000, // MPEG-I + * 22050, 24000, 16000, // MPEG-II +- * 11025, 12000, 8000 // MPEG-2.5 ++ * 11025, 12000, 8000 // MPEG-2.5 + * }; + * + * const int bitrates[16][4] = { +@@ -92,37 +75,37 @@ typedef struct shine_global_flags *shine_t; + /* Fill in a `mpeg_t` structure with default values. */ + void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg); + +-/* Check if a given bitrate is supported by the encoder (see `bitrates` above for a list +- * of acceptable values. */ ++/* Check if a given bitrate is supported by the encoder (see `bitrates` above ++ * for a list of acceptable values. */ + int shine_find_bitrate_index(int bitr, int mpeg_version); + +-/* Check if a given samplerate is supported by the encoder (see `samplerates` above for a list +- * of acceptable values. */ ++/* Check if a given samplerate is supported by the encoder (see `samplerates` ++ * above for a list of acceptable values. */ + int shine_find_samplerate_index(int freq); + + /* Returns the MPEG version used for the given samplerate index. See above +- * `mpeg_versions` for a list of possible values. */ ++ * `mpeg_versions` for a list of possible values. */ + int shine_mpeg_version(int samplerate_index); + +-/* Check if a given bitrate and samplerate is supported by the encoder (see `samplerates` +- * and `bitrates` above for a list of acceptable values). ++/* Check if a given bitrate and samplerate is supported by the encoder (see ++ * `samplerates` and `bitrates` above for a list of acceptable values). + * + * Returns -1 on error, mpeg_version on success. */ + int shine_check_config(int freq, int bitr); + + /* Pass a pointer to a `config_t` structure and returns an initialized +- * encoder. ++ * encoder. + * + * Configuration data is copied over to the encoder. It is not possible + * to change its values after initializing the encoder at the moment. + * +- * Checking for valid configuration values is left for the application to +- * implement. You can use the `shine_find_bitrate_index` and +- * `shine_find_samplerate_index` functions or the `bitrates` and +- * `samplerates` arrays above to check those parameters. Mone and stereo ++ * Checking for valid configuration values is left for the application to ++ * implement. You can use the `shine_find_bitrate_index` and ++ * `shine_find_samplerate_index` functions or the `bitrates` and ++ * `samplerates` arrays above to check those parameters. Mone and stereo + * mode for wave and mpeg should also be consistent with each other. + * +- * This function returns NULL if it was not able to allocate memory data for ++ * This function returns NULL if it was not able to allocate memory data for + * the encoder. */ + shine_t shine_initialise(shine_config_t *config); + +@@ -132,26 +115,28 @@ shine_t shine_initialise(shine_config_t *config); + /* Returns audio samples expected in each frame. */ + int shine_samples_per_pass(shine_t s); + +-/* Encode audio data. Source data must have `shine_samples_per_pass(s)` audio samples per +- * channels. Mono encoder only expect one channel. ++/* Encode audio data. Source data must have `shine_samples_per_pass(s)` audio ++ * samples per channels. Mono encoder only expect one channel. + * +- * Returns a pointer to freshly encoded data while `written` contains the size of +- * available data. This pointer's memory is handled by the library and is only valid +- * until the next call to `shine_encode_buffer` or `shine_close` and may be NULL if no data +- * was written. */ ++ * Returns a pointer to freshly encoded data while `written` contains the size ++ * of available data. This pointer's memory is handled by the library and is ++ * only valid until the next call to `shine_encode_buffer` or `shine_close` and ++ * may be NULL if no data was written. */ + unsigned char *shine_encode_buffer(shine_t s, int16_t **data, int *written); + +-/* Encode interleaved audio data. Source data must have `shine_samples_per_pass(s)` audio samples per +- * channels. Mono encoder only expect one channel. ++/* Encode interleaved audio data. Source data must have ++ * `shine_samples_per_pass(s)` audio samples per channels. Mono encoder only ++ * expect one channel. + * +- * Returns a pointer to freshly encoded data while `written` contains the size of +- * available data. This pointer's memory is handled by the library and is only valid +- * until the next call to `shine_encode_buffer` or `shine_close` and may be NULL if no data +- * was written. */ +-unsigned char *shine_encode_buffer_interleaved(shine_t s, int16_t *data, int *written); +- +-/* Flush all data currently in the encoding buffer. Should be used before closing +- * the encoder, to make all encoded data has been written. */ ++ * Returns a pointer to freshly encoded data while `written` contains the size ++ * of available data. This pointer's memory is handled by the library and is ++ * only valid until the next call to `shine_encode_buffer` or `shine_close` and ++ * may be NULL if no data was written. */ ++unsigned char *shine_encode_buffer_interleaved(shine_t s, int16_t *data, ++ int *written); ++ ++/* Flush all data currently in the encoding buffer. Should be used before ++ * closing the encoder, to make all encoded data has been written. */ + unsigned char *shine_flush(shine_t s, int *written); + + /* Close an encoder, freeing all associated memory. Encoder handler is not +diff --git a/src/lib/mult_mips_gcc.h b/src/lib/mult_mips_gcc.h +index 092ed84..d49d215 100644 +--- a/src/lib/mult_mips_gcc.h ++++ b/src/lib/mult_mips_gcc.h +@@ -1,51 +1,50 @@ + #include <stdint.h> + +-#define mul(a,b) \ +-({ \ +- register int32_t res; \ +- __asm__ __volatile__("mult %0, %1" : : "r" (a), "r" (b)); \ +- __asm__ __volatile__("mfhi %0" : "=r" (res)); \ +- res; \ +-}) ++#define mul(a, b) \ ++ ({ \ ++ register int32_t res; \ ++ __asm__ __volatile__("mult %0, %1" : : "r"(a), "r"(b)); \ ++ __asm__ __volatile__("mfhi %0" : "=r"(res)); \ ++ res; \ ++ }) + +-#define mul0(hi,lo,a,b) \ +- __asm__ __volatile__("mult %0, %1" : : "r" (a), "r" (b)) ++#define mul0(hi, lo, a, b) \ ++ __asm__ __volatile__("mult %0, %1" : : "r"(a), "r"(b)) + +-#define muladd(hi,lo,a,b) \ +- __asm__ __volatile__("madd %0, %1" : : "r" (a), "r" (b)) ++#define muladd(hi, lo, a, b) \ ++ __asm__ __volatile__("madd %0, %1" : : "r"(a), "r"(b)) + +-#define mulsub(hi,lo,a,b) \ +- __asm__ __volatile__("msub %0, %1" : : "r" (a), "r" (b)) ++#define mulsub(hi, lo, a, b) \ ++ __asm__ __volatile__("msub %0, %1" : : "r"(a), "r"(b)) + +-#define mulz(hi,lo) \ +-do { \ +- register int32_t t; \ +- __asm__ __volatile__("mfhi %0" : "=r" (t)); \ +- (hi) = t; \ +-} while (0) ++#define mulz(hi, lo) \ ++ do { \ ++ register int32_t t; \ ++ __asm__ __volatile__("mfhi %0" : "=r"(t)); \ ++ (hi) = t; \ ++ } while (0) + +-#define cmuls(dre, dim, are, aim, bre, bim) \ +-do { \ +- register int32_t t1, t2, tre; \ +- __asm__ __volatile__("mult %0, %1" : : "r" (are), "r" (bre)); \ +- __asm__ __volatile__("msub %0, %1" : : "r" (aim), "r" (bim)); \ +- __asm__ __volatile__("mfhi %0; mflo %1" : "=r" (t1), "=r" (t2)); \ +- tre = (t1 << 1) | ((uint32_t)t2 >> 31); \ +- __asm__ __volatile__("mult %0, %1" : : "r" (are), "r" (bim)); \ +- __asm__ __volatile__("madd %0, %1" : : "r" (bre), "r" (aim)); \ +- dre = tre; \ +- __asm__ __volatile__("mfhi %0; mflo %1" : "=r" (t1), "=r" (t2)); \ +- dim = (t1 << 1) | ((uint32_t)t2 >> 31); \ +-} while (0) ++#define cmuls(dre, dim, are, aim, bre, bim) \ ++ do { \ ++ register int32_t t1, t2, tre; \ ++ __asm__ __volatile__("mult %0, %1" : : "r"(are), "r"(bre)); \ ++ __asm__ __volatile__("msub %0, %1" : : "r"(aim), "r"(bim)); \ ++ __asm__ __volatile__("mfhi %0; mflo %1" : "=r"(t1), "=r"(t2)); \ ++ tre = (t1 << 1) | ((uint32_t)t2 >> 31); \ ++ __asm__ __volatile__("mult %0, %1" : : "r"(are), "r"(bim)); \ ++ __asm__ __volatile__("madd %0, %1" : : "r"(bre), "r"(aim)); \ ++ dre = tre; \ ++ __asm__ __volatile__("mfhi %0; mflo %1" : "=r"(t1), "=r"(t2)); \ ++ dim = (t1 << 1) | ((uint32_t)t2 >> 31); \ ++ } while (0) + + #if __mips_isa_rev >= 2 +-static inline uint32_t SWAB32(uint32_t x) +-{ +- __asm__( +- " wsbh %0, %1 \n" +- " rotr %0, %0, 16 \n" +- : "=r" (x) : "r" (x)); +- return x; ++static inline uint32_t SWAB32(uint32_t x) { ++ __asm__(" wsbh %0, %1 \n" ++ " rotr %0, %0, 16 \n" ++ : "=r"(x) ++ : "r"(x)); ++ return x; + } + #define SWAB32 SWAB32 + #endif +diff --git a/src/lib/mult_noarch_gcc.h b/src/lib/mult_noarch_gcc.h +index 516e66c..2ee207e 100644 +--- a/src/lib/mult_noarch_gcc.h ++++ b/src/lib/mult_noarch_gcc.h +@@ -1,34 +1,40 @@ + #include <stdint.h> + + #ifndef mul +-#define mul(a,b) (int32_t) ( ( ((int64_t) a) * ((int64_t) b) ) >>32 ) ++#define mul(a, b) (int32_t)((((int64_t)a) * ((int64_t)b)) >> 32) + #endif + + #ifndef muls +-#define muls(a,b) (int32_t) ( ( ((int64_t) a) * ((int64_t) b) ) >>31 ) ++#define muls(a, b) (int32_t)((((int64_t)a) * ((int64_t)b)) >> 31) + #endif + + #ifndef mulr +-#define mulr(a,b) (int32_t) ( ( ( ((int64_t) a) * ((int64_t) b)) + 0x80000000LL ) >>32 ) ++#define mulr(a, b) \ ++ (int32_t)(((((int64_t)a) * ((int64_t)b)) + 0x80000000LL) >> 32) + #endif + + #ifndef mulsr +-#define mulsr(a,b) (int32_t) ( ( ( ((int64_t) a) * ((int64_t) b)) + 0x40000000LL ) >>31 ) ++#define mulsr(a, b) \ ++ (int32_t)(((((int64_t)a) * ((int64_t)b)) + 0x40000000LL) >> 31) + #endif + + #ifndef mul0 +-#define mul0(hi,lo,a,b) ((hi) = mul((a), (b))) +-#define muladd(hi,lo,a,b) ((hi) += mul((a), (b))) +-#define mulsub(hi,lo,a,b) ((hi) -= mul((a), (b))) +-#define mulz(hi,lo) ++#define mul0(hi, lo, a, b) ((hi) = mul((a), (b))) ++#define muladd(hi, lo, a, b) ((hi) += mul((a), (b))) ++#define mulsub(hi, lo, a, b) ((hi) -= mul((a), (b))) ++#define mulz(hi, lo) + #endif + + #ifndef cmuls +-#define cmuls(dre, dim, are, aim, bre, bim) \ +-do { \ +- int32_t tre; \ +- (tre) = (int32_t) (((int64_t) (are) * (int64_t) (bre) - (int64_t) (aim) * (int64_t) (bim)) >> 31); \ +- (dim) = (int32_t) (((int64_t) (are) * (int64_t) (bim) + (int64_t) (aim) * (int64_t) (bre)) >> 31); \ +- (dre) = tre; \ +-} while (0) ++#define cmuls(dre, dim, are, aim, bre, bim) \ ++ do { \ ++ int32_t tre; \ ++ (tre) = (int32_t)(((int64_t)(are) * (int64_t)(bre) - \ ++ (int64_t)(aim) * (int64_t)(bim)) >> \ ++ 31); \ ++ (dim) = (int32_t)(((int64_t)(are) * (int64_t)(bim) + \ ++ (int64_t)(aim) * (int64_t)(bre)) >> \ ++ 31); \ ++ (dre) = tre; \ ++ } while (0) + #endif +diff --git a/src/lib/mult_sarm_gcc.h b/src/lib/mult_sarm_gcc.h +index d229eff..0cf8e08 100644 +--- a/src/lib/mult_sarm_gcc.h ++++ b/src/lib/mult_sarm_gcc.h +@@ -2,108 +2,102 @@ + + /* Fractional multiply */ + #if __ARM_ARCH >= 6 +-#define mul(x,y) \ +-({ \ +- register int32_t result; \ +- asm ("smmul %0, %2, %1" : "=r" (result) : "r" (x), "r" (y)); \ +- result ;\ +-}) ++#define mul(x, y) \ ++ ({ \ ++ register int32_t result; \ ++ asm("smmul %0, %2, %1" : "=r"(result) : "r"(x), "r"(y)); \ ++ result; \ ++ }) + #else +-#define mul(x,y) \ +-({ \ +- register int32_t result; \ +- asm ("smull r3, %0, %2, %1" : "=r" (result) : "r" (x), "r" (y) : "r3"); \ +- result ; \ +-}) ++#define mul(x, y) \ ++ ({ \ ++ register int32_t result; \ ++ asm("smull r3, %0, %2, %1" : "=r"(result) : "r"(x), "r"(y) : "r3"); \ ++ result; \ ++ }) + #endif + + /* Fractional multiply with single bit left shift. */ +-#define muls(x,y) \ +-({ \ +- register int32_t result; \ +- asm ( \ +- "smull r3, %0, %2, %1\n\t" \ +- "movs r3, r3, lsl #1\n\t" \ +- "adc %0, %0, %0" \ +- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \ +- ); \ +- result; \ +-}) +- ++#define muls(x, y) \ ++ ({ \ ++ register int32_t result; \ ++ asm("smull r3, %0, %2, %1\n\t" \ ++ "movs r3, r3, lsl #1\n\t" \ ++ "adc %0, %0, %0" \ ++ : "=r"(result) \ ++ : "r"(x), "r"(y) \ ++ : "r3", "cc"); \ ++ result; \ ++ }) + + #if __ARM_ARCH >= 6 +-#define mulr(x,y) \ +-({ \ +- register int32_t result; \ +- asm ( \ +- "smmulr %0, %2, %1" : "=r" (result) : "r" (x), "r" (y) \ +- ); \ +- result; \ +-}) ++#define mulr(x, y) \ ++ ({ \ ++ register int32_t result; \ ++ asm("smmulr %0, %2, %1" : "=r"(result) : "r"(x), "r"(y)); \ ++ result; \ ++ }) + #else +-#define mulr(x,y) \ +-({ \ +- register int32_t result; \ +- asm ( \ +- "smull r3, %0, %2, %1\n\t" \ +- "adds r3, r3, #0x80000000\n\t" \ +- "adc %0, %0, #0" \ +- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \ +- ); \ +- result; \ +-}) ++#define mulr(x, y) \ ++ ({ \ ++ register int32_t result; \ ++ asm("smull r3, %0, %2, %1\n\t" \ ++ "adds r3, r3, #0x80000000\n\t" \ ++ "adc %0, %0, #0" \ ++ : "=r"(result) \ ++ : "r"(x), "r"(y) \ ++ : "r3", "cc"); \ ++ result; \ ++ }) + #endif + +-#define mulsr(x,y) \ +-({ \ +- register int32_t result; \ +- asm ( \ +- "smull r3, %0, %1, %2\n\t" \ +- "movs r3, r3, lsl #1\n\t" \ +- "adc %0, %0, %0\n\t" \ +- "adds r3, r3, #0x80000000\n\t" \ +- "adc %0, %0, #0" \ +- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \ +- ); \ +- result; \ +-}) ++#define mulsr(x, y) \ ++ ({ \ ++ register int32_t result; \ ++ asm("smull r3, %0, %1, %2\n\t" \ ++ "movs r3, r3, lsl #1\n\t" \ ++ "adc %0, %0, %0\n\t" \ ++ "adds r3, r3, #0x80000000\n\t" \ ++ "adc %0, %0, #0" \ ++ : "=r"(result) \ ++ : "r"(x), "r"(y) \ ++ : "r3", "cc"); \ ++ result; \ ++ }) + +-#define mul0(hi,lo,a,b) \ +- asm ("smull %0, %1, %2, %3" : "=r" (lo), "=r" (hi) : "r" (a), "r" (b)) ++#define mul0(hi, lo, a, b) \ ++ asm("smull %0, %1, %2, %3" : "=r"(lo), "=r"(hi) : "r"(a), "r"(b)) + +-#define muladd(hi,lo,a,b) \ +- asm ("smlal %0, %1, %2, %3" : "+r" (lo), "+r" (hi) : "r" (a), "r" (b)) ++#define muladd(hi, lo, a, b) \ ++ asm("smlal %0, %1, %2, %3" : "+r"(lo), "+r"(hi) : "r"(a), "r"(b)) + +-#define mulsub(hi,lo,a,b) \ +- asm ("smlal %0, %1, %2, %3" : "+r" (lo), "+r" (hi) : "r" (a), "r" (-(b))) ++#define mulsub(hi, lo, a, b) \ ++ asm("smlal %0, %1, %2, %3" : "+r"(lo), "+r"(hi) : "r"(a), "r"(-(b))) + +-#define mulz(hi,lo) ++#define mulz(hi, lo) + +-#define cmuls(dre, dim, are, aim, bre, bim) \ +-do { \ +- register int32_t tre, tim; \ +- asm ( \ +- "smull r3, %0, %2, %4\n\t" \ +- "smlal r3, %0, %3, %5\n\t" \ +- "movs r3, r3, lsl #1\n\t" \ +- "adc %0, %0, %0\n\t" \ +- "smull r3, %1, %2, %6\n\t" \ +- "smlal r3, %1, %4, %3\n\t" \ +- "movs r3, r3, lsl #1\n\t" \ +- "adc %1, %1, %1\n\t" \ +- : "=&r" (tre), "=&r" (tim) \ +- : "r" (are), "r" (aim), "r" (bre), "r" (-(bim)), "r" (bim) \ +- : "r3", "cc" \ +- ); \ +- dre = tre; \ +- dim = tim; \ +-} while (0) ++#define cmuls(dre, dim, are, aim, bre, bim) \ ++ do { \ ++ register int32_t tre, tim; \ ++ asm("smull r3, %0, %2, %4\n\t" \ ++ "smlal r3, %0, %3, %5\n\t" \ ++ "movs r3, r3, lsl #1\n\t" \ ++ "adc %0, %0, %0\n\t" \ ++ "smull r3, %1, %2, %6\n\t" \ ++ "smlal r3, %1, %4, %3\n\t" \ ++ "movs r3, r3, lsl #1\n\t" \ ++ "adc %1, %1, %1\n\t" \ ++ : "=&r"(tre), "=&r"(tim) \ ++ : "r"(are), "r"(aim), "r"(bre), "r"(-(bim)), "r"(bim) \ ++ : "r3", "cc"); \ ++ dre = tre; \ ++ dim = tim; \ ++ } while (0) + + #if __ARM_ARCH >= 6 +-static inline uint32_t SWAB32(uint32_t x) +-{ +- asm ("rev %0, %1" : "=r" (x) : "r" (x)); +- return x; ++static inline uint32_t SWAB32(uint32_t x) { ++ asm("rev %0, %1" : "=r"(x) : "r"(x)); ++ return x; + } + #define SWAB32 SWAB32 + #endif +diff --git a/src/lib/reservoir.c b/src/lib/reservoir.c +index ca84f3d..cea0a9b 100644 +--- a/src/lib/reservoir.c ++++ b/src/lib/reservoir.c +@@ -2,13 +2,13 @@ + * Layer3 bit reservoir: Described in C.1.5.4.2.2 of the IS + */ + +-#include "types.h" +-#include "layer3.h" +-#include "l3loop.h" +-#include "huffman.h" ++#include "reservoir.h" + #include "bitstream.h" ++#include "huffman.h" + #include "l3bitstream.h" +-#include "reservoir.h" ++#include "l3loop.h" ++#include "layer3.h" ++#include "types.h" + + /* + * shine_max_reservoir_bits: +@@ -17,36 +17,34 @@ + * allowance for the current granule based on reservoir size + * and perceptual entropy. + */ +-int shine_max_reservoir_bits (double *pe, shine_global_config *config ) +-{ ++int shine_max_reservoir_bits(double *pe, shine_global_config *config) { + int more_bits, max_bits, add_bits, over_bits; + int mean_bits = config->mean_bits; + + mean_bits /= config->wave.channels; + max_bits = mean_bits; + +- if(max_bits>4095) ++ if (max_bits > 4095) + max_bits = 4095; +- if(!config->ResvMax) ++ if (!config->ResvMax) + return max_bits; + + more_bits = *pe * 3.1 - mean_bits; + add_bits = 0; +- if(more_bits>100) +- { ++ if (more_bits > 100) { + int frac = (config->ResvSize * 6) / 10; + +- if(frac<more_bits) ++ if (frac < more_bits) + add_bits = frac; + else + add_bits = more_bits; + } +- over_bits = config->ResvSize - ((config->ResvMax <<3) / 10) - add_bits; +- if (over_bits>0) ++ over_bits = config->ResvSize - ((config->ResvMax << 3) / 10) - add_bits; ++ if (over_bits > 0) + add_bits += over_bits; + + max_bits += add_bits; +- if(max_bits>4095) ++ if (max_bits > 4095) + max_bits = 4095; + return max_bits; + } +@@ -57,9 +55,9 @@ int shine_max_reservoir_bits (double *pe, shine_global_config *config ) + * Called after a granule's bit allocation. Readjusts the size of + * the reservoir to reflect the granule's usage. + */ +-void shine_ResvAdjust(gr_info *gi, shine_global_config *config ) +-{ +- config->ResvSize += (config->mean_bits / config->wave.channels) - gi->part2_3_length; ++void shine_ResvAdjust(gr_info *gi, shine_global_config *config) { ++ config->ResvSize += ++ (config->mean_bits / config->wave.channels) - gi->part2_3_length; + } + + /* +@@ -71,8 +69,7 @@ void shine_ResvAdjust(gr_info *gi, shine_global_config *config ) + * part2_3_length. The bitstream formatter will detect this and write the + * appropriate stuffing bits to the bitstream. + */ +-void shine_ResvFrameEnd(shine_global_config *config ) +-{ ++void shine_ResvFrameEnd(shine_global_config *config) { + gr_info *gi; + int gr, ch, ancillary_pad, stuffingBits; + int over_bits; +@@ -81,42 +78,38 @@ void shine_ResvFrameEnd(shine_global_config *config ) + ancillary_pad = 0; + + /* just in case mean_bits is odd, this is necessary... */ +- if((config->wave.channels==2) && (config->mean_bits & 1)) ++ if ((config->wave.channels == 2) && (config->mean_bits & 1)) + config->ResvSize += 1; + + over_bits = config->ResvSize - config->ResvMax; +- if(over_bits<0) ++ if (over_bits < 0) + over_bits = 0; + + config->ResvSize -= over_bits; + stuffingBits = over_bits + ancillary_pad; + + /* we must be byte aligned */ +- if((over_bits = config->ResvSize % 8)) +- { ++ if ((over_bits = config->ResvSize % 8)) { + stuffingBits += over_bits; + config->ResvSize -= over_bits; + } + +- if(stuffingBits) +- { ++ if (stuffingBits) { + /* + * plan a: put all into the first granule + * This was preferred by someone designing a + * real-time decoder... + */ +- gi = (gr_info *) &(l3_side->gr[0].ch[0]); ++ gi = (gr_info *)&(l3_side->gr[0].ch[0]); + +- if ( gi->part2_3_length + stuffingBits < 4095 ) ++ if (gi->part2_3_length + stuffingBits < 4095) + gi->part2_3_length += stuffingBits; +- else +- { ++ else { + /* plan b: distribute throughout the granules */ +- for (gr = 0; gr < config->mpeg.granules_per_frame; gr++ ) +- for (ch = 0; ch < config->wave.channels; ch++ ) +- { ++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) ++ for (ch = 0; ch < config->wave.channels; ch++) { + int extraBits, bitsThisGr; +- gr_info *gi = (gr_info *) &(l3_side->gr[gr].ch[ch]); ++ gr_info *gi = (gr_info *)&(l3_side->gr[gr].ch[ch]); + if (!stuffingBits) + break; + extraBits = 4095 - gi->part2_3_length; +@@ -133,5 +126,3 @@ void shine_ResvFrameEnd(shine_global_config *config ) + } + } + } +- +- +diff --git a/src/lib/reservoir.h b/src/lib/reservoir.h +index 2f1ffa5..2245778 100644 +--- a/src/lib/reservoir.h ++++ b/src/lib/reservoir.h +@@ -1,9 +1,11 @@ + #ifndef RESERVOIR_H + #define RESERVOIR_H + ++#include "types.h" ++ + void shine_ResvFrameBegin(int frameLength, shine_global_config *config); +-int shine_max_reservoir_bits (double *pe, shine_global_config *config); +-void shine_ResvAdjust (gr_info *gi, shine_global_config *config ); +-void shine_ResvFrameEnd (shine_global_config *config ); ++int shine_max_reservoir_bits(double *pe, shine_global_config *config); ++void shine_ResvAdjust(gr_info *gi, shine_global_config *config); ++void shine_ResvFrameEnd(shine_global_config *config); + + #endif +diff --git a/src/lib/tables.c b/src/lib/tables.c +index ff7e374..3c63b4f 100644 +--- a/src/lib/tables.c ++++ b/src/lib/tables.c +@@ -7,120 +7,171 @@ + + #include "tables.h" + +-const int shine_slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }; +-const int shine_slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 }; ++const int shine_slen1_tab[16] = {0, 0, 0, 0, 3, 1, 1, 1, ++ 2, 2, 2, 3, 3, 3, 4, 4}; ++const int shine_slen2_tab[16] = {0, 1, 2, 3, 0, 1, 2, 3, ++ 1, 2, 3, 1, 2, 3, 2, 3}; + + /* Valid samplerates and bitrates. */ + const int samplerates[9] = { +- 44100, 48000, 32000, /* MPEG-I */ +- 22050, 24000, 16000, /* MPEG-II */ +- 11025, 12000, 8000 /* MPEG-2.5 */ ++ 44100, 48000, 32000, /* MPEG-I */ ++ 22050, 24000, 16000, /* MPEG-II */ ++ 11025, 12000, 8000 /* MPEG-2.5 */ + }; + + const int bitrates[16][4] = { +- /* MPEG version: +- * 2.5, reserved, II, I */ +- { -1, -1, -1, -1}, +- { 8, -1, 8, 32}, +- { 16, -1, 16, 40}, +- { 24, -1, 24, 48}, +- { 32, -1, 32, 56}, +- { 40, -1, 40, 64}, +- { 48, -1, 48, 80}, +- { 56, -1, 56, 96}, +- { 64, -1, 64, 112}, +- { -1, -1, 80, 128}, +- { -1, -1, 96, 160}, +- { -1, -1, 112, 192}, +- { -1, -1, 128, 224}, +- { -1, -1, 144, 256}, +- { -1, -1, 160, 320}, +- { -1, -1, -1, -1} +-}; ++ /* MPEG version: ++ * 2.5, reserved, II, I */ ++ {-1, -1, -1, -1}, {8, -1, 8, 32}, {16, -1, 16, 40}, ++ {24, -1, 24, 48}, {32, -1, 32, 56}, {40, -1, 40, 64}, ++ {48, -1, 48, 80}, {56, -1, 56, 96}, {64, -1, 64, 112}, ++ {-1, -1, 80, 128}, {-1, -1, 96, 160}, {-1, -1, 112, 192}, ++ {-1, -1, 128, 224}, {-1, -1, 144, 256}, {-1, -1, 160, 320}, ++ {-1, -1, -1, -1}}; + +-const int shine_scale_fact_band_index[9][23] = +-{ +- /* MPEG-I */ ++const int shine_scale_fact_band_index[9][23] = { ++ /* MPEG-I */ + /* Table B.8.b: 44.1 kHz */ +- {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576}, ++ {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, ++ 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576}, + /* Table B.8.c: 48 kHz */ +- {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576}, ++ {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, ++ 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576}, + /* Table B.8.a: 32 kHz */ +- {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576}, +- /* MPEG-II */ ++ {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, ++ 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576}, ++ /* MPEG-II */ + /* Table B.2.b: 22.05 kHz */ +- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, ++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, ++ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, + /* Table B.2.c: 24 kHz */ +- {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, ++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, ++ 114, 136, 162, 194, 232, 278, 330, 394, 464, 540, 576}, + /* Table B.2.a: 16 kHz */ +- {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576}, ++ {0, 6, 12, 18, 24, 30, 36, 44, 45, 66, 80, 96, ++ 116, 140, 168, 200, 238, 248, 336, 396, 464, 522, 576}, + +- /* MPEG-2.5 */ ++ /* MPEG-2.5 */ + /* 11.025 kHz */ +- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, ++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, ++ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, + /* 12 kHz */ +- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, ++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, ++ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, + /* MPEG-2.5 8 kHz */ +- {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}, ++ {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, ++ 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576}, + }; + + /* note. 0.035781 is shine_enwindow maximum value */ + /* scale and convert to fixed point before storing */ +-#define SHINE_EW(x) (int32_t)((double)(x) * 0x7fffffff) +-#define SHINE_EW2(a,b) SHINE_EW(a), SHINE_EW(b) +-#define SHINE_EW10(a,b,c,d,e,f,g,h,i,j) SHINE_EW2(a,b), SHINE_EW2(c,d), SHINE_EW2(e,f), SHINE_EW2(g,h), SHINE_EW2(i,j) ++#define SHINE_EW(x) (int32_t)((double)(x)*0x7fffffff) ++#define SHINE_EW2(a, b) SHINE_EW(a), SHINE_EW(b) ++#define SHINE_EW10(a, b, c, d, e, f, g, h, i, j) \ ++ SHINE_EW2(a, b), SHINE_EW2(c, d), SHINE_EW2(e, f), SHINE_EW2(g, h), \ ++ SHINE_EW2(i, j) + + const int32_t shine_enwindow[] = { +-SHINE_EW10( 0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000001, -0.000001, -0.000001), +-SHINE_EW10( -0.000001, -0.000001, -0.000001, -0.000002, -0.000002, -0.000002, -0.000002, -0.000003, -0.000003, -0.000003), +-SHINE_EW10( -0.000004, -0.000004, -0.000005, -0.000005, -0.000006, -0.000007, -0.000008, -0.000008, -0.000009, -0.000010), +-SHINE_EW10( -0.000011, -0.000012, -0.000014, -0.000015, -0.000017, -0.000018, -0.000020, -0.000021, -0.000023, -0.000025), +-SHINE_EW10( -0.000028, -0.000030, -0.000032, -0.000035, -0.000038, -0.000041, -0.000043, -0.000046, -0.000050, -0.000053), +-SHINE_EW10( -0.000056, -0.000060, -0.000063, -0.000066, -0.000070, -0.000073, -0.000077, -0.000081, -0.000084, -0.000087), +-SHINE_EW10( -0.000091, -0.000093, -0.000096, -0.000099, 0.000102, 0.000104, 0.000106, 0.000107, 0.000108, 0.000109), +-SHINE_EW10( 0.000109, 0.000108, 0.000107, 0.000105, 0.000103, 0.000099, 0.000095, 0.000090, 0.000084, 0.000078), +-SHINE_EW10( 0.000070, 0.000061, 0.000051, 0.000040, 0.000027, 0.000014, -0.000001, -0.000017, -0.000034, -0.000053), +-SHINE_EW10( -0.000073, -0.000094, -0.000116, -0.000140, -0.000165, -0.000191, -0.000219, -0.000247, -0.000277, -0.000308), +-SHINE_EW10( -0.000339, -0.000371, -0.000404, -0.000438, -0.000473, -0.000507, -0.000542, -0.000577, -0.000612, -0.000647), +-SHINE_EW10( -0.000681, -0.000714, -0.000747, -0.000779, -0.000810, -0.000839, -0.000866, -0.000892, -0.000915, -0.000936), +-SHINE_EW10( -0.000954, -0.000969, -0.000981, -0.000989, -0.000994, -0.000995, -0.000992, -0.000984, 0.000971, 0.000954), +-SHINE_EW10( 0.000931, 0.000903, 0.000869, 0.000829, 0.000784, 0.000732, 0.000674, 0.000610, 0.000539, 0.000463), +-SHINE_EW10( 0.000379, 0.000288, 0.000192, 0.000088, -0.000021, -0.000137, -0.000260, -0.000388, -0.000522, -0.000662), +-SHINE_EW10( -0.000807, -0.000957, -0.001111, -0.001270, -0.001432, -0.001598, -0.001767, -0.001937, -0.002110, -0.002283), +-SHINE_EW10( -0.002457, -0.002631, -0.002803, -0.002974, -0.003142, -0.003307, -0.003467, -0.003623, -0.003772, -0.003914), +-SHINE_EW10( -0.004049, -0.004175, -0.004291, -0.004396, -0.004490, -0.004570, -0.004638, -0.004691, -0.004728, -0.004749), +-SHINE_EW10( -0.004752, -0.004737, -0.004703, -0.004649, -0.004574, -0.004477, -0.004358, -0.004215, -0.004049, -0.003859), +-SHINE_EW10( -0.003643, -0.003402, 0.003135, 0.002841, 0.002522, 0.002175, 0.001801, 0.001400, 0.000971, 0.000516), +-SHINE_EW10( 0.000033, -0.000476, -0.001012, -0.001574, -0.002162, -0.002774, -0.003411, -0.004072, -0.004756, -0.005462), +-SHINE_EW10( -0.006189, -0.006937, -0.007703, -0.008487, -0.009288, -0.010104, -0.010933, -0.011775, -0.012628, -0.013489), +-SHINE_EW10( -0.014359, -0.015234, -0.016113, -0.016994, -0.017876, -0.018757, -0.019634, -0.020507, -0.021372, -0.022229), +-SHINE_EW10( -0.023074, -0.023907, -0.024725, -0.025527, -0.026311, -0.027074, -0.027815, -0.028533, -0.029225, -0.029890), +-SHINE_EW10( -0.030527, -0.031133, -0.031707, -0.032248, -0.032755, -0.033226, -0.033660, -0.034056, -0.034413, -0.034730), +-SHINE_EW10( -0.035007, -0.035242, -0.035435, -0.035586, -0.035694, -0.035759, 0.035781, 0.035759, 0.035694, 0.035586), +-SHINE_EW10( 0.035435, 0.035242, 0.035007, 0.034730, 0.034413, 0.034056, 0.033660, 0.033226, 0.032755, 0.032248), +-SHINE_EW10( 0.031707, 0.031133, 0.030527, 0.029890, 0.029225, 0.028533, 0.027815, 0.027074, 0.026311, 0.025527), +-SHINE_EW10( 0.024725, 0.023907, 0.023074, 0.022229, 0.021372, 0.020507, 0.019634, 0.018757, 0.017876, 0.016994), +-SHINE_EW10( 0.016113, 0.015234, 0.014359, 0.013489, 0.012628, 0.011775, 0.010933, 0.010104, 0.009288, 0.008487), +-SHINE_EW10( 0.007703, 0.006937, 0.006189, 0.005462, 0.004756, 0.004072, 0.003411, 0.002774, 0.002162, 0.001574), +-SHINE_EW10( 0.001012, 0.000476, -0.000033, -0.000516, -0.000971, -0.001400, -0.001801, -0.002175, -0.002522, -0.002841), +-SHINE_EW10( 0.003135, 0.003402, 0.003643, 0.003859, 0.004049, 0.004215, 0.004358, 0.004477, 0.004574, 0.004649), +-SHINE_EW10( 0.004703, 0.004737, 0.004752, 0.004749, 0.004728, 0.004691, 0.004638, 0.004570, 0.004490, 0.004396), +-SHINE_EW10( 0.004291, 0.004175, 0.004049, 0.003914, 0.003772, 0.003623, 0.003467, 0.003307, 0.003142, 0.002974), +-SHINE_EW10( 0.002803, 0.002631, 0.002457, 0.002283, 0.002110, 0.001937, 0.001767, 0.001598, 0.001432, 0.001270), +-SHINE_EW10( 0.001111, 0.000957, 0.000807, 0.000662, 0.000522, 0.000388, 0.000260, 0.000137, 0.000021, -0.000088), +-SHINE_EW10( -0.000192, -0.000288, -0.000379, -0.000463, -0.000539, -0.000610, -0.000674, -0.000732, -0.000784, -0.000829), +-SHINE_EW10( -0.000869, -0.000903, -0.000931, -0.000954, 0.000971, 0.000984, 0.000992, 0.000995, 0.000994, 0.000989), +-SHINE_EW10( 0.000981, 0.000969, 0.000954, 0.000936, 0.000915, 0.000892, 0.000866, 0.000839, 0.000810, 0.000779), +-SHINE_EW10( 0.000747, 0.000714, 0.000681, 0.000647, 0.000612, 0.000577, 0.000542, 0.000507, 0.000473, 0.000438), +-SHINE_EW10( 0.000404, 0.000371, 0.000339, 0.000308, 0.000277, 0.000247, 0.000219, 0.000191, 0.000165, 0.000140), +-SHINE_EW10( 0.000116, 0.000094, 0.000073, 0.000053, 0.000034, 0.000017, 0.000001, -0.000014, -0.000027, -0.000040), +-SHINE_EW10( -0.000051, -0.000061, -0.000070, -0.000078, -0.000084, -0.000090, -0.000095, -0.000099, -0.000103, -0.000105), +-SHINE_EW10( -0.000107, -0.000108, -0.000109, -0.000109, -0.000108, -0.000107, -0.000106, -0.000104, 0.000102, 0.000099), +-SHINE_EW10( 0.000096, 0.000093, 0.000091, 0.000087, 0.000084, 0.000081, 0.000077, 0.000073, 0.000070, 0.000066), +-SHINE_EW10( 0.000063, 0.000060, 0.000056, 0.000053, 0.000050, 0.000046, 0.000043, 0.000041, 0.000038, 0.000035), +-SHINE_EW10( 0.000032, 0.000030, 0.000028, 0.000025, 0.000023, 0.000021, 0.000020, 0.000018, 0.000017, 0.000015), +-SHINE_EW10( 0.000014, 0.000012, 0.000011, 0.000010, 0.000009, 0.000008, 0.000008, 0.000007, 0.000006, 0.000005), +-SHINE_EW10( 0.000005, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002), +-SHINE_EW10( 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000), +-SHINE_EW2 ( 0.000000, 0.000000) +-}; ++ SHINE_EW10(0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000, ++ -0.000000, -0.000001, -0.000001, -0.000001), ++ SHINE_EW10(-0.000001, -0.000001, -0.000001, -0.000002, -0.000002, -0.000002, ++ -0.000002, -0.000003, -0.000003, -0.000003), ++ SHINE_EW10(-0.000004, -0.000004, -0.000005, -0.000005, -0.000006, -0.000007, ++ -0.000008, -0.000008, -0.000009, -0.000010), ++ SHINE_EW10(-0.000011, -0.000012, -0.000014, -0.000015, -0.000017, -0.000018, ++ -0.000020, -0.000021, -0.000023, -0.000025), ++ SHINE_EW10(-0.000028, -0.000030, -0.000032, -0.000035, -0.000038, -0.000041, ++ -0.000043, -0.000046, -0.000050, -0.000053), ++ SHINE_EW10(-0.000056, -0.000060, -0.000063, -0.000066, -0.000070, -0.000073, ++ -0.000077, -0.000081, -0.000084, -0.000087), ++ SHINE_EW10(-0.000091, -0.000093, -0.000096, -0.000099, 0.000102, 0.000104, ++ 0.000106, 0.000107, 0.000108, 0.000109), ++ SHINE_EW10(0.000109, 0.000108, 0.000107, 0.000105, 0.000103, 0.000099, ++ 0.000095, 0.000090, 0.000084, 0.000078), ++ SHINE_EW10(0.000070, 0.000061, 0.000051, 0.000040, 0.000027, 0.000014, ++ -0.000001, -0.000017, -0.000034, -0.000053), ++ SHINE_EW10(-0.000073, -0.000094, -0.000116, -0.000140, -0.000165, -0.000191, ++ -0.000219, -0.000247, -0.000277, -0.000308), ++ SHINE_EW10(-0.000339, -0.000371, -0.000404, -0.000438, -0.000473, -0.000507, ++ -0.000542, -0.000577, -0.000612, -0.000647), ++ SHINE_EW10(-0.000681, -0.000714, -0.000747, -0.000779, -0.000810, -0.000839, ++ -0.000866, -0.000892, -0.000915, -0.000936), ++ SHINE_EW10(-0.000954, -0.000969, -0.000981, -0.000989, -0.000994, -0.000995, ++ -0.000992, -0.000984, 0.000971, 0.000954), ++ SHINE_EW10(0.000931, 0.000903, 0.000869, 0.000829, 0.000784, 0.000732, ++ 0.000674, 0.000610, 0.000539, 0.000463), ++ SHINE_EW10(0.000379, 0.000288, 0.000192, 0.000088, -0.000021, -0.000137, ++ -0.000260, -0.000388, -0.000522, -0.000662), ++ SHINE_EW10(-0.000807, -0.000957, -0.001111, -0.001270, -0.001432, -0.001598, ++ -0.001767, -0.001937, -0.002110, -0.002283), ++ SHINE_EW10(-0.002457, -0.002631, -0.002803, -0.002974, -0.003142, -0.003307, ++ -0.003467, -0.003623, -0.003772, -0.003914), ++ SHINE_EW10(-0.004049, -0.004175, -0.004291, -0.004396, -0.004490, -0.004570, ++ -0.004638, -0.004691, -0.004728, -0.004749), ++ SHINE_EW10(-0.004752, -0.004737, -0.004703, -0.004649, -0.004574, -0.004477, ++ -0.004358, -0.004215, -0.004049, -0.003859), ++ SHINE_EW10(-0.003643, -0.003402, 0.003135, 0.002841, 0.002522, 0.002175, ++ 0.001801, 0.001400, 0.000971, 0.000516), ++ SHINE_EW10(0.000033, -0.000476, -0.001012, -0.001574, -0.002162, -0.002774, ++ -0.003411, -0.004072, -0.004756, -0.005462), ++ SHINE_EW10(-0.006189, -0.006937, -0.007703, -0.008487, -0.009288, -0.010104, ++ -0.010933, -0.011775, -0.012628, -0.013489), ++ SHINE_EW10(-0.014359, -0.015234, -0.016113, -0.016994, -0.017876, -0.018757, ++ -0.019634, -0.020507, -0.021372, -0.022229), ++ SHINE_EW10(-0.023074, -0.023907, -0.024725, -0.025527, -0.026311, -0.027074, ++ -0.027815, -0.028533, -0.029225, -0.029890), ++ SHINE_EW10(-0.030527, -0.031133, -0.031707, -0.032248, -0.032755, -0.033226, ++ -0.033660, -0.034056, -0.034413, -0.034730), ++ SHINE_EW10(-0.035007, -0.035242, -0.035435, -0.035586, -0.035694, -0.035759, ++ 0.035781, 0.035759, 0.035694, 0.035586), ++ SHINE_EW10(0.035435, 0.035242, 0.035007, 0.034730, 0.034413, 0.034056, ++ 0.033660, 0.033226, 0.032755, 0.032248), ++ SHINE_EW10(0.031707, 0.031133, 0.030527, 0.029890, 0.029225, 0.028533, ++ 0.027815, 0.027074, 0.026311, 0.025527), ++ SHINE_EW10(0.024725, 0.023907, 0.023074, 0.022229, 0.021372, 0.020507, ++ 0.019634, 0.018757, 0.017876, 0.016994), ++ SHINE_EW10(0.016113, 0.015234, 0.014359, 0.013489, 0.012628, 0.011775, ++ 0.010933, 0.010104, 0.009288, 0.008487), ++ SHINE_EW10(0.007703, 0.006937, 0.006189, 0.005462, 0.004756, 0.004072, ++ 0.003411, 0.002774, 0.002162, 0.001574), ++ SHINE_EW10(0.001012, 0.000476, -0.000033, -0.000516, -0.000971, -0.001400, ++ -0.001801, -0.002175, -0.002522, -0.002841), ++ SHINE_EW10(0.003135, 0.003402, 0.003643, 0.003859, 0.004049, 0.004215, ++ 0.004358, 0.004477, 0.004574, 0.004649), ++ SHINE_EW10(0.004703, 0.004737, 0.004752, 0.004749, 0.004728, 0.004691, ++ 0.004638, 0.004570, 0.004490, 0.004396), ++ SHINE_EW10(0.004291, 0.004175, 0.004049, 0.003914, 0.003772, 0.003623, ++ 0.003467, 0.003307, 0.003142, 0.002974), ++ SHINE_EW10(0.002803, 0.002631, 0.002457, 0.002283, 0.002110, 0.001937, ++ 0.001767, 0.001598, 0.001432, 0.001270), ++ SHINE_EW10(0.001111, 0.000957, 0.000807, 0.000662, 0.000522, 0.000388, ++ 0.000260, 0.000137, 0.000021, -0.000088), ++ SHINE_EW10(-0.000192, -0.000288, -0.000379, -0.000463, -0.000539, -0.000610, ++ -0.000674, -0.000732, -0.000784, -0.000829), ++ SHINE_EW10(-0.000869, -0.000903, -0.000931, -0.000954, 0.000971, 0.000984, ++ 0.000992, 0.000995, 0.000994, 0.000989), ++ SHINE_EW10(0.000981, 0.000969, 0.000954, 0.000936, 0.000915, 0.000892, ++ 0.000866, 0.000839, 0.000810, 0.000779), ++ SHINE_EW10(0.000747, 0.000714, 0.000681, 0.000647, 0.000612, 0.000577, ++ 0.000542, 0.000507, 0.000473, 0.000438), ++ SHINE_EW10(0.000404, 0.000371, 0.000339, 0.000308, 0.000277, 0.000247, ++ 0.000219, 0.000191, 0.000165, 0.000140), ++ SHINE_EW10(0.000116, 0.000094, 0.000073, 0.000053, 0.000034, 0.000017, ++ 0.000001, -0.000014, -0.000027, -0.000040), ++ SHINE_EW10(-0.000051, -0.000061, -0.000070, -0.000078, -0.000084, -0.000090, ++ -0.000095, -0.000099, -0.000103, -0.000105), ++ SHINE_EW10(-0.000107, -0.000108, -0.000109, -0.000109, -0.000108, -0.000107, ++ -0.000106, -0.000104, 0.000102, 0.000099), ++ SHINE_EW10(0.000096, 0.000093, 0.000091, 0.000087, 0.000084, 0.000081, ++ 0.000077, 0.000073, 0.000070, 0.000066), ++ SHINE_EW10(0.000063, 0.000060, 0.000056, 0.000053, 0.000050, 0.000046, ++ 0.000043, 0.000041, 0.000038, 0.000035), ++ SHINE_EW10(0.000032, 0.000030, 0.000028, 0.000025, 0.000023, 0.000021, ++ 0.000020, 0.000018, 0.000017, 0.000015), ++ SHINE_EW10(0.000014, 0.000012, 0.000011, 0.000010, 0.000009, 0.000008, ++ 0.000008, 0.000007, 0.000006, 0.000005), ++ SHINE_EW10(0.000005, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003, ++ 0.000002, 0.000002, 0.000002, 0.000002), ++ SHINE_EW10(0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, ++ 0.000000, 0.000000, 0.000000, 0.000000), ++ SHINE_EW2(0.000000, 0.000000)}; +diff --git a/src/lib/tables.h b/src/lib/tables.h +index 5c94228..fe06502 100644 +--- a/src/lib/tables.h ++++ b/src/lib/tables.h +@@ -9,8 +9,7 @@ extern const int shine_slen2_tab[16]; + extern const int samplerates[9]; + extern const int bitrates[16][4]; + +-extern const int shine_scale_fact_band_index[9][23]; ++extern const int shine_scale_fact_band_index[9][23]; + extern const int32_t shine_enwindow[]; + + #endif +- +diff --git a/src/lib/types.h b/src/lib/types.h +index f3def1a..11a05fc 100644 +--- a/src/lib/types.h ++++ b/src/lib/types.h +@@ -2,18 +2,18 @@ + #define PRIV_TYPES_H + + #include <stdio.h> +-#include <string.h> + #include <stdlib.h> ++#include <string.h> + + #include <math.h> + +-#define GRANULE_SIZE 576 ++#define GRANULE_SIZE 576 + + #include "bitstream.h" + + /* Include arch-specific instructions, + * when defined. */ +-#if defined(__mips__) && (__mips != 64) ++#if defined(__mips__) && (__mips == 32) + #include "mult_mips_gcc.h" + #elif defined(__arm__) && !defined(__thumb__) + #include "mult_sarm_gcc.h" +@@ -24,29 +24,32 @@ + #include "mult_noarch_gcc.h" + + #ifndef SWAB32 +-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) +-#define SWAB32(x) __builtin_bswap32(x) ++#if defined(__GNUC__) && \ ++ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) ++#define SWAB32(x) __builtin_bswap32(x) + #else +-#define SWAB32(x) (((unsigned int)(x) >> 24) | (((unsigned int)(x) >> 8) & 0xff00) | (((unsigned int)(x) & 0xff00) << 8) | ((unsigned int)(x) << 24)) ++#define SWAB32(x) \ ++ (((unsigned int)(x) >> 24) | (((unsigned int)(x) >> 8) & 0xff00) | \ ++ (((unsigned int)(x)&0xff00) << 8) | ((unsigned int)(x) << 24)) + #endif + #endif + + /* #define DEBUG if you want the library to dump info to stdout */ + +-#define PI 3.14159265358979 +-#define PI4 0.78539816339745 +-#define PI12 0.26179938779915 +-#define PI36 0.087266462599717 +-#define PI64 0.049087385212 +-#define SQRT2 1.41421356237 +-#define LN2 0.69314718 ++#define PI 3.14159265358979 ++#define PI4 0.78539816339745 ++#define PI12 0.26179938779915 ++#define PI36 0.087266462599717 ++#define PI64 0.049087385212 ++#define SQRT2 1.41421356237 ++#define LN2 0.69314718 + #define LN_TO_LOG10 0.2302585093 +-#define BLKSIZE 1024 +-#define HAN_SIZE 512 /* for loop unrolling, require that HAN_SIZE%8==0 */ ++#define BLKSIZE 1024 ++#define HAN_SIZE 512 /* for loop unrolling, require that HAN_SIZE%8==0 */ + #define SCALE_BLOCK 12 + #define SCALE_RANGE 64 +-#define SCALE 32768 +-#define SBLIMIT 32 ++#define SCALE 32768 ++#define SBLIMIT 32 + + #ifndef MAX_CHANNELS + #define MAX_CHANNELS 2 +@@ -57,44 +60,44 @@ + #endif + + typedef struct { +- int channels; +- int samplerate; ++ int channels; ++ int samplerate; + } priv_shine_wave_t; + + typedef struct { +- int version; +- int layer; +- int granules_per_frame; +- int mode; /* + */ /* Stereo mode */ +- int bitr; /* + */ /* Must conform to known bitrate - see Main.c */ +- int emph; /* + */ /* De-emphasis */ +- int padding; +- int bits_per_frame; +- int bits_per_slot; +- double frac_slots_per_frame; +- double slot_lag; +- int whole_slots_per_frame; +- int bitrate_index; /* + */ /* See Main.c and Layer3.c */ +- int samplerate_index; /* + */ /* See Main.c and Layer3.c */ +- int crc; +- int ext; +- int mode_ext; +- int copyright; /* + */ +- int original; /* + */ ++ int version; ++ int layer; ++ int granules_per_frame; ++ int mode; /* + */ /* Stereo mode */ ++ int bitr; /* + */ /* Must conform to known bitrate - see Main.c */ ++ int emph; /* + */ /* De-emphasis */ ++ int padding; ++ int bits_per_frame; ++ int bits_per_slot; ++ double frac_slots_per_frame; ++ double slot_lag; ++ int whole_slots_per_frame; ++ int bitrate_index; /* + */ /* See Main.c and Layer3.c */ ++ int samplerate_index; /* + */ /* See Main.c and Layer3.c */ ++ int crc; ++ int ext; ++ int mode_ext; ++ int copyright; /* + */ ++ int original; /* + */ + } priv_shine_mpeg_t; + + typedef struct { +- int32_t *xr; /* magnitudes of the spectral values */ +- int32_t xrsq[GRANULE_SIZE]; /* xr squared */ +- int32_t xrabs[GRANULE_SIZE]; /* xr absolute */ +- int32_t xrmax; /* maximum of xrabs array */ +- int32_t en_tot[MAX_GRANULES]; /* gr */ ++ int32_t *xr; /* magnitudes of the spectral values */ ++ int32_t xrsq[GRANULE_SIZE]; /* xr squared */ ++ int32_t xrabs[GRANULE_SIZE]; /* xr absolute */ ++ int32_t xrmax; /* maximum of xrabs array */ ++ int32_t en_tot[MAX_GRANULES]; /* gr */ + int32_t en[MAX_GRANULES][21]; + int32_t xm[MAX_GRANULES][21]; + int32_t xrmaxl[MAX_GRANULES]; +- double steptab[128]; /* 2**(-x/4) for x = -127..0 */ +- int32_t steptabi[128]; /* 2**(-x/4) for x = -127..0 */ +- int int2idx[10000]; /* x**(3/4) for x = 0..9999 */ ++ double steptab[128]; /* 2**(-x/4) for x = -127..0 */ ++ int32_t steptabi[128]; /* 2**(-x/4) for x = -127..0 */ ++ int int2idx[10000]; /* x**(3/4) for x = 0..9999 */ + } l3loop_t; + + typedef struct { +@@ -105,7 +108,7 @@ typedef struct { + int off[MAX_CHANNELS]; + int32_t fl[SBLIMIT][64]; + int32_t x[MAX_CHANNELS][HAN_SIZE]; +-} subband_t; ++} subband_t; + + /* Side information */ + typedef struct { +@@ -130,49 +133,48 @@ typedef struct { + } gr_info; + + typedef struct { +- unsigned private_bits; +- int resvDrain; +- unsigned scfsi[MAX_CHANNELS][4]; ++ unsigned private_bits; ++ int resvDrain; ++ unsigned scfsi[MAX_CHANNELS][4]; ++ struct { + struct { +- struct { +- gr_info tt; +- } ch[MAX_CHANNELS]; +- } gr[MAX_GRANULES]; ++ gr_info tt; ++ } ch[MAX_CHANNELS]; ++ } gr[MAX_GRANULES]; + } shine_side_info_t; + + typedef struct { +- double l[MAX_GRANULES][MAX_CHANNELS][21]; ++ double l[MAX_GRANULES][MAX_CHANNELS][21]; + } shine_psy_ratio_t; + + typedef struct { +- double l[MAX_GRANULES][MAX_CHANNELS][21]; ++ double l[MAX_GRANULES][MAX_CHANNELS][21]; + } shine_psy_xmin_t; + + typedef struct { +- int32_t l[MAX_GRANULES][MAX_CHANNELS][22]; /* [cb] */ +- int32_t s[MAX_GRANULES][MAX_CHANNELS][13][3]; /* [window][cb] */ ++ int32_t l[MAX_GRANULES][MAX_CHANNELS][22]; /* [cb] */ ++ int32_t s[MAX_GRANULES][MAX_CHANNELS][13][3]; /* [window][cb] */ + } shine_scalefac_t; + +- +-typedef struct shine_global_flags { +- priv_shine_wave_t wave; +- priv_shine_mpeg_t mpeg; +- bitstream_t bs; ++typedef struct shine_global_flags { ++ priv_shine_wave_t wave; ++ priv_shine_mpeg_t mpeg; ++ bitstream_t bs; + shine_side_info_t side_info; +- int sideinfo_len; +- int mean_bits; ++ int sideinfo_len; ++ int mean_bits; + shine_psy_ratio_t ratio; +- shine_scalefac_t scalefactor; +- int16_t *buffer[MAX_CHANNELS]; +- double pe[MAX_CHANNELS][MAX_GRANULES]; +- int l3_enc[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE]; +- int32_t l3_sb_sample[MAX_CHANNELS][MAX_GRANULES+1][18][SBLIMIT]; +- int32_t mdct_freq[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE]; +- int ResvSize; +- int ResvMax; +- l3loop_t l3loop; +- mdct_t mdct; +- subband_t subband; ++ shine_scalefac_t scalefactor; ++ int16_t *buffer[MAX_CHANNELS]; ++ double pe[MAX_CHANNELS][MAX_GRANULES]; ++ int l3_enc[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE]; ++ int32_t l3_sb_sample[MAX_CHANNELS][MAX_GRANULES + 1][18][SBLIMIT]; ++ int32_t mdct_freq[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE]; ++ int ResvSize; ++ int ResvMax; ++ l3loop_t l3loop; ++ mdct_t mdct; ++ subband_t subband; + } shine_global_config; + + #endif diff --git a/multimedia/shine/shine.SlackBuild b/multimedia/shine/shine.SlackBuild index 3caf69653d276..81d701d8f3b55 100644 --- a/multimedia/shine/shine.SlackBuild +++ b/multimedia/shine/shine.SlackBuild @@ -2,7 +2,7 @@ # Slackware build script for shine -# Copyright 2022 Vijay Marcel +# Copyright 2022-2024 Vijay Marcel # All rights reserved. # # Redistribution and use of this script, with or without modification, is @@ -25,8 +25,7 @@ cd $(dirname $0) ; CWD=$(pwd) PRGNAM=shine -VERSION=${VERSION:-20042019_76ea4f0} -COMMIT=${COMMIT:-76ea4f072e03a3d76283c99412f698076a20a362} +VERSION=${VERSION:-3.1.1} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} PKGTYPE=${PKGTYPE:-tgz} @@ -39,9 +38,6 @@ case "$( uname -m )" in esac fi -# If the variable PRINT_PACKAGE_NAME is set, then this script will report what -# the name of the created package would be, and then exit. This information -# could be useful to other scripts. if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE" exit 0 @@ -52,13 +48,13 @@ PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} if [ "$ARCH" = "i586" ]; then - SLKCFLAGS="-O2 -march=i586 -mtune=i686" + SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then - SLKCFLAGS="-O2 -march=i686 -mtune=i686" + SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC" LIBDIRSUFFIX="" elif [ "$ARCH" = "x86_64" ]; then - SLKCFLAGS="-O2 -fPIC" + SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC" LIBDIRSUFFIX="64" else SLKCFLAGS="-O2" @@ -71,9 +67,9 @@ trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ER rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP -rm -rf $PRGNAM-$COMMIT -tar xvf $CWD/$PRGNAM-$COMMIT.tar.gz -cd $PRGNAM-$COMMIT +rm -rf $PRGNAM-$VERSION +tar xvf $CWD/$PRGNAM-$VERSION.tar.gz +cd $PRGNAM-$VERSION chown -R root:root . find -L . \ @@ -82,10 +78,11 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; -CFLAGS="$SLKCFLAGS" \ -CXXFLAGS="$SLKCFLAGS" \ +patch -p1 --verbose --unified < $CWD/fix-bugs.patch ./bootstrap +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ ./configure \ --prefix=/usr \ --libdir=/usr/lib${LIBDIRSUFFIX} \ @@ -101,7 +98,7 @@ make install DESTDIR=$PKG rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ - | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true + | cut -f 1 -d : | xargs strip --strip-unneeded --remove-section=.comment --remove-section=.note 2> /dev/null || true mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION cp -a README.md COPYING ChangeLog $PKG/usr/doc/$PRGNAM-$VERSION diff --git a/multimedia/shine/shine.info b/multimedia/shine/shine.info index ddff14a8c66bb..401505a28320e 100644 --- a/multimedia/shine/shine.info +++ b/multimedia/shine/shine.info @@ -1,8 +1,8 @@ PRGNAM="shine" -VERSION="20042019_76ea4f0" +VERSION="3.1.1" HOMEPAGE="https://github.com/toots/shine" -DOWNLOAD="https://github.com/toots/shine/archive/76ea4f0/shine-76ea4f072e03a3d76283c99412f698076a20a362.tar.gz" -MD5SUM="c44a4512276982a351c693f32206a7f3" +DOWNLOAD="https://github.com/toots/shine/archive/3.1.1/shine-3.1.1.tar.gz" +MD5SUM="ff41cb139c25470f2d9c9acc9f97cc8d" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" |