From 5ede9ce84fa86fbbc28c1f47ca0a1e7df10162ff Mon Sep 17 00:00:00 2001 From: gohai Date: Mon, 31 Jul 2023 10:57:14 +0800 Subject: [PATCH 01/15] Add a LanguageModel class that implements the Llama2 architecture via llama2.c and Emscripten See https://github.com/gohai/llama2.c-emscripten for details. --- examples/LanguageModel/index.html | 14 + examples/LanguageModel/sketch.js | 61 ++++ examples/LanguageModelAsync/index.html | 15 + examples/LanguageModelAsync/sketch.js | 22 ++ examples/LanguageModelEvent/index.html | 14 + examples/LanguageModelEvent/sketch.js | 62 ++++ examples/LanguageModelManual/index.html | 14 + examples/LanguageModelManual/sketch.js | 59 ++++ examples/LanguageModelManualAsync/index.html | 14 + examples/LanguageModelManualAsync/sketch.js | 62 ++++ src/LanguageModel/index.js | 288 +++++++++++++++++++ src/LanguageModel/llama2.data | Bin 0 -> 432717 bytes src/LanguageModel/llama2.js | 19 ++ src/LanguageModel/llama2.wasm | Bin 0 -> 48114 bytes src/index.js | 2 + webpack.config.js | 25 ++ 16 files changed, 671 insertions(+) create mode 100644 examples/LanguageModel/index.html create mode 100644 examples/LanguageModel/sketch.js create mode 100644 examples/LanguageModelAsync/index.html create mode 100644 examples/LanguageModelAsync/sketch.js create mode 100644 examples/LanguageModelEvent/index.html create mode 100644 examples/LanguageModelEvent/sketch.js create mode 100644 examples/LanguageModelManual/index.html create mode 100644 examples/LanguageModelManual/sketch.js create mode 100644 examples/LanguageModelManualAsync/index.html create mode 100644 examples/LanguageModelManualAsync/sketch.js create mode 100644 src/LanguageModel/index.js create mode 100644 src/LanguageModel/llama2.data create mode 100644 src/LanguageModel/llama2.js create mode 100755 src/LanguageModel/llama2.wasm diff --git a/examples/LanguageModel/index.html b/examples/LanguageModel/index.html new file mode 100644 index 00000000..bc17ebed --- /dev/null +++ b/examples/LanguageModel/index.html @@ -0,0 +1,14 @@ + + + + + Language Model Example + + + + + + + + + diff --git a/examples/LanguageModel/sketch.js b/examples/LanguageModel/sketch.js new file mode 100644 index 00000000..429231fb --- /dev/null +++ b/examples/LanguageModel/sketch.js @@ -0,0 +1,61 @@ +let lm; +let curWord = 0; +let angle = 0; +let radius = 60; + +function setup() { + createCanvas(400, 400); + background(0); + + lm = ml5.languageModel(onModelLoaded); +} + +function draw() { + fill(0, 5); + rect(0, 0, width, height); +} + +function onModelLoaded() { + console.log('Model loaded'); + select('#generate').removeAttribute('disabled'); + select('#generate').mouseClicked(generateText); +} + +function generateText() { + let prompt = select('#prompt').value(); + console.log('Prompt: ' + prompt); + + let options = { + temperature: 0.9 + }; + lm.generate(prompt, options, onToken); + + curWord = 0; +} + +function onToken(lm) { + console.log(lm.tokens[lm.tokens.length-1]); + + while (curWord < lm.words.length) { + push(); + translate(width/2, height/2); + rotate(radians(angle)); + translate(radius, 0); + rotate(radians(-angle)); + angle = angle + 5; + radius += 0.5; + if (radius > width/2 || radius > height/2) { + radius = 60; + } + fill(255); + textAlign(CENTER); + textSize(10); + text(lm.words[curWord], 0, 0); + pop(); + curWord++; + } + + if (lm.finished) { + console.log('Generation finished'); + } +} diff --git a/examples/LanguageModelAsync/index.html b/examples/LanguageModelAsync/index.html new file mode 100644 index 00000000..baca104c --- /dev/null +++ b/examples/LanguageModelAsync/index.html @@ -0,0 +1,15 @@ + + + + + Language Model Example + + + + + + +
+ + + diff --git a/examples/LanguageModelAsync/sketch.js b/examples/LanguageModelAsync/sketch.js new file mode 100644 index 00000000..9421cad8 --- /dev/null +++ b/examples/LanguageModelAsync/sketch.js @@ -0,0 +1,22 @@ +let lm; + +async function setup() { + noCanvas(); + + lm = await ml5.languageModel(); + console.log('Model loaded'); + + select('#generate').mouseClicked(generateText); +} + +function draw() { +} + +async function generateText() { + let prompt = select('#prompt').value(); + console.log('Prompt: ' + prompt); + + let out = await lm.generate(prompt); + console.log('Generated: ' + out); + select('#output').html(out); +} diff --git a/examples/LanguageModelEvent/index.html b/examples/LanguageModelEvent/index.html new file mode 100644 index 00000000..7fae8d96 --- /dev/null +++ b/examples/LanguageModelEvent/index.html @@ -0,0 +1,14 @@ + + + + + Language Model Example + + + + + + + + + diff --git a/examples/LanguageModelEvent/sketch.js b/examples/LanguageModelEvent/sketch.js new file mode 100644 index 00000000..39ee5503 --- /dev/null +++ b/examples/LanguageModelEvent/sketch.js @@ -0,0 +1,62 @@ +let lm; +let curWord = 0; +let angle = 0; +let radius = 60; + +function setup() { + createCanvas(400, 400); + background(0); + + lm = ml5.languageModel(onModelLoaded); +} + +function draw() { + fill(0, 5); + rect(0, 0, width, height); +} + +function onModelLoaded() { + console.log('Model loaded'); + select('#generate').removeAttribute('disabled'); + select('#generate').mouseClicked(generateText); +} + +function generateText() { + let prompt = select('#prompt').value(); + console.log('Prompt: ' + prompt); + + let options = { + temperature: 0.9 + }; + lm.generate(prompt, options); + lm.on('token', onToken); + lm.on('word', onWord); + lm.on('finish', onFinsh); +} + + +function onToken(lm) { + console.log('token', lm.tokens[lm.tokens.length-1]); +} + +function onWord(word, lm) { + push(); + translate(width/2, height/2); + rotate(radians(angle)); + translate(radius, 0); + rotate(radians(-angle)); + angle = angle + 5; + radius += 0.5; + if (radius > width/2 || radius > height/2) { + radius = 60; + } + fill(255); + textAlign(CENTER); + textSize(10); + text(word, 0, 0); + pop(); +} + +function onFinsh(lm) { + console.log('Generation finished', lm.out); +} diff --git a/examples/LanguageModelManual/index.html b/examples/LanguageModelManual/index.html new file mode 100644 index 00000000..bc17ebed --- /dev/null +++ b/examples/LanguageModelManual/index.html @@ -0,0 +1,14 @@ + + + + + Language Model Example + + + + + + + + + diff --git a/examples/LanguageModelManual/sketch.js b/examples/LanguageModelManual/sketch.js new file mode 100644 index 00000000..22e78635 --- /dev/null +++ b/examples/LanguageModelManual/sketch.js @@ -0,0 +1,59 @@ +let lm; +let numOptions = 40; + +async function setup() { + noCanvas(); + + lm = await ml5.languageModel(onModelLoaded); +} + +function draw() { +} + +function onModelLoaded() { + console.log('Model loaded'); + select('#generate').removeAttribute('disabled'); + select('#generate').mouseClicked(generateText); +} + +function generateText() { + let prompt = select('#prompt').value(); + console.log('Prompt: ' + prompt); + + select('#prompt').remove(); + select('#generate').remove(); + let btn = createElement('button', prompt); + btn.attribute('disabled', 'disabled'); + select('body').child(btn); + + let options = { + temperature: 0.9 + }; + + lm.manualStart(prompt, options, onTokens); +} + +function onTokens(tokens, lm) { + for (let i=0; i < numOptions; i++) { + let btn = createElement('button', tokens[i].str); + btn.class('continuation'); + btn.id(tokens[i].index); + btn.mousePressed(selectToken); + select('body').child(btn); + } +} + +function selectToken() { + let nextToken = parseInt(this.id()); + + this.removeClass('continuation'); + this.attribute('disabled', 'disabled'); + this.mousePressed(null); + + let others = selectAll('.continuation'); + for (let i=0; i < others.length; i++) { + others[i].remove(); + } + + lm.manualNext(nextToken, onTokens); +} diff --git a/examples/LanguageModelManualAsync/index.html b/examples/LanguageModelManualAsync/index.html new file mode 100644 index 00000000..7fae8d96 --- /dev/null +++ b/examples/LanguageModelManualAsync/index.html @@ -0,0 +1,14 @@ + + + + + Language Model Example + + + + + + + + + diff --git a/examples/LanguageModelManualAsync/sketch.js b/examples/LanguageModelManualAsync/sketch.js new file mode 100644 index 00000000..9f1066b4 --- /dev/null +++ b/examples/LanguageModelManualAsync/sketch.js @@ -0,0 +1,62 @@ +let lm; +let numOptions = 40; + +async function setup() { + noCanvas(); + + lm = await ml5.languageModel(); + console.log('Model loaded'); + + select('#generate').mouseClicked(generateText); +} + +function draw() { +} + +async function generateText() { + let prompt = select('#prompt').value(); + console.log('Prompt: ' + prompt); + + select('#prompt').remove(); + select('#generate').remove(); + let btn = createElement('button', prompt); + btn.attribute('disabled', 'disabled'); + select('body').child(btn); + + let options = { + temperature: 0.9 + }; + + let tokens = await lm.manualStart(prompt, options); + + for (let i=0; i < numOptions; i++) { + let btn = createElement('button', tokens[i].str); + btn.class('continuation'); + btn.id(tokens[i].index); + btn.mousePressed(selectToken); + select('body').child(btn); + } +} + +async function selectToken() { + let nextToken = parseInt(this.id()); + + this.removeClass('continuation'); + this.attribute('disabled', 'disabled'); + this.mousePressed(null); + + let others = selectAll('.continuation'); + for (let i=0; i < others.length; i++) { + others[i].remove(); + } + + let tokens = await lm.manualNext(nextToken); + + for (let i=0; i < numOptions; i++) { + let btn = createElement('button', tokens[i].str); + btn.class('continuation'); + btn.id(tokens[i].index); + btn.mousePressed(selectToken); + select('body').child(btn); + } +} diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js new file mode 100644 index 00000000..27cdb3dd --- /dev/null +++ b/src/LanguageModel/index.js @@ -0,0 +1,288 @@ +// Copyright (c) 2023 ml5 +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +import { EventEmitter } from "events"; +import callCallback from "../utils/callcallback"; +import handleArguments from "../utils/handleArguments"; + +import Llama2 from './llama2.js'; +import Llama2Wasm from './llama2.wasm'; +import Llama2Data from './llama2.data'; + + +class LanguageModel extends EventEmitter { + constructor(optionsOrCb, cb) { + super(); + + this.options = { + modelUrl: 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin', // if set, model.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) + tokenizerUrl: '', // if set, tokenizer.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) + steps: 0, // how many tokens to generate (defaults to model's maximum) + temperature: 0.9, // 0.0 = (deterministic) argmax sampling, 1.0 = baseline + stopOnBosOrEos: true, // stop when encountering beginning-of-sequence or end-of-sequence token + }; + + // handle arguments + let callback; + if (typeof optionsOrCb === 'function') { + callback = optionsOrCb; + } else { + if (typeof optionsOrCb === 'object') { + this.options.modelUrl = (typeof optionsOrCb.modelUrl === 'string') ? optionsOrCb.modelUrl : this.options.modelUrl; + this.options.tokenizerUrl = (typeof optionsOrCb.tokenizerUrl === 'string') ? optionsOrCb.tokenizerUrl : this.options.tokenizerUrl; + } + if (typeof cb === 'function') { + callback = cb; + } + } + + this.out = ''; + this.tokens = []; + this.words = []; + this.finished = true; + + this.ready = callCallback(this.loadModel(), callback); + } + + async loadModel() { + const onStdout = (str) => { + //console.log('onStdout', str); + }; + + this.llama2 = await Llama2({ + locateFile(path) { + if (path.endsWith('.wasm')) { + return Llama2Wasm; + } + if (path.endsWith('.data')) { + return Llama2Data; + } + return path; + }, + arguments: ['model.bin'], + print: onStdout, + preRun: [ + (inst) => { + // model.bin and tokenizer.bin can either be baked into the llama2.data file + // (leading to a large library size), or dynamically from an URL provided as + // an option + if (this.options.modelUrl) { + inst.FS_createPreloadedFile('', 'model.bin', this.options.modelUrl, true, false); + } + if (this.options.tokenizerUrl) { + inst.FS_createPreloadedFile('', 'tokenizer.bin', this.options.tokenizerUrl, true, false); + } + } + ] + }); + + const onTokenCallback = await this.llama2.addFunction((tokenStr, token, probability, finished) => { + // ignore tokens after BOS or EOS (with stopOnBosOrEn on) + if (this.finished) { + return; + } + + tokenStr = this.llama2.UTF8ToString(tokenStr); + this.tokens.push({ index: token, str: tokenStr, probability: probability }); + // llama2.c signals finished after completing all steps + if (finished) { + this.finished = true; + } + + // optionally stop after encountering BOS (1) or EOS (2) + if (this.options.stopOnBosOrEos && (token == 1 || token == 2)) { + this.finished = true; + } else { + this.out += tokenStr; + } + + // on-token callback/event + if (this.callback) { + this.callback(this); + } + this.emit('token', this); + + // redo word tokenization + const wordDelimiters = ' .,:;"“?!\n'; + const re = new RegExp('(?=[' + wordDelimiters + '])|(?<=[' + wordDelimiters + '])', 'g'); + const prevNumWords = this.words.length; + this.words = this.out.split(re); + // ignore the last word if we can't be certain it's complete + if (!wordDelimiters.includes(this.out.slice(-1)) && !this.finished) { + this.words.pop(); + } + // on-word event + for (let i=prevNumWords; i < this.words.length; i++) { + this.emit('word', this.words[i], this); + } + + // on-finished promise/event + if (this.finished) { + // fulfill the promise returned by generate() + if (this.promiseResolve) { + this.promiseResolve(this.out); + } + this.emit('finsh', this); + } + }, 'viifi'); + + await this.llama2.ccall('register_callback', null, [ 'number' ], [ onTokenCallback ]); + + //console.log('loadModel done'); + } + + async generate(prompt, optionsOrCb, cb) { + await this.ready; + + // handle arguments + if (typeof optionsOrCb === 'function') { + this.callback = optionsOrCb; + } else { + if (typeof optionsOrCb === 'object') { + this.options.steps = (typeof optionsOrCb.steps === 'number') ? optionsOrCb.steps : this.options.steps; + this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; + this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; + } + if (typeof cb === 'function') { + this.callback = cb; + } else { + this.callback = null; + } + } + + // if there are any outstanding requests, resolve them + // with the output received so far + if (this.promiseResolve) { + this.promiseResolve(this.out); + } + + await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); + + this.out = ''; + this.tokens = [{ index: 1, str: '', probability: 1 }]; + this.words = []; + this.finished = false; + + await this.llama2.ccall('generate', null, [ 'string' ], [ prompt ]); + + return new Promise((resolve, reject) => { + this.promiseResolve = resolve; + }); + } + + async vocab() { + if (this._vocab) { + return this._vocab; + } + + await this.ready; + const vocabSize = await this.llama2.ccall('get_vocab_size', 'number', [], []); + const vocabPtr = await this.llama2.ccall('get_vocab', 'number', [], []); + this._vocab = new Array(vocabSize); + for (let i=0; i < vocabSize; i++) { + const strPtr = this.llama2.HEAPU32[(vocabPtr+4*i)/4]; + this._vocab[i] = this.llama2.UTF8ToString(strPtr); + } + return this._vocab; + } + + async manualStart(prompt, optionsOrCb, cb) { + await this.ready; + + // handle arguments + if (typeof optionsOrCb === 'function') { + this.callback = optionsOrCb; + } else { + if (typeof optionsOrCb === 'object') { + this.options.steps = (typeof optionsOrCb.steps === 'number') ? optionsOrCb.steps : this.options.steps; + this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; + this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; + } + if (typeof cb === 'function') { + this.callback = cb; + } else { + this.callback = null; + } + } + + // if there are any outstanding requests, resolve them + // with the output received so far + if (this.promiseResolve) { + this.promiseResolve(this.out); + } + + await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); + + this.out = ''; + this.tokens = []; + this.words = []; + this.finished = true; + + let token = await this.llama2.ccall('manual_start', 'number', [ 'string' ], [ prompt ]); + return this.manualNext(token); + } + + async manualNext(token) { + await this.ready; + + if (typeof token === 'number') { + // nothing to do + } else if (typeof token === 'object' && typeof token.index === 'number') { + token = token.index; + } else if (typeof token === 'string') { + // check if numeric + if (token.match(/^\d+$/)) { + token = parseInt(token); + } else { + // look up in vocabulary + const vocab = await this.vocab(); + let found = false; + for (let i=0; i < vocab.length; i++) { + if (token === vocab[i]) { + token = i; + found = true; + break; + } + } + if (!found) { + throw 'Not in vocabulary: ' + token; + } + } + } else { + throw 'Unrecognized next token: ' + token; + } + + const vocab = await this.vocab(); + const logitsPtr = await this.llama2.ccall('manual_next', 'number', [ 'number' ], [ token ]); + + const tokens = new Array(vocab.length-1); + for (let i=1; i < vocab.length; i++) { + tokens[i] = { index: i, str: vocab[i], probability: this.llama2.HEAPF32[(logitsPtr+i*4)/4] }; + } + tokens.sort((a, b) => (a.probability > b.probability) ? -1 : 1); + + // on-tokens callback/event + if (this.callback) { + this.callback(tokens, this); + } + this.emit('tokens', tokens, this); + + return tokens; + } + +} + + +/** + * exposes LanguageModel class through function + * @returns {Object|Promise} A new LanguageModel instance + */ +const languageModel = (...inputs) => { + const { options = {}, callback } = handleArguments(...inputs); + const instance = new LanguageModel(options, callback); + return instance; +}; + +export default languageModel; diff --git a/src/LanguageModel/llama2.data b/src/LanguageModel/llama2.data new file mode 100644 index 0000000000000000000000000000000000000000..e0a8a7bc47fda2ecaab1e2cc2255d140925ed704 GIT binary patch literal 432717 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ⅅ9xq)jX7kJ+xjcPYAaHqYfwaF{f|{=#Gi+Red5 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

H;Zvg5O`Xpe$`XCh0VoDln+JP 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 Date: Fri, 4 Aug 2023 11:16:35 +0800 Subject: [PATCH 02/15] LanguageModel: Require explicitly specifying the model name used Besides providing a model name, the user can also pass an object containing the URL to a custom model. In both cases, they're explicit about the model they're exploring. As suggested by @shiffman --- examples/LanguageModel/sketch.js | 2 +- examples/LanguageModelAsync/sketch.js | 2 +- examples/LanguageModelEvent/sketch.js | 2 +- examples/LanguageModelManual/sketch.js | 2 +- examples/LanguageModelManualAsync/sketch.js | 2 +- src/LanguageModel/index.js | 41 +++++++++++++-------- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/examples/LanguageModel/sketch.js b/examples/LanguageModel/sketch.js index 429231fb..f52d6a48 100644 --- a/examples/LanguageModel/sketch.js +++ b/examples/LanguageModel/sketch.js @@ -7,7 +7,7 @@ function setup() { createCanvas(400, 400); background(0); - lm = ml5.languageModel(onModelLoaded); + lm = ml5.languageModel('TinyStories-15M', onModelLoaded); } function draw() { diff --git a/examples/LanguageModelAsync/sketch.js b/examples/LanguageModelAsync/sketch.js index 9421cad8..4a698377 100644 --- a/examples/LanguageModelAsync/sketch.js +++ b/examples/LanguageModelAsync/sketch.js @@ -3,7 +3,7 @@ let lm; async function setup() { noCanvas(); - lm = await ml5.languageModel(); + lm = await ml5.languageModel('TinyStories-15M'); console.log('Model loaded'); select('#generate').mouseClicked(generateText); diff --git a/examples/LanguageModelEvent/sketch.js b/examples/LanguageModelEvent/sketch.js index 39ee5503..3c236548 100644 --- a/examples/LanguageModelEvent/sketch.js +++ b/examples/LanguageModelEvent/sketch.js @@ -7,7 +7,7 @@ function setup() { createCanvas(400, 400); background(0); - lm = ml5.languageModel(onModelLoaded); + lm = ml5.languageModel('TinyStories-15M', onModelLoaded); } function draw() { diff --git a/examples/LanguageModelManual/sketch.js b/examples/LanguageModelManual/sketch.js index 22e78635..15840048 100644 --- a/examples/LanguageModelManual/sketch.js +++ b/examples/LanguageModelManual/sketch.js @@ -4,7 +4,7 @@ let numOptions = 40; async function setup() { noCanvas(); - lm = await ml5.languageModel(onModelLoaded); + lm = await ml5.languageModel('TinyStories-15M', onModelLoaded); } function draw() { diff --git a/examples/LanguageModelManualAsync/sketch.js b/examples/LanguageModelManualAsync/sketch.js index 9f1066b4..1bcb198e 100644 --- a/examples/LanguageModelManualAsync/sketch.js +++ b/examples/LanguageModelManualAsync/sketch.js @@ -4,7 +4,7 @@ let numOptions = 40; async function setup() { noCanvas(); - lm = await ml5.languageModel(); + lm = await ml5.languageModel('TinyStories-15M'); console.log('Model loaded'); select('#generate').mouseClicked(generateText); diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 27cdb3dd..54351110 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -5,7 +5,6 @@ import { EventEmitter } from "events"; import callCallback from "../utils/callcallback"; -import handleArguments from "../utils/handleArguments"; import Llama2 from './llama2.js'; import Llama2Wasm from './llama2.wasm'; @@ -13,11 +12,11 @@ import Llama2Data from './llama2.data'; class LanguageModel extends EventEmitter { - constructor(optionsOrCb, cb) { + constructor(modelNameOrOptions, callback) { super(); this.options = { - modelUrl: 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin', // if set, model.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) + modelUrl: '', // if set, model.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) tokenizerUrl: '', // if set, tokenizer.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) steps: 0, // how many tokens to generate (defaults to model's maximum) temperature: 0.9, // 0.0 = (deterministic) argmax sampling, 1.0 = baseline @@ -25,17 +24,28 @@ class LanguageModel extends EventEmitter { }; // handle arguments - let callback; - if (typeof optionsOrCb === 'function') { - callback = optionsOrCb; - } else { - if (typeof optionsOrCb === 'object') { - this.options.modelUrl = (typeof optionsOrCb.modelUrl === 'string') ? optionsOrCb.modelUrl : this.options.modelUrl; - this.options.tokenizerUrl = (typeof optionsOrCb.tokenizerUrl === 'string') ? optionsOrCb.tokenizerUrl : this.options.tokenizerUrl; - } - if (typeof cb === 'function') { - callback = cb; + if (typeof modelNameOrOptions === 'string') { + switch (modelNameOrOptions) { + // see https://huggingface.co/karpathy/tinyllamas for TinyStories-* + case 'TinyStories-15M': + this.options.modelUrl = 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin'; + break; + case 'TinyStories-42M': + this.options.modelUrl = 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories42M.bin'; + break; + case 'TinyStories-110M': + this.options.modelUrl = 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories110M.bin'; + break; + default: + throw 'Unrecognized model ' + modelNameOrUrl + ', try e.g. TinyStories-15M'; } + } else if (typeof modelNameOrUrl === 'object') { + this.options.modelUrl = (typeof modelNameOrOptions.modelUrl === 'string') ? modelNameOrOptions.modelUrl : this.options.modelUrl; + this.options.tokenizerUrl = (typeof modelNameOrOptions.tokenizerUrl === 'string') ? modelNameOrOptions.tokenizerUrl : this.options.tokenizerUrl; + } + + if (!this.options.modelUrl) { + throw 'You need to provide the name of the model to load, e.g. TinyStories-15M'; } this.out = ''; @@ -279,9 +289,8 @@ class LanguageModel extends EventEmitter { * exposes LanguageModel class through function * @returns {Object|Promise} A new LanguageModel instance */ -const languageModel = (...inputs) => { - const { options = {}, callback } = handleArguments(...inputs); - const instance = new LanguageModel(options, callback); +const languageModel = (modelNameOrOptions, callback) => { + const instance = new LanguageModel(modelNameOrOptions, callback); return instance; }; From d10242daab905667098d54506f3c561cccefd295 Mon Sep 17 00:00:00 2001 From: gohai Date: Fri, 4 Aug 2023 11:50:25 +0800 Subject: [PATCH 03/15] LanguageModel: Change the callback to be on-completion rather than on-token As suggested by @shiffman. This makes the most basic example easier to understand. --- examples/LanguageModel/index.html | 2 +- examples/LanguageModel/sketch.js | 56 +++++++++++++------------------ src/LanguageModel/index.js | 10 +++--- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/examples/LanguageModel/index.html b/examples/LanguageModel/index.html index bc17ebed..90402ed0 100644 --- a/examples/LanguageModel/index.html +++ b/examples/LanguageModel/index.html @@ -8,7 +8,7 @@ - +

diff --git a/examples/LanguageModel/sketch.js b/examples/LanguageModel/sketch.js index f52d6a48..f879e7ac 100644 --- a/examples/LanguageModel/sketch.js +++ b/examples/LanguageModel/sketch.js @@ -1,18 +1,32 @@ let lm; +let words = []; let curWord = 0; -let angle = 0; -let radius = 60; +let curX = 0; +let curY = 20; function setup() { createCanvas(400, 400); + frameRate(15); background(0); lm = ml5.languageModel('TinyStories-15M', onModelLoaded); } function draw() { - fill(0, 5); + fill(0, 2); rect(0, 0, width, height); + + if (curWord < words.length) { + let wordWidth = textWidth(words[curWord]); + if (curX+wordWidth > width) { + curX = 0; + curY += textAscent() + textDescent(); + } + fill(255); + text(words[curWord] + ' ', curX, curY); + curX += wordWidth; + curWord++; + } } function onModelLoaded() { @@ -23,39 +37,17 @@ function onModelLoaded() { function generateText() { let prompt = select('#prompt').value(); - console.log('Prompt: ' + prompt); + console.log('Prompt is "' + prompt + '"'); let options = { temperature: 0.9 }; - lm.generate(prompt, options, onToken); - - curWord = 0; + lm.generate(prompt, options, gotText); } -function onToken(lm) { - console.log(lm.tokens[lm.tokens.length-1]); - - while (curWord < lm.words.length) { - push(); - translate(width/2, height/2); - rotate(radians(angle)); - translate(radius, 0); - rotate(radians(-angle)); - angle = angle + 5; - radius += 0.5; - if (radius > width/2 || radius > height/2) { - radius = 60; - } - fill(255); - textAlign(CENTER); - textSize(10); - text(lm.words[curWord], 0, 0); - pop(); - curWord++; - } - - if (lm.finished) { - console.log('Generation finished'); - } +function gotText(out, lm) { + console.log('Model returned "' + out + '"'); + // lm.words contains the output broken up in words + words = lm.words; + curWord = 0; } diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 54351110..e50b1a6b 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -108,10 +108,7 @@ class LanguageModel extends EventEmitter { this.out += tokenStr; } - // on-token callback/event - if (this.callback) { - this.callback(this); - } + // on-token event this.emit('token', this); // redo word tokenization @@ -128,13 +125,16 @@ class LanguageModel extends EventEmitter { this.emit('word', this.words[i], this); } - // on-finished promise/event + // on-finished promise/event/callback if (this.finished) { // fulfill the promise returned by generate() if (this.promiseResolve) { this.promiseResolve(this.out); } this.emit('finsh', this); + if (this.callback) { + this.callback(this.out, this); + } } }, 'viifi'); From 0a5b08903108b4538bccd5015b5a4a7408509860 Mon Sep 17 00:00:00 2001 From: gohai Date: Fri, 4 Aug 2023 11:56:49 +0800 Subject: [PATCH 04/15] LanguageModel: Pass value as the first argument to event handlers Previously this sometimes only passed the LanguageModel instance. Instead, always pass the best possible "value" as the first, and the instance as an (optional) second. --- examples/LanguageModelEvent/index.html | 2 +- examples/LanguageModelEvent/sketch.js | 8 ++++---- src/LanguageModel/index.js | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/LanguageModelEvent/index.html b/examples/LanguageModelEvent/index.html index 7fae8d96..996e95bd 100644 --- a/examples/LanguageModelEvent/index.html +++ b/examples/LanguageModelEvent/index.html @@ -8,7 +8,7 @@ - +

diff --git a/examples/LanguageModelEvent/sketch.js b/examples/LanguageModelEvent/sketch.js index 3c236548..57555250 100644 --- a/examples/LanguageModelEvent/sketch.js +++ b/examples/LanguageModelEvent/sketch.js @@ -35,8 +35,8 @@ function generateText() { } -function onToken(lm) { - console.log('token', lm.tokens[lm.tokens.length-1]); +function onToken(token, lm) { + console.log('token', token); } function onWord(word, lm) { @@ -57,6 +57,6 @@ function onWord(word, lm) { pop(); } -function onFinsh(lm) { - console.log('Generation finished', lm.out); +function onFinsh(out, lm) { + console.log('Generation finished', out); } diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index e50b1a6b..3d2fb1c2 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -109,7 +109,7 @@ class LanguageModel extends EventEmitter { } // on-token event - this.emit('token', this); + this.emit('token', this.tokens[this.tokens.length-1], this); // redo word tokenization const wordDelimiters = ' .,:;"“?!\n'; @@ -131,7 +131,7 @@ class LanguageModel extends EventEmitter { if (this.promiseResolve) { this.promiseResolve(this.out); } - this.emit('finsh', this); + this.emit('finsh', this.out, this); if (this.callback) { this.callback(this.out, this); } From 54323f218c0619942d7dcb5294cdc667e0da3182 Mon Sep 17 00:00:00 2001 From: gohai Date: Fri, 4 Aug 2023 12:00:41 +0800 Subject: [PATCH 05/15] LanguageModel: Reorganize examples This drops all examples that use async/await. --- examples/LanguageModelAsync/index.html | 15 ----- examples/LanguageModelAsync/sketch.js | 22 ------- .../index.html | 2 +- .../sketch.js | 7 ++- examples/LanguageModelManual/sketch.js | 2 +- examples/LanguageModelManualAsync/index.html | 14 ----- examples/LanguageModelManualAsync/sketch.js | 62 ------------------- 7 files changed, 6 insertions(+), 118 deletions(-) delete mode 100644 examples/LanguageModelAsync/index.html delete mode 100644 examples/LanguageModelAsync/sketch.js rename examples/{LanguageModelEvent => LanguageModelEvents}/index.html (86%) rename examples/{LanguageModelEvent => LanguageModelEvents}/sketch.js (86%) delete mode 100644 examples/LanguageModelManualAsync/index.html delete mode 100644 examples/LanguageModelManualAsync/sketch.js diff --git a/examples/LanguageModelAsync/index.html b/examples/LanguageModelAsync/index.html deleted file mode 100644 index baca104c..00000000 --- a/examples/LanguageModelAsync/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Language Model Example - - - - - - -

- - - diff --git a/examples/LanguageModelAsync/sketch.js b/examples/LanguageModelAsync/sketch.js deleted file mode 100644 index 4a698377..00000000 --- a/examples/LanguageModelAsync/sketch.js +++ /dev/null @@ -1,22 +0,0 @@ -let lm; - -async function setup() { - noCanvas(); - - lm = await ml5.languageModel('TinyStories-15M'); - console.log('Model loaded'); - - select('#generate').mouseClicked(generateText); -} - -function draw() { -} - -async function generateText() { - let prompt = select('#prompt').value(); - console.log('Prompt: ' + prompt); - - let out = await lm.generate(prompt); - console.log('Generated: ' + out); - select('#output').html(out); -} diff --git a/examples/LanguageModelEvent/index.html b/examples/LanguageModelEvents/index.html similarity index 86% rename from examples/LanguageModelEvent/index.html rename to examples/LanguageModelEvents/index.html index 996e95bd..90402ed0 100644 --- a/examples/LanguageModelEvent/index.html +++ b/examples/LanguageModelEvents/index.html @@ -8,7 +8,7 @@ -

+

diff --git a/examples/LanguageModelEvent/sketch.js b/examples/LanguageModelEvents/sketch.js similarity index 86% rename from examples/LanguageModelEvent/sketch.js rename to examples/LanguageModelEvents/sketch.js index 57555250..2a3540e3 100644 --- a/examples/LanguageModelEvent/sketch.js +++ b/examples/LanguageModelEvents/sketch.js @@ -23,7 +23,7 @@ function onModelLoaded() { function generateText() { let prompt = select('#prompt').value(); - console.log('Prompt: ' + prompt); + console.log('Prompt is "' + prompt + '"'); let options = { temperature: 0.9 @@ -36,10 +36,11 @@ function generateText() { function onToken(token, lm) { - console.log('token', token); + //console.log('Token', token); } function onWord(word, lm) { + //console.log('Word "' + word + '"'); push(); translate(width/2, height/2); rotate(radians(angle)); @@ -58,5 +59,5 @@ function onWord(word, lm) { } function onFinsh(out, lm) { - console.log('Generation finished', out); + console.log('Generation finished'); } diff --git a/examples/LanguageModelManual/sketch.js b/examples/LanguageModelManual/sketch.js index 15840048..d24d9f28 100644 --- a/examples/LanguageModelManual/sketch.js +++ b/examples/LanguageModelManual/sketch.js @@ -18,7 +18,7 @@ function onModelLoaded() { function generateText() { let prompt = select('#prompt').value(); - console.log('Prompt: ' + prompt); + console.log('Prompt is "' + prompt + '"'); select('#prompt').remove(); select('#generate').remove(); diff --git a/examples/LanguageModelManualAsync/index.html b/examples/LanguageModelManualAsync/index.html deleted file mode 100644 index 7fae8d96..00000000 --- a/examples/LanguageModelManualAsync/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Language Model Example - - - - - - - - - diff --git a/examples/LanguageModelManualAsync/sketch.js b/examples/LanguageModelManualAsync/sketch.js deleted file mode 100644 index 1bcb198e..00000000 --- a/examples/LanguageModelManualAsync/sketch.js +++ /dev/null @@ -1,62 +0,0 @@ -let lm; -let numOptions = 40; - -async function setup() { - noCanvas(); - - lm = await ml5.languageModel('TinyStories-15M'); - console.log('Model loaded'); - - select('#generate').mouseClicked(generateText); -} - -function draw() { -} - -async function generateText() { - let prompt = select('#prompt').value(); - console.log('Prompt: ' + prompt); - - select('#prompt').remove(); - select('#generate').remove(); - let btn = createElement('button', prompt); - btn.attribute('disabled', 'disabled'); - select('body').child(btn); - - let options = { - temperature: 0.9 - }; - - let tokens = await lm.manualStart(prompt, options); - - for (let i=0; i < numOptions; i++) { - let btn = createElement('button', tokens[i].str); - btn.class('continuation'); - btn.id(tokens[i].index); - btn.mousePressed(selectToken); - select('body').child(btn); - } -} - -async function selectToken() { - let nextToken = parseInt(this.id()); - - this.removeClass('continuation'); - this.attribute('disabled', 'disabled'); - this.mousePressed(null); - - let others = selectAll('.continuation'); - for (let i=0; i < others.length; i++) { - others[i].remove(); - } - - let tokens = await lm.manualNext(nextToken); - - for (let i=0; i < numOptions; i++) { - let btn = createElement('button', tokens[i].str); - btn.class('continuation'); - btn.id(tokens[i].index); - btn.mousePressed(selectToken); - select('body').child(btn); - } -} From 78ba11c59c8ee9acb676a1344b86924b1360f62c Mon Sep 17 00:00:00 2001 From: gohai Date: Fri, 4 Aug 2023 12:11:24 +0800 Subject: [PATCH 06/15] LanguageModel: Fix typo --- src/LanguageModel/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 3d2fb1c2..d423f1c7 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -131,7 +131,7 @@ class LanguageModel extends EventEmitter { if (this.promiseResolve) { this.promiseResolve(this.out); } - this.emit('finsh', this.out, this); + this.emit('finish', this.out, this); if (this.callback) { this.callback(this.out, this); } From 5b3218a53ded640c49c0782197d613110a3fd795 Mon Sep 17 00:00:00 2001 From: gohai Date: Fri, 4 Aug 2023 19:42:59 +0800 Subject: [PATCH 07/15] LanguageModel: Support p5's preload() Unsure if calling _{inc,de}crementPreload() manually is the best way to accomplish this. I first tried the p5PreloadHelper from the old repo, but this never made window._preloadCount go above zero for me. (Maybe @ziyuan-linn has some idea?) --- examples/LanguageModel/index.html | 2 +- examples/LanguageModel/sketch.js | 13 +++++-------- examples/LanguageModelEvents/index.html | 2 +- examples/LanguageModelEvents/sketch.js | 9 +++++---- examples/LanguageModelManual/index.html | 2 +- examples/LanguageModelManual/sketch.js | 11 ++++++----- src/LanguageModel/index.js | 10 ++++++++++ 7 files changed, 29 insertions(+), 20 deletions(-) diff --git a/examples/LanguageModel/index.html b/examples/LanguageModel/index.html index 90402ed0..996e95bd 100644 --- a/examples/LanguageModel/index.html +++ b/examples/LanguageModel/index.html @@ -8,7 +8,7 @@ -

+

diff --git a/examples/LanguageModel/sketch.js b/examples/LanguageModel/sketch.js index f879e7ac..98815753 100644 --- a/examples/LanguageModel/sketch.js +++ b/examples/LanguageModel/sketch.js @@ -4,12 +4,15 @@ let curWord = 0; let curX = 0; let curY = 20; +function preload() { + lm = ml5.languageModel('TinyStories-15M'); +} + function setup() { createCanvas(400, 400); frameRate(15); background(0); - - lm = ml5.languageModel('TinyStories-15M', onModelLoaded); + select('#generate').mouseClicked(generateText); } function draw() { @@ -29,12 +32,6 @@ function draw() { } } -function onModelLoaded() { - console.log('Model loaded'); - select('#generate').removeAttribute('disabled'); - select('#generate').mouseClicked(generateText); -} - function generateText() { let prompt = select('#prompt').value(); console.log('Prompt is "' + prompt + '"'); diff --git a/examples/LanguageModelEvents/index.html b/examples/LanguageModelEvents/index.html index 90402ed0..996e95bd 100644 --- a/examples/LanguageModelEvents/index.html +++ b/examples/LanguageModelEvents/index.html @@ -8,7 +8,7 @@ -

+

diff --git a/examples/LanguageModelEvents/sketch.js b/examples/LanguageModelEvents/sketch.js index 2a3540e3..77af5b9e 100644 --- a/examples/LanguageModelEvents/sketch.js +++ b/examples/LanguageModelEvents/sketch.js @@ -3,11 +3,14 @@ let curWord = 0; let angle = 0; let radius = 60; +function preload() { + lm = ml5.languageModel('TinyStories-15M', onModelLoaded); +} + function setup() { createCanvas(400, 400); background(0); - - lm = ml5.languageModel('TinyStories-15M', onModelLoaded); + select('#generate').mouseClicked(generateText); } function draw() { @@ -17,8 +20,6 @@ function draw() { function onModelLoaded() { console.log('Model loaded'); - select('#generate').removeAttribute('disabled'); - select('#generate').mouseClicked(generateText); } function generateText() { diff --git a/examples/LanguageModelManual/index.html b/examples/LanguageModelManual/index.html index bc17ebed..7fae8d96 100644 --- a/examples/LanguageModelManual/index.html +++ b/examples/LanguageModelManual/index.html @@ -8,7 +8,7 @@ - + diff --git a/examples/LanguageModelManual/sketch.js b/examples/LanguageModelManual/sketch.js index d24d9f28..5688b1e2 100644 --- a/examples/LanguageModelManual/sketch.js +++ b/examples/LanguageModelManual/sketch.js @@ -1,10 +1,13 @@ let lm; let numOptions = 40; -async function setup() { - noCanvas(); +function preload() { + lm = ml5.languageModel('TinyStories-15M', onModelLoaded); +} - lm = await ml5.languageModel('TinyStories-15M', onModelLoaded); +function setup() { + noCanvas(); + select('#generate').mouseClicked(generateText); } function draw() { @@ -12,8 +15,6 @@ function draw() { function onModelLoaded() { console.log('Model loaded'); - select('#generate').removeAttribute('disabled'); - select('#generate').mouseClicked(generateText); } function generateText() { diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index d423f1c7..931fc662 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -53,6 +53,11 @@ class LanguageModel extends EventEmitter { this.words = []; this.finished = true; + // for compatibility with p5's preload() + if (typeof window === 'object' && typeof window._incrementPreload === 'function') { + window._incrementPreload(); + } + this.ready = callCallback(this.loadModel(), callback); } @@ -141,6 +146,11 @@ class LanguageModel extends EventEmitter { await this.llama2.ccall('register_callback', null, [ 'number' ], [ onTokenCallback ]); //console.log('loadModel done'); + + // for compatibility with p5's preload() + if (typeof window === 'object' && typeof window._decrementPreload === 'function') { + window._decrementPreload(); + } } async generate(prompt, optionsOrCb, cb) { From 8fcfe055076ea9983ef17a01d64509da53c156f8 Mon Sep 17 00:00:00 2001 From: gohai Date: Sat, 5 Aug 2023 10:44:08 +0800 Subject: [PATCH 08/15] LanguageModel: Rename .out to .text --- examples/LanguageModel/sketch.js | 4 ++-- examples/LanguageModelEvents/sketch.js | 2 +- src/LanguageModel/index.js | 22 +++++++++++----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/LanguageModel/sketch.js b/examples/LanguageModel/sketch.js index 98815753..071a61c5 100644 --- a/examples/LanguageModel/sketch.js +++ b/examples/LanguageModel/sketch.js @@ -42,8 +42,8 @@ function generateText() { lm.generate(prompt, options, gotText); } -function gotText(out, lm) { - console.log('Model returned "' + out + '"'); +function gotText(text, lm) { + console.log('Model returned "' + text + '"'); // lm.words contains the output broken up in words words = lm.words; curWord = 0; diff --git a/examples/LanguageModelEvents/sketch.js b/examples/LanguageModelEvents/sketch.js index 77af5b9e..086e1a63 100644 --- a/examples/LanguageModelEvents/sketch.js +++ b/examples/LanguageModelEvents/sketch.js @@ -59,6 +59,6 @@ function onWord(word, lm) { pop(); } -function onFinsh(out, lm) { +function onFinsh(text, lm) { console.log('Generation finished'); } diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 931fc662..e6d8f8fb 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -48,7 +48,7 @@ class LanguageModel extends EventEmitter { throw 'You need to provide the name of the model to load, e.g. TinyStories-15M'; } - this.out = ''; + this.text = ''; this.tokens = []; this.words = []; this.finished = true; @@ -110,7 +110,7 @@ class LanguageModel extends EventEmitter { if (this.options.stopOnBosOrEos && (token == 1 || token == 2)) { this.finished = true; } else { - this.out += tokenStr; + this.text += tokenStr; } // on-token event @@ -120,9 +120,9 @@ class LanguageModel extends EventEmitter { const wordDelimiters = ' .,:;"“?!\n'; const re = new RegExp('(?=[' + wordDelimiters + '])|(?<=[' + wordDelimiters + '])', 'g'); const prevNumWords = this.words.length; - this.words = this.out.split(re); + this.words = this.text.split(re); // ignore the last word if we can't be certain it's complete - if (!wordDelimiters.includes(this.out.slice(-1)) && !this.finished) { + if (!wordDelimiters.includes(this.text.slice(-1)) && !this.finished) { this.words.pop(); } // on-word event @@ -134,11 +134,11 @@ class LanguageModel extends EventEmitter { if (this.finished) { // fulfill the promise returned by generate() if (this.promiseResolve) { - this.promiseResolve(this.out); + this.promiseResolve(this.text); } - this.emit('finish', this.out, this); + this.emit('finish', this.text, this); if (this.callback) { - this.callback(this.out, this); + this.callback(this.text, this); } } }, 'viifi'); @@ -175,12 +175,12 @@ class LanguageModel extends EventEmitter { // if there are any outstanding requests, resolve them // with the output received so far if (this.promiseResolve) { - this.promiseResolve(this.out); + this.promiseResolve(this.text); } await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); - this.out = ''; + this.text = ''; this.tokens = [{ index: 1, str: '', probability: 1 }]; this.words = []; this.finished = false; @@ -230,12 +230,12 @@ class LanguageModel extends EventEmitter { // if there are any outstanding requests, resolve them // with the output received so far if (this.promiseResolve) { - this.promiseResolve(this.out); + this.promiseResolve(this.text); } await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); - this.out = ''; + this.text = ''; this.tokens = []; this.words = []; this.finished = true; From 7410aaa86e05ee2c9827ab82a55ad6e59342f229 Mon Sep 17 00:00:00 2001 From: gohai Date: Sat, 5 Aug 2023 10:45:57 +0800 Subject: [PATCH 09/15] LanguageModel: Save prompt with instance --- src/LanguageModel/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index e6d8f8fb..b1463a46 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -48,6 +48,7 @@ class LanguageModel extends EventEmitter { throw 'You need to provide the name of the model to load, e.g. TinyStories-15M'; } + this.prompt = ''; this.text = ''; this.tokens = []; this.words = []; @@ -180,6 +181,7 @@ class LanguageModel extends EventEmitter { await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); + this.prompt = prompt; this.text = ''; this.tokens = [{ index: 1, str: '', probability: 1 }]; this.words = []; @@ -235,6 +237,7 @@ class LanguageModel extends EventEmitter { await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); + this.prompt = prompt; this.text = ''; this.tokens = []; this.words = []; From d338c73823444fbe9dddb3f3d3b268fe2d825091 Mon Sep 17 00:00:00 2001 From: gohai Date: Sat, 5 Aug 2023 10:58:38 +0800 Subject: [PATCH 10/15] LanguageModel: Make callback/event return the instance rather than the value --- examples/LanguageModel/sketch.js | 6 +++--- examples/LanguageModelEvents/sketch.js | 14 +++++++------- src/LanguageModel/index.js | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/examples/LanguageModel/sketch.js b/examples/LanguageModel/sketch.js index 071a61c5..69acd2b0 100644 --- a/examples/LanguageModel/sketch.js +++ b/examples/LanguageModel/sketch.js @@ -42,9 +42,9 @@ function generateText() { lm.generate(prompt, options, gotText); } -function gotText(text, lm) { - console.log('Model returned "' + text + '"'); +function gotText(result) { + console.log('Model returned "' + result.text + '"'); // lm.words contains the output broken up in words - words = lm.words; + words = result.words; curWord = 0; } diff --git a/examples/LanguageModelEvents/sketch.js b/examples/LanguageModelEvents/sketch.js index 086e1a63..de743531 100644 --- a/examples/LanguageModelEvents/sketch.js +++ b/examples/LanguageModelEvents/sketch.js @@ -36,12 +36,12 @@ function generateText() { } -function onToken(token, lm) { - //console.log('Token', token); +function onToken(lm) { + console.log('Token', lm.tokens.slice(-1)); } -function onWord(word, lm) { - //console.log('Word "' + word + '"'); +function onWord(lm) { + console.log('Word "' + lm.words.slice(-1) + '"'); push(); translate(width/2, height/2); rotate(radians(angle)); @@ -55,10 +55,10 @@ function onWord(word, lm) { fill(255); textAlign(CENTER); textSize(10); - text(word, 0, 0); + text(lm.words.slice(-1), 0, 0); pop(); } -function onFinsh(text, lm) { - console.log('Generation finished'); +function onFinsh(lm) { + console.log('Model returned "' + lm.text + '"'); } diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index b1463a46..0faf1eea 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -115,20 +115,20 @@ class LanguageModel extends EventEmitter { } // on-token event - this.emit('token', this.tokens[this.tokens.length-1], this); + this.emit('token', this); // redo word tokenization const wordDelimiters = ' .,:;"“?!\n'; const re = new RegExp('(?=[' + wordDelimiters + '])|(?<=[' + wordDelimiters + '])', 'g'); - const prevNumWords = this.words.length; - this.words = this.text.split(re); + const newWords = this.text.split(re); // ignore the last word if we can't be certain it's complete if (!wordDelimiters.includes(this.text.slice(-1)) && !this.finished) { - this.words.pop(); + newWords.pop(); } - // on-word event - for (let i=prevNumWords; i < this.words.length; i++) { - this.emit('word', this.words[i], this); + // on-word events + for (let i=this.words.length; i < newWords.length; i++) { + this.words[i] = newWords[i]; + this.emit('word', this); } // on-finished promise/event/callback @@ -137,9 +137,9 @@ class LanguageModel extends EventEmitter { if (this.promiseResolve) { this.promiseResolve(this.text); } - this.emit('finish', this.text, this); + this.emit('finish', this); if (this.callback) { - this.callback(this.text, this); + this.callback(this); } } }, 'viifi'); From a658e7e1b3b4e4e6a59b8ff83127f113a8aa7e5f Mon Sep 17 00:00:00 2001 From: gohai Date: Tue, 8 Aug 2023 17:51:14 +0800 Subject: [PATCH 11/15] LanguageModel: Update llama2.c-emscripten build to include support for top-p sampling (used by default) From @karpathy's commit message: Quick note on sampling, the recommendation for good results is to use `-t 1.0 -p 0.9`, i.e. top-p sampling at 0.9 with temperature 1.0 (this is the default). To control the diversity of samples use either the temperature (i.e. vary `-t` between 0 and 1 and keep top-p off with `-p 0`) or the top-p value (i.e. vary `-p` between 0 and 1 and keep `-t 1`), but not both. Nice explainers on LLM sampling strategies include [this](https://peterchng.com/blog/2023/05/02/token-selection-strategies-top-k-top-p-and-temperature/), [this](https://docs.cohere.com/docs/controlling-generation-with-top-k-top-p) or [this](https://huggingface.co/blog/how-to-generate). --- src/LanguageModel/index.js | 9 ++++++--- src/LanguageModel/llama2.js | 2 +- src/LanguageModel/llama2.wasm | Bin 48114 -> 50686 bytes 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 0faf1eea..984d0ccd 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -19,7 +19,8 @@ class LanguageModel extends EventEmitter { modelUrl: '', // if set, model.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) tokenizerUrl: '', // if set, tokenizer.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) steps: 0, // how many tokens to generate (defaults to model's maximum) - temperature: 0.9, // 0.0 = (deterministic) argmax sampling, 1.0 = baseline + temperature: 1.0, // 0.0 = (deterministic) argmax sampling, 1.0 = baseline, don't set higher + topp: 0.9, // p value in top-p (nucleus) sampling, 0 = off stopOnBosOrEos: true, // stop when encountering beginning-of-sequence or end-of-sequence token }; @@ -164,6 +165,7 @@ class LanguageModel extends EventEmitter { if (typeof optionsOrCb === 'object') { this.options.steps = (typeof optionsOrCb.steps === 'number') ? optionsOrCb.steps : this.options.steps; this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; + this.options.topp = (typeof optionsOrCb.topp === 'number') ? optionsOrCb.topp : this.options.topp; this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; } if (typeof cb === 'function') { @@ -179,7 +181,7 @@ class LanguageModel extends EventEmitter { this.promiseResolve(this.text); } - await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); + await this.llama2.ccall('set_parameters', null, [ 'number', 'number', 'number' ], [ this.options.temperature, this.options.topp, this.options.steps ]); this.prompt = prompt; this.text = ''; @@ -220,6 +222,7 @@ class LanguageModel extends EventEmitter { if (typeof optionsOrCb === 'object') { this.options.steps = (typeof optionsOrCb.steps === 'number') ? optionsOrCb.steps : this.options.steps; this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; + this.options.topp = (typeof optionsOrCb.topp === 'number') ? optionsOrCb.topp : this.options.topp; this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; } if (typeof cb === 'function') { @@ -235,7 +238,7 @@ class LanguageModel extends EventEmitter { this.promiseResolve(this.text); } - await this.llama2.ccall('set_parameters', null, [ 'number', 'number' ], [ this.options.temperature, this.options.steps ]); + await this.llama2.ccall('set_parameters', null, [ 'number', 'number', 'number' ], [ this.options.temperature, this.options.topp, this.options.steps ]); this.prompt = prompt; this.text = ''; diff --git a/src/LanguageModel/llama2.js b/src/LanguageModel/llama2.js index a80e3988..779e606d 100644 --- a/src/LanguageModel/llama2.js +++ b/src/LanguageModel/llama2.js @@ -5,7 +5,7 @@ var Llama2 = (() => { return ( function(moduleArg = {}) { -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject}));if(!Module.expectedDataFileDownloads){Module.expectedDataFileDownloads=0}Module.expectedDataFileDownloads++;(function(){if(Module["ENVIRONMENT_IS_PTHREAD"]||Module["$ww"])return;var loadPackage=function(metadata){var PACKAGE_PATH="";if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/")}else if(typeof process==="undefined"&&typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/")}var PACKAGE_NAME="web/src/llama2.data";var REMOTE_PACKAGE_BASE="llama2.data";if(typeof Module["locateFilePackage"]==="function"&&!Module["locateFile"]){Module["locateFile"]=Module["locateFilePackage"];err("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)")}var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata["remote_package_size"];function fetchRemotePackage(packageName,packageSize,callback,errback){if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){require("fs").readFile(packageName,(function(err,contents){if(err){errback(err)}else{callback(contents.buffer)}}));return}var xhr=new XMLHttpRequest;xhr.open("GET",packageName,true);xhr.responseType="arraybuffer";xhr.onprogress=function(event){var url=packageName;var size=packageSize;if(event.total)size=event.total;if(event.loaded){if(!xhr.addedTotal){xhr.addedTotal=true;if(!Module.dataFileDownloads)Module.dataFileDownloads={};Module.dataFileDownloads[url]={loaded:event.loaded,total:size}}else{Module.dataFileDownloads[url].loaded=event.loaded}var total=0;var loaded=0;var num=0;for(var download in Module.dataFileDownloads){var data=Module.dataFileDownloads[download];total+=data.total;loaded+=data.loaded;num++}total=Math.ceil(total*Module.expectedDataFileDownloads/num);if(Module["setStatus"])Module["setStatus"](`Downloading data... (${loaded}/${total})`)}else if(!Module.dataFileDownloads){if(Module["setStatus"])Module["setStatus"]("Downloading data...")}};xhr.onerror=function(event){throw new Error("NetworkError for: "+packageName)};xhr.onload=function(event){if(xhr.status==200||xhr.status==304||xhr.status==206||xhr.status==0&&xhr.response){var packageData=xhr.response;callback(packageData)}else{throw new Error(xhr.statusText+" : "+xhr.responseURL)}};xhr.send(null)}function handleError(error){console.error("package error:",error)}var fetchedCallback=null;var fetched=Module["getPreloadedPackage"]?Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE):null;if(!fetched)fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE,(function(data){if(fetchedCallback){fetchedCallback(data);fetchedCallback=null}else{fetched=data}}),handleError);function runWithFS(){function assert(check,msg){if(!check)throw msg+(new Error).stack}function DataRequest(start,end,audio){this.start=start;this.end=end;this.audio=audio}DataRequest.prototype={requests:{},open:function(mode,name){this.name=name;this.requests[name]=this;Module["addRunDependency"](`fp ${this.name}`)},send:function(){},onload:function(){var byteArray=this.byteArray.subarray(this.start,this.end);this.finish(byteArray)},finish:function(byteArray){var that=this;Module["FS_createDataFile"](this.name,null,byteArray,true,true,true);Module["removeRunDependency"](`fp ${that.name}`);this.requests[this.name]=null}};var files=metadata["files"];for(var i=0;i{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;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)=>{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,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",((err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)}))};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[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(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}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}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.error.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 HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}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 getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}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)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="llama2.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then((response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()})).catch((()=>getBinarySync(binaryFile)))}else if(readAsync){return new Promise(((resolve,reject)=>{readAsync(binaryFile,(response=>resolve(new Uint8Array(response))),reject)}))}}return Promise.resolve().then((()=>getBinarySync(binaryFile)))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then((binary=>WebAssembly.instantiate(binary,imports))).then((instance=>instance)).then(receiver,(reason=>{err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then((response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,(function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)}))}))}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["r"];updateMemoryViews();wasmTable=Module["asm"]["E"];addOnInit(Module["asm"]["s"]);removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((p=>!!p)),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((p=>!!p)),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};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}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,-1)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets:function(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets:function(tty,optional_actions,data){return 0},ioctl_tiocgwinsz:function(tty){return[24,80]}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,(arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}}));if(dep)addRunDependency(dep)};var preloadPlugins=Module["preloadPlugins"]||[];function FS_handledByPreloadPlugin(byteArray,fullname,finish,onerror){if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach((function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}}));return handled}function FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,(()=>{if(onerror)onerror();removeRunDependency(dep)}))){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,(byteArray=>processData(byteArray)),onerror)}else{processData(url)}}function FS_modeStringToFlags(str){var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags}function FS_getMode(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter((p=>!!p));var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>node===node.parent,isMountpoint:node=>!!node.mounted,isFile:mode=>(mode&61440)===32768,isDir:mode=>(mode&61440)===16384,isLink:mode=>(mode&61440)===40960,isChrdev:mode=>(mode&61440)===8192,isBlkdev:mode=>(mode&61440)===24576,isFIFO:mode=>(mode&61440)===4096,isSocket:mode=>(mode&49152)===49152,flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:()=>{for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked:fd=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream:(stream,fd=-1)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>parent.node_ops.lookup(parent,name),mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>FS.stat(path,true),chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStreamChecked(fd);FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStreamChecked(fd);FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStreamChecked(fd);if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>stream.fd===null,llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach((code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""}))},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter((chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}}));function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.get();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.get();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.get();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var nowIsMonotonic=true;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,addr){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function _emscripten_date_now(){return Date.now()}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_memcpy_big=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var safeSetTimeout=(func,timeout)=>setTimeout((()=>{callUserCallback(func)}),timeout);var warnOnce=text=>{if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;URL.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};preloadPlugins.push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}var b=new Blob([byteArray],{type:Browser.getMimetype(name)});var url=URL.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(()=>finish(audio)),false);audio.onerror=function audio_onerror(event){if(done)return;err("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout((()=>{finish(audio)}),1e4)};preloadPlugins.push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((callback=>callback()));Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(()=>{});CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func,timeout){return safeSetTimeout(func,timeout)},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame((()=>{callUserCallback(func)}))},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((listener=>listener(canvas.width,canvas.height)))},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=size-b.byteLength+65535>>>16;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _emscripten_resume_main_loop(){Browser.mainLoop.resume()}var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var _emscripten_set_main_loop_arg=function(func,arg,fps,simulateInfiniteLoop){var browserIterationFunc=()=>getWasmTableEntry(func)(arg);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg)};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};function getCFunc(ident){var func=Module["_"+ident];return func}var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var ccall=function(ident,returnType,argTypes,args,opts){var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>7)}}function sigToWasmTypes(sig){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};function addFunction(func,sig){var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedImages={};var preloadedAudios={};var wasmImports={b:___syscall_fcntl64,q:___syscall_ioctl,c:___syscall_openat,h:__emscripten_get_now_is_monotonic,l:__mmap_js,m:__munmap_js,d:_emscripten_date_now,i:_emscripten_memcpy_big,f:_emscripten_pause_main_loop,o:_emscripten_resize_heap,j:_emscripten_resume_main_loop,k:_emscripten_set_main_loop_arg,g:_exit,a:_fd_close,p:_fd_read,n:_fd_seek,e:_fd_write};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module["asm"]["s"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["t"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["u"]).apply(null,arguments)};var _main_loop=Module["_main_loop"]=function(){return(_main_loop=Module["_main_loop"]=Module["asm"]["v"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["w"]).apply(null,arguments)};var _register_callback=Module["_register_callback"]=function(){return(_register_callback=Module["_register_callback"]=Module["asm"]["x"]).apply(null,arguments)};var _set_parameters=Module["_set_parameters"]=function(){return(_set_parameters=Module["_set_parameters"]=Module["asm"]["y"]).apply(null,arguments)};var _generate=Module["_generate"]=function(){return(_generate=Module["_generate"]=Module["asm"]["z"]).apply(null,arguments)};var _get_vocab=Module["_get_vocab"]=function(){return(_get_vocab=Module["_get_vocab"]=Module["asm"]["A"]).apply(null,arguments)};var _get_vocab_size=Module["_get_vocab_size"]=function(){return(_get_vocab_size=Module["_get_vocab_size"]=Module["asm"]["B"]).apply(null,arguments)};var _manual_start=Module["_manual_start"]=function(){return(_manual_start=Module["_manual_start"]=Module["asm"]["C"]).apply(null,arguments)};var _manual_next=Module["_manual_next"]=function(){return(_manual_next=Module["_manual_next"]=Module["asm"]["D"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module["asm"]["F"]).apply(null,arguments)};var _emscripten_builtin_memalign=function(){return(_emscripten_builtin_memalign=Module["asm"]["G"]).apply(null,arguments)};var stackSave=function(){return(stackSave=Module["asm"]["H"]).apply(null,arguments)};var stackRestore=function(){return(stackRestore=Module["asm"]["I"]).apply(null,arguments)};var stackAlloc=function(){return(stackAlloc=Module["asm"]["J"]).apply(null,arguments)};Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;Module["ccall"]=ccall;Module["addFunction"]=addFunction;Module["UTF8ToString"]=UTF8ToString;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach((arg=>{HEAP32[argv_ptr++]=stringToUTF8OnStack(arg)}));HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(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();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}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 Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject}));if(!Module.expectedDataFileDownloads){Module.expectedDataFileDownloads=0}Module.expectedDataFileDownloads++;(function(){if(Module["ENVIRONMENT_IS_PTHREAD"]||Module["$ww"])return;var loadPackage=function(metadata){var PACKAGE_PATH="";if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/")}else if(typeof process==="undefined"&&typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/")}var PACKAGE_NAME="web/src/llama2.data";var REMOTE_PACKAGE_BASE="llama2.data";if(typeof Module["locateFilePackage"]==="function"&&!Module["locateFile"]){Module["locateFile"]=Module["locateFilePackage"];err("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)")}var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata["remote_package_size"];function fetchRemotePackage(packageName,packageSize,callback,errback){if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){require("fs").readFile(packageName,(function(err,contents){if(err){errback(err)}else{callback(contents.buffer)}}));return}var xhr=new XMLHttpRequest;xhr.open("GET",packageName,true);xhr.responseType="arraybuffer";xhr.onprogress=function(event){var url=packageName;var size=packageSize;if(event.total)size=event.total;if(event.loaded){if(!xhr.addedTotal){xhr.addedTotal=true;if(!Module.dataFileDownloads)Module.dataFileDownloads={};Module.dataFileDownloads[url]={loaded:event.loaded,total:size}}else{Module.dataFileDownloads[url].loaded=event.loaded}var total=0;var loaded=0;var num=0;for(var download in Module.dataFileDownloads){var data=Module.dataFileDownloads[download];total+=data.total;loaded+=data.loaded;num++}total=Math.ceil(total*Module.expectedDataFileDownloads/num);if(Module["setStatus"])Module["setStatus"](`Downloading data... (${loaded}/${total})`)}else if(!Module.dataFileDownloads){if(Module["setStatus"])Module["setStatus"]("Downloading data...")}};xhr.onerror=function(event){throw new Error("NetworkError for: "+packageName)};xhr.onload=function(event){if(xhr.status==200||xhr.status==304||xhr.status==206||xhr.status==0&&xhr.response){var packageData=xhr.response;callback(packageData)}else{throw new Error(xhr.statusText+" : "+xhr.responseURL)}};xhr.send(null)}function handleError(error){console.error("package error:",error)}var fetchedCallback=null;var fetched=Module["getPreloadedPackage"]?Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE):null;if(!fetched)fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE,(function(data){if(fetchedCallback){fetchedCallback(data);fetchedCallback=null}else{fetched=data}}),handleError);function runWithFS(){function assert(check,msg){if(!check)throw msg+(new Error).stack}function DataRequest(start,end,audio){this.start=start;this.end=end;this.audio=audio}DataRequest.prototype={requests:{},open:function(mode,name){this.name=name;this.requests[name]=this;Module["addRunDependency"](`fp ${this.name}`)},send:function(){},onload:function(){var byteArray=this.byteArray.subarray(this.start,this.end);this.finish(byteArray)},finish:function(byteArray){var that=this;Module["FS_createDataFile"](this.name,null,byteArray,true,true,true);Module["removeRunDependency"](`fp ${that.name}`);this.requests[this.name]=null}};var files=metadata["files"];for(var i=0;i{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;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)=>{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,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",((err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)}))};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[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(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}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}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.error.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 HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}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 getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}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)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="llama2.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then((response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()})).catch((()=>getBinarySync(binaryFile)))}else if(readAsync){return new Promise(((resolve,reject)=>{readAsync(binaryFile,(response=>resolve(new Uint8Array(response))),reject)}))}}return Promise.resolve().then((()=>getBinarySync(binaryFile)))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then((binary=>WebAssembly.instantiate(binary,imports))).then((instance=>instance)).then(receiver,(reason=>{err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then((response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,(function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)}))}))}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["r"];updateMemoryViews();wasmTable=Module["asm"]["E"];addOnInit(Module["asm"]["s"]);removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((p=>!!p)),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((p=>!!p)),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};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}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,-1)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets:function(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets:function(tty,optional_actions,data){return 0},ioctl_tiocgwinsz:function(tty){return[24,80]}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,(arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}}));if(dep)addRunDependency(dep)};var preloadPlugins=Module["preloadPlugins"]||[];function FS_handledByPreloadPlugin(byteArray,fullname,finish,onerror){if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach((function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}}));return handled}function FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,(()=>{if(onerror)onerror();removeRunDependency(dep)}))){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,(byteArray=>processData(byteArray)),onerror)}else{processData(url)}}function FS_modeStringToFlags(str){var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags}function FS_getMode(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter((p=>!!p));var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>node===node.parent,isMountpoint:node=>!!node.mounted,isFile:mode=>(mode&61440)===32768,isDir:mode=>(mode&61440)===16384,isLink:mode=>(mode&61440)===40960,isChrdev:mode=>(mode&61440)===8192,isBlkdev:mode=>(mode&61440)===24576,isFIFO:mode=>(mode&61440)===4096,isSocket:mode=>(mode&49152)===49152,flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:()=>{for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked:fd=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream:(stream,fd=-1)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>parent.node_ops.lookup(parent,name),mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>FS.stat(path,true),chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStreamChecked(fd);FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStreamChecked(fd);FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStreamChecked(fd);if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>stream.fd===null,llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach((code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""}))},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter((chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}}));function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.get();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.get();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.get();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var nowIsMonotonic=true;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,addr){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function _emscripten_date_now(){return Date.now()}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_memcpy_big=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var safeSetTimeout=(func,timeout)=>setTimeout((()=>{callUserCallback(func)}),timeout);var warnOnce=text=>{if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;URL.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};preloadPlugins.push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}var b=new Blob([byteArray],{type:Browser.getMimetype(name)});var url=URL.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(()=>finish(audio)),false);audio.onerror=function audio_onerror(event){if(done)return;err("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout((()=>{finish(audio)}),1e4)};preloadPlugins.push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((callback=>callback()));Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(()=>{});CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func,timeout){return safeSetTimeout(func,timeout)},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame((()=>{callUserCallback(func)}))},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((listener=>listener(canvas.width,canvas.height)))},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=size-b.byteLength+65535>>>16;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _emscripten_resume_main_loop(){Browser.mainLoop.resume()}var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var _emscripten_set_main_loop_arg=function(func,arg,fps,simulateInfiniteLoop){var browserIterationFunc=()=>getWasmTableEntry(func)(arg);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg)};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};function getCFunc(ident){var func=Module["_"+ident];return func}var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var ccall=function(ident,returnType,argTypes,args,opts){var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>7)}}function sigToWasmTypes(sig){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};function addFunction(func,sig){var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedImages={};var preloadedAudios={};var wasmImports={c:___syscall_fcntl64,q:___syscall_ioctl,d:___syscall_openat,h:__emscripten_get_now_is_monotonic,l:__mmap_js,m:__munmap_js,e:_emscripten_date_now,i:_emscripten_memcpy_big,g:_emscripten_pause_main_loop,o:_emscripten_resize_heap,j:_emscripten_resume_main_loop,k:_emscripten_set_main_loop_arg,b:_exit,a:_fd_close,p:_fd_read,n:_fd_seek,f:_fd_write};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module["asm"]["s"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["t"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["u"]).apply(null,arguments)};var _main_loop=Module["_main_loop"]=function(){return(_main_loop=Module["_main_loop"]=Module["asm"]["v"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["w"]).apply(null,arguments)};var _register_callback=Module["_register_callback"]=function(){return(_register_callback=Module["_register_callback"]=Module["asm"]["x"]).apply(null,arguments)};var _set_parameters=Module["_set_parameters"]=function(){return(_set_parameters=Module["_set_parameters"]=Module["asm"]["y"]).apply(null,arguments)};var _generate=Module["_generate"]=function(){return(_generate=Module["_generate"]=Module["asm"]["z"]).apply(null,arguments)};var _get_vocab=Module["_get_vocab"]=function(){return(_get_vocab=Module["_get_vocab"]=Module["asm"]["A"]).apply(null,arguments)};var _get_vocab_size=Module["_get_vocab_size"]=function(){return(_get_vocab_size=Module["_get_vocab_size"]=Module["asm"]["B"]).apply(null,arguments)};var _manual_start=Module["_manual_start"]=function(){return(_manual_start=Module["_manual_start"]=Module["asm"]["C"]).apply(null,arguments)};var _manual_next=Module["_manual_next"]=function(){return(_manual_next=Module["_manual_next"]=Module["asm"]["D"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module["asm"]["F"]).apply(null,arguments)};var _emscripten_builtin_memalign=function(){return(_emscripten_builtin_memalign=Module["asm"]["G"]).apply(null,arguments)};var stackSave=function(){return(stackSave=Module["asm"]["H"]).apply(null,arguments)};var stackRestore=function(){return(stackRestore=Module["asm"]["I"]).apply(null,arguments)};var stackAlloc=function(){return(stackAlloc=Module["asm"]["J"]).apply(null,arguments)};Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;Module["ccall"]=ccall;Module["addFunction"]=addFunction;Module["UTF8ToString"]=UTF8ToString;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach((arg=>{HEAP32[argv_ptr++]=stringToUTF8OnStack(arg)}));HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(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();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}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(); return moduleArg.ready diff --git a/src/LanguageModel/llama2.wasm b/src/LanguageModel/llama2.wasm index 38e8ec4f65432bf7a25206a7004f5346dd883a3d..a168ec5d6db7050165187f04b6a108fc9b9461c0 100755 GIT binary patch delta 20010 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 delta 17354 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 From dc41231e9487097107ed25800be4a00c3bdc488e Mon Sep 17 00:00:00 2001 From: gohai Date: Sat, 12 Aug 2023 13:11:34 +0800 Subject: [PATCH 12/15] LanguageModel: Fix generate() options --- src/LanguageModel/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 984d0ccd..15664f60 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -40,7 +40,7 @@ class LanguageModel extends EventEmitter { default: throw 'Unrecognized model ' + modelNameOrUrl + ', try e.g. TinyStories-15M'; } - } else if (typeof modelNameOrUrl === 'object') { + } else if (typeof modelNameOrOptions === 'object') { this.options.modelUrl = (typeof modelNameOrOptions.modelUrl === 'string') ? modelNameOrOptions.modelUrl : this.options.modelUrl; this.options.tokenizerUrl = (typeof modelNameOrOptions.tokenizerUrl === 'string') ? modelNameOrOptions.tokenizerUrl : this.options.tokenizerUrl; } From 7e03afaa3aadbe1f27a231441b49a6c9d9487254 Mon Sep 17 00:00:00 2001 From: gohai Date: Sat, 12 Aug 2023 13:13:15 +0800 Subject: [PATCH 13/15] LanguageModel: Rename the "steps" option to "maxTokens" --- src/LanguageModel/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 15664f60..7d6a71aa 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -18,7 +18,7 @@ class LanguageModel extends EventEmitter { this.options = { modelUrl: '', // if set, model.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) tokenizerUrl: '', // if set, tokenizer.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) - steps: 0, // how many tokens to generate (defaults to model's maximum) + maxTokens: 0, // how many tokens to generate (defaults to model's maximum) temperature: 1.0, // 0.0 = (deterministic) argmax sampling, 1.0 = baseline, don't set higher topp: 0.9, // p value in top-p (nucleus) sampling, 0 = off stopOnBosOrEos: true, // stop when encountering beginning-of-sequence or end-of-sequence token @@ -163,7 +163,7 @@ class LanguageModel extends EventEmitter { this.callback = optionsOrCb; } else { if (typeof optionsOrCb === 'object') { - this.options.steps = (typeof optionsOrCb.steps === 'number') ? optionsOrCb.steps : this.options.steps; + this.options.maxTokens = (typeof optionsOrCb.maxTokens === 'number') ? optionsOrCb.maxTokens : this.options.maxTokens; this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; this.options.topp = (typeof optionsOrCb.topp === 'number') ? optionsOrCb.topp : this.options.topp; this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; @@ -181,7 +181,7 @@ class LanguageModel extends EventEmitter { this.promiseResolve(this.text); } - await this.llama2.ccall('set_parameters', null, [ 'number', 'number', 'number' ], [ this.options.temperature, this.options.topp, this.options.steps ]); + await this.llama2.ccall('set_parameters', null, [ 'number', 'number', 'number' ], [ this.options.temperature, this.options.topp, this.options.maxTokens ]); this.prompt = prompt; this.text = ''; @@ -220,7 +220,7 @@ class LanguageModel extends EventEmitter { this.callback = optionsOrCb; } else { if (typeof optionsOrCb === 'object') { - this.options.steps = (typeof optionsOrCb.steps === 'number') ? optionsOrCb.steps : this.options.steps; + this.options.maxTokens = (typeof optionsOrCb.maxTokens === 'number') ? optionsOrCb.maxTokens : this.options.maxTokens; this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; this.options.topp = (typeof optionsOrCb.topp === 'number') ? optionsOrCb.topp : this.options.topp; this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; @@ -238,7 +238,7 @@ class LanguageModel extends EventEmitter { this.promiseResolve(this.text); } - await this.llama2.ccall('set_parameters', null, [ 'number', 'number', 'number' ], [ this.options.temperature, this.options.topp, this.options.steps ]); + await this.llama2.ccall('set_parameters', null, [ 'number', 'number', 'number' ], [ this.options.temperature, this.options.topp, this.options.maxTokens ]); this.prompt = prompt; this.text = ''; From fdf8fb28860b5eadda6d375927998d07d64f9ff2 Mon Sep 17 00:00:00 2001 From: gohai Date: Sat, 12 Aug 2023 13:31:23 +0800 Subject: [PATCH 14/15] LanguageModel: Better default options when user passes temperature or topp This automatically picks reasonable default value for the other parameter, if not explicity specified, and prints a message if both are. --- src/LanguageModel/index.js | 50 +++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index 7d6a71aa..e7f88103 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -164,8 +164,22 @@ class LanguageModel extends EventEmitter { } else { if (typeof optionsOrCb === 'object') { this.options.maxTokens = (typeof optionsOrCb.maxTokens === 'number') ? optionsOrCb.maxTokens : this.options.maxTokens; - this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; - this.options.topp = (typeof optionsOrCb.topp === 'number') ? optionsOrCb.topp : this.options.topp; + if (typeof optionsOrCb.temperature === 'number') { + this.options.temperature = optionsOrCb.temperature; + // disable top-p unless explicitly provided + if (typeof optionsOrCb.topp !== 'number' && this.options.topp != 0) { + this.options.topp = 0; + console.log('Disabling top-p sampling'); + } + } + if (typeof optionsOrCb.topp === 'number') { + this.options.topp = optionsOrCb.topp; + // set temperature to 1.0 unless explicity provided + if (typeof optionsOrCb.temperature !== 'number' && this.options.temperature != 1) { + this.options.temperature = 1; + console.log('Using temperature 1.0 for top-p sampling'); + } + } this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; } if (typeof cb === 'function') { @@ -175,6 +189,13 @@ class LanguageModel extends EventEmitter { } } + // https://peterchng.com/blog/2023/05/02/token-selection-strategies-top-k-top-p-and-temperature/ + // https://docs.cohere.com/docs/controlling-generation-with-top-k-top-p + // https://huggingface.co/blog/how-to-generate + if (this.options.temperature != 1 && this.options.topp != 0) { + console.log('Generating with temperature ' + this.options.temperature + ' and top-p ' + this.options.topp + '. Note: it\'s recommended to only tweak one, and leave the other at it\'s default value.'); + } + // if there are any outstanding requests, resolve them // with the output received so far if (this.promiseResolve) { @@ -221,8 +242,22 @@ class LanguageModel extends EventEmitter { } else { if (typeof optionsOrCb === 'object') { this.options.maxTokens = (typeof optionsOrCb.maxTokens === 'number') ? optionsOrCb.maxTokens : this.options.maxTokens; - this.options.temperature = (typeof optionsOrCb.temperature === 'number') ? optionsOrCb.temperature : this.options.temperature; - this.options.topp = (typeof optionsOrCb.topp === 'number') ? optionsOrCb.topp : this.options.topp; + if (typeof optionsOrCb.temperature === 'number') { + this.options.temperature = optionsOrCb.temperature; + // disable top-p unless explicitly provided + if (typeof optionsOrCb.topp !== 'number') { + this.options.topp = 0; + console.log('Disabling top-p sampling'); + } + } + if (typeof optionsOrCb.topp === 'number') { + this.options.topp = optionsOrCb.topp; + // set temperature to 1.0 unless explicity provided + if (typeof optionsOrCb.temperature !== 'number') { + this.options.temperature = 1; + console.log('Using temperature 1.0 for top-p sampling'); + } + } this.options.stopOnBosOrEos = (typeof optionsOrCb.stopOnBosOrEos == 'boolean') ? optionsOrCb.stopPropagation : this.options.stopOnBosOrEos; } if (typeof cb === 'function') { @@ -232,6 +267,13 @@ class LanguageModel extends EventEmitter { } } + // https://peterchng.com/blog/2023/05/02/token-selection-strategies-top-k-top-p-and-temperature/ + // https://docs.cohere.com/docs/controlling-generation-with-top-k-top-p + // https://huggingface.co/blog/how-to-generate + if (this.options.temperature != 1 && this.options.topp != 0) { + console.log('Generating with temperature ' + this.options.temperature + ' and top-p ' + this.options.topp + '. Note: it\'s recommended to only tweak one, and leave the other at it\'s default value.'); + } + // if there are any outstanding requests, resolve them // with the output received so far if (this.promiseResolve) { From 429dc2eec5cad1c34d5e4d3e0be62fc663aabd56 Mon Sep 17 00:00:00 2001 From: gohai Date: Sat, 12 Aug 2023 13:34:26 +0800 Subject: [PATCH 15/15] LanguageModel: Disable top-p sampling by default This matches upstream llama2.c, and prevents a confusing message with the basic example, which specifies a temperature (thus disabling the default top-p sampling). --- src/LanguageModel/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageModel/index.js b/src/LanguageModel/index.js index e7f88103..518adc7f 100644 --- a/src/LanguageModel/index.js +++ b/src/LanguageModel/index.js @@ -20,7 +20,7 @@ class LanguageModel extends EventEmitter { tokenizerUrl: '', // if set, tokenizer.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) maxTokens: 0, // how many tokens to generate (defaults to model's maximum) temperature: 1.0, // 0.0 = (deterministic) argmax sampling, 1.0 = baseline, don't set higher - topp: 0.9, // p value in top-p (nucleus) sampling, 0 = off + topp: 0, // p value in top-p (nucleus) sampling, 0 = off stopOnBosOrEos: true, // stop when encountering beginning-of-sequence or end-of-sequence token };

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 literal 0 HcmV?d00001 diff --git a/src/LanguageModel/llama2.js b/src/LanguageModel/llama2.js new file mode 100644 index 00000000..a80e3988 --- /dev/null +++ b/src/LanguageModel/llama2.js @@ -0,0 +1,19 @@ + +var Llama2 = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(moduleArg = {}) { + +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject}));if(!Module.expectedDataFileDownloads){Module.expectedDataFileDownloads=0}Module.expectedDataFileDownloads++;(function(){if(Module["ENVIRONMENT_IS_PTHREAD"]||Module["$ww"])return;var loadPackage=function(metadata){var PACKAGE_PATH="";if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/")}else if(typeof process==="undefined"&&typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/")}var PACKAGE_NAME="web/src/llama2.data";var REMOTE_PACKAGE_BASE="llama2.data";if(typeof Module["locateFilePackage"]==="function"&&!Module["locateFile"]){Module["locateFile"]=Module["locateFilePackage"];err("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)")}var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata["remote_package_size"];function fetchRemotePackage(packageName,packageSize,callback,errback){if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){require("fs").readFile(packageName,(function(err,contents){if(err){errback(err)}else{callback(contents.buffer)}}));return}var xhr=new XMLHttpRequest;xhr.open("GET",packageName,true);xhr.responseType="arraybuffer";xhr.onprogress=function(event){var url=packageName;var size=packageSize;if(event.total)size=event.total;if(event.loaded){if(!xhr.addedTotal){xhr.addedTotal=true;if(!Module.dataFileDownloads)Module.dataFileDownloads={};Module.dataFileDownloads[url]={loaded:event.loaded,total:size}}else{Module.dataFileDownloads[url].loaded=event.loaded}var total=0;var loaded=0;var num=0;for(var download in Module.dataFileDownloads){var data=Module.dataFileDownloads[download];total+=data.total;loaded+=data.loaded;num++}total=Math.ceil(total*Module.expectedDataFileDownloads/num);if(Module["setStatus"])Module["setStatus"](`Downloading data... (${loaded}/${total})`)}else if(!Module.dataFileDownloads){if(Module["setStatus"])Module["setStatus"]("Downloading data...")}};xhr.onerror=function(event){throw new Error("NetworkError for: "+packageName)};xhr.onload=function(event){if(xhr.status==200||xhr.status==304||xhr.status==206||xhr.status==0&&xhr.response){var packageData=xhr.response;callback(packageData)}else{throw new Error(xhr.statusText+" : "+xhr.responseURL)}};xhr.send(null)}function handleError(error){console.error("package error:",error)}var fetchedCallback=null;var fetched=Module["getPreloadedPackage"]?Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE):null;if(!fetched)fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE,(function(data){if(fetchedCallback){fetchedCallback(data);fetchedCallback=null}else{fetched=data}}),handleError);function runWithFS(){function assert(check,msg){if(!check)throw msg+(new Error).stack}function DataRequest(start,end,audio){this.start=start;this.end=end;this.audio=audio}DataRequest.prototype={requests:{},open:function(mode,name){this.name=name;this.requests[name]=this;Module["addRunDependency"](`fp ${this.name}`)},send:function(){},onload:function(){var byteArray=this.byteArray.subarray(this.start,this.end);this.finish(byteArray)},finish:function(byteArray){var that=this;Module["FS_createDataFile"](this.name,null,byteArray,true,true,true);Module["removeRunDependency"](`fp ${that.name}`);this.requests[this.name]=null}};var files=metadata["files"];for(var i=0;i{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;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)=>{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,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",((err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)}))};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[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(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}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}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.error.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 HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}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 getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}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)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="llama2.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then((response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()})).catch((()=>getBinarySync(binaryFile)))}else if(readAsync){return new Promise(((resolve,reject)=>{readAsync(binaryFile,(response=>resolve(new Uint8Array(response))),reject)}))}}return Promise.resolve().then((()=>getBinarySync(binaryFile)))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then((binary=>WebAssembly.instantiate(binary,imports))).then((instance=>instance)).then(receiver,(reason=>{err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then((response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,(function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)}))}))}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["r"];updateMemoryViews();wasmTable=Module["asm"]["E"];addOnInit(Module["asm"]["s"]);removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((p=>!!p)),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((p=>!!p)),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};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}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,-1)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets:function(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets:function(tty,optional_actions,data){return 0},ioctl_tiocgwinsz:function(tty){return[24,80]}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,(arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}}));if(dep)addRunDependency(dep)};var preloadPlugins=Module["preloadPlugins"]||[];function FS_handledByPreloadPlugin(byteArray,fullname,finish,onerror){if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach((function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}}));return handled}function FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,(()=>{if(onerror)onerror();removeRunDependency(dep)}))){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,(byteArray=>processData(byteArray)),onerror)}else{processData(url)}}function FS_modeStringToFlags(str){var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags}function FS_getMode(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter((p=>!!p));var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>node===node.parent,isMountpoint:node=>!!node.mounted,isFile:mode=>(mode&61440)===32768,isDir:mode=>(mode&61440)===16384,isLink:mode=>(mode&61440)===40960,isChrdev:mode=>(mode&61440)===8192,isBlkdev:mode=>(mode&61440)===24576,isFIFO:mode=>(mode&61440)===4096,isSocket:mode=>(mode&49152)===49152,flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:()=>{for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked:fd=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream:(stream,fd=-1)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>parent.node_ops.lookup(parent,name),mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>FS.stat(path,true),chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStreamChecked(fd);FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStreamChecked(fd);FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStreamChecked(fd);if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>stream.fd===null,llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach((code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""}))},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter((chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}}));function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.get();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.get();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.get();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var nowIsMonotonic=true;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,addr){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function _emscripten_date_now(){return Date.now()}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_memcpy_big=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var safeSetTimeout=(func,timeout)=>setTimeout((()=>{callUserCallback(func)}),timeout);var warnOnce=text=>{if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;URL.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};preloadPlugins.push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}var b=new Blob([byteArray],{type:Browser.getMimetype(name)});var url=URL.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(()=>finish(audio)),false);audio.onerror=function audio_onerror(event){if(done)return;err("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout((()=>{finish(audio)}),1e4)};preloadPlugins.push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((callback=>callback()));Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(()=>{});CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func,timeout){return safeSetTimeout(func,timeout)},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame((()=>{callUserCallback(func)}))},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((listener=>listener(canvas.width,canvas.height)))},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=size-b.byteLength+65535>>>16;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _emscripten_resume_main_loop(){Browser.mainLoop.resume()}var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var _emscripten_set_main_loop_arg=function(func,arg,fps,simulateInfiniteLoop){var browserIterationFunc=()=>getWasmTableEntry(func)(arg);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg)};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};function getCFunc(ident){var func=Module["_"+ident];return func}var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var ccall=function(ident,returnType,argTypes,args,opts){var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>7)}}function sigToWasmTypes(sig){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};function addFunction(func,sig){var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedImages={};var preloadedAudios={};var wasmImports={b:___syscall_fcntl64,q:___syscall_ioctl,c:___syscall_openat,h:__emscripten_get_now_is_monotonic,l:__mmap_js,m:__munmap_js,d:_emscripten_date_now,i:_emscripten_memcpy_big,f:_emscripten_pause_main_loop,o:_emscripten_resize_heap,j:_emscripten_resume_main_loop,k:_emscripten_set_main_loop_arg,g:_exit,a:_fd_close,p:_fd_read,n:_fd_seek,e:_fd_write};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module["asm"]["s"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["t"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["u"]).apply(null,arguments)};var _main_loop=Module["_main_loop"]=function(){return(_main_loop=Module["_main_loop"]=Module["asm"]["v"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["w"]).apply(null,arguments)};var _register_callback=Module["_register_callback"]=function(){return(_register_callback=Module["_register_callback"]=Module["asm"]["x"]).apply(null,arguments)};var _set_parameters=Module["_set_parameters"]=function(){return(_set_parameters=Module["_set_parameters"]=Module["asm"]["y"]).apply(null,arguments)};var _generate=Module["_generate"]=function(){return(_generate=Module["_generate"]=Module["asm"]["z"]).apply(null,arguments)};var _get_vocab=Module["_get_vocab"]=function(){return(_get_vocab=Module["_get_vocab"]=Module["asm"]["A"]).apply(null,arguments)};var _get_vocab_size=Module["_get_vocab_size"]=function(){return(_get_vocab_size=Module["_get_vocab_size"]=Module["asm"]["B"]).apply(null,arguments)};var _manual_start=Module["_manual_start"]=function(){return(_manual_start=Module["_manual_start"]=Module["asm"]["C"]).apply(null,arguments)};var _manual_next=Module["_manual_next"]=function(){return(_manual_next=Module["_manual_next"]=Module["asm"]["D"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module["asm"]["F"]).apply(null,arguments)};var _emscripten_builtin_memalign=function(){return(_emscripten_builtin_memalign=Module["asm"]["G"]).apply(null,arguments)};var stackSave=function(){return(stackSave=Module["asm"]["H"]).apply(null,arguments)};var stackRestore=function(){return(stackRestore=Module["asm"]["I"]).apply(null,arguments)};var stackAlloc=function(){return(stackAlloc=Module["asm"]["J"]).apply(null,arguments)};Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;Module["ccall"]=ccall;Module["addFunction"]=addFunction;Module["UTF8ToString"]=UTF8ToString;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach((arg=>{HEAP32[argv_ptr++]=stringToUTF8OnStack(arg)}));HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(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();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}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(); + + + return moduleArg.ready +} + +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Llama2; +else if (typeof define === 'function' && define['amd']) + define([], () => Llama2); diff --git a/src/LanguageModel/llama2.wasm b/src/LanguageModel/llama2.wasm new file mode 100755 index 0000000000000000000000000000000000000000..38e8ec4f65432bf7a25206a7004f5346dd883a3d GIT binary patch literal 48114 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