From 1d920a3e081c968c6da1f6169b5b4cbdde8916ec Mon Sep 17 00:00:00 2001 From: Aliaksei Chapyzhenka Date: Wed, 25 May 2022 22:15:31 -0700 Subject: [PATCH] fixed issues with cross chunk Spans, chunk string->array, and better tests --- bin/build.js | 6 +- lib/chopper.js | 35 ++++++++ lib/parser.js | 10 ++- lib/web-vcd-parser.js | 76 +++++++++++------ lib/wrapper.js | 2 - out/vcd.js | 4 +- out/vcd.wasm | Bin 128797 -> 131436 bytes test/dump.vcd | 72 ++++++++++++++++ test/napi_basic.js | 14 ++-- test/napi_dump.js | 183 +++++++++++++++++----------------------- test/wasm_dump.js | 188 ++++++++++++++++++------------------------ vcd.c | 10 ++- vcd_spans.c | 75 +++++++++++++---- wasm_main.cpp | 34 ++++++-- 14 files changed, 424 insertions(+), 285 deletions(-) create mode 100644 lib/chopper.js create mode 100644 test/dump.vcd diff --git a/bin/build.js b/bin/build.js index 669f4ae..fc400a7 100755 --- a/bin/build.js +++ b/bin/build.js @@ -37,6 +37,8 @@ const properties = { mask: 'ptr', // mask (x, z) of the signal on change event digitCount: 'i32', tmpStr: 'ptr', + timeStampStr: 'ptr', + idStr: 'ptr', tmpStr2: 'ptr', stackPointer: 'i32', id: 'ptr', @@ -255,7 +257,7 @@ const generate = (cb) => { .skipTo(inSimulation); simulationTime - .match(spaces, timeSpan.end(simulation)) + .match(spaces, timeSpan.end(p.invoke(p.code.span('onTime'), simulation))) .skipTo(simulationTime); simulationVector @@ -298,7 +300,7 @@ const generate = (cb) => { .skipTo(simulationVectorRecovery); simulationId - .match(spaces, idSpan.end(simulation)) + .match(spaces, idSpan.end(p.invoke(p.code.span('onId'), simulation))) .skipTo(simulationId); const artifacts = p.build(declaration); diff --git a/lib/chopper.js b/lib/chopper.js new file mode 100644 index 0000000..427d5db --- /dev/null +++ b/lib/chopper.js @@ -0,0 +1,35 @@ +'use strict'; + +function xoshiro128ss(a, b, c, d) { + return function() { + var t = b << 9, r = a * 5; r = (r << 7 | r >>> 25) * 9; + c ^= a; d ^= b; + b ^= c; a ^= d; c ^= t; + d = d << 11 | d >>> 21; + return (r >>> 0) / 4294967296; + }; +} + + +function * chopper (src, step) { + + const chunker = len => { + const chunk = src.slice(0, len); + src = src.slice(chunk.length); + return chunk; + }; + + const random = xoshiro128ss(1134534345, 2145245245624, 313442566456, 4245642456456); + // const random = Math.random; + // const random = () => 0; + // yield(chunker(395)); + // yield(chunker(145)); + while(true) { + if (src.length === 0) { + return; + } + yield(chunker(random() * step + step)); + } +} + +module.exports = chopper; diff --git a/lib/parser.js b/lib/parser.js index db53fbf..50deed3 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -31,15 +31,21 @@ module.exports = () => { const cxt = lib.init(lifemit, triemit, info); s._write = function (chunk, encoding, callback) { - lib.execute(cxt, lifemit, triemit2, info, chunk); + const err = lib.execute(cxt, lifemit, triemit2, info, chunk); + if (err) { + // console.log(info); + console.log(err); + // throw new Error(err); + } callback(); }; s.change = { on: (id, fn) => { + // console.log(id); triemit2 = triemit; triee.on(id, fn); - const triggerString = triee.eventNames().join(' ') + ' '; + const triggerString = triee.eventNames().join('\0') + '\0\0'; lib.setTrigger(cxt, triggerString); }, any: fn => { diff --git a/lib/web-vcd-parser.js b/lib/web-vcd-parser.js index deb5df3..1c79edd 100644 --- a/lib/web-vcd-parser.js +++ b/lib/web-vcd-parser.js @@ -11,26 +11,36 @@ const dotProp = require('dot-prop'); // }); // } -function u8ToBn(u8) { - var hex = []; - // let u8 = Uint8Array.from(buf); +// function u8ToBn(u8) { +// let str = ''; +// for (let i = 0; i < u8.length; i++) { +// const val = u8[i]; +// str = val.toString(16) + str; +// if (val < 16) { +// str = '0' + str; +// } +// } +// return BigInt('0x' + str); +// } - u8.forEach(function (i) { - var h = i.toString(16); - if (h.length % 2) { h = '0' + h; } - hex.push(h); - }); - - hex.reverse(); - - return BigInt('0x' + hex.join('')); +function h8ToBn(HEAPU8, start, len) { + let str = ''; + const fin = start + len; + for (let i = start; i < fin; i++) { + const val = HEAPU8[i]; + str = val.toString(16) + str; + if (val < 16) { + str = '0' + str; + } + } + return BigInt('0x' + str); } // let startCalled = 0; const bindCWrap = (c, wasm) => { const w = wasm.cwrap; - c.execute = w('execute', 'number', ['number', 'number', 'number', 'number', 'number', 'string']); + c.execute = w('execute', 'number', ['number', 'number', 'number', 'number', 'number', 'array', 'number']); c.init = w('init', 'number', ['number', 'number', 'number', 'number']); c.getTime = w('getTime', 'number', ['number']); c.setTrigger = w('setTrigger', 'number', ['number', 'string']); @@ -57,13 +67,21 @@ const getWrapper = wasm => { // gets a string from a c heap pointer and length const getString = (name, len) => { - const view = wasm.HEAPU8.subarray(name, name+len); + + // const view = wasm.HEAPU8.subarray(name, name+len); + // let string = ''; + // for (let i = 0; i < len; i++) { + // string += String.fromCharCode(view[i]); + // } + // return string; let string = ''; - for (let i = 0; i < len; i++) { - string += String.fromCharCode(view[i]); + const end = name + len; + for (let i = name; i < end; i++) { + string += String.fromCharCode(wasm.HEAPU8[i]); } return string; + }; let boundInfo; @@ -137,16 +155,19 @@ const getWrapper = wasm => { boundEE1 = wasm.addFunction(function(eventName, l0, time, command, valueWords, value, mask) { const name = getString(eventName, l0); // console.log(`event name`); - // console.log(`event ${name} time ${time} cmd ${command} wrds ${valueWords}`); + // console.log({name, time, command, valueWords}); - const view0 = wasm.HEAPU8.subarray(value, value+(valueWords*8)); - const view1 = wasm.HEAPU8.subarray(mask, mask+(valueWords*8)); + // const view0 = wasm.HEAPU8.subarray(value, value+(valueWords*8)); + // const view1 = wasm.HEAPU8.subarray(mask, mask+(valueWords*8)); - let bigValue = u8ToBn(view0); - let bigMask = u8ToBn(view1); + // let bigValue = u8ToBn(view0); + // let bigMask = u8ToBn(view1); + // let bigValue = 0n; // console.log(bigValue.toString(16)); + const bigValue = h8ToBn(wasm.HEAPU8, value, valueWords * 8); + const bigMask = h8ToBn(wasm.HEAPU8, mask, valueWords * 8); ee[1](name, time, command, bigValue, bigMask); }, 'viijiiii'); @@ -167,7 +188,7 @@ const getWrapper = wasm => { boundInfo = info; ee[0] = cb0; ee[1] = cb1; - c.execute(ctx, boundEE0, boundEE1, boundSet, boundGet, chunk.toString()); + return c.execute(ctx, boundEE0, boundEE1, boundSet, boundGet, chunk, chunk.length); }, setTrigger: (ctx, triggerString) => { return c.setTrigger(ctx, triggerString); @@ -208,8 +229,11 @@ module.exports = async wasm => { const cxt = lib.init(lifemit, triemit, info); s._write = function (chunk, encoding, callback) { - // console.log('about to write', chunk); - lib.execute(cxt, lifemit, triemit2, info, chunk); + // console.log(cxt, info); + const err = lib.execute(cxt, lifemit, triemit2, info, chunk); + if (err) { + console.log(err); + } // console.log(util.inspect(info, {showHidden: true, depth : null, colorize: true})); // console.log(info.stack[0].top); // console.log(info.stack[1]); @@ -220,9 +244,9 @@ module.exports = async wasm => { s.change = { on: (id, fn) => { triemit2 = triemit; - // console.log(id, fn); triee.on(id, fn); const triggerString = triee.eventNames().join(' ') + ' '; + // console.log(id, Buffer.from(triggerString)); lib.setTrigger(cxt, triggerString); }, any: fn => { @@ -239,5 +263,3 @@ module.exports = async wasm => { return s; }; - -/* global BigInt */ diff --git a/lib/wrapper.js b/lib/wrapper.js index 5f9476b..4d3a034 100644 --- a/lib/wrapper.js +++ b/lib/wrapper.js @@ -1,7 +1,5 @@ 'use strict'; -/* global BigInt */ - const dotProp = require('dot-prop'); function _waitForStart(mod) { diff --git a/out/vcd.js b/out/vcd.js index 8fec110..711fd42 100644 --- a/out/vcd.js +++ b/out/vcd.js @@ -1,12 +1,12 @@ -var createVCD = (function() { +var createVCD = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( function(createVCD) { createVCD = createVCD || {}; -var Module=typeof createVCD!=="undefined"?createVCD:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};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;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};readAsync=function readAsync(filename,onload,onerror){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);nodeFS["readFile"](filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status,toThrow){if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for getValue: "+type)}return null}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function 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 stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64;var HEAPU64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf);Module["HEAP64"]=HEAP64=new BigInt64Array(buf);Module["HEAPU64"]=HEAPU64=new BigUint64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||1073741824;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function 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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 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="vcd.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["j"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["t"];addOnInit(Module["asm"]["k"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function _abort(){abort()}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}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=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(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:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(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:function(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)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}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.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(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;i0){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}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},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)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(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:function(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:function(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:function(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:function(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:function(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:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(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:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(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:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(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+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(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:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(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:function(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:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(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:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(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:function(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:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(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:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(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:function(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(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(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:function(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(function(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:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(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:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.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=function(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);if(typeof Uint8Array!="undefined")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||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(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(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){FS.forceLoadFile(node);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>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function _environ_get(__environ,environ_buf){try{var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _environ_sizes_get(penviron_count,penviron_buf_size){try{var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_bigint,whence,newOffset){try{var offset_low=Number(offset_bigint&BigInt(4294967295))|0,offset_high=Number(offset_bigint>>BigInt(32))|0;var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>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 instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}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.staticInit();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 asmLibraryArg={"b":_abort,"a":_emscripten_resize_heap,"d":_environ_get,"e":_environ_sizes_get,"f":_fd_close,"i":_fd_read,"g":_fd_seek,"h":_fd_write,"c":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["k"]).apply(null,arguments)};var _init=Module["_init"]=function(){return(_init=Module["_init"]=Module["asm"]["l"]).apply(null,arguments)};var _execute=Module["_execute"]=function(){return(_execute=Module["_execute"]=Module["asm"]["m"]).apply(null,arguments)};var _setTrigger=Module["_setTrigger"]=function(){return(_setTrigger=Module["_setTrigger"]=Module["asm"]["n"]).apply(null,arguments)};var _getTime=Module["_getTime"]=function(){return(_getTime=Module["_getTime"]=Module["asm"]["o"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["p"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["q"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["r"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["s"]).apply(null,arguments)};Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["addOnPostRun"]=addOnPostRun;Module["addFunction"]=addFunction;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];var argc=args.length+1;var argv=stackAlloc((argc+1)*4);HEAP32[argv>>2]=allocateUTF8OnStack(thisProgram);for(var i=1;i>2)+i]=allocateUTF8OnStack(args[i-1])}HEAP32[(argv>>2)+argc]=0;try{var ret=entryFunction(argc,argv);exit(ret,true)}catch(e){if(e instanceof ExitStatus||e=="unwind"){return}var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}err("exception thrown: "+toLog);quit_(1,e)}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();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()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(keepRuntimeAlive()){}else{exitRuntime();if(Module["onExit"])Module["onExit"](status);ABORT=true}quit_(status,new ExitStatus(status))}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=typeof createVCD!="undefined"?createVCD:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=(()=>{if(!nodePath){fs=require("fs");nodePath=require("path")}});read_=function shell_read(filename,binary){requireNodeFS();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)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})});if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_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.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function uleb128Encode(n){if(n<128){return[n]}return[n%128|128,n>>7]}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function=="function"){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=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function 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 stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf);Module["HEAP64"]=HEAP64=new BigInt64Array(buf);Module["HEAPU64"]=HEAPU64=new BigUint64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||1073741824;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;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="vcd.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["k"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["r"];addOnInit(Module["asm"]["l"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func=="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function getValue(ptr,type="i8",noSafe){if(type.endsWith("*"))type="u32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return Number(HEAP64[ptr>>3]);case"float":return HEAPF32[ptr>>2];case"double":return Number(HEAPF64[ptr>>3]);default:abort("invalid type for getValue: "+type)}return null}function getWasmTableEntry(funcPtr){return wasmTable.get(funcPtr)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}function setValue(ptr,value,type="i8",noSafe){if(type.endsWith("*"))type="u32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function setWasmTableEntry(idx,func){wasmTable.set(idx,func)}function _abort(){abort("")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let 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=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}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,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}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;i0){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}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},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)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(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:function(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:function(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:function(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:function(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:function(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:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(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:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(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:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(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{path=PATH_FS.resolve(FS.cwd(),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.normalizeArray(path.split("/").filter(p=>!!p),false);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=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},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:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get function(){return this.shared.position},set:function(val){this.shared.position=val}}}}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);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)=>{return 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=>{return 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.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}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.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}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.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}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=>{return 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.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 random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);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.getStream(fd);if(!stream)throw new FS.ErrnoError(8);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.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 mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},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||[])}else{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)}});stream_ops.read=((stream,buffer,offset,length,position)=>{FS.forceLoadFile(node);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{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(Browser.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)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=(()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)});openRequest.onsuccess=(()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=(()=>{ok++;if(ok+fail==total)finish()});putRequest.onerror=(()=>{fail++;if(ok+fail==total)finish()})});transaction.onerror=onerror});openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=(()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=(()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()});getRequest.onerror=(()=>{fail++;if(ok+fail==total)finish()})});transaction.onerror=onerror});openRequest.onerror=onerror}};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=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);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]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP64[buf+40>>3]=BigInt(stat.size);HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;HEAP64[buf+80>>3]=BigInt(stat.ino);return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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 instanceof FS.ErrnoError))throw e;return e.errno}}var MAX_INT53=9007199254740992;var MIN_INT53=-9007199254740992;function bigintToI53Checked(num){return numMAX_INT53?NaN:Number(num)}function _fd_seek(fd,offset,whence,newOffset){try{offset=bigintToI53Checked(offset);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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}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 instanceof FS.ErrnoError))throw e;return e.errno}}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}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.staticInit();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 asmLibraryArg={"a":_abort,"j":_emscripten_memcpy_big,"i":_emscripten_resize_heap,"d":_environ_get,"e":_environ_sizes_get,"f":_fd_close,"g":_fd_read,"h":_fd_seek,"b":_fd_write,"c":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["l"]).apply(null,arguments)};var _init=Module["_init"]=function(){return(_init=Module["_init"]=Module["asm"]["m"]).apply(null,arguments)};var _execute=Module["_execute"]=function(){return(_execute=Module["_execute"]=Module["asm"]["n"]).apply(null,arguments)};var _setTrigger=Module["_setTrigger"]=function(){return(_setTrigger=Module["_setTrigger"]=Module["asm"]["o"]).apply(null,arguments)};var _getTime=Module["_getTime"]=function(){return(_getTime=Module["_getTime"]=Module["asm"]["p"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["q"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["s"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["t"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["u"]).apply(null,arguments)};Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["addOnPostRun"]=addOnPostRun;Module["addFunction"]=addFunction;Module["setValue"]=setValue;Module["getValue"]=getValue;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach(arg=>{HEAP32[argv_ptr++]=allocateUTF8OnStack(arg)});HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exit(ret,true);return ret}catch(e){return handleException(e)}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();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()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); return createVCD.ready diff --git a/out/vcd.wasm b/out/vcd.wasm index 62d4285a09b06cd6b181712ff989a9889bede877..ce5a8138a1c9a82ac8e5b97cead9225b013338c4 100755 GIT binary patch literal 131436 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ÔY%&FuD*U9gl1y=Z#tej9q8LBDM<1{pRRW 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%0A%BO~5s~top57 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 literal 128797 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 YUYk|J7oSfN+h3Ed+QYwex_SD)0bjNrYybcN diff --git a/test/dump.vcd b/test/dump.vcd new file mode 100644 index 0000000..2337214 --- /dev/null +++ b/test/dump.vcd @@ -0,0 +1,72 @@ +$version Generated by VerilatedVcd $end +$date Wed Sep 18 22:59:07 2019 + $end +$timescale 1ns $end + + $scope module top $end + $var wire 1 "}G clock $end + $scope module leaf $end + $var wire 64 {u counter [63:0] $end + $upscope $end + $scope module fruit $end + $var wire 4 u) point [3:0] $end + $upscope $end + $upscope $end + + $enddefinitions $end +#100 +0"}G +#200 +1"}G +bzzzzxxxx11110000ZZZZXXXX11110000zzzzxxxx11110000zzzzxxxx11110000 {u +#300 +0"}G +b1111000000000000000000000000000000000000000000000000000000000000 {u +b0000 u) +#301 +b0000111100000000000000000000000000000000000000000000000000000000 {u +b0001 u) +#302 +b0000000011110000000000000000000000000000000000000000000000000000 {u +b0010 u) +#303 +b0000000000001111000000000000000000000000000000000000000000000000 {u +b0011 u) +#304 +b0000000000000000111100000000000000000000000000000000000000000000 {u +b0100 u) +#305 +b0000000000000000000011110000000000000000000000000000000000000000 {u +b0101 u) +#306 +b0000000000000000000000001111000000000000000000000000000000000000 {u +b0110 u) +#307 +b0000000000000000000000000000111100000000000000000000000000000000 {u +b0111 u) +#308 +B0000000000000000000000000000000011110000000000000000000000000000 {u +b1000 u) +#309 +b0000000000000000000000000000000000001111000000000000000000000000 {u +b1001 u) +#310 +b0000000000000000000000000000000000000000111100000000000000000000 {u +b1010 u) +#311 +b0000000000000000000000000000000000000000000011110000000000000000 {u +b1011 u) +#312 +b0000000000000000000000000000000000000000000000001111000000000000 {u +b1100 u) +#313 +b0000000000000000000000000000000000000000000000000000111100000000 {u +b1101 u) +#314 +b0000000000000000000000000000000000000000000000000000000011110000 {u +b1110 u) +#315 +b0000000000000000000000000000000000000000000000000000000000001111 {u +b1111 u) +#316 +1"}G diff --git a/test/napi_basic.js b/test/napi_basic.js index 0f19519..115f2cd 100644 --- a/test/napi_basic.js +++ b/test/napi_basic.js @@ -17,7 +17,9 @@ describe('basic', () => { it('fail: foo bar', done => { const inst = parser(); - expect(inst.write(Buffer.from(' foo bar ???'))).to.eq(true); + expect(() => { + inst.write(Buffer.from(' foo bar ???')); + }).not.to.throw(); expect(inst.info).to.deep.eq({ stack: [{}], status: 'declaration', @@ -26,11 +28,13 @@ describe('basic', () => { done(); }); - it('$comment', done => { + it('fail: $comment', done => { const inst = parser(); - expect(inst.write(Buffer.from( - ' \n $comment some text $end $comment more text $end ???' - ))).to.eq(true); + expect(() => { + inst.write(Buffer.from( + ' \n $comment some text $end $comment more text $end ???' + )); + }).not.to.throw(); expect(inst.info).to.deep.eq({ comment: ' more text ', stack: [{}], diff --git a/test/napi_dump.js b/test/napi_dump.js index ac54bb3..228a487 100644 --- a/test/napi_dump.js +++ b/test/napi_dump.js @@ -1,118 +1,87 @@ 'use strict'; +const fs = require('fs'); +const path = require('path'); + const expect = require('chai').expect; const parser = require('../lib/parser.js'); +const chopper = require('../lib/chopper.js'); -describe('dump', () => { +const expectaitions = [ + { id: '"}G', time: 100n, cmd: 14, value: 0n, mask: 0n }, + { id: '"}G', time: 200n, cmd: 15, value: 1n, mask: 0n }, + { id: '{u', time: 200n, cmd: 30, value: 0xf0f0f0f0f0f0f0f0n, mask: 0xff00ff00ff00ff00n }, + { id: '"}G', time: 300n, cmd: 14, value: 0n, mask: 0n }, + { id: '{u', time: 300n, cmd: 30, value: 0xf000000000000000n, mask: 0n }, + { id: 'u)', time: 300n, cmd: 30, value: 0n, mask: 0n }, + { id: '{u', time: 301n, cmd: 30, value: 0x0f00000000000000n, mask: 0n }, + { id: 'u)', time: 301n, cmd: 30, value: 1n, mask: 0n }, + { id: '{u', time: 302n, cmd: 30, value: 0x00f0000000000000n, mask: 0n }, + { id: 'u)', time: 302n, cmd: 30, value: 2n, mask: 0n }, + { id: '{u', time: 303n, cmd: 30, value: 0x000f000000000000n, mask: 0n }, + { id: 'u)', time: 303n, cmd: 30, value: 3n, mask: 0n }, + { id: '{u', time: 304n, cmd: 30, value: 0x0000f00000000000n, mask: 0n }, + { id: 'u)', time: 304n, cmd: 30, value: 4n, mask: 0n }, + { id: '{u', time: 305n, cmd: 30, value: 0x00000f0000000000n, mask: 0n }, + { id: 'u)', time: 305n, cmd: 30, value: 5n, mask: 0n }, + { id: '{u', time: 306n, cmd: 30, value: 0x000000f000000000n, mask: 0n }, + { id: 'u)', time: 306n, cmd: 30, value: 6n, mask: 0n }, + { id: '{u', time: 307n, cmd: 30, value: 0x0000000f00000000n, mask: 0n }, + { id: 'u)', time: 307n, cmd: 30, value: 7n, mask: 0n }, + { id: '{u', time: 308n, cmd: 31, value: 0x00000000f0000000n, mask: 0n }, + { id: 'u)', time: 308n, cmd: 30, value: 8n, mask: 0n }, + { id: '{u', time: 309n, cmd: 30, value: 0x000000000f000000n, mask: 0n }, + { id: 'u)', time: 309n, cmd: 30, value: 9n, mask: 0n }, + { id: '{u', time: 310n, cmd: 30, value: 0x0000000000f00000n, mask: 0n }, + { id: 'u)', time: 310n, cmd: 30, value: 10n, mask: 0n }, + { id: '{u', time: 311n, cmd: 30, value: 0x00000000000f0000n, mask: 0n }, + { id: 'u)', time: 311n, cmd: 30, value: 11n, mask: 0n }, + { id: '{u', time: 312n, cmd: 30, value: 0x000000000000f000n, mask: 0n }, + { id: 'u)', time: 312n, cmd: 30, value: 12n, mask: 0n }, + { id: '{u', time: 313n, cmd: 30, value: 0x0000000000000f00n, mask: 0n }, + { id: 'u)', time: 313n, cmd: 30, value: 13n, mask: 0n }, + { id: '{u', time: 314n, cmd: 30, value: 0x00000000000000f0n, mask: 0n }, + { id: 'u)', time: 314n, cmd: 30, value: 14n, mask: 0n }, + { id: '{u', time: 315n, cmd: 30, value: 0x000000000000000fn, mask: 0n }, + { id: 'u)', time: 315n, cmd: 30, value: 15n, mask: 0n }, + { id: '"}G', time: 316n, cmd: 15, value: 1n, mask: 0n } +]; - it('simple', done => { - const inst = parser(); - const dump = []; - ['"}G', '{u', 'u)'] // array of all signal ids - .map(id => - inst.change.on(id, (time, cmd, value, mask) => { - dump.push({ - id, - time, - cmd, - value, - mask - }); - }) - ); +describe('napi dump', function () { + it('simple napi', done => { + fs.readFile(path.join(__dirname, 'dump.vcd'), function (err, src) { + if (err) { + throw new Error(err); + } + const inst = parser(); + const dump = []; + ['"}G', '{u', 'u)'] // array of all signal ids + .map(id => + inst.change.on(id, (time, cmd, value, mask) => { + const row = { + id, + time: BigInt(time), + cmd, + value, + mask + }; + dump.push(row); + // console.log(row); + }) + ); - inst.on('finish', () => { - expect(inst.getTime()).to.eq(316n); - expect(dump).to.deep.eq([ - { id: '"}G', time: 100, cmd: 14, value: 0n, mask: 0n }, - { id: '"}G', time: 200, cmd: 15, value: 1n, mask: 0n }, - { id: '{u', time: 200, cmd: 30, value: 0xf0f0f0f0f0f0f0f0n, mask: 0xff00ff00ff00ff00n }, - { id: '"}G', time: 300, cmd: 14, value: 0n, mask: 0n }, - { id: '{u', time: 300, cmd: 30, value: 0xf000000000000000n, mask: 0n }, - { id: '{u', time: 301, cmd: 30, value: 0x0f00000000000000n, mask: 0n }, - { id: '{u', time: 302, cmd: 30, value: 0x00f0000000000000n, mask: 0n }, - { id: '{u', time: 303, cmd: 30, value: 0x000f000000000000n, mask: 0n }, - { id: '{u', time: 304, cmd: 30, value: 0x0000f00000000000n, mask: 0n }, - { id: '{u', time: 305, cmd: 30, value: 0x00000f0000000000n, mask: 0n }, - { id: '{u', time: 306, cmd: 30, value: 0x000000f000000000n, mask: 0n }, - { id: '{u', time: 307, cmd: 30, value: 0x0000000f00000000n, mask: 0n }, - { id: '{u', time: 308, cmd: 31, value: 0x00000000f0000000n, mask: 0n }, - { id: '{u', time: 309, cmd: 30, value: 0x000000000f000000n, mask: 0n }, - { id: '{u', time: 310, cmd: 30, value: 0x0000000000f00000n, mask: 0n }, - { id: '{u', time: 311, cmd: 30, value: 0x00000000000f0000n, mask: 0n }, - { id: '{u', time: 312, cmd: 30, value: 0x000000000000f000n, mask: 0n }, - { id: '{u', time: 313, cmd: 30, value: 0x0000000000000f00n, mask: 0n }, - { id: '{u', time: 314, cmd: 30, value: 0x00000000000000f0n, mask: 0n }, - { id: '{u', time: 315, cmd: 30, value: 0x000000000000000fn, mask: 0n }, - { id: '"}G', time: 316, cmd: 15, value: 1n, mask: 0n } - ]); - // console.log(dump); - done(); + inst.on('finish', () => { + expect(inst.getTime()).to.eq(316n); + expect(dump).to.deep.eq(expectaitions); + done(); + }); + + for (const chunk of chopper(src, 100)) { + // console.log('\u001b[31m[\u001b[0m' + chunk.toString() + '\u001b[31m]\u001b[0m'); + inst.write(chunk); + } + inst.end(); }); - - inst.write(` -$version Generated by VerilatedVcd $end -$date Wed Sep 18 22:59:07 2019 - $end -$timescale 1ns $end - - $scope module top $end - $var wire 1 "}G clock $end - $scope module leaf $end - $var wire 64 {u counter [63:0] $end - $upscope $end - $scope module fruit $end - $var wire 4 u) point [3:0] $end - $upscope $end - $upscope $end - - $enddefinitions $end -#100 -0"}G -#200 -1"}G -bzzzzxxxx11110000ZZZZXXXX11110000zzzzxxx`); - - // break in the middle of the number scan - - inst.write(`x11110000zzzzxxxx11110000 {u -#300 -0"}G -b1111000000000000000000000000000000000000000000000000000000000000 {u -#301 -b0000111100000000000000000000000000000000000000000000000000000000 {u -#302 -b0000000011110000000000000000000000000000000000000000000000000000 {u -#303 -b0000000000001111000000000000000000000000000000000000000000000000 {u -#304 -b0000000000000000111100000000000000000000000000000000000000000000 {u -#305 -b0000000000000000000011110000000000000000000000000000000000000000 {u -#306 -b0000000000000000000000001111000000000000000000000000000000000000 {u -#307 -b0000000000000000000000000000111100000000000000000000000000000000 {u -#308 -B0000000000000000000000000000000011110000000000000000000000000000 {u -#309 -b0000000000000000000000000000000000001111000000000000000000000000 {u -#310 -b0000000000000000000000000000000000000000111100000000000000000000 {u -#311 -b0000000000000000000000000000000000000000000011110000000000000000 {u -#312 -b0000000000000000000000000000000000000000000000001111000000000000 {u -#313 -b0000000000000000000000000000000000000000000000000000111100000000 {u -#314 -b0000000000000000000000000000000000000000000000000000000011110000 {u -#315 -b0000000000000000000000000000000000000000000000000000000000001111 {u -#316 -1"}G -`); - inst.end(); }); }); diff --git a/test/wasm_dump.js b/test/wasm_dump.js index d6119c1..7d7f809 100644 --- a/test/wasm_dump.js +++ b/test/wasm_dump.js @@ -1,120 +1,92 @@ 'use strict'; +const fs = require('fs'); +const path = require('path'); + const expect = require('chai').expect; const createVCD = require('../out/vcd.js'); const webVcdParser = require('../lib/web-vcd-parser.js'); +const chopper = require('../lib/chopper.js'); -describe('wasm dump', function () { +const expectaitions = [ + { id: '"}G', time: 100n, cmd: 14, value: 0n, mask: 0n }, + { id: '"}G', time: 200n, cmd: 15, value: 1n, mask: 0n }, + { id: '{u', time: 200n, cmd: 30, value: 0xf0f0f0f0f0f0f0f0n, mask: 0xff00ff00ff00ff00n }, + { id: '"}G', time: 300n, cmd: 14, value: 0n, mask: 0n }, + { id: '{u', time: 300n, cmd: 30, value: 0xf000000000000000n, mask: 0n }, + { id: 'u)', time: 300n, cmd: 30, value: 0n, mask: 0n }, + { id: '{u', time: 301n, cmd: 30, value: 0x0f00000000000000n, mask: 0n }, + { id: 'u)', time: 301n, cmd: 30, value: 1n, mask: 0n }, + { id: '{u', time: 302n, cmd: 30, value: 0x00f0000000000000n, mask: 0n }, + { id: 'u)', time: 302n, cmd: 30, value: 2n, mask: 0n }, + { id: '{u', time: 303n, cmd: 30, value: 0x000f000000000000n, mask: 0n }, + { id: 'u)', time: 303n, cmd: 30, value: 3n, mask: 0n }, + { id: '{u', time: 304n, cmd: 30, value: 0x0000f00000000000n, mask: 0n }, + { id: 'u)', time: 304n, cmd: 30, value: 4n, mask: 0n }, + { id: '{u', time: 305n, cmd: 30, value: 0x00000f0000000000n, mask: 0n }, + { id: 'u)', time: 305n, cmd: 30, value: 5n, mask: 0n }, + { id: '{u', time: 306n, cmd: 30, value: 0x000000f000000000n, mask: 0n }, + { id: 'u)', time: 306n, cmd: 30, value: 6n, mask: 0n }, + { id: '{u', time: 307n, cmd: 30, value: 0x0000000f00000000n, mask: 0n }, + { id: 'u)', time: 307n, cmd: 30, value: 7n, mask: 0n }, + { id: '{u', time: 308n, cmd: 31, value: 0x00000000f0000000n, mask: 0n }, + { id: 'u)', time: 308n, cmd: 30, value: 8n, mask: 0n }, + { id: '{u', time: 309n, cmd: 30, value: 0x000000000f000000n, mask: 0n }, + { id: 'u)', time: 309n, cmd: 30, value: 9n, mask: 0n }, + { id: '{u', time: 310n, cmd: 30, value: 0x0000000000f00000n, mask: 0n }, + { id: 'u)', time: 310n, cmd: 30, value: 10n, mask: 0n }, + { id: '{u', time: 311n, cmd: 30, value: 0x00000000000f0000n, mask: 0n }, + { id: 'u)', time: 311n, cmd: 30, value: 11n, mask: 0n }, + { id: '{u', time: 312n, cmd: 30, value: 0x000000000000f000n, mask: 0n }, + { id: 'u)', time: 312n, cmd: 30, value: 12n, mask: 0n }, + { id: '{u', time: 313n, cmd: 30, value: 0x0000000000000f00n, mask: 0n }, + { id: 'u)', time: 313n, cmd: 30, value: 13n, mask: 0n }, + { id: '{u', time: 314n, cmd: 30, value: 0x00000000000000f0n, mask: 0n }, + { id: 'u)', time: 314n, cmd: 30, value: 14n, mask: 0n }, + { id: '{u', time: 315n, cmd: 30, value: 0x000000000000000fn, mask: 0n }, + { id: 'u)', time: 315n, cmd: 30, value: 15n, mask: 0n }, + { id: '"}G', time: 316n, cmd: 15, value: 1n, mask: 0n } +]; - it('simple wasm', function (done) { - createVCD().then(function (mod) { - webVcdParser(mod).then(function (inst) { - const dump = []; - ['"}G', '{u', 'u)'] // array of all signal ids - .map(id => - inst.change.on(id, (time, cmd, value, mask) => { - dump.push({ - id, - time, - cmd, - value, - mask - }); - }) - ); +describe('wasm dump', () => { + it('simple wasm', done => { + fs.readFile(path.join(__dirname, 'dump.vcd'), function (err, src) { + if (err) { + throw new Error(err); + } + createVCD().then((mod) => { + webVcdParser(mod).then((inst) => { + const dump = []; + ['"}G', '{u', 'u)'] // array of all signal ids + .map(id => + inst.change.on(id, (time, cmd, value, mask) => { + const row = { + id, + time, + cmd, + value, + mask + }; + dump.push(row); + // console.log(row); + }) + ); - inst.on('finish', () => { - // expect(inst.getTime()).to.eq(316n); - expect(dump).to.deep.eq([ - { id: '"}G', time: 100n, cmd: 14, value: 0n, mask: 0n }, - { id: '"}G', time: 200n, cmd: 15, value: 1n, mask: 0n }, - { id: '{u', time: 200n, cmd: 30, value: 0xf0f0f0f0f0f0f0f0n, mask: 0xff00ff00ff00ff00n }, - { id: '"}G', time: 300n, cmd: 14, value: 0n, mask: 0n }, - { id: '{u', time: 300n, cmd: 30, value: 0xf000000000000000n, mask: 0n }, - { id: '{u', time: 301n, cmd: 30, value: 0x0f00000000000000n, mask: 0n }, - { id: '{u', time: 302n, cmd: 30, value: 0x00f0000000000000n, mask: 0n }, - { id: '{u', time: 303n, cmd: 30, value: 0x000f000000000000n, mask: 0n }, - { id: '{u', time: 304n, cmd: 30, value: 0x0000f00000000000n, mask: 0n }, - { id: '{u', time: 305n, cmd: 30, value: 0x00000f0000000000n, mask: 0n }, - { id: '{u', time: 306n, cmd: 30, value: 0x000000f000000000n, mask: 0n }, - { id: '{u', time: 307n, cmd: 30, value: 0x0000000f00000000n, mask: 0n }, - { id: '{u', time: 308n, cmd: 31, value: 0x00000000f0000000n, mask: 0n }, - { id: '{u', time: 309n, cmd: 30, value: 0x000000000f000000n, mask: 0n }, - { id: '{u', time: 310n, cmd: 30, value: 0x0000000000f00000n, mask: 0n }, - { id: '{u', time: 311n, cmd: 30, value: 0x00000000000f0000n, mask: 0n }, - { id: '{u', time: 312n, cmd: 30, value: 0x000000000000f000n, mask: 0n }, - { id: '{u', time: 313n, cmd: 30, value: 0x0000000000000f00n, mask: 0n }, - { id: '{u', time: 314n, cmd: 30, value: 0x00000000000000f0n, mask: 0n }, - { id: '{u', time: 315n, cmd: 30, value: 0x000000000000000fn, mask: 0n }, - { id: '"}G', time: 316n, cmd: 15, value: 1n, mask: 0n } - ]); - done(); + inst.on('finish', () => { + expect(inst.getTime()).to.eq(316n); + // console.log(dump); + // expect(dump.length).to.eq(expectaitions.length); + expect(dump).to.deep.eq(expectaitions); + done(); + }); + const step = (Math.random() * 500) |0; + for (const chunk of chopper(src, step)) { + // console.log('\n\u001b[31m[\u001b[0m' + chunk.toString() + '\u001b[31m](\u001b[0m\n' + chunk.length + '\u001b[31m)\u001b[0m\n'); + inst.write(chunk); + } + inst.end(); + // console.log(step); }); - - inst.write(` -$version Generated by VerilatedVcd $end -$date Wed Sep 18 22:59:07 2019 - $end -$timescale 1ns $end - - $scope module top $end - $var wire 1 "}G clock $end - $scope module leaf $end - $var wire 64 {u counter [63:0] $end - $upscope $end - $scope module fruit $end - $var wire 4 u) point [3:0] $end - $upscope $end - $upscope $end - - $enddefinitions $end -#100 -0"}G -#200 -1"}G -bzzzzxxxx11110000ZZZZXXXX11110000zzzzxxx`); - - // break in the middle of the number scan - - inst.write(`x11110000zzzzxxxx11110000 {u -#300 -0"}G -b1111000000000000000000000000000000000000000000000000000000000000 {u -#301 -b0000111100000000000000000000000000000000000000000000000000000000 {u -#302 -b0000000011110000000000000000000000000000000000000000000000000000 {u -#303 -b0000000000001111000000000000000000000000000000000000000000000000 {u -#304 -b0000000000000000111100000000000000000000000000000000000000000000 {u -#305 -b0000000000000000000011110000000000000000000000000000000000000000 {u -#306 -b0000000000000000000000001111000000000000000000000000000000000000 {u -#307 -b0000000000000000000000000000111100000000000000000000000000000000 {u -#308 -B0000000000000000000000000000000011110000000000000000000000000000 {u -#309 -b0000000000000000000000000000000000001111000000000000000000000000 {u -#310 -b0000000000000000000000000000000000000000111100000000000000000000 {u -#311 -b0000000000000000000000000000000000000000000011110000000000000000 {u -#312 -b0000000000000000000000000000000000000000000000001111000000000000 {u -#313 -b0000000000000000000000000000000000000000000000000000111100000000 {u -#314 -b0000000000000000000000000000000000000000000000000000000011110000 {u -#315 -b0000000000000000000000000000000000000000000000000000000000001111 {u -#316 -1"}G -`); - inst.end(); - }); }); }); diff --git a/vcd.c b/vcd.c index 5d1a032..b40d23c 100644 --- a/vcd.c +++ b/vcd.c @@ -123,9 +123,11 @@ METHOD(init) { ASSERT_FUNCTION(args[1], state->triee) ASSERT_OBJECT(args[2], state->info) - static char triggerString [4096] = " "; - static char tmpStr [4096] = " "; - static char tmpStr2 [4096] = " "; + static char triggerString [4096] = {0}; + static char tmpStr [4096] = {0}; + static char tmpStr2 [4096] = {0}; + static char timeStampStr [4096] = {0}; + static char idStr [4096] = {0}; static uint64_t valueBuf [4096] = {}; static uint64_t maskBuf [4096] = {}; @@ -134,6 +136,8 @@ METHOD(init) { state->napi_env = env; state->tmpStr = tmpStr; state->tmpStr2 = tmpStr2; + state->timeStampStr = timeStampStr; + state->idStr = idStr; state->value = valueBuf; state->mask = maskBuf; state->time = INT64_MAX; diff --git a/vcd_spans.c b/vcd_spans.c index f1fba78..6e1b3c4 100644 --- a/vcd_spans.c +++ b/vcd_spans.c @@ -25,7 +25,7 @@ typedef void* napi_env; } void strcopy(const unsigned char* p, const unsigned char* endp, unsigned char* dst) { - unsigned char* src; + const unsigned char* src; src = p; while (src < (endp - 1)) { *dst = *src; @@ -35,40 +35,52 @@ void strcopy(const unsigned char* p, const unsigned char* endp, unsigned char* d *dst = 0; } +void strconcat(const unsigned char* p, const unsigned char* endp, unsigned char* dst) { + // printf("", endp - p); + dst += strlen((char *)dst); // go to the end of string + while (p < endp) { + *dst = *p; + p++; + dst++; + } + *dst = 0; +} + // FIXME use a better structure to match strings int stringEq ( - const unsigned char* gold, // search pattern + const unsigned char* i, // search pattern const unsigned char* p, const unsigned char* endp ) { - if (gold[0] == 0) { + if (*i == 0) { return 1; } - unsigned char* i; - unsigned char* j; - i = gold; - j = p; + const unsigned char* j; while (1) { - if (*i == ' ') { // end of search pattern + j = p; + // printf("(%s|%s)", (char *)i, (char *)j); + if (*i == 0) { // end of search pattern return 0; } while (*i == *j) { // follow matching trail + if (*i == 0 && *j == 0) { // match zeros + return 1; + } i++; j++; } - if ((*i == ' ') && (j == (endp - 1))) { // exact match - return 1; - } - while (*i != ' ') { // skip to the end of pattern word + while (*i != 0) { // skip to the end of pattern word i++; } i++; - j = p; // try another word } } int commandSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { + +#ifndef VCDWASM napi_env env = state->napi_env; +#endif if (state->command == 5) { // $upscope state->stackPointer -= 1; @@ -100,6 +112,8 @@ int commandSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char } if (state->command == 8) { // $enddefinitions + *(char *)state->idStr = 0; + *(char *)state->timeStampStr = 0; #ifndef VCDWASM napi_value status, undefined, eventName, eventPayload, return_val; ASSERT(status, napi_create_string_latin1(env, "simulation", NAPI_AUTO_LENGTH, &status)) @@ -191,15 +205,27 @@ int varNameSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char } int idSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { + strconcat(p, endp, state->idStr); + // printf("\n", (char *)state->idStr); + return 0; +} + +int onId (vcd_parser_t* state, const unsigned char* _p, const unsigned char* _endp) { #ifndef VCDWASM napi_env env = state->napi_env; #endif + const unsigned char* p = (char *)state->idStr; + const unsigned int plen = strlen((char *)p) - 1; + *(char *)(p + plen) = 0; // null instead of space + const unsigned char* endp = p + plen - 1; + // printf("\n", (char *)state->idStr); const int valueWords = (state->digitCount >> 6) + 1; uint64_t* value = state->value; uint64_t* mask = state->mask; if (stringEq((state->trigger), p, endp)) { const uint8_t command = state->command; + // printf("{id:'%s',cmd:%d}", (char *)p, command); if (command == 14) { value[0] = 0; mask[0] = 0; @@ -211,17 +237,17 @@ int idSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* end #ifndef VCDWASM napi_value undefined, eventName, aTime, aCommand, aValue, aMask, return_val; ASSERT(undefined, napi_get_undefined(env, &undefined)) - ASSERT(eventName, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &eventName)) + ASSERT(eventName, napi_create_string_latin1(env, (char*)p, NAPI_AUTO_LENGTH, &eventName)) ASSERT(aTime, napi_create_int64(env, state->time, &aTime)) ASSERT(aCommand, napi_create_int32(env, command, &aCommand)) ASSERT(aValue, napi_create_bigint_words(env, 0, valueWords, value, &aValue)) ASSERT(aMask, napi_create_bigint_words(env, 0, valueWords, mask, &aMask)) napi_value* argv[] = {&eventName, &aTime, &aCommand, &aValue, &aMask}; ASSERT(state->triee, napi_call_function(env, undefined, state->triee, 5, *argv, &return_val)) - + // printf("", (char *)p); #else - strcopy(p, endp, state->tmpStr); - emit_triee(state->tmpStr, state->time, command, valueWords, value, mask); + // strcopy(p, endp, state->tmpStr); + emit_triee((char *)p, state->time, command, valueWords, value, mask); #endif } for (int i = 0; i < valueWords; i++) { @@ -229,9 +255,12 @@ int idSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* end mask[i] = 0; } state->digitCount = 0; + *(char *)state->idStr = 0; return 0; } + + int onDigit( vcd_parser_t* state, const unsigned char* p, @@ -270,8 +299,17 @@ int onRecover( return 0; } + int timeSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { - int64_t time = strtoul((const char *)p, (char **)&endp, 10); + strconcat(p, endp, state->timeStampStr); + // printf("\n", (char *)state->timeStampStr); + return 0; +} + +int onTime (vcd_parser_t* state, const unsigned char* _p, const unsigned char* _endp) { + char *end; + const int64_t time = strtoul(state->timeStampStr, &end, 10); + // printf("\n", time); if (state->time == INT64_MAX) { #ifndef VCDWASM napi_env env = state->napi_env; @@ -283,5 +321,6 @@ int timeSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* e #endif } state->time = time; + *(char *)state->timeStampStr = 0; return 0; } diff --git a/wasm_main.cpp b/wasm_main.cpp index a2b2e6b..34002c6 100644 --- a/wasm_main.cpp +++ b/wasm_main.cpp @@ -123,9 +123,11 @@ int init( state->lifee = 0; state->triee = 0; - static char triggerString [4096] = " "; - static char tmpStr [4096] = " "; - static char tmpStr2 [4096] = " "; + static char triggerString [4096] = {0}; + static char tmpStr [4096] = {0}; + static char tmpStr2 [4096] = {0}; + static char timeStampStr [4096] = {0}; + static char idStr [4096] = {0}; static uint64_t valueBuf [4096] = {}; static uint64_t maskBuf [4096] = {}; @@ -134,10 +136,12 @@ int init( state->napi_env = 0; state->tmpStr = tmpStr; state->tmpStr2 = tmpStr2; + state->timeStampStr = timeStampStr; + state->idStr = idStr; state->value = valueBuf; state->mask = maskBuf; - state->digitCount = 0; state->time = INT64_MAX; + state->digitCount = 0; set_property_string("status", "declaration"); @@ -157,7 +161,8 @@ int32_t execute( externalJsMethodOne* f1, externalJsSetProperty* sfn, externalJsGetProperty* gfn, - char* p + char* p, + const int plen ) { // cout << "execute got " << p << "\n"; @@ -167,7 +172,9 @@ int32_t execute( externalZero = f0; externalOne = f1; - const size_t plen = strlen(p); + // const size_t plen = strlen(p); + // printf("\n", plen); + const int32_t error = vcd_parser_execute(state, p, p + plen); @@ -175,9 +182,18 @@ int32_t execute( } int setTrigger(const int context, char* triggerString) { - state->trigger = malloc(strlen(triggerString)); - strcpy((char*)state->trigger, triggerString); - // cout << "setTrigger() got " << triggerString << "\n"; + int triggerStringLen = strlen((char *)triggerString) - 1; + // state->trigger = malloc(strlen(triggerString)); + char* p = (char *)state->tmpStr; + for (int i = 0; i < triggerStringLen; i++) { + char c = *(triggerString + i); + if (c == 32) { + c = 0; + } + *(p + i) = c; + } + // strcpy((char*)state->trigger, triggerString); + // cout << "[" << triggerString << "|" << p << "\n"; return 0; }