Advertisement
Guest User

Untitled

a guest
Dec 6th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 188.45 KB | None | 0 0
  1. self.mattock = self.mattock || {};
  2. self.mattock.CONFIG = {
  3. LIB_URL: "http://mattock.burlesco.io/lib/",
  4. WEBSOCKET_SHARDS: [["ws://mattock.burlesco.io/async"]],
  5. };
  6. var Module = {
  7. locateFile: (function (path) {
  8. return mattock.CONFIG.LIB_URL + path
  9. })
  10. };
  11. var Module;
  12. if (!Module) Module = (typeof Module !== "undefined" ? Module : null) || {};
  13. var moduleOverrides = {};
  14. for (var key in Module) {
  15. if (Module.hasOwnProperty(key)) {
  16. moduleOverrides[key] = Module[key]
  17. }
  18. }
  19. var ENVIRONMENT_IS_WEB = false;
  20. var ENVIRONMENT_IS_WORKER = false;
  21. var ENVIRONMENT_IS_NODE = false;
  22. var ENVIRONMENT_IS_SHELL = false;
  23. if (Module["ENVIRONMENT"]) {
  24. if (Module["ENVIRONMENT"] === "WEB") {
  25. ENVIRONMENT_IS_WEB = true
  26. } else if (Module["ENVIRONMENT"] === "WORKER") {
  27. ENVIRONMENT_IS_WORKER = true
  28. } else if (Module["ENVIRONMENT"] === "NODE") {
  29. ENVIRONMENT_IS_NODE = true
  30. } else if (Module["ENVIRONMENT"] === "SHELL") {
  31. ENVIRONMENT_IS_SHELL = true
  32. } else {
  33. throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")
  34. }
  35. } else {
  36. ENVIRONMENT_IS_WEB = typeof window === "object";
  37. ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  38. ENVIRONMENT_IS_NODE = typeof process === "object" && typeof require === "function" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
  39. ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER
  40. }
  41. if (ENVIRONMENT_IS_NODE) {
  42. if (!Module["print"]) Module["print"] = console.log;
  43. if (!Module["printErr"]) Module["printErr"] = console.warn;
  44. var nodeFS;
  45. var nodePath;
  46. Module["read"] = function shell_read(filename, binary) {
  47. if (!nodeFS) nodeFS = require("fs");
  48. if (!nodePath) nodePath = require("path");
  49. filename = nodePath["normalize"](filename);
  50. var ret = nodeFS["readFileSync"](filename);
  51. return binary ? ret : ret.toString()
  52. };
  53. Module["readBinary"] = function readBinary(filename) {
  54. var ret = Module["read"](filename, true);
  55. if (!ret.buffer) {
  56. ret = new Uint8Array(ret)
  57. }
  58. assert(ret.buffer);
  59. return ret
  60. };
  61. Module["load"] = function load(f) {
  62. globalEval(read(f))
  63. };
  64. if (!Module["thisProgram"]) {
  65. if (process["argv"].length > 1) {
  66. Module["thisProgram"] = process["argv"][1].replace(/\\/g, "/")
  67. } else {
  68. Module["thisProgram"] = "unknown-program"
  69. }
  70. }
  71. Module["arguments"] = process["argv"].slice(2);
  72. if (typeof module !== "undefined") {
  73. module["exports"] = Module
  74. }
  75. process["on"]("uncaughtException", (function (ex) {
  76. if (!(ex instanceof ExitStatus)) {
  77. throw ex
  78. }
  79. }));
  80. Module["inspect"] = (function () {
  81. return "[Emscripten Module object]"
  82. })
  83. } else if (ENVIRONMENT_IS_SHELL) {
  84. if (!Module["print"]) Module["print"] = print;
  85. if (typeof printErr != "undefined") Module["printErr"] = printErr;
  86. if (typeof read != "undefined") {
  87. Module["read"] = read
  88. } else {
  89. Module["read"] = function shell_read() {
  90. throw "no read() available"
  91. }
  92. }
  93. Module["readBinary"] = function readBinary(f) {
  94. if (typeof readbuffer === "function") {
  95. return new Uint8Array(readbuffer(f))
  96. }
  97. var data = read(f, "binary");
  98. assert(typeof data === "object");
  99. return data
  100. };
  101. if (typeof scriptArgs != "undefined") {
  102. Module["arguments"] = scriptArgs
  103. } else if (typeof arguments != "undefined") {
  104. Module["arguments"] = arguments
  105. }
  106. if (typeof quit === "function") {
  107. Module["quit"] = (function (status, toThrow) {
  108. quit(status)
  109. })
  110. }
  111. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  112. Module["read"] = function shell_read(url) {
  113. var xhr = new XMLHttpRequest;
  114. xhr.open("GET", url, false);
  115. xhr.send(null);
  116. return xhr.responseText
  117. };
  118. if (ENVIRONMENT_IS_WORKER) {
  119. Module["readBinary"] = function readBinary(url) {
  120. var xhr = new XMLHttpRequest;
  121. xhr.open("GET", url, false);
  122. xhr.responseType = "arraybuffer";
  123. xhr.send(null);
  124. return new Uint8Array(xhr.response)
  125. }
  126. }
  127. Module["readAsync"] = function readAsync(url, onload, onerror) {
  128. var xhr = new XMLHttpRequest;
  129. xhr.open("GET", url, true);
  130. xhr.responseType = "arraybuffer";
  131. xhr.onload = function xhr_onload() {
  132. if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
  133. onload(xhr.response)
  134. } else {
  135. onerror()
  136. }
  137. };
  138. xhr.onerror = onerror;
  139. xhr.send(null)
  140. };
  141. if (typeof arguments != "undefined") {
  142. Module["arguments"] = arguments
  143. }
  144. if (typeof console !== "undefined") {
  145. if (!Module["print"]) Module["print"] = function shell_print(x) {
  146. console.log(x)
  147. };
  148. if (!Module["printErr"]) Module["printErr"] = function shell_printErr(x) {
  149. console.warn(x)
  150. }
  151. } else {
  152. var TRY_USE_DUMP = false;
  153. if (!Module["print"]) Module["print"] = TRY_USE_DUMP && typeof dump !== "undefined" ? (function (x) {
  154. dump(x)
  155. }) : (function (x) {})
  156. }
  157. if (ENVIRONMENT_IS_WORKER) {
  158. Module["load"] = importScripts
  159. }
  160. if (typeof Module["setWindowTitle"] === "undefined") {
  161. Module["setWindowTitle"] = (function (title) {
  162. document.title = title
  163. })
  164. }
  165. } else {
  166. throw "Unknown runtime environment. Where are we?"
  167. }
  168.  
  169. function globalEval(x) {
  170. eval.call(null, x)
  171. }
  172. if (!Module["load"] && Module["read"]) {
  173. Module["load"] = function load(f) {
  174. globalEval(Module["read"](f))
  175. }
  176. }
  177. if (!Module["print"]) {
  178. Module["print"] = (function () {})
  179. }
  180. if (!Module["printErr"]) {
  181. Module["printErr"] = Module["print"]
  182. }
  183. if (!Module["arguments"]) {
  184. Module["arguments"] = []
  185. }
  186. if (!Module["thisProgram"]) {
  187. Module["thisProgram"] = "./this.program"
  188. }
  189. if (!Module["quit"]) {
  190. Module["quit"] = (function (status, toThrow) {
  191. throw toThrow
  192. })
  193. }
  194. Module.print = Module["print"];
  195. Module.printErr = Module["printErr"];
  196. Module["preRun"] = [];
  197. Module["postRun"] = [];
  198. for (var key in moduleOverrides) {
  199. if (moduleOverrides.hasOwnProperty(key)) {
  200. Module[key] = moduleOverrides[key]
  201. }
  202. }
  203. moduleOverrides = undefined;
  204. var Runtime = {
  205. setTempRet0: (function (value) {
  206. tempRet0 = value;
  207. return value
  208. }),
  209. getTempRet0: (function () {
  210. return tempRet0
  211. }),
  212. stackSave: (function () {
  213. return STACKTOP
  214. }),
  215. stackRestore: (function (stackTop) {
  216. STACKTOP = stackTop
  217. }),
  218. getNativeTypeSize: (function (type) {
  219. switch (type) {
  220. case "i1":
  221. case "i8":
  222. return 1;
  223. case "i16":
  224. return 2;
  225. case "i32":
  226. return 4;
  227. case "i64":
  228. return 8;
  229. case "float":
  230. return 4;
  231. case "double":
  232. return 8;
  233. default:
  234. {
  235. if (type[type.length - 1] === "*") {
  236. return Runtime.QUANTUM_SIZE
  237. } else if (type[0] === "i") {
  238. var bits = parseInt(type.substr(1));
  239. assert(bits % 8 === 0);
  240. return bits / 8
  241. } else {
  242. return 0
  243. }
  244. }
  245. }
  246. }),
  247. getNativeFieldSize: (function (type) {
  248. return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE)
  249. }),
  250. STACK_ALIGN: 16,
  251. prepVararg: (function (ptr, type) {
  252. if (type === "double" || type === "i64") {
  253. if (ptr & 7) {
  254. assert((ptr & 7) === 4);
  255. ptr += 4
  256. }
  257. } else {
  258. assert((ptr & 3) === 0)
  259. }
  260. return ptr
  261. }),
  262. getAlignSize: (function (type, size, vararg) {
  263. if (!vararg && (type == "i64" || type == "double")) return 8;
  264. if (!type) return Math.min(size, 8);
  265. return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE)
  266. }),
  267. dynCall: (function (sig, ptr, args) {
  268. if (args && args.length) {
  269. return Module["dynCall_" + sig].apply(null, [ptr].concat(args))
  270. } else {
  271. return Module["dynCall_" + sig].call(null, ptr)
  272. }
  273. }),
  274. functionPointers: [],
  275. addFunction: (function (func) {
  276. for (var i = 0; i < Runtime.functionPointers.length; i++) {
  277. if (!Runtime.functionPointers[i]) {
  278. Runtime.functionPointers[i] = func;
  279. return 2 * (1 + i)
  280. }
  281. }
  282. throw "Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."
  283. }),
  284. removeFunction: (function (index) {
  285. Runtime.functionPointers[(index - 2) / 2] = null
  286. }),
  287. warnOnce: (function (text) {
  288. if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
  289. if (!Runtime.warnOnce.shown[text]) {
  290. Runtime.warnOnce.shown[text] = 1;
  291. Module.printErr(text)
  292. }
  293. }),
  294. funcWrappers: {},
  295. getFuncWrapper: (function (func, sig) {
  296. assert(sig);
  297. if (!Runtime.funcWrappers[sig]) {
  298. Runtime.funcWrappers[sig] = {}
  299. }
  300. var sigCache = Runtime.funcWrappers[sig];
  301. if (!sigCache[func]) {
  302. if (sig.length === 1) {
  303. sigCache[func] = function dynCall_wrapper() {
  304. return Runtime.dynCall(sig, func)
  305. }
  306. } else if (sig.length === 2) {
  307. sigCache[func] = function dynCall_wrapper(arg) {
  308. return Runtime.dynCall(sig, func, [arg])
  309. }
  310. } else {
  311. sigCache[func] = function dynCall_wrapper() {
  312. return Runtime.dynCall(sig, func, Array.prototype.slice.call(arguments))
  313. }
  314. }
  315. }
  316. return sigCache[func]
  317. }),
  318. getCompilerSetting: (function (name) {
  319. throw "You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"
  320. }),
  321. stackAlloc: (function (size) {
  322. var ret = STACKTOP;
  323. STACKTOP = STACKTOP + size | 0;
  324. STACKTOP = STACKTOP + 15 & -16;
  325. return ret
  326. }),
  327. staticAlloc: (function (size) {
  328. var ret = STATICTOP;
  329. STATICTOP = STATICTOP + size | 0;
  330. STATICTOP = STATICTOP + 15 & -16;
  331. return ret
  332. }),
  333. dynamicAlloc: (function (size) {
  334. var ret = HEAP32[DYNAMICTOP_PTR >> 2];
  335. var end = (ret + size + 15 | 0) & -16;
  336. HEAP32[DYNAMICTOP_PTR >> 2] = end;
  337. if (end >= TOTAL_MEMORY) {
  338. var success = enlargeMemory();
  339. if (!success) {
  340. HEAP32[DYNAMICTOP_PTR >> 2] = ret;
  341. return 0
  342. }
  343. }
  344. return ret
  345. }),
  346. alignMemory: (function (size, quantum) {
  347. var ret = size = Math.ceil(size / (quantum ? quantum : 16)) * (quantum ? quantum : 16);
  348. return ret
  349. }),
  350. makeBigInt: (function (low, high, unsigned) {
  351. var ret = unsigned ? +(low >>> 0) + +(high >>> 0) * 4294967296 : +(low >>> 0) + +(high | 0) * 4294967296;
  352. return ret
  353. }),
  354. GLOBAL_BASE: 1024,
  355. QUANTUM_SIZE: 4,
  356. __dummy__: 0
  357. };
  358. Module["Runtime"] = Runtime;
  359. var ABORT = 0;
  360. var EXITSTATUS = 0;
  361.  
  362. function assert(condition, text) {
  363. if (!condition) {
  364. abort("Assertion failed: " + text)
  365. }
  366. }
  367.  
  368. function getCFunc(ident) {
  369. var func = Module["_" + ident];
  370. if (!func) {
  371. try {
  372. func = eval("_" + ident)
  373. } catch (e) {}
  374. }
  375. assert(func, "Cannot call unknown function " + ident + " (perhaps LLVM optimizations or closure removed it?)");
  376. return func
  377. }
  378. var cwrap, ccall;
  379. ((function () {
  380. var JSfuncs = {
  381. "stackSave": (function () {
  382. Runtime.stackSave()
  383. }),
  384. "stackRestore": (function () {
  385. Runtime.stackRestore()
  386. }),
  387. "arrayToC": (function (arr) {
  388. var ret = Runtime.stackAlloc(arr.length);
  389. writeArrayToMemory(arr, ret);
  390. return ret
  391. }),
  392. "stringToC": (function (str) {
  393. var ret = 0;
  394. if (str !== null && str !== undefined && str !== 0) {
  395. var len = (str.length << 2) + 1;
  396. ret = Runtime.stackAlloc(len);
  397. stringToUTF8(str, ret, len)
  398. }
  399. return ret
  400. })
  401. };
  402. var toC = {
  403. "string": JSfuncs["stringToC"],
  404. "array": JSfuncs["arrayToC"]
  405. };
  406. ccall = function ccallFunc(ident, returnType, argTypes, args, opts) {
  407. var func = getCFunc(ident);
  408. var cArgs = [];
  409. var stack = 0;
  410. if (args) {
  411. for (var i = 0; i < args.length; i++) {
  412. var converter = toC[argTypes[i]];
  413. if (converter) {
  414. if (stack === 0) stack = Runtime.stackSave();
  415. cArgs[i] = converter(args[i])
  416. } else {
  417. cArgs[i] = args[i]
  418. }
  419. }
  420. }
  421. var ret = func.apply(null, cArgs);
  422. if (returnType === "string") ret = Pointer_stringify(ret);
  423. if (stack !== 0) {
  424. if (opts && opts.async) {
  425. EmterpreterAsync.asyncFinalizers.push((function () {
  426. Runtime.stackRestore(stack)
  427. }));
  428. return
  429. }
  430. Runtime.stackRestore(stack)
  431. }
  432. return ret
  433. };
  434. var sourceRegex = /^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;
  435.  
  436. function parseJSFunc(jsfunc) {
  437. var parsed = jsfunc.toString().match(sourceRegex).slice(1);
  438. return {
  439. arguments: parsed[0],
  440. body: parsed[1],
  441. returnValue: parsed[2]
  442. }
  443. }
  444. var JSsource = null;
  445.  
  446. function ensureJSsource() {
  447. if (!JSsource) {
  448. JSsource = {};
  449. for (var fun in JSfuncs) {
  450. if (JSfuncs.hasOwnProperty(fun)) {
  451. JSsource[fun] = parseJSFunc(JSfuncs[fun])
  452. }
  453. }
  454. }
  455. }
  456. cwrap = function cwrap(ident, returnType, argTypes) {
  457. argTypes = argTypes || [];
  458. var cfunc = getCFunc(ident);
  459. var numericArgs = argTypes.every((function (type) {
  460. return type === "number"
  461. }));
  462. var numericRet = returnType !== "string";
  463. if (numericRet && numericArgs) {
  464. return cfunc
  465. }
  466. var argNames = argTypes.map((function (x, i) {
  467. return "$" + i
  468. }));
  469. var funcstr = "(function(" + argNames.join(",") + ") {";
  470. var nargs = argTypes.length;
  471. if (!numericArgs) {
  472. ensureJSsource();
  473. funcstr += "var stack = " + JSsource["stackSave"].body + ";";
  474. for (var i = 0; i < nargs; i++) {
  475. var arg = argNames[i],
  476. type = argTypes[i];
  477. if (type === "number") continue;
  478. var convertCode = JSsource[type + "ToC"];
  479. funcstr += "var " + convertCode.arguments + " = " + arg + ";";
  480. funcstr += convertCode.body + ";";
  481. funcstr += arg + "=(" + convertCode.returnValue + ");"
  482. }
  483. }
  484. var cfuncname = parseJSFunc((function () {
  485. return cfunc
  486. })).returnValue;
  487. funcstr += "var ret = " + cfuncname + "(" + argNames.join(",") + ");";
  488. if (!numericRet) {
  489. var strgfy = parseJSFunc((function () {
  490. return Pointer_stringify
  491. })).returnValue;
  492. funcstr += "ret = " + strgfy + "(ret);"
  493. }
  494. if (!numericArgs) {
  495. ensureJSsource();
  496. funcstr += JSsource["stackRestore"].body.replace("()", "(stack)") + ";"
  497. }
  498. funcstr += "return ret})";
  499. return eval(funcstr)
  500. }
  501. }))();
  502. Module["ccall"] = ccall;
  503. Module["cwrap"] = cwrap;
  504.  
  505. function setValue(ptr, value, type, noSafe) {
  506. type = type || "i8";
  507. if (type.charAt(type.length - 1) === "*") type = "i32";
  508. switch (type) {
  509. case "i1":
  510. HEAP8[ptr >> 0] = value;
  511. break;
  512. case "i8":
  513. HEAP8[ptr >> 0] = value;
  514. break;
  515. case "i16":
  516. HEAP16[ptr >> 1] = value;
  517. break;
  518. case "i32":
  519. HEAP32[ptr >> 2] = value;
  520. break;
  521. case "i64":
  522. 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];
  523. break;
  524. case "float":
  525. HEAPF32[ptr >> 2] = value;
  526. break;
  527. case "double":
  528. HEAPF64[ptr >> 3] = value;
  529. break;
  530. default:
  531. abort("invalid type for setValue: " + type)
  532. }
  533. }
  534. Module["setValue"] = setValue;
  535.  
  536. function getValue(ptr, type, noSafe) {
  537. type = type || "i8";
  538. if (type.charAt(type.length - 1) === "*") type = "i32";
  539. switch (type) {
  540. case "i1":
  541. return HEAP8[ptr >> 0];
  542. case "i8":
  543. return HEAP8[ptr >> 0];
  544. case "i16":
  545. return HEAP16[ptr >> 1];
  546. case "i32":
  547. return HEAP32[ptr >> 2];
  548. case "i64":
  549. return HEAP32[ptr >> 2];
  550. case "float":
  551. return HEAPF32[ptr >> 2];
  552. case "double":
  553. return HEAPF64[ptr >> 3];
  554. default:
  555. abort("invalid type for setValue: " + type)
  556. }
  557. return null
  558. }
  559. Module["getValue"] = getValue;
  560. var ALLOC_NORMAL = 0;
  561. var ALLOC_STACK = 1;
  562. var ALLOC_STATIC = 2;
  563. var ALLOC_DYNAMIC = 3;
  564. var ALLOC_NONE = 4;
  565. Module["ALLOC_NORMAL"] = ALLOC_NORMAL;
  566. Module["ALLOC_STACK"] = ALLOC_STACK;
  567. Module["ALLOC_STATIC"] = ALLOC_STATIC;
  568. Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC;
  569. Module["ALLOC_NONE"] = ALLOC_NONE;
  570.  
  571. function allocate(slab, types, allocator, ptr) {
  572. var zeroinit, size;
  573. if (typeof slab === "number") {
  574. zeroinit = true;
  575. size = slab
  576. } else {
  577. zeroinit = false;
  578. size = slab.length
  579. }
  580. var singleType = typeof types === "string" ? types : null;
  581. var ret;
  582. if (allocator == ALLOC_NONE) {
  583. ret = ptr
  584. } else {
  585. ret = [typeof _malloc === "function" ? _malloc : Runtime.staticAlloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length))
  586. }
  587. if (zeroinit) {
  588. var ptr = ret,
  589. stop;
  590. assert((ret & 3) == 0);
  591. stop = ret + (size & ~3);
  592. for (; ptr < stop; ptr += 4) {
  593. HEAP32[ptr >> 2] = 0
  594. }
  595. stop = ret + size;
  596. while (ptr < stop) {
  597. HEAP8[ptr++ >> 0] = 0
  598. }
  599. return ret
  600. }
  601. if (singleType === "i8") {
  602. if (slab.subarray || slab.slice) {
  603. HEAPU8.set(slab, ret)
  604. } else {
  605. HEAPU8.set(new Uint8Array(slab), ret)
  606. }
  607. return ret
  608. }
  609. var i = 0,
  610. type, typeSize, previousType;
  611. while (i < size) {
  612. var curr = slab[i];
  613. if (typeof curr === "function") {
  614. curr = Runtime.getFunctionIndex(curr)
  615. }
  616. type = singleType || types[i];
  617. if (type === 0) {
  618. i++;
  619. continue
  620. }
  621. if (type == "i64") type = "i32";
  622. setValue(ret + i, curr, type);
  623. if (previousType !== type) {
  624. typeSize = Runtime.getNativeTypeSize(type);
  625. previousType = type
  626. }
  627. i += typeSize
  628. }
  629. return ret
  630. }
  631. Module["allocate"] = allocate;
  632.  
  633. function getMemory(size) {
  634. if (!staticSealed) return Runtime.staticAlloc(size);
  635. if (!runtimeInitialized) return Runtime.dynamicAlloc(size);
  636. return _malloc(size)
  637. }
  638. Module["getMemory"] = getMemory;
  639.  
  640. function Pointer_stringify(ptr, length) {
  641. if (length === 0 || !ptr) return "";
  642. var hasUtf = 0;
  643. var t;
  644. var i = 0;
  645. while (1) {
  646. t = HEAPU8[ptr + i >> 0];
  647. hasUtf |= t;
  648. if (t == 0 && !length) break;
  649. i++;
  650. if (length && i == length) break
  651. }
  652. if (!length) length = i;
  653. var ret = "";
  654. if (hasUtf < 128) {
  655. var MAX_CHUNK = 1024;
  656. var curr;
  657. while (length > 0) {
  658. curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
  659. ret = ret ? ret + curr : curr;
  660. ptr += MAX_CHUNK;
  661. length -= MAX_CHUNK
  662. }
  663. return ret
  664. }
  665. return Module["UTF8ToString"](ptr)
  666. }
  667. Module["Pointer_stringify"] = Pointer_stringify;
  668.  
  669. function AsciiToString(ptr) {
  670. var str = "";
  671. while (1) {
  672. var ch = HEAP8[ptr++ >> 0];
  673. if (!ch) return str;
  674. str += String.fromCharCode(ch)
  675. }
  676. }
  677. Module["AsciiToString"] = AsciiToString;
  678.  
  679. function stringToAscii(str, outPtr) {
  680. return writeAsciiToMemory(str, outPtr, false)
  681. }
  682. Module["stringToAscii"] = stringToAscii;
  683. var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
  684.  
  685. function UTF8ArrayToString(u8Array, idx) {
  686. var endPtr = idx;
  687. while (u8Array[endPtr]) ++endPtr;
  688. if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
  689. return UTF8Decoder.decode(u8Array.subarray(idx, endPtr))
  690. } else {
  691. var u0, u1, u2, u3, u4, u5;
  692. var str = "";
  693. while (1) {
  694. u0 = u8Array[idx++];
  695. if (!u0) return str;
  696. if (!(u0 & 128)) {
  697. str += String.fromCharCode(u0);
  698. continue
  699. }
  700. u1 = u8Array[idx++] & 63;
  701. if ((u0 & 224) == 192) {
  702. str += String.fromCharCode((u0 & 31) << 6 | u1);
  703. continue
  704. }
  705. u2 = u8Array[idx++] & 63;
  706. if ((u0 & 240) == 224) {
  707. u0 = (u0 & 15) << 12 | u1 << 6 | u2
  708. } else {
  709. u3 = u8Array[idx++] & 63;
  710. if ((u0 & 248) == 240) {
  711. u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u3
  712. } else {
  713. u4 = u8Array[idx++] & 63;
  714. if ((u0 & 252) == 248) {
  715. u0 = (u0 & 3) << 24 | u1 << 18 | u2 << 12 | u3 << 6 | u4
  716. } else {
  717. u5 = u8Array[idx++] & 63;
  718. u0 = (u0 & 1) << 30 | u1 << 24 | u2 << 18 | u3 << 12 | u4 << 6 | u5
  719. }
  720. }
  721. }
  722. if (u0 < 65536) {
  723. str += String.fromCharCode(u0)
  724. } else {
  725. var ch = u0 - 65536;
  726. str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023)
  727. }
  728. }
  729. }
  730. }
  731. Module["UTF8ArrayToString"] = UTF8ArrayToString;
  732.  
  733. function UTF8ToString(ptr) {
  734. return UTF8ArrayToString(HEAPU8, ptr)
  735. }
  736. Module["UTF8ToString"] = UTF8ToString;
  737.  
  738. function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
  739. if (!(maxBytesToWrite > 0)) return 0;
  740. var startIdx = outIdx;
  741. var endIdx = outIdx + maxBytesToWrite - 1;
  742. for (var i = 0; i < str.length; ++i) {
  743. var u = str.charCodeAt(i);
  744. if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  745. if (u <= 127) {
  746. if (outIdx >= endIdx) break;
  747. outU8Array[outIdx++] = u
  748. } else if (u <= 2047) {
  749. if (outIdx + 1 >= endIdx) break;
  750. outU8Array[outIdx++] = 192 | u >> 6;
  751. outU8Array[outIdx++] = 128 | u & 63
  752. } else if (u <= 65535) {
  753. if (outIdx + 2 >= endIdx) break;
  754. outU8Array[outIdx++] = 224 | u >> 12;
  755. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  756. outU8Array[outIdx++] = 128 | u & 63
  757. } else if (u <= 2097151) {
  758. if (outIdx + 3 >= endIdx) break;
  759. outU8Array[outIdx++] = 240 | u >> 18;
  760. outU8Array[outIdx++] = 128 | u >> 12 & 63;
  761. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  762. outU8Array[outIdx++] = 128 | u & 63
  763. } else if (u <= 67108863) {
  764. if (outIdx + 4 >= endIdx) break;
  765. outU8Array[outIdx++] = 248 | u >> 24;
  766. outU8Array[outIdx++] = 128 | u >> 18 & 63;
  767. outU8Array[outIdx++] = 128 | u >> 12 & 63;
  768. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  769. outU8Array[outIdx++] = 128 | u & 63
  770. } else {
  771. if (outIdx + 5 >= endIdx) break;
  772. outU8Array[outIdx++] = 252 | u >> 30;
  773. outU8Array[outIdx++] = 128 | u >> 24 & 63;
  774. outU8Array[outIdx++] = 128 | u >> 18 & 63;
  775. outU8Array[outIdx++] = 128 | u >> 12 & 63;
  776. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  777. outU8Array[outIdx++] = 128 | u & 63
  778. }
  779. }
  780. outU8Array[outIdx] = 0;
  781. return outIdx - startIdx
  782. }
  783. Module["stringToUTF8Array"] = stringToUTF8Array;
  784.  
  785. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  786. return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
  787. }
  788. Module["stringToUTF8"] = stringToUTF8;
  789.  
  790. function lengthBytesUTF8(str) {
  791. var len = 0;
  792. for (var i = 0; i < str.length; ++i) {
  793. var u = str.charCodeAt(i);
  794. if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  795. if (u <= 127) {
  796. ++len
  797. } else if (u <= 2047) {
  798. len += 2
  799. } else if (u <= 65535) {
  800. len += 3
  801. } else if (u <= 2097151) {
  802. len += 4
  803. } else if (u <= 67108863) {
  804. len += 5
  805. } else {
  806. len += 6
  807. }
  808. }
  809. return len
  810. }
  811. Module["lengthBytesUTF8"] = lengthBytesUTF8;
  812. var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : undefined;
  813.  
  814. function demangle(func) {
  815. var __cxa_demangle_func = Module["___cxa_demangle"] || Module["__cxa_demangle"];
  816. if (__cxa_demangle_func) {
  817. try {
  818. var s = func.substr(1);
  819. var len = lengthBytesUTF8(s) + 1;
  820. var buf = _malloc(len);
  821. stringToUTF8(s, buf, len);
  822. var status = _malloc(4);
  823. var ret = __cxa_demangle_func(buf, 0, 0, status);
  824. if (getValue(status, "i32") === 0 && ret) {
  825. return Pointer_stringify(ret)
  826. }
  827. } catch (e) {} finally {
  828. if (buf) _free(buf);
  829. if (status) _free(status);
  830. if (ret) _free(ret)
  831. }
  832. return func
  833. }
  834. Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");
  835. return func
  836. }
  837.  
  838. function demangleAll(text) {
  839. var regex = /__Z[\w\d_]+/g;
  840. return text.replace(regex, (function (x) {
  841. var y = demangle(x);
  842. return x === y ? x : x + " [" + y + "]"
  843. }))
  844. }
  845.  
  846. function jsStackTrace() {
  847. var err = new Error;
  848. if (!err.stack) {
  849. try {
  850. throw new Error(0)
  851. } catch (e) {
  852. err = e
  853. }
  854. if (!err.stack) {
  855. return "(no stack trace available)"
  856. }
  857. }
  858. return err.stack.toString()
  859. }
  860.  
  861. function stackTrace() {
  862. var js = jsStackTrace();
  863. if (Module["extraStackTrace"]) js += "\n" + Module["extraStackTrace"]();
  864. return demangleAll(js)
  865. }
  866. Module["stackTrace"] = stackTrace;
  867. var WASM_PAGE_SIZE = 65536;
  868. var ASMJS_PAGE_SIZE = 16777216;
  869.  
  870. function alignUp(x, multiple) {
  871. if (x % multiple > 0) {
  872. x += multiple - x % multiple
  873. }
  874. return x
  875. }
  876. var HEAP, buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
  877.  
  878. function updateGlobalBuffer(buf) {
  879. Module["buffer"] = buffer = buf
  880. }
  881.  
  882. function updateGlobalBufferViews() {
  883. Module["HEAP8"] = HEAP8 = new Int8Array(buffer);
  884. Module["HEAP16"] = HEAP16 = new Int16Array(buffer);
  885. Module["HEAP32"] = HEAP32 = new Int32Array(buffer);
  886. Module["HEAPU8"] = HEAPU8 = new Uint8Array(buffer);
  887. Module["HEAPU16"] = HEAPU16 = new Uint16Array(buffer);
  888. Module["HEAPU32"] = HEAPU32 = new Uint32Array(buffer);
  889. Module["HEAPF32"] = HEAPF32 = new Float32Array(buffer);
  890. Module["HEAPF64"] = HEAPF64 = new Float64Array(buffer)
  891. }
  892. var STATIC_BASE, STATICTOP, staticSealed;
  893. var STACK_BASE, STACKTOP, STACK_MAX;
  894. var DYNAMIC_BASE, DYNAMICTOP_PTR;
  895. STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0;
  896. staticSealed = false;
  897.  
  898. function abortOnCannotGrowMemory() {
  899. abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value " + TOTAL_MEMORY + ", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")
  900. }
  901.  
  902. function enlargeMemory() {
  903. abortOnCannotGrowMemory()
  904. }
  905. var TOTAL_STACK = Module["TOTAL_STACK"] || 5242880;
  906. var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 16777216;
  907. if (TOTAL_MEMORY < TOTAL_STACK) Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was " + TOTAL_MEMORY + "! (TOTAL_STACK=" + TOTAL_STACK + ")");
  908. if (Module["buffer"]) {
  909. buffer = Module["buffer"]
  910. } else {
  911. if (typeof WebAssembly === "object" && typeof WebAssembly.Memory === "function") {
  912. Module["wasmMemory"] = new WebAssembly.Memory({
  913. "initial": TOTAL_MEMORY / WASM_PAGE_SIZE,
  914. "maximum": TOTAL_MEMORY / WASM_PAGE_SIZE
  915. });
  916. buffer = Module["wasmMemory"].buffer
  917. } else {
  918. buffer = new ArrayBuffer(TOTAL_MEMORY)
  919. }
  920. }
  921. updateGlobalBufferViews();
  922.  
  923. function getTotalMemory() {
  924. return TOTAL_MEMORY
  925. }
  926. HEAP32[0] = 1668509029;
  927. HEAP16[1] = 25459;
  928. if (HEAPU8[2] !== 115 || HEAPU8[3] !== 99) throw "Runtime error: expected the system to be little-endian!";
  929. Module["HEAP"] = HEAP;
  930. Module["buffer"] = buffer;
  931. Module["HEAP8"] = HEAP8;
  932. Module["HEAP16"] = HEAP16;
  933. Module["HEAP32"] = HEAP32;
  934. Module["HEAPU8"] = HEAPU8;
  935. Module["HEAPU16"] = HEAPU16;
  936. Module["HEAPU32"] = HEAPU32;
  937. Module["HEAPF32"] = HEAPF32;
  938. Module["HEAPF64"] = HEAPF64;
  939.  
  940. function callRuntimeCallbacks(callbacks) {
  941. while (callbacks.length > 0) {
  942. var callback = callbacks.shift();
  943. if (typeof callback == "function") {
  944. callback();
  945. continue
  946. }
  947. var func = callback.func;
  948. if (typeof func === "number") {
  949. if (callback.arg === undefined) {
  950. Module["dynCall_v"](func)
  951. } else {
  952. Module["dynCall_vi"](func, callback.arg)
  953. }
  954. } else {
  955. func(callback.arg === undefined ? null : callback.arg)
  956. }
  957. }
  958. }
  959. var __ATPRERUN__ = [];
  960. var __ATINIT__ = [];
  961. var __ATMAIN__ = [];
  962. var __ATEXIT__ = [];
  963. var __ATPOSTRUN__ = [];
  964. var runtimeInitialized = false;
  965. var runtimeExited = false;
  966.  
  967. function preRun() {
  968. if (Module["preRun"]) {
  969. if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
  970. while (Module["preRun"].length) {
  971. addOnPreRun(Module["preRun"].shift())
  972. }
  973. }
  974. callRuntimeCallbacks(__ATPRERUN__)
  975. }
  976.  
  977. function ensureInitRuntime() {
  978. if (runtimeInitialized) return;
  979. runtimeInitialized = true;
  980. callRuntimeCallbacks(__ATINIT__)
  981. }
  982.  
  983. function preMain() {
  984. callRuntimeCallbacks(__ATMAIN__)
  985. }
  986.  
  987. function exitRuntime() {
  988. callRuntimeCallbacks(__ATEXIT__);
  989. runtimeExited = true
  990. }
  991.  
  992. function postRun() {
  993. if (Module["postRun"]) {
  994. if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
  995. while (Module["postRun"].length) {
  996. addOnPostRun(Module["postRun"].shift())
  997. }
  998. }
  999. callRuntimeCallbacks(__ATPOSTRUN__)
  1000. }
  1001.  
  1002. function addOnPreRun(cb) {
  1003. __ATPRERUN__.unshift(cb)
  1004. }
  1005. Module["addOnPreRun"] = addOnPreRun;
  1006.  
  1007. function addOnInit(cb) {
  1008. __ATINIT__.unshift(cb)
  1009. }
  1010. Module["addOnInit"] = addOnInit;
  1011.  
  1012. function addOnPreMain(cb) {
  1013. __ATMAIN__.unshift(cb)
  1014. }
  1015. Module["addOnPreMain"] = addOnPreMain;
  1016.  
  1017. function addOnExit(cb) {
  1018. __ATEXIT__.unshift(cb)
  1019. }
  1020. Module["addOnExit"] = addOnExit;
  1021.  
  1022. function addOnPostRun(cb) {
  1023. __ATPOSTRUN__.unshift(cb)
  1024. }
  1025. Module["addOnPostRun"] = addOnPostRun;
  1026.  
  1027. function intArrayFromString(stringy, dontAddNull, length) {
  1028. var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  1029. var u8array = new Array(len);
  1030. var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  1031. if (dontAddNull) u8array.length = numBytesWritten;
  1032. return u8array
  1033. }
  1034. Module["intArrayFromString"] = intArrayFromString;
  1035.  
  1036. function intArrayToString(array) {
  1037. var ret = [];
  1038. for (var i = 0; i < array.length; i++) {
  1039. var chr = array[i];
  1040. if (chr > 255) {
  1041. chr &= 255
  1042. }
  1043. ret.push(String.fromCharCode(chr))
  1044. }
  1045. return ret.join("")
  1046. }
  1047. Module["intArrayToString"] = intArrayToString;
  1048.  
  1049. function writeStringToMemory(string, buffer, dontAddNull) {
  1050. Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");
  1051. var lastChar, end;
  1052. if (dontAddNull) {
  1053. end = buffer + lengthBytesUTF8(string);
  1054. lastChar = HEAP8[end]
  1055. }
  1056. stringToUTF8(string, buffer, Infinity);
  1057. if (dontAddNull) HEAP8[end] = lastChar
  1058. }
  1059. Module["writeStringToMemory"] = writeStringToMemory;
  1060.  
  1061. function writeArrayToMemory(array, buffer) {
  1062. HEAP8.set(array, buffer)
  1063. }
  1064. Module["writeArrayToMemory"] = writeArrayToMemory;
  1065.  
  1066. function writeAsciiToMemory(str, buffer, dontAddNull) {
  1067. for (var i = 0; i < str.length; ++i) {
  1068. HEAP8[buffer++ >> 0] = str.charCodeAt(i)
  1069. }
  1070. if (!dontAddNull) HEAP8[buffer >> 0] = 0
  1071. }
  1072. Module["writeAsciiToMemory"] = writeAsciiToMemory;
  1073. if (!Math["imul"] || Math["imul"](4294967295, 5) !== -5) Math["imul"] = function imul(a, b) {
  1074. var ah = a >>> 16;
  1075. var al = a & 65535;
  1076. var bh = b >>> 16;
  1077. var bl = b & 65535;
  1078. return al * bl + (ah * bl + al * bh << 16) | 0
  1079. };
  1080. Math.imul = Math["imul"];
  1081. if (!Math["fround"]) {
  1082. var froundBuffer = new Float32Array(1);
  1083. Math["fround"] = (function (x) {
  1084. froundBuffer[0] = x;
  1085. return froundBuffer[0]
  1086. })
  1087. }
  1088. Math.fround = Math["fround"];
  1089. if (!Math["clz32"]) Math["clz32"] = (function (x) {
  1090. x = x >>> 0;
  1091. for (var i = 0; i < 32; i++) {
  1092. if (x & 1 << 31 - i) return i
  1093. }
  1094. return 32
  1095. });
  1096. Math.clz32 = Math["clz32"];
  1097. if (!Math["trunc"]) Math["trunc"] = (function (x) {
  1098. return x < 0 ? Math.ceil(x) : Math.floor(x)
  1099. });
  1100. Math.trunc = Math["trunc"];
  1101. var Math_abs = Math.abs;
  1102. var Math_cos = Math.cos;
  1103. var Math_sin = Math.sin;
  1104. var Math_tan = Math.tan;
  1105. var Math_acos = Math.acos;
  1106. var Math_asin = Math.asin;
  1107. var Math_atan = Math.atan;
  1108. var Math_atan2 = Math.atan2;
  1109. var Math_exp = Math.exp;
  1110. var Math_log = Math.log;
  1111. var Math_sqrt = Math.sqrt;
  1112. var Math_ceil = Math.ceil;
  1113. var Math_floor = Math.floor;
  1114. var Math_pow = Math.pow;
  1115. var Math_imul = Math.imul;
  1116. var Math_fround = Math.fround;
  1117. var Math_round = Math.round;
  1118. var Math_min = Math.min;
  1119. var Math_clz32 = Math.clz32;
  1120. var Math_trunc = Math.trunc;
  1121. var runDependencies = 0;
  1122. var runDependencyWatcher = null;
  1123. var dependenciesFulfilled = null;
  1124.  
  1125. function getUniqueRunDependency(id) {
  1126. return id
  1127. }
  1128.  
  1129. function addRunDependency(id) {
  1130. runDependencies++;
  1131. if (Module["monitorRunDependencies"]) {
  1132. Module["monitorRunDependencies"](runDependencies)
  1133. }
  1134. }
  1135. Module["addRunDependency"] = addRunDependency;
  1136.  
  1137. function removeRunDependency(id) {
  1138. runDependencies--;
  1139. if (Module["monitorRunDependencies"]) {
  1140. Module["monitorRunDependencies"](runDependencies)
  1141. }
  1142. if (runDependencies == 0) {
  1143. if (runDependencyWatcher !== null) {
  1144. clearInterval(runDependencyWatcher);
  1145. runDependencyWatcher = null
  1146. }
  1147. if (dependenciesFulfilled) {
  1148. var callback = dependenciesFulfilled;
  1149. dependenciesFulfilled = null;
  1150. callback()
  1151. }
  1152. }
  1153. }
  1154. Module["removeRunDependency"] = removeRunDependency;
  1155. Module["preloadedImages"] = {};
  1156. Module["preloadedAudios"] = {};
  1157. var memoryInitializer = null;
  1158.  
  1159. function integrateWasmJS(Module) {
  1160. var method = Module["wasmJSMethod"] || "native-wasm";
  1161. Module["wasmJSMethod"] = method;
  1162. var wasmTextFile = Module["wasmTextFile"] || "cryptonight.wast";
  1163. var wasmBinaryFile = Module["wasmBinaryFile"] || "mattock.wasm";
  1164. var asmjsCodeFile = Module["asmjsCodeFile"] || "cryptonight.temp.asm.js";
  1165. if (typeof Module["locateFile"] === "function") {
  1166. wasmTextFile = Module["locateFile"](wasmTextFile);
  1167. wasmBinaryFile = Module["locateFile"](wasmBinaryFile);
  1168. asmjsCodeFile = Module["locateFile"](asmjsCodeFile)
  1169. }
  1170. var wasmPageSize = 64 * 1024;
  1171. var asm2wasmImports = {
  1172. "f64-rem": (function (x, y) {
  1173. return x % y
  1174. }),
  1175. "f64-to-int": (function (x) {
  1176. return x | 0
  1177. }),
  1178. "i32s-div": (function (x, y) {
  1179. return (x | 0) / (y | 0) | 0
  1180. }),
  1181. "i32u-div": (function (x, y) {
  1182. return (x >>> 0) / (y >>> 0) >>> 0
  1183. }),
  1184. "i32s-rem": (function (x, y) {
  1185. return (x | 0) % (y | 0) | 0
  1186. }),
  1187. "i32u-rem": (function (x, y) {
  1188. return (x >>> 0) % (y >>> 0) >>> 0
  1189. }),
  1190. "debugger": (function () {
  1191. debugger
  1192. })
  1193. };
  1194. var info = {
  1195. "global": null,
  1196. "env": null,
  1197. "asm2wasm": asm2wasmImports,
  1198. "parent": Module
  1199. };
  1200. var exports = null;
  1201.  
  1202. function lookupImport(mod, base) {
  1203. var lookup = info;
  1204. if (mod.indexOf(".") < 0) {
  1205. lookup = (lookup || {})[mod]
  1206. } else {
  1207. var parts = mod.split(".");
  1208. lookup = (lookup || {})[parts[0]];
  1209. lookup = (lookup || {})[parts[1]]
  1210. }
  1211. if (base) {
  1212. lookup = (lookup || {})[base]
  1213. }
  1214. if (lookup === undefined) {
  1215. abort("bad lookupImport to (" + mod + ")." + base)
  1216. }
  1217. return lookup
  1218. }
  1219.  
  1220. function mergeMemory(newBuffer) {
  1221. var oldBuffer = Module["buffer"];
  1222. if (newBuffer.byteLength < oldBuffer.byteLength) {
  1223. Module["printErr"]("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")
  1224. }
  1225. var oldView = new Int8Array(oldBuffer);
  1226. var newView = new Int8Array(newBuffer);
  1227. if (!memoryInitializer) {
  1228. oldView.set(newView.subarray(Module["STATIC_BASE"], Module["STATIC_BASE"] + Module["STATIC_BUMP"]), Module["STATIC_BASE"])
  1229. }
  1230. newView.set(oldView);
  1231. updateGlobalBuffer(newBuffer);
  1232. updateGlobalBufferViews()
  1233. }
  1234. var WasmTypes = {
  1235. none: 0,
  1236. i32: 1,
  1237. i64: 2,
  1238. f32: 3,
  1239. f64: 4
  1240. };
  1241.  
  1242. function fixImports(imports) {
  1243. if (!0) return imports;
  1244. var ret = {};
  1245. for (var i in imports) {
  1246. var fixed = i;
  1247. if (fixed[0] == "_") fixed = fixed.substr(1);
  1248. ret[fixed] = imports[i]
  1249. }
  1250. return ret
  1251. }
  1252.  
  1253. function getBinary() {
  1254. try {
  1255. var binary;
  1256. if (Module["wasmBinary"]) {
  1257. binary = Module["wasmBinary"];
  1258. binary = new Uint8Array(binary)
  1259. } else if (Module["readBinary"]) {
  1260. binary = Module["readBinary"](wasmBinaryFile)
  1261. } else {
  1262. throw "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"
  1263. }
  1264. return binary
  1265. } catch (err) {
  1266. abort(err)
  1267. }
  1268. }
  1269.  
  1270. function getBinaryPromise() {
  1271. if (!Module["wasmBinary"] && typeof fetch === "function") {
  1272. return fetch(wasmBinaryFile, {
  1273. credentials: "same-origin"
  1274. }).then((function (response) {
  1275. if (!response["ok"]) {
  1276. throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"
  1277. }
  1278. return response["arrayBuffer"]()
  1279. }))
  1280. }
  1281. return new Promise((function (resolve, reject) {
  1282. resolve(getBinary())
  1283. }))
  1284. }
  1285.  
  1286. function doNativeWasm(global, env, providedBuffer) {
  1287. if (typeof WebAssembly !== "object") {
  1288. Module["printErr"]("no native wasm support detected");
  1289. return false
  1290. }
  1291. if (!(Module["wasmMemory"] instanceof WebAssembly.Memory)) {
  1292. Module["printErr"]("no native wasm Memory in use");
  1293. return false
  1294. }
  1295. env["memory"] = Module["wasmMemory"];
  1296. info["global"] = {
  1297. "NaN": NaN,
  1298. "Infinity": Infinity
  1299. };
  1300. info["global.Math"] = global.Math;
  1301. info["env"] = env;
  1302.  
  1303. function receiveInstance(instance) {
  1304. exports = instance.exports;
  1305. if (exports.memory) mergeMemory(exports.memory);
  1306. Module["asm"] = exports;
  1307. Module["usingWasm"] = true;
  1308. removeRunDependency("wasm-instantiate")
  1309. }
  1310. addRunDependency("wasm-instantiate");
  1311. if (Module["instantiateWasm"]) {
  1312. try {
  1313. return Module["instantiateWasm"](info, receiveInstance)
  1314. } catch (e) {
  1315. Module["printErr"]("Module.instantiateWasm callback failed with error: " + e);
  1316. return false
  1317. }
  1318. }
  1319. getBinaryPromise().then((function (binary) {
  1320. return WebAssembly.instantiate(binary, info)
  1321. })).then((function (output) {
  1322. receiveInstance(output["instance"])
  1323. })).catch((function (reason) {
  1324. Module["printErr"]("failed to asynchronously prepare wasm: " + reason);
  1325. abort(reason)
  1326. }));
  1327. return {}
  1328. }
  1329. Module["asmPreload"] = Module["asm"];
  1330. var asmjsReallocBuffer = Module["reallocBuffer"];
  1331. var wasmReallocBuffer = (function (size) {
  1332. var PAGE_MULTIPLE = Module["usingWasm"] ? WASM_PAGE_SIZE : ASMJS_PAGE_SIZE;
  1333. size = alignUp(size, PAGE_MULTIPLE);
  1334. var old = Module["buffer"];
  1335. var oldSize = old.byteLength;
  1336. if (Module["usingWasm"]) {
  1337. try {
  1338. var result = Module["wasmMemory"].grow((size - oldSize) / wasmPageSize);
  1339. if (result !== (-1 | 0)) {
  1340. return Module["buffer"] = Module["wasmMemory"].buffer
  1341. } else {
  1342. return null
  1343. }
  1344. } catch (e) {
  1345. return null
  1346. }
  1347. } else {
  1348. exports["__growWasmMemory"]((size - oldSize) / wasmPageSize);
  1349. return Module["buffer"] !== old ? Module["buffer"] : null
  1350. }
  1351. });
  1352. Module["reallocBuffer"] = (function (size) {
  1353. if (finalMethod === "asmjs") {
  1354. return asmjsReallocBuffer(size)
  1355. } else {
  1356. return wasmReallocBuffer(size)
  1357. }
  1358. });
  1359. var finalMethod = "";
  1360. Module["asm"] = (function (global, env, providedBuffer) {
  1361. global = fixImports(global);
  1362. env = fixImports(env);
  1363. if (!env["table"]) {
  1364. var TABLE_SIZE = Module["wasmTableSize"];
  1365. if (TABLE_SIZE === undefined) TABLE_SIZE = 1024;
  1366. var MAX_TABLE_SIZE = Module["wasmMaxTableSize"];
  1367. if (typeof WebAssembly === "object" && typeof WebAssembly.Table === "function") {
  1368. if (MAX_TABLE_SIZE !== undefined) {
  1369. env["table"] = new WebAssembly.Table({
  1370. "initial": TABLE_SIZE,
  1371. "maximum": MAX_TABLE_SIZE,
  1372. "element": "anyfunc"
  1373. })
  1374. } else {
  1375. env["table"] = new WebAssembly.Table({
  1376. "initial": TABLE_SIZE,
  1377. element: "anyfunc"
  1378. })
  1379. }
  1380. } else {
  1381. env["table"] = new Array(TABLE_SIZE)
  1382. }
  1383. Module["wasmTable"] = env["table"]
  1384. }
  1385. if (!env["memoryBase"]) {
  1386. env["memoryBase"] = Module["STATIC_BASE"]
  1387. }
  1388. if (!env["tableBase"]) {
  1389. env["tableBase"] = 0
  1390. }
  1391. var exports;
  1392. exports = doNativeWasm(global, env, providedBuffer);
  1393. return exports
  1394. });
  1395. var methodHandler = Module["asm"]
  1396. }
  1397. integrateWasmJS(Module);
  1398. var ASM_CONSTS = [];
  1399. STATIC_BASE = Runtime.GLOBAL_BASE;
  1400. STATICTOP = STATIC_BASE + 12512;
  1401. __ATINIT__.push();
  1402. memoryInitializer = Module["wasmJSMethod"].indexOf("asmjs") >= 0 || Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0 ? "cryptonight.js.mem" : null;
  1403. var STATIC_BUMP = 12512;
  1404. Module["STATIC_BASE"] = STATIC_BASE;
  1405. Module["STATIC_BUMP"] = STATIC_BUMP;
  1406. var tempDoublePtr = STATICTOP;
  1407. STATICTOP += 16;
  1408.  
  1409. function ___assert_fail(condition, filename, line, func) {
  1410. ABORT = true;
  1411. throw "Assertion failed: " + Pointer_stringify(condition) + ", at: " + [filename ? Pointer_stringify(filename) : "unknown filename", line, func ? Pointer_stringify(func) : "unknown function"] + " at " + stackTrace()
  1412. }
  1413. var PROCINFO = {
  1414. ppid: 1,
  1415. pid: 42,
  1416. sid: 42,
  1417. pgid: 42
  1418. };
  1419. var ERRNO_CODES = {
  1420. EPERM: 1,
  1421. ENOENT: 2,
  1422. ESRCH: 3,
  1423. EINTR: 4,
  1424. EIO: 5,
  1425. ENXIO: 6,
  1426. E2BIG: 7,
  1427. ENOEXEC: 8,
  1428. EBADF: 9,
  1429. ECHILD: 10,
  1430. EAGAIN: 11,
  1431. EWOULDBLOCK: 11,
  1432. ENOMEM: 12,
  1433. EACCES: 13,
  1434. EFAULT: 14,
  1435. ENOTBLK: 15,
  1436. EBUSY: 16,
  1437. EEXIST: 17,
  1438. EXDEV: 18,
  1439. ENODEV: 19,
  1440. ENOTDIR: 20,
  1441. EISDIR: 21,
  1442. EINVAL: 22,
  1443. ENFILE: 23,
  1444. EMFILE: 24,
  1445. ENOTTY: 25,
  1446. ETXTBSY: 26,
  1447. EFBIG: 27,
  1448. ENOSPC: 28,
  1449. ESPIPE: 29,
  1450. EROFS: 30,
  1451. EMLINK: 31,
  1452. EPIPE: 32,
  1453. EDOM: 33,
  1454. ERANGE: 34,
  1455. ENOMSG: 42,
  1456. EIDRM: 43,
  1457. ECHRNG: 44,
  1458. EL2NSYNC: 45,
  1459. EL3HLT: 46,
  1460. EL3RST: 47,
  1461. ELNRNG: 48,
  1462. EUNATCH: 49,
  1463. ENOCSI: 50,
  1464. EL2HLT: 51,
  1465. EDEADLK: 35,
  1466. ENOLCK: 37,
  1467. EBADE: 52,
  1468. EBADR: 53,
  1469. EXFULL: 54,
  1470. ENOANO: 55,
  1471. EBADRQC: 56,
  1472. EBADSLT: 57,
  1473. EDEADLOCK: 35,
  1474. EBFONT: 59,
  1475. ENOSTR: 60,
  1476. ENODATA: 61,
  1477. ETIME: 62,
  1478. ENOSR: 63,
  1479. ENONET: 64,
  1480. ENOPKG: 65,
  1481. EREMOTE: 66,
  1482. ENOLINK: 67,
  1483. EADV: 68,
  1484. ESRMNT: 69,
  1485. ECOMM: 70,
  1486. EPROTO: 71,
  1487. EMULTIHOP: 72,
  1488. EDOTDOT: 73,
  1489. EBADMSG: 74,
  1490. ENOTUNIQ: 76,
  1491. EBADFD: 77,
  1492. EREMCHG: 78,
  1493. ELIBACC: 79,
  1494. ELIBBAD: 80,
  1495. ELIBSCN: 81,
  1496. ELIBMAX: 82,
  1497. ELIBEXEC: 83,
  1498. ENOSYS: 38,
  1499. ENOTEMPTY: 39,
  1500. ENAMETOOLONG: 36,
  1501. ELOOP: 40,
  1502. EOPNOTSUPP: 95,
  1503. EPFNOSUPPORT: 96,
  1504. ECONNRESET: 104,
  1505. ENOBUFS: 105,
  1506. EAFNOSUPPORT: 97,
  1507. EPROTOTYPE: 91,
  1508. ENOTSOCK: 88,
  1509. ENOPROTOOPT: 92,
  1510. ESHUTDOWN: 108,
  1511. ECONNREFUSED: 111,
  1512. EADDRINUSE: 98,
  1513. ECONNABORTED: 103,
  1514. ENETUNREACH: 101,
  1515. ENETDOWN: 100,
  1516. ETIMEDOUT: 110,
  1517. EHOSTDOWN: 112,
  1518. EHOSTUNREACH: 113,
  1519. EINPROGRESS: 115,
  1520. EALREADY: 114,
  1521. EDESTADDRREQ: 89,
  1522. EMSGSIZE: 90,
  1523. EPROTONOSUPPORT: 93,
  1524. ESOCKTNOSUPPORT: 94,
  1525. EADDRNOTAVAIL: 99,
  1526. ENETRESET: 102,
  1527. EISCONN: 106,
  1528. ENOTCONN: 107,
  1529. ETOOMANYREFS: 109,
  1530. EUSERS: 87,
  1531. EDQUOT: 122,
  1532. ESTALE: 116,
  1533. ENOTSUP: 95,
  1534. ENOMEDIUM: 123,
  1535. EILSEQ: 84,
  1536. EOVERFLOW: 75,
  1537. ECANCELED: 125,
  1538. ENOTRECOVERABLE: 131,
  1539. EOWNERDEAD: 130,
  1540. ESTRPIPE: 86
  1541. };
  1542. var ERRNO_MESSAGES = {
  1543. 0: "Success",
  1544. 1: "Not super-user",
  1545. 2: "No such file or directory",
  1546. 3: "No such process",
  1547. 4: "Interrupted system call",
  1548. 5: "I/O error",
  1549. 6: "No such device or address",
  1550. 7: "Arg list too long",
  1551. 8: "Exec format error",
  1552. 9: "Bad file number",
  1553. 10: "No children",
  1554. 11: "No more processes",
  1555. 12: "Not enough core",
  1556. 13: "Permission denied",
  1557. 14: "Bad address",
  1558. 15: "Block device required",
  1559. 16: "Mount device busy",
  1560. 17: "File exists",
  1561. 18: "Cross-device link",
  1562. 19: "No such device",
  1563. 20: "Not a directory",
  1564. 21: "Is a directory",
  1565. 22: "Invalid argument",
  1566. 23: "Too many open files in system",
  1567. 24: "Too many open files",
  1568. 25: "Not a typewriter",
  1569. 26: "Text file busy",
  1570. 27: "File too large",
  1571. 28: "No space left on device",
  1572. 29: "Illegal seek",
  1573. 30: "Read only file system",
  1574. 31: "Too many links",
  1575. 32: "Broken pipe",
  1576. 33: "Math arg out of domain of func",
  1577. 34: "Math result not representable",
  1578. 35: "File locking deadlock error",
  1579. 36: "File or path name too long",
  1580. 37: "No record locks available",
  1581. 38: "Function not implemented",
  1582. 39: "Directory not empty",
  1583. 40: "Too many symbolic links",
  1584. 42: "No message of desired type",
  1585. 43: "Identifier removed",
  1586. 44: "Channel number out of range",
  1587. 45: "Level 2 not synchronized",
  1588. 46: "Level 3 halted",
  1589. 47: "Level 3 reset",
  1590. 48: "Link number out of range",
  1591. 49: "Protocol driver not attached",
  1592. 50: "No CSI structure available",
  1593. 51: "Level 2 halted",
  1594. 52: "Invalid exchange",
  1595. 53: "Invalid request descriptor",
  1596. 54: "Exchange full",
  1597. 55: "No anode",
  1598. 56: "Invalid request code",
  1599. 57: "Invalid slot",
  1600. 59: "Bad font file fmt",
  1601. 60: "Device not a stream",
  1602. 61: "No data (for no delay io)",
  1603. 62: "Timer expired",
  1604. 63: "Out of streams resources",
  1605. 64: "Machine is not on the network",
  1606. 65: "Package not installed",
  1607. 66: "The object is remote",
  1608. 67: "The link has been severed",
  1609. 68: "Advertise error",
  1610. 69: "Srmount error",
  1611. 70: "Communication error on send",
  1612. 71: "Protocol error",
  1613. 72: "Multihop attempted",
  1614. 73: "Cross mount point (not really error)",
  1615. 74: "Trying to read unreadable message",
  1616. 75: "Value too large for defined data type",
  1617. 76: "Given log. name not unique",
  1618. 77: "f.d. invalid for this operation",
  1619. 78: "Remote address changed",
  1620. 79: "Can access a needed shared lib",
  1621. 80: "Accessing a corrupted shared lib",
  1622. 81: ".lib section in a.out corrupted",
  1623. 82: "Attempting to link in too many libs",
  1624. 83: "Attempting to exec a shared library",
  1625. 84: "Illegal byte sequence",
  1626. 86: "Streams pipe error",
  1627. 87: "Too many users",
  1628. 88: "Socket operation on non-socket",
  1629. 89: "Destination address required",
  1630. 90: "Message too long",
  1631. 91: "Protocol wrong type for socket",
  1632. 92: "Protocol not available",
  1633. 93: "Unknown protocol",
  1634. 94: "Socket type not supported",
  1635. 95: "Not supported",
  1636. 96: "Protocol family not supported",
  1637. 97: "Address family not supported by protocol family",
  1638. 98: "Address already in use",
  1639. 99: "Address not available",
  1640. 100: "Network interface is not configured",
  1641. 101: "Network is unreachable",
  1642. 102: "Connection reset by network",
  1643. 103: "Connection aborted",
  1644. 104: "Connection reset by peer",
  1645. 105: "No buffer space available",
  1646. 106: "Socket is already connected",
  1647. 107: "Socket is not connected",
  1648. 108: "Can't send after socket shutdown",
  1649. 109: "Too many references",
  1650. 110: "Connection timed out",
  1651. 111: "Connection refused",
  1652. 112: "Host is down",
  1653. 113: "Host is unreachable",
  1654. 114: "Socket already connected",
  1655. 115: "Connection already in progress",
  1656. 116: "Stale file handle",
  1657. 122: "Quota exceeded",
  1658. 123: "No medium (in tape drive)",
  1659. 125: "Operation canceled",
  1660. 130: "Previous owner died",
  1661. 131: "State not recoverable"
  1662. };
  1663.  
  1664. function ___setErrNo(value) {
  1665. if (Module["___errno_location"]) HEAP32[Module["___errno_location"]() >> 2] = value;
  1666. return value
  1667. }
  1668. var PATH = {
  1669. splitPath: (function (filename) {
  1670. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  1671. return splitPathRe.exec(filename).slice(1)
  1672. }),
  1673. normalizeArray: (function (parts, allowAboveRoot) {
  1674. var up = 0;
  1675. for (var i = parts.length - 1; i >= 0; i--) {
  1676. var last = parts[i];
  1677. if (last === ".") {
  1678. parts.splice(i, 1)
  1679. } else if (last === "..") {
  1680. parts.splice(i, 1);
  1681. up++
  1682. } else if (up) {
  1683. parts.splice(i, 1);
  1684. up--
  1685. }
  1686. }
  1687. if (allowAboveRoot) {
  1688. for (; up; up--) {
  1689. parts.unshift("..")
  1690. }
  1691. }
  1692. return parts
  1693. }),
  1694. normalize: (function (path) {
  1695. var isAbsolute = path.charAt(0) === "/",
  1696. trailingSlash = path.substr(-1) === "/";
  1697. path = PATH.normalizeArray(path.split("/").filter((function (p) {
  1698. return !!p
  1699. })), !isAbsolute).join("/");
  1700. if (!path && !isAbsolute) {
  1701. path = "."
  1702. }
  1703. if (path && trailingSlash) {
  1704. path += "/"
  1705. }
  1706. return (isAbsolute ? "/" : "") + path
  1707. }),
  1708. dirname: (function (path) {
  1709. var result = PATH.splitPath(path),
  1710. root = result[0],
  1711. dir = result[1];
  1712. if (!root && !dir) {
  1713. return "."
  1714. }
  1715. if (dir) {
  1716. dir = dir.substr(0, dir.length - 1)
  1717. }
  1718. return root + dir
  1719. }),
  1720. basename: (function (path) {
  1721. if (path === "/") return "/";
  1722. var lastSlash = path.lastIndexOf("/");
  1723. if (lastSlash === -1) return path;
  1724. return path.substr(lastSlash + 1)
  1725. }),
  1726. extname: (function (path) {
  1727. return PATH.splitPath(path)[3]
  1728. }),
  1729. join: (function () {
  1730. var paths = Array.prototype.slice.call(arguments, 0);
  1731. return PATH.normalize(paths.join("/"))
  1732. }),
  1733. join2: (function (l, r) {
  1734. return PATH.normalize(l + "/" + r)
  1735. }),
  1736. resolve: (function () {
  1737. var resolvedPath = "",
  1738. resolvedAbsolute = false;
  1739. for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  1740. var path = i >= 0 ? arguments[i] : FS.cwd();
  1741. if (typeof path !== "string") {
  1742. throw new TypeError("Arguments to path.resolve must be strings")
  1743. } else if (!path) {
  1744. return ""
  1745. }
  1746. resolvedPath = path + "/" + resolvedPath;
  1747. resolvedAbsolute = path.charAt(0) === "/"
  1748. }
  1749. resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter((function (p) {
  1750. return !!p
  1751. })), !resolvedAbsolute).join("/");
  1752. return (resolvedAbsolute ? "/" : "") + resolvedPath || "."
  1753. }),
  1754. relative: (function (from, to) {
  1755. from = PATH.resolve(from).substr(1);
  1756. to = PATH.resolve(to).substr(1);
  1757.  
  1758. function trim(arr) {
  1759. var start = 0;
  1760. for (; start < arr.length; start++) {
  1761. if (arr[start] !== "") break
  1762. }
  1763. var end = arr.length - 1;
  1764. for (; end >= 0; end--) {
  1765. if (arr[end] !== "") break
  1766. }
  1767. if (start > end) return [];
  1768. return arr.slice(start, end - start + 1)
  1769. }
  1770. var fromParts = trim(from.split("/"));
  1771. var toParts = trim(to.split("/"));
  1772. var length = Math.min(fromParts.length, toParts.length);
  1773. var samePartsLength = length;
  1774. for (var i = 0; i < length; i++) {
  1775. if (fromParts[i] !== toParts[i]) {
  1776. samePartsLength = i;
  1777. break
  1778. }
  1779. }
  1780. var outputParts = [];
  1781. for (var i = samePartsLength; i < fromParts.length; i++) {
  1782. outputParts.push("..")
  1783. }
  1784. outputParts = outputParts.concat(toParts.slice(samePartsLength));
  1785. return outputParts.join("/")
  1786. })
  1787. };
  1788. var TTY = {
  1789. ttys: [],
  1790. init: (function () {}),
  1791. shutdown: (function () {}),
  1792. register: (function (dev, ops) {
  1793. TTY.ttys[dev] = {
  1794. input: [],
  1795. output: [],
  1796. ops: ops
  1797. };
  1798. FS.registerDevice(dev, TTY.stream_ops)
  1799. }),
  1800. stream_ops: {
  1801. open: (function (stream) {
  1802. var tty = TTY.ttys[stream.node.rdev];
  1803. if (!tty) {
  1804. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  1805. }
  1806. stream.tty = tty;
  1807. stream.seekable = false
  1808. }),
  1809. close: (function (stream) {
  1810. stream.tty.ops.flush(stream.tty)
  1811. }),
  1812. flush: (function (stream) {
  1813. stream.tty.ops.flush(stream.tty)
  1814. }),
  1815. read: (function (stream, buffer, offset, length, pos) {
  1816. if (!stream.tty || !stream.tty.ops.get_char) {
  1817. throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1818. }
  1819. var bytesRead = 0;
  1820. for (var i = 0; i < length; i++) {
  1821. var result;
  1822. try {
  1823. result = stream.tty.ops.get_char(stream.tty)
  1824. } catch (e) {
  1825. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1826. }
  1827. if (result === undefined && bytesRead === 0) {
  1828. throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  1829. }
  1830. if (result === null || result === undefined) break;
  1831. bytesRead++;
  1832. buffer[offset + i] = result
  1833. }
  1834. if (bytesRead) {
  1835. stream.node.timestamp = Date.now()
  1836. }
  1837. return bytesRead
  1838. }),
  1839. write: (function (stream, buffer, offset, length, pos) {
  1840. if (!stream.tty || !stream.tty.ops.put_char) {
  1841. throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1842. }
  1843. for (var i = 0; i < length; i++) {
  1844. try {
  1845. stream.tty.ops.put_char(stream.tty, buffer[offset + i])
  1846. } catch (e) {
  1847. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1848. }
  1849. }
  1850. if (length) {
  1851. stream.node.timestamp = Date.now()
  1852. }
  1853. return i
  1854. })
  1855. },
  1856. default_tty_ops: {
  1857. get_char: (function (tty) {
  1858. if (!tty.input.length) {
  1859. var result = null;
  1860. if (ENVIRONMENT_IS_NODE) {
  1861. var BUFSIZE = 256;
  1862. var buf = new Buffer(BUFSIZE);
  1863. var bytesRead = 0;
  1864. var isPosixPlatform = process.platform != "win32";
  1865. var fd = process.stdin.fd;
  1866. if (isPosixPlatform) {
  1867. var usingDevice = false;
  1868. try {
  1869. fd = fs.openSync("/dev/stdin", "r");
  1870. usingDevice = true
  1871. } catch (e) {}
  1872. }
  1873. try {
  1874. bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null)
  1875. } catch (e) {
  1876. if (e.toString().indexOf("EOF") != -1) bytesRead = 0;
  1877. else throw e
  1878. }
  1879. if (usingDevice) {
  1880. fs.closeSync(fd)
  1881. }
  1882. if (bytesRead > 0) {
  1883. result = buf.slice(0, bytesRead).toString("utf-8")
  1884. } else {
  1885. result = null
  1886. }
  1887. } else if (typeof window != "undefined" && typeof window.prompt == "function") {
  1888. result = window.prompt("Input: ");
  1889. if (result !== null) {
  1890. result += "\n"
  1891. }
  1892. } else if (typeof readline == "function") {
  1893. result = readline();
  1894. if (result !== null) {
  1895. result += "\n"
  1896. }
  1897. }
  1898. if (!result) {
  1899. return null
  1900. }
  1901. tty.input = intArrayFromString(result, true)
  1902. }
  1903. return tty.input.shift()
  1904. }),
  1905. put_char: (function (tty, val) {
  1906. if (val === null || val === 10) {
  1907. Module["print"](UTF8ArrayToString(tty.output, 0));
  1908. tty.output = []
  1909. } else {
  1910. if (val != 0) tty.output.push(val)
  1911. }
  1912. }),
  1913. flush: (function (tty) {
  1914. if (tty.output && tty.output.length > 0) {
  1915. Module["print"](UTF8ArrayToString(tty.output, 0));
  1916. tty.output = []
  1917. }
  1918. })
  1919. },
  1920. default_tty1_ops: {
  1921. put_char: (function (tty, val) {
  1922. if (val === null || val === 10) {
  1923. Module["printErr"](UTF8ArrayToString(tty.output, 0));
  1924. tty.output = []
  1925. } else {
  1926. if (val != 0) tty.output.push(val)
  1927. }
  1928. }),
  1929. flush: (function (tty) {
  1930. if (tty.output && tty.output.length > 0) {
  1931. Module["printErr"](UTF8ArrayToString(tty.output, 0));
  1932. tty.output = []
  1933. }
  1934. })
  1935. }
  1936. };
  1937. var MEMFS = {
  1938. ops_table: null,
  1939. mount: (function (mount) {
  1940. return MEMFS.createNode(null, "/", 16384 | 511, 0)
  1941. }),
  1942. createNode: (function (parent, name, mode, dev) {
  1943. if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  1944. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  1945. }
  1946. if (!MEMFS.ops_table) {
  1947. MEMFS.ops_table = {
  1948. dir: {
  1949. node: {
  1950. getattr: MEMFS.node_ops.getattr,
  1951. setattr: MEMFS.node_ops.setattr,
  1952. lookup: MEMFS.node_ops.lookup,
  1953. mknod: MEMFS.node_ops.mknod,
  1954. rename: MEMFS.node_ops.rename,
  1955. unlink: MEMFS.node_ops.unlink,
  1956. rmdir: MEMFS.node_ops.rmdir,
  1957. readdir: MEMFS.node_ops.readdir,
  1958. symlink: MEMFS.node_ops.symlink
  1959. },
  1960. stream: {
  1961. llseek: MEMFS.stream_ops.llseek
  1962. }
  1963. },
  1964. file: {
  1965. node: {
  1966. getattr: MEMFS.node_ops.getattr,
  1967. setattr: MEMFS.node_ops.setattr
  1968. },
  1969. stream: {
  1970. llseek: MEMFS.stream_ops.llseek,
  1971. read: MEMFS.stream_ops.read,
  1972. write: MEMFS.stream_ops.write,
  1973. allocate: MEMFS.stream_ops.allocate,
  1974. mmap: MEMFS.stream_ops.mmap,
  1975. msync: MEMFS.stream_ops.msync
  1976. }
  1977. },
  1978. link: {
  1979. node: {
  1980. getattr: MEMFS.node_ops.getattr,
  1981. setattr: MEMFS.node_ops.setattr,
  1982. readlink: MEMFS.node_ops.readlink
  1983. },
  1984. stream: {}
  1985. },
  1986. chrdev: {
  1987. node: {
  1988. getattr: MEMFS.node_ops.getattr,
  1989. setattr: MEMFS.node_ops.setattr
  1990. },
  1991. stream: FS.chrdev_stream_ops
  1992. }
  1993. }
  1994. }
  1995. var node = FS.createNode(parent, name, mode, dev);
  1996. if (FS.isDir(node.mode)) {
  1997. node.node_ops = MEMFS.ops_table.dir.node;
  1998. node.stream_ops = MEMFS.ops_table.dir.stream;
  1999. node.contents = {}
  2000. } else if (FS.isFile(node.mode)) {
  2001. node.node_ops = MEMFS.ops_table.file.node;
  2002. node.stream_ops = MEMFS.ops_table.file.stream;
  2003. node.usedBytes = 0;
  2004. node.contents = null
  2005. } else if (FS.isLink(node.mode)) {
  2006. node.node_ops = MEMFS.ops_table.link.node;
  2007. node.stream_ops = MEMFS.ops_table.link.stream
  2008. } else if (FS.isChrdev(node.mode)) {
  2009. node.node_ops = MEMFS.ops_table.chrdev.node;
  2010. node.stream_ops = MEMFS.ops_table.chrdev.stream
  2011. }
  2012. node.timestamp = Date.now();
  2013. if (parent) {
  2014. parent.contents[name] = node
  2015. }
  2016. return node
  2017. }),
  2018. getFileDataAsRegularArray: (function (node) {
  2019. if (node.contents && node.contents.subarray) {
  2020. var arr = [];
  2021. for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]);
  2022. return arr
  2023. }
  2024. return node.contents
  2025. }),
  2026. getFileDataAsTypedArray: (function (node) {
  2027. if (!node.contents) return new Uint8Array;
  2028. if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes);
  2029. return new Uint8Array(node.contents)
  2030. }),
  2031. expandFileStorage: (function (node, newCapacity) {
  2032. if (node.contents && node.contents.subarray && newCapacity > node.contents.length) {
  2033. node.contents = MEMFS.getFileDataAsRegularArray(node);
  2034. node.usedBytes = node.contents.length
  2035. }
  2036. if (!node.contents || node.contents.subarray) {
  2037. var prevCapacity = node.contents ? node.contents.length : 0;
  2038. if (prevCapacity >= newCapacity) return;
  2039. var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  2040. newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) | 0);
  2041. if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);
  2042. var oldContents = node.contents;
  2043. node.contents = new Uint8Array(newCapacity);
  2044. if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  2045. return
  2046. }
  2047. if (!node.contents && newCapacity > 0) node.contents = [];
  2048. while (node.contents.length < newCapacity) node.contents.push(0)
  2049. }),
  2050. resizeFileStorage: (function (node, newSize) {
  2051. if (node.usedBytes == newSize) return;
  2052. if (newSize == 0) {
  2053. node.contents = null;
  2054. node.usedBytes = 0;
  2055. return
  2056. }
  2057. if (!node.contents || node.contents.subarray) {
  2058. var oldContents = node.contents;
  2059. node.contents = new Uint8Array(new ArrayBuffer(newSize));
  2060. if (oldContents) {
  2061. node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)))
  2062. }
  2063. node.usedBytes = newSize;
  2064. return
  2065. }
  2066. if (!node.contents) node.contents = [];
  2067. if (node.contents.length > newSize) node.contents.length = newSize;
  2068. else
  2069. while (node.contents.length < newSize) node.contents.push(0);
  2070. node.usedBytes = newSize
  2071. }),
  2072. node_ops: {
  2073. getattr: (function (node) {
  2074. var attr = {};
  2075. attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  2076. attr.ino = node.id;
  2077. attr.mode = node.mode;
  2078. attr.nlink = 1;
  2079. attr.uid = 0;
  2080. attr.gid = 0;
  2081. attr.rdev = node.rdev;
  2082. if (FS.isDir(node.mode)) {
  2083. attr.size = 4096
  2084. } else if (FS.isFile(node.mode)) {
  2085. attr.size = node.usedBytes
  2086. } else if (FS.isLink(node.mode)) {
  2087. attr.size = node.link.length
  2088. } else {
  2089. attr.size = 0
  2090. }
  2091. attr.atime = new Date(node.timestamp);
  2092. attr.mtime = new Date(node.timestamp);
  2093. attr.ctime = new Date(node.timestamp);
  2094. attr.blksize = 4096;
  2095. attr.blocks = Math.ceil(attr.size / attr.blksize);
  2096. return attr
  2097. }),
  2098. setattr: (function (node, attr) {
  2099. if (attr.mode !== undefined) {
  2100. node.mode = attr.mode
  2101. }
  2102. if (attr.timestamp !== undefined) {
  2103. node.timestamp = attr.timestamp
  2104. }
  2105. if (attr.size !== undefined) {
  2106. MEMFS.resizeFileStorage(node, attr.size)
  2107. }
  2108. }),
  2109. lookup: (function (parent, name) {
  2110. throw FS.genericErrors[ERRNO_CODES.ENOENT]
  2111. }),
  2112. mknod: (function (parent, name, mode, dev) {
  2113. return MEMFS.createNode(parent, name, mode, dev)
  2114. }),
  2115. rename: (function (old_node, new_dir, new_name) {
  2116. if (FS.isDir(old_node.mode)) {
  2117. var new_node;
  2118. try {
  2119. new_node = FS.lookupNode(new_dir, new_name)
  2120. } catch (e) {}
  2121. if (new_node) {
  2122. for (var i in new_node.contents) {
  2123. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2124. }
  2125. }
  2126. }
  2127. delete old_node.parent.contents[old_node.name];
  2128. old_node.name = new_name;
  2129. new_dir.contents[new_name] = old_node;
  2130. old_node.parent = new_dir
  2131. }),
  2132. unlink: (function (parent, name) {
  2133. delete parent.contents[name]
  2134. }),
  2135. rmdir: (function (parent, name) {
  2136. var node = FS.lookupNode(parent, name);
  2137. for (var i in node.contents) {
  2138. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2139. }
  2140. delete parent.contents[name]
  2141. }),
  2142. readdir: (function (node) {
  2143. var entries = [".", ".."];
  2144. for (var key in node.contents) {
  2145. if (!node.contents.hasOwnProperty(key)) {
  2146. continue
  2147. }
  2148. entries.push(key)
  2149. }
  2150. return entries
  2151. }),
  2152. symlink: (function (parent, newname, oldpath) {
  2153. var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  2154. node.link = oldpath;
  2155. return node
  2156. }),
  2157. readlink: (function (node) {
  2158. if (!FS.isLink(node.mode)) {
  2159. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2160. }
  2161. return node.link
  2162. })
  2163. },
  2164. stream_ops: {
  2165. read: (function (stream, buffer, offset, length, position) {
  2166. var contents = stream.node.contents;
  2167. if (position >= stream.node.usedBytes) return 0;
  2168. var size = Math.min(stream.node.usedBytes - position, length);
  2169. assert(size >= 0);
  2170. if (size > 8 && contents.subarray) {
  2171. buffer.set(contents.subarray(position, position + size), offset)
  2172. } else {
  2173. for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]
  2174. }
  2175. return size
  2176. }),
  2177. write: (function (stream, buffer, offset, length, position, canOwn) {
  2178. if (!length) return 0;
  2179. var node = stream.node;
  2180. node.timestamp = Date.now();
  2181. if (buffer.subarray && (!node.contents || node.contents.subarray)) {
  2182. if (canOwn) {
  2183. node.contents = buffer.subarray(offset, offset + length);
  2184. node.usedBytes = length;
  2185. return length
  2186. } else if (node.usedBytes === 0 && position === 0) {
  2187. node.contents = new Uint8Array(buffer.subarray(offset, offset + length));
  2188. node.usedBytes = length;
  2189. return length
  2190. } else if (position + length <= node.usedBytes) {
  2191. node.contents.set(buffer.subarray(offset, offset + length), position);
  2192. return length
  2193. }
  2194. }
  2195. MEMFS.expandFileStorage(node, position + length);
  2196. if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position);
  2197. else {
  2198. for (var i = 0; i < length; i++) {
  2199. node.contents[position + i] = buffer[offset + i]
  2200. }
  2201. }
  2202. node.usedBytes = Math.max(node.usedBytes, position + length);
  2203. return length
  2204. }),
  2205. llseek: (function (stream, offset, whence) {
  2206. var position = offset;
  2207. if (whence === 1) {
  2208. position += stream.position
  2209. } else if (whence === 2) {
  2210. if (FS.isFile(stream.node.mode)) {
  2211. position += stream.node.usedBytes
  2212. }
  2213. }
  2214. if (position < 0) {
  2215. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2216. }
  2217. return position
  2218. }),
  2219. allocate: (function (stream, offset, length) {
  2220. MEMFS.expandFileStorage(stream.node, offset + length);
  2221. stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length)
  2222. }),
  2223. mmap: (function (stream, buffer, offset, length, position, prot, flags) {
  2224. if (!FS.isFile(stream.node.mode)) {
  2225. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2226. }
  2227. var ptr;
  2228. var allocated;
  2229. var contents = stream.node.contents;
  2230. if (!(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer)) {
  2231. allocated = false;
  2232. ptr = contents.byteOffset
  2233. } else {
  2234. if (position > 0 || position + length < stream.node.usedBytes) {
  2235. if (contents.subarray) {
  2236. contents = contents.subarray(position, position + length)
  2237. } else {
  2238. contents = Array.prototype.slice.call(contents, position, position + length)
  2239. }
  2240. }
  2241. allocated = true;
  2242. ptr = _malloc(length);
  2243. if (!ptr) {
  2244. throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)
  2245. }
  2246. buffer.set(contents, ptr)
  2247. }
  2248. return {
  2249. ptr: ptr,
  2250. allocated: allocated
  2251. }
  2252. }),
  2253. msync: (function (stream, buffer, offset, length, mmapFlags) {
  2254. if (!FS.isFile(stream.node.mode)) {
  2255. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2256. }
  2257. if (mmapFlags & 2) {
  2258. return 0
  2259. }
  2260. var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
  2261. return 0
  2262. })
  2263. }
  2264. };
  2265. var IDBFS = {
  2266. dbs: {},
  2267. indexedDB: (function () {
  2268. if (typeof indexedDB !== "undefined") return indexedDB;
  2269. var ret = null;
  2270. if (typeof window === "object") ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  2271. assert(ret, "IDBFS used, but indexedDB not supported");
  2272. return ret
  2273. }),
  2274. DB_VERSION: 21,
  2275. DB_STORE_NAME: "FILE_DATA",
  2276. mount: (function (mount) {
  2277. return MEMFS.mount.apply(null, arguments)
  2278. }),
  2279. syncfs: (function (mount, populate, callback) {
  2280. IDBFS.getLocalSet(mount, (function (err, local) {
  2281. if (err) return callback(err);
  2282. IDBFS.getRemoteSet(mount, (function (err, remote) {
  2283. if (err) return callback(err);
  2284. var src = populate ? remote : local;
  2285. var dst = populate ? local : remote;
  2286. IDBFS.reconcile(src, dst, callback)
  2287. }))
  2288. }))
  2289. }),
  2290. getDB: (function (name, callback) {
  2291. var db = IDBFS.dbs[name];
  2292. if (db) {
  2293. return callback(null, db)
  2294. }
  2295. var req;
  2296. try {
  2297. req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION)
  2298. } catch (e) {
  2299. return callback(e)
  2300. }
  2301. if (!req) {
  2302. return callback("Unable to connect to IndexedDB")
  2303. }
  2304. req.onupgradeneeded = (function (e) {
  2305. var db = e.target.result;
  2306. var transaction = e.target.transaction;
  2307. var fileStore;
  2308. if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
  2309. fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME)
  2310. } else {
  2311. fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME)
  2312. }
  2313. if (!fileStore.indexNames.contains("timestamp")) {
  2314. fileStore.createIndex("timestamp", "timestamp", {
  2315. unique: false
  2316. })
  2317. }
  2318. });
  2319. req.onsuccess = (function () {
  2320. db = req.result;
  2321. IDBFS.dbs[name] = db;
  2322. callback(null, db)
  2323. });
  2324. req.onerror = (function (e) {
  2325. callback(this.error);
  2326. e.preventDefault()
  2327. })
  2328. }),
  2329. getLocalSet: (function (mount, callback) {
  2330. var entries = {};
  2331.  
  2332. function isRealDir(p) {
  2333. return p !== "." && p !== ".."
  2334. }
  2335.  
  2336. function toAbsolute(root) {
  2337. return (function (p) {
  2338. return PATH.join2(root, p)
  2339. })
  2340. }
  2341. var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));
  2342. while (check.length) {
  2343. var path = check.pop();
  2344. var stat;
  2345. try {
  2346. stat = FS.stat(path)
  2347. } catch (e) {
  2348. return callback(e)
  2349. }
  2350. if (FS.isDir(stat.mode)) {
  2351. check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))
  2352. }
  2353. entries[path] = {
  2354. timestamp: stat.mtime
  2355. }
  2356. }
  2357. return callback(null, {
  2358. type: "local",
  2359. entries: entries
  2360. })
  2361. }),
  2362. getRemoteSet: (function (mount, callback) {
  2363. var entries = {};
  2364. IDBFS.getDB(mount.mountpoint, (function (err, db) {
  2365. if (err) return callback(err);
  2366. var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readonly");
  2367. transaction.onerror = (function (e) {
  2368. callback(this.error);
  2369. e.preventDefault()
  2370. });
  2371. var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2372. var index = store.index("timestamp");
  2373. index.openKeyCursor().onsuccess = (function (event) {
  2374. var cursor = event.target.result;
  2375. if (!cursor) {
  2376. return callback(null, {
  2377. type: "remote",
  2378. db: db,
  2379. entries: entries
  2380. })
  2381. }
  2382. entries[cursor.primaryKey] = {
  2383. timestamp: cursor.key
  2384. };
  2385. cursor.continue()
  2386. })
  2387. }))
  2388. }),
  2389. loadLocalEntry: (function (path, callback) {
  2390. var stat, node;
  2391. try {
  2392. var lookup = FS.lookupPath(path);
  2393. node = lookup.node;
  2394. stat = FS.stat(path)
  2395. } catch (e) {
  2396. return callback(e)
  2397. }
  2398. if (FS.isDir(stat.mode)) {
  2399. return callback(null, {
  2400. timestamp: stat.mtime,
  2401. mode: stat.mode
  2402. })
  2403. } else if (FS.isFile(stat.mode)) {
  2404. node.contents = MEMFS.getFileDataAsTypedArray(node);
  2405. return callback(null, {
  2406. timestamp: stat.mtime,
  2407. mode: stat.mode,
  2408. contents: node.contents
  2409. })
  2410. } else {
  2411. return callback(new Error("node type not supported"))
  2412. }
  2413. }),
  2414. storeLocalEntry: (function (path, entry, callback) {
  2415. try {
  2416. if (FS.isDir(entry.mode)) {
  2417. FS.mkdir(path, entry.mode)
  2418. } else if (FS.isFile(entry.mode)) {
  2419. FS.writeFile(path, entry.contents, {
  2420. encoding: "binary",
  2421. canOwn: true
  2422. })
  2423. } else {
  2424. return callback(new Error("node type not supported"))
  2425. }
  2426. FS.chmod(path, entry.mode);
  2427. FS.utime(path, entry.timestamp, entry.timestamp)
  2428. } catch (e) {
  2429. return callback(e)
  2430. }
  2431. callback(null)
  2432. }),
  2433. removeLocalEntry: (function (path, callback) {
  2434. try {
  2435. var lookup = FS.lookupPath(path);
  2436. var stat = FS.stat(path);
  2437. if (FS.isDir(stat.mode)) {
  2438. FS.rmdir(path)
  2439. } else if (FS.isFile(stat.mode)) {
  2440. FS.unlink(path)
  2441. }
  2442. } catch (e) {
  2443. return callback(e)
  2444. }
  2445. callback(null)
  2446. }),
  2447. loadRemoteEntry: (function (store, path, callback) {
  2448. var req = store.get(path);
  2449. req.onsuccess = (function (event) {
  2450. callback(null, event.target.result)
  2451. });
  2452. req.onerror = (function (e) {
  2453. callback(this.error);
  2454. e.preventDefault()
  2455. })
  2456. }),
  2457. storeRemoteEntry: (function (store, path, entry, callback) {
  2458. var req = store.put(entry, path);
  2459. req.onsuccess = (function () {
  2460. callback(null)
  2461. });
  2462. req.onerror = (function (e) {
  2463. callback(this.error);
  2464. e.preventDefault()
  2465. })
  2466. }),
  2467. removeRemoteEntry: (function (store, path, callback) {
  2468. var req = store.delete(path);
  2469. req.onsuccess = (function () {
  2470. callback(null)
  2471. });
  2472. req.onerror = (function (e) {
  2473. callback(this.error);
  2474. e.preventDefault()
  2475. })
  2476. }),
  2477. reconcile: (function (src, dst, callback) {
  2478. var total = 0;
  2479. var create = [];
  2480. Object.keys(src.entries).forEach((function (key) {
  2481. var e = src.entries[key];
  2482. var e2 = dst.entries[key];
  2483. if (!e2 || e.timestamp > e2.timestamp) {
  2484. create.push(key);
  2485. total++
  2486. }
  2487. }));
  2488. var remove = [];
  2489. Object.keys(dst.entries).forEach((function (key) {
  2490. var e = dst.entries[key];
  2491. var e2 = src.entries[key];
  2492. if (!e2) {
  2493. remove.push(key);
  2494. total++
  2495. }
  2496. }));
  2497. if (!total) {
  2498. return callback(null)
  2499. }
  2500. var completed = 0;
  2501. var db = src.type === "remote" ? src.db : dst.db;
  2502. var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readwrite");
  2503. var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2504.  
  2505. function done(err) {
  2506. if (err) {
  2507. if (!done.errored) {
  2508. done.errored = true;
  2509. return callback(err)
  2510. }
  2511. return
  2512. }
  2513. if (++completed >= total) {
  2514. return callback(null)
  2515. }
  2516. }
  2517. transaction.onerror = (function (e) {
  2518. done(this.error);
  2519. e.preventDefault()
  2520. });
  2521. create.sort().forEach((function (path) {
  2522. if (dst.type === "local") {
  2523. IDBFS.loadRemoteEntry(store, path, (function (err, entry) {
  2524. if (err) return done(err);
  2525. IDBFS.storeLocalEntry(path, entry, done)
  2526. }))
  2527. } else {
  2528. IDBFS.loadLocalEntry(path, (function (err, entry) {
  2529. if (err) return done(err);
  2530. IDBFS.storeRemoteEntry(store, path, entry, done)
  2531. }))
  2532. }
  2533. }));
  2534. remove.sort().reverse().forEach((function (path) {
  2535. if (dst.type === "local") {
  2536. IDBFS.removeLocalEntry(path, done)
  2537. } else {
  2538. IDBFS.removeRemoteEntry(store, path, done)
  2539. }
  2540. }))
  2541. })
  2542. };
  2543. var NODEFS = {
  2544. isWindows: false,
  2545. staticInit: (function () {
  2546. NODEFS.isWindows = !!process.platform.match(/^win/)
  2547. }),
  2548. mount: (function (mount) {
  2549. assert(ENVIRONMENT_IS_NODE);
  2550. return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0)
  2551. }),
  2552. createNode: (function (parent, name, mode, dev) {
  2553. if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
  2554. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2555. }
  2556. var node = FS.createNode(parent, name, mode);
  2557. node.node_ops = NODEFS.node_ops;
  2558. node.stream_ops = NODEFS.stream_ops;
  2559. return node
  2560. }),
  2561. getMode: (function (path) {
  2562. var stat;
  2563. try {
  2564. stat = fs.lstatSync(path);
  2565. if (NODEFS.isWindows) {
  2566. stat.mode = stat.mode | (stat.mode & 146) >> 1
  2567. }
  2568. } catch (e) {
  2569. if (!e.code) throw e;
  2570. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2571. }
  2572. return stat.mode
  2573. }),
  2574. realPath: (function (node) {
  2575. var parts = [];
  2576. while (node.parent !== node) {
  2577. parts.push(node.name);
  2578. node = node.parent
  2579. }
  2580. parts.push(node.mount.opts.root);
  2581. parts.reverse();
  2582. return PATH.join.apply(null, parts)
  2583. }),
  2584. flagsToPermissionStringMap: {
  2585. 0: "r",
  2586. 1: "r+",
  2587. 2: "r+",
  2588. 64: "r",
  2589. 65: "r+",
  2590. 66: "r+",
  2591. 129: "rx+",
  2592. 193: "rx+",
  2593. 514: "w+",
  2594. 577: "w",
  2595. 578: "w+",
  2596. 705: "wx",
  2597. 706: "wx+",
  2598. 1024: "a",
  2599. 1025: "a",
  2600. 1026: "a+",
  2601. 1089: "a",
  2602. 1090: "a+",
  2603. 1153: "ax",
  2604. 1154: "ax+",
  2605. 1217: "ax",
  2606. 1218: "ax+",
  2607. 4096: "rs",
  2608. 4098: "rs+"
  2609. },
  2610. flagsToPermissionString: (function (flags) {
  2611. flags &= ~2097152;
  2612. flags &= ~2048;
  2613. flags &= ~32768;
  2614. flags &= ~524288;
  2615. if (flags in NODEFS.flagsToPermissionStringMap) {
  2616. return NODEFS.flagsToPermissionStringMap[flags]
  2617. } else {
  2618. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2619. }
  2620. }),
  2621. node_ops: {
  2622. getattr: (function (node) {
  2623. var path = NODEFS.realPath(node);
  2624. var stat;
  2625. try {
  2626. stat = fs.lstatSync(path)
  2627. } catch (e) {
  2628. if (!e.code) throw e;
  2629. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2630. }
  2631. if (NODEFS.isWindows && !stat.blksize) {
  2632. stat.blksize = 4096
  2633. }
  2634. if (NODEFS.isWindows && !stat.blocks) {
  2635. stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0
  2636. }
  2637. return {
  2638. dev: stat.dev,
  2639. ino: stat.ino,
  2640. mode: stat.mode,
  2641. nlink: stat.nlink,
  2642. uid: stat.uid,
  2643. gid: stat.gid,
  2644. rdev: stat.rdev,
  2645. size: stat.size,
  2646. atime: stat.atime,
  2647. mtime: stat.mtime,
  2648. ctime: stat.ctime,
  2649. blksize: stat.blksize,
  2650. blocks: stat.blocks
  2651. }
  2652. }),
  2653. setattr: (function (node, attr) {
  2654. var path = NODEFS.realPath(node);
  2655. try {
  2656. if (attr.mode !== undefined) {
  2657. fs.chmodSync(path, attr.mode);
  2658. node.mode = attr.mode
  2659. }
  2660. if (attr.timestamp !== undefined) {
  2661. var date = new Date(attr.timestamp);
  2662. fs.utimesSync(path, date, date)
  2663. }
  2664. if (attr.size !== undefined) {
  2665. fs.truncateSync(path, attr.size)
  2666. }
  2667. } catch (e) {
  2668. if (!e.code) throw e;
  2669. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2670. }
  2671. }),
  2672. lookup: (function (parent, name) {
  2673. var path = PATH.join2(NODEFS.realPath(parent), name);
  2674. var mode = NODEFS.getMode(path);
  2675. return NODEFS.createNode(parent, name, mode)
  2676. }),
  2677. mknod: (function (parent, name, mode, dev) {
  2678. var node = NODEFS.createNode(parent, name, mode, dev);
  2679. var path = NODEFS.realPath(node);
  2680. try {
  2681. if (FS.isDir(node.mode)) {
  2682. fs.mkdirSync(path, node.mode)
  2683. } else {
  2684. fs.writeFileSync(path, "", {
  2685. mode: node.mode
  2686. })
  2687. }
  2688. } catch (e) {
  2689. if (!e.code) throw e;
  2690. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2691. }
  2692. return node
  2693. }),
  2694. rename: (function (oldNode, newDir, newName) {
  2695. var oldPath = NODEFS.realPath(oldNode);
  2696. var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
  2697. try {
  2698. fs.renameSync(oldPath, newPath)
  2699. } catch (e) {
  2700. if (!e.code) throw e;
  2701. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2702. }
  2703. }),
  2704. unlink: (function (parent, name) {
  2705. var path = PATH.join2(NODEFS.realPath(parent), name);
  2706. try {
  2707. fs.unlinkSync(path)
  2708. } catch (e) {
  2709. if (!e.code) throw e;
  2710. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2711. }
  2712. }),
  2713. rmdir: (function (parent, name) {
  2714. var path = PATH.join2(NODEFS.realPath(parent), name);
  2715. try {
  2716. fs.rmdirSync(path)
  2717. } catch (e) {
  2718. if (!e.code) throw e;
  2719. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2720. }
  2721. }),
  2722. readdir: (function (node) {
  2723. var path = NODEFS.realPath(node);
  2724. try {
  2725. return fs.readdirSync(path)
  2726. } catch (e) {
  2727. if (!e.code) throw e;
  2728. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2729. }
  2730. }),
  2731. symlink: (function (parent, newName, oldPath) {
  2732. var newPath = PATH.join2(NODEFS.realPath(parent), newName);
  2733. try {
  2734. fs.symlinkSync(oldPath, newPath)
  2735. } catch (e) {
  2736. if (!e.code) throw e;
  2737. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2738. }
  2739. }),
  2740. readlink: (function (node) {
  2741. var path = NODEFS.realPath(node);
  2742. try {
  2743. path = fs.readlinkSync(path);
  2744. path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path);
  2745. return path
  2746. } catch (e) {
  2747. if (!e.code) throw e;
  2748. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2749. }
  2750. })
  2751. },
  2752. stream_ops: {
  2753. open: (function (stream) {
  2754. var path = NODEFS.realPath(stream.node);
  2755. try {
  2756. if (FS.isFile(stream.node.mode)) {
  2757. stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags))
  2758. }
  2759. } catch (e) {
  2760. if (!e.code) throw e;
  2761. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2762. }
  2763. }),
  2764. close: (function (stream) {
  2765. try {
  2766. if (FS.isFile(stream.node.mode) && stream.nfd) {
  2767. fs.closeSync(stream.nfd)
  2768. }
  2769. } catch (e) {
  2770. if (!e.code) throw e;
  2771. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2772. }
  2773. }),
  2774. read: (function (stream, buffer, offset, length, position) {
  2775. if (length === 0) return 0;
  2776. var nbuffer = new Buffer(length);
  2777. var res;
  2778. try {
  2779. res = fs.readSync(stream.nfd, nbuffer, 0, length, position)
  2780. } catch (e) {
  2781. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2782. }
  2783. if (res > 0) {
  2784. for (var i = 0; i < res; i++) {
  2785. buffer[offset + i] = nbuffer[i]
  2786. }
  2787. }
  2788. return res
  2789. }),
  2790. write: (function (stream, buffer, offset, length, position) {
  2791. var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
  2792. var res;
  2793. try {
  2794. res = fs.writeSync(stream.nfd, nbuffer, 0, length, position)
  2795. } catch (e) {
  2796. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2797. }
  2798. return res
  2799. }),
  2800. llseek: (function (stream, offset, whence) {
  2801. var position = offset;
  2802. if (whence === 1) {
  2803. position += stream.position
  2804. } else if (whence === 2) {
  2805. if (FS.isFile(stream.node.mode)) {
  2806. try {
  2807. var stat = fs.fstatSync(stream.nfd);
  2808. position += stat.size
  2809. } catch (e) {
  2810. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2811. }
  2812. }
  2813. }
  2814. if (position < 0) {
  2815. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2816. }
  2817. return position
  2818. })
  2819. }
  2820. };
  2821. var WORKERFS = {
  2822. DIR_MODE: 16895,
  2823. FILE_MODE: 33279,
  2824. reader: null,
  2825. mount: (function (mount) {
  2826. assert(ENVIRONMENT_IS_WORKER);
  2827. if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync;
  2828. var root = WORKERFS.createNode(null, "/", WORKERFS.DIR_MODE, 0);
  2829. var createdParents = {};
  2830.  
  2831. function ensureParent(path) {
  2832. var parts = path.split("/");
  2833. var parent = root;
  2834. for (var i = 0; i < parts.length - 1; i++) {
  2835. var curr = parts.slice(0, i + 1).join("/");
  2836. if (!createdParents[curr]) {
  2837. createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0)
  2838. }
  2839. parent = createdParents[curr]
  2840. }
  2841. return parent
  2842. }
  2843.  
  2844. function base(path) {
  2845. var parts = path.split("/");
  2846. return parts[parts.length - 1]
  2847. }
  2848. Array.prototype.forEach.call(mount.opts["files"] || [], (function (file) {
  2849. WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate)
  2850. }));
  2851. (mount.opts["blobs"] || []).forEach((function (obj) {
  2852. WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"])
  2853. }));
  2854. (mount.opts["packages"] || []).forEach((function (pack) {
  2855. pack["metadata"].files.forEach((function (file) {
  2856. var name = file.filename.substr(1);
  2857. WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack["blob"].slice(file.start, file.end))
  2858. }))
  2859. }));
  2860. return root
  2861. }),
  2862. createNode: (function (parent, name, mode, dev, contents, mtime) {
  2863. var node = FS.createNode(parent, name, mode);
  2864. node.mode = mode;
  2865. node.node_ops = WORKERFS.node_ops;
  2866. node.stream_ops = WORKERFS.stream_ops;
  2867. node.timestamp = (mtime || new Date).getTime();
  2868. assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE);
  2869. if (mode === WORKERFS.FILE_MODE) {
  2870. node.size = contents.size;
  2871. node.contents = contents
  2872. } else {
  2873. node.size = 4096;
  2874. node.contents = {}
  2875. }
  2876. if (parent) {
  2877. parent.contents[name] = node
  2878. }
  2879. return node
  2880. }),
  2881. node_ops: {
  2882. getattr: (function (node) {
  2883. return {
  2884. dev: 1,
  2885. ino: undefined,
  2886. mode: node.mode,
  2887. nlink: 1,
  2888. uid: 0,
  2889. gid: 0,
  2890. rdev: undefined,
  2891. size: node.size,
  2892. atime: new Date(node.timestamp),
  2893. mtime: new Date(node.timestamp),
  2894. ctime: new Date(node.timestamp),
  2895. blksize: 4096,
  2896. blocks: Math.ceil(node.size / 4096)
  2897. }
  2898. }),
  2899. setattr: (function (node, attr) {
  2900. if (attr.mode !== undefined) {
  2901. node.mode = attr.mode
  2902. }
  2903. if (attr.timestamp !== undefined) {
  2904. node.timestamp = attr.timestamp
  2905. }
  2906. }),
  2907. lookup: (function (parent, name) {
  2908. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  2909. }),
  2910. mknod: (function (parent, name, mode, dev) {
  2911. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2912. }),
  2913. rename: (function (oldNode, newDir, newName) {
  2914. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2915. }),
  2916. unlink: (function (parent, name) {
  2917. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2918. }),
  2919. rmdir: (function (parent, name) {
  2920. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2921. }),
  2922. readdir: (function (node) {
  2923. var entries = [".", ".."];
  2924. for (var key in node.contents) {
  2925. if (!node.contents.hasOwnProperty(key)) {
  2926. continue
  2927. }
  2928. entries.push(key)
  2929. }
  2930. return entries
  2931. }),
  2932. symlink: (function (parent, newName, oldPath) {
  2933. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2934. }),
  2935. readlink: (function (node) {
  2936. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2937. })
  2938. },
  2939. stream_ops: {
  2940. read: (function (stream, buffer, offset, length, position) {
  2941. if (position >= stream.node.size) return 0;
  2942. var chunk = stream.node.contents.slice(position, position + length);
  2943. var ab = WORKERFS.reader.readAsArrayBuffer(chunk);
  2944. buffer.set(new Uint8Array(ab), offset);
  2945. return chunk.size
  2946. }),
  2947. write: (function (stream, buffer, offset, length, position) {
  2948. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  2949. }),
  2950. llseek: (function (stream, offset, whence) {
  2951. var position = offset;
  2952. if (whence === 1) {
  2953. position += stream.position
  2954. } else if (whence === 2) {
  2955. if (FS.isFile(stream.node.mode)) {
  2956. position += stream.node.size
  2957. }
  2958. }
  2959. if (position < 0) {
  2960. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2961. }
  2962. return position
  2963. })
  2964. }
  2965. };
  2966. STATICTOP += 16;
  2967. STATICTOP += 16;
  2968. STATICTOP += 16;
  2969. var FS = {
  2970. root: null,
  2971. mounts: [],
  2972. devices: [null],
  2973. streams: [],
  2974. nextInode: 1,
  2975. nameTable: null,
  2976. currentPath: "/",
  2977. initialized: false,
  2978. ignorePermissions: true,
  2979. trackingDelegate: {},
  2980. tracking: {
  2981. openFlags: {
  2982. READ: 1,
  2983. WRITE: 2
  2984. }
  2985. },
  2986. ErrnoError: null,
  2987. genericErrors: {},
  2988. filesystems: null,
  2989. syncFSRequests: 0,
  2990. handleFSError: (function (e) {
  2991. if (!(e instanceof FS.ErrnoError)) throw e + " : " + stackTrace();
  2992. return ___setErrNo(e.errno)
  2993. }),
  2994. lookupPath: (function (path, opts) {
  2995. path = PATH.resolve(FS.cwd(), path);
  2996. opts = opts || {};
  2997. if (!path) return {
  2998. path: "",
  2999. node: null
  3000. };
  3001. var defaults = {
  3002. follow_mount: true,
  3003. recurse_count: 0
  3004. };
  3005. for (var key in defaults) {
  3006. if (opts[key] === undefined) {
  3007. opts[key] = defaults[key]
  3008. }
  3009. }
  3010. if (opts.recurse_count > 8) {
  3011. throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  3012. }
  3013. var parts = PATH.normalizeArray(path.split("/").filter((function (p) {
  3014. return !!p
  3015. })), false);
  3016. var current = FS.root;
  3017. var current_path = "/";
  3018. for (var i = 0; i < parts.length; i++) {
  3019. var islast = i === parts.length - 1;
  3020. if (islast && opts.parent) {
  3021. break
  3022. }
  3023. current = FS.lookupNode(current, parts[i]);
  3024. current_path = PATH.join2(current_path, parts[i]);
  3025. if (FS.isMountpoint(current)) {
  3026. if (!islast || islast && opts.follow_mount) {
  3027. current = current.mounted.root
  3028. }
  3029. }
  3030. if (!islast || opts.follow) {
  3031. var count = 0;
  3032. while (FS.isLink(current.mode)) {
  3033. var link = FS.readlink(current_path);
  3034. current_path = PATH.resolve(PATH.dirname(current_path), link);
  3035. var lookup = FS.lookupPath(current_path, {
  3036. recurse_count: opts.recurse_count
  3037. });
  3038. current = lookup.node;
  3039. if (count++ > 40) {
  3040. throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  3041. }
  3042. }
  3043. }
  3044. }
  3045. return {
  3046. path: current_path,
  3047. node: current
  3048. }
  3049. }),
  3050. getPath: (function (node) {
  3051. var path;
  3052. while (true) {
  3053. if (FS.isRoot(node)) {
  3054. var mount = node.mount.mountpoint;
  3055. if (!path) return mount;
  3056. return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path
  3057. }
  3058. path = path ? node.name + "/" + path : node.name;
  3059. node = node.parent
  3060. }
  3061. }),
  3062. hashName: (function (parentid, name) {
  3063. var hash = 0;
  3064. for (var i = 0; i < name.length; i++) {
  3065. hash = (hash << 5) - hash + name.charCodeAt(i) | 0
  3066. }
  3067. return (parentid + hash >>> 0) % FS.nameTable.length
  3068. }),
  3069. hashAddNode: (function (node) {
  3070. var hash = FS.hashName(node.parent.id, node.name);
  3071. node.name_next = FS.nameTable[hash];
  3072. FS.nameTable[hash] = node
  3073. }),
  3074. hashRemoveNode: (function (node) {
  3075. var hash = FS.hashName(node.parent.id, node.name);
  3076. if (FS.nameTable[hash] === node) {
  3077. FS.nameTable[hash] = node.name_next
  3078. } else {
  3079. var current = FS.nameTable[hash];
  3080. while (current) {
  3081. if (current.name_next === node) {
  3082. current.name_next = node.name_next;
  3083. break
  3084. }
  3085. current = current.name_next
  3086. }
  3087. }
  3088. }),
  3089. lookupNode: (function (parent, name) {
  3090. var err = FS.mayLookup(parent);
  3091. if (err) {
  3092. throw new FS.ErrnoError(err, parent)
  3093. }
  3094. var hash = FS.hashName(parent.id, name);
  3095. for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  3096. var nodeName = node.name;
  3097. if (node.parent.id === parent.id && nodeName === name) {
  3098. return node
  3099. }
  3100. }
  3101. return FS.lookup(parent, name)
  3102. }),
  3103. createNode: (function (parent, name, mode, rdev) {
  3104. if (!FS.FSNode) {
  3105. FS.FSNode = (function (parent, name, mode, rdev) {
  3106. if (!parent) {
  3107. parent = this
  3108. }
  3109. this.parent = parent;
  3110. this.mount = parent.mount;
  3111. this.mounted = null;
  3112. this.id = FS.nextInode++;
  3113. this.name = name;
  3114. this.mode = mode;
  3115. this.node_ops = {};
  3116. this.stream_ops = {};
  3117. this.rdev = rdev
  3118. });
  3119. FS.FSNode.prototype = {};
  3120. var readMode = 292 | 73;
  3121. var writeMode = 146;
  3122. Object.defineProperties(FS.FSNode.prototype, {
  3123. read: {
  3124. get: (function () {
  3125. return (this.mode & readMode) === readMode
  3126. }),
  3127. set: (function (val) {
  3128. val ? this.mode |= readMode : this.mode &= ~readMode
  3129. })
  3130. },
  3131. write: {
  3132. get: (function () {
  3133. return (this.mode & writeMode) === writeMode
  3134. }),
  3135. set: (function (val) {
  3136. val ? this.mode |= writeMode : this.mode &= ~writeMode
  3137. })
  3138. },
  3139. isFolder: {
  3140. get: (function () {
  3141. return FS.isDir(this.mode)
  3142. })
  3143. },
  3144. isDevice: {
  3145. get: (function () {
  3146. return FS.isChrdev(this.mode)
  3147. })
  3148. }
  3149. })
  3150. }
  3151. var node = new FS.FSNode(parent, name, mode, rdev);
  3152. FS.hashAddNode(node);
  3153. return node
  3154. }),
  3155. destroyNode: (function (node) {
  3156. FS.hashRemoveNode(node)
  3157. }),
  3158. isRoot: (function (node) {
  3159. return node === node.parent
  3160. }),
  3161. isMountpoint: (function (node) {
  3162. return !!node.mounted
  3163. }),
  3164. isFile: (function (mode) {
  3165. return (mode & 61440) === 32768
  3166. }),
  3167. isDir: (function (mode) {
  3168. return (mode & 61440) === 16384
  3169. }),
  3170. isLink: (function (mode) {
  3171. return (mode & 61440) === 40960
  3172. }),
  3173. isChrdev: (function (mode) {
  3174. return (mode & 61440) === 8192
  3175. }),
  3176. isBlkdev: (function (mode) {
  3177. return (mode & 61440) === 24576
  3178. }),
  3179. isFIFO: (function (mode) {
  3180. return (mode & 61440) === 4096
  3181. }),
  3182. isSocket: (function (mode) {
  3183. return (mode & 49152) === 49152
  3184. }),
  3185. flagModes: {
  3186. "r": 0,
  3187. "rs": 1052672,
  3188. "r+": 2,
  3189. "w": 577,
  3190. "wx": 705,
  3191. "xw": 705,
  3192. "w+": 578,
  3193. "wx+": 706,
  3194. "xw+": 706,
  3195. "a": 1089,
  3196. "ax": 1217,
  3197. "xa": 1217,
  3198. "a+": 1090,
  3199. "ax+": 1218,
  3200. "xa+": 1218
  3201. },
  3202. modeStringToFlags: (function (str) {
  3203. var flags = FS.flagModes[str];
  3204. if (typeof flags === "undefined") {
  3205. throw new Error("Unknown file open mode: " + str)
  3206. }
  3207. return flags
  3208. }),
  3209. flagsToPermissionString: (function (flag) {
  3210. var perms = ["r", "w", "rw"][flag & 3];
  3211. if (flag & 512) {
  3212. perms += "w"
  3213. }
  3214. return perms
  3215. }),
  3216. nodePermissions: (function (node, perms) {
  3217. if (FS.ignorePermissions) {
  3218. return 0
  3219. }
  3220. if (perms.indexOf("r") !== -1 && !(node.mode & 292)) {
  3221. return ERRNO_CODES.EACCES
  3222. } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) {
  3223. return ERRNO_CODES.EACCES
  3224. } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) {
  3225. return ERRNO_CODES.EACCES
  3226. }
  3227. return 0
  3228. }),
  3229. mayLookup: (function (dir) {
  3230. var err = FS.nodePermissions(dir, "x");
  3231. if (err) return err;
  3232. if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES;
  3233. return 0
  3234. }),
  3235. mayCreate: (function (dir, name) {
  3236. try {
  3237. var node = FS.lookupNode(dir, name);
  3238. return ERRNO_CODES.EEXIST
  3239. } catch (e) {}
  3240. return FS.nodePermissions(dir, "wx")
  3241. }),
  3242. mayDelete: (function (dir, name, isdir) {
  3243. var node;
  3244. try {
  3245. node = FS.lookupNode(dir, name)
  3246. } catch (e) {
  3247. return e.errno
  3248. }
  3249. var err = FS.nodePermissions(dir, "wx");
  3250. if (err) {
  3251. return err
  3252. }
  3253. if (isdir) {
  3254. if (!FS.isDir(node.mode)) {
  3255. return ERRNO_CODES.ENOTDIR
  3256. }
  3257. if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  3258. return ERRNO_CODES.EBUSY
  3259. }
  3260. } else {
  3261. if (FS.isDir(node.mode)) {
  3262. return ERRNO_CODES.EISDIR
  3263. }
  3264. }
  3265. return 0
  3266. }),
  3267. mayOpen: (function (node, flags) {
  3268. if (!node) {
  3269. return ERRNO_CODES.ENOENT
  3270. }
  3271. if (FS.isLink(node.mode)) {
  3272. return ERRNO_CODES.ELOOP
  3273. } else if (FS.isDir(node.mode)) {
  3274. if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  3275. return ERRNO_CODES.EISDIR
  3276. }
  3277. }
  3278. return FS.nodePermissions(node, FS.flagsToPermissionString(flags))
  3279. }),
  3280. MAX_OPEN_FDS: 4096,
  3281. nextfd: (function (fd_start, fd_end) {
  3282. fd_start = fd_start || 0;
  3283. fd_end = fd_end || FS.MAX_OPEN_FDS;
  3284. for (var fd = fd_start; fd <= fd_end; fd++) {
  3285. if (!FS.streams[fd]) {
  3286. return fd
  3287. }
  3288. }
  3289. throw new FS.ErrnoError(ERRNO_CODES.EMFILE)
  3290. }),
  3291. getStream: (function (fd) {
  3292. return FS.streams[fd]
  3293. }),
  3294. createStream: (function (stream, fd_start, fd_end) {
  3295. if (!FS.FSStream) {
  3296. FS.FSStream = (function () {});
  3297. FS.FSStream.prototype = {};
  3298. Object.defineProperties(FS.FSStream.prototype, {
  3299. object: {
  3300. get: (function () {
  3301. return this.node
  3302. }),
  3303. set: (function (val) {
  3304. this.node = val
  3305. })
  3306. },
  3307. isRead: {
  3308. get: (function () {
  3309. return (this.flags & 2097155) !== 1
  3310. })
  3311. },
  3312. isWrite: {
  3313. get: (function () {
  3314. return (this.flags & 2097155) !== 0
  3315. })
  3316. },
  3317. isAppend: {
  3318. get: (function () {
  3319. return this.flags & 1024
  3320. })
  3321. }
  3322. })
  3323. }
  3324. var newStream = new FS.FSStream;
  3325. for (var p in stream) {
  3326. newStream[p] = stream[p]
  3327. }
  3328. stream = newStream;
  3329. var fd = FS.nextfd(fd_start, fd_end);
  3330. stream.fd = fd;
  3331. FS.streams[fd] = stream;
  3332. return stream
  3333. }),
  3334. closeStream: (function (fd) {
  3335. FS.streams[fd] = null
  3336. }),
  3337. chrdev_stream_ops: {
  3338. open: (function (stream) {
  3339. var device = FS.getDevice(stream.node.rdev);
  3340. stream.stream_ops = device.stream_ops;
  3341. if (stream.stream_ops.open) {
  3342. stream.stream_ops.open(stream)
  3343. }
  3344. }),
  3345. llseek: (function () {
  3346. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3347. })
  3348. },
  3349. major: (function (dev) {
  3350. return dev >> 8
  3351. }),
  3352. minor: (function (dev) {
  3353. return dev & 255
  3354. }),
  3355. makedev: (function (ma, mi) {
  3356. return ma << 8 | mi
  3357. }),
  3358. registerDevice: (function (dev, ops) {
  3359. FS.devices[dev] = {
  3360. stream_ops: ops
  3361. }
  3362. }),
  3363. getDevice: (function (dev) {
  3364. return FS.devices[dev]
  3365. }),
  3366. getMounts: (function (mount) {
  3367. var mounts = [];
  3368. var check = [mount];
  3369. while (check.length) {
  3370. var m = check.pop();
  3371. mounts.push(m);
  3372. check.push.apply(check, m.mounts)
  3373. }
  3374. return mounts
  3375. }),
  3376. syncfs: (function (populate, callback) {
  3377. if (typeof populate === "function") {
  3378. callback = populate;
  3379. populate = false
  3380. }
  3381. FS.syncFSRequests++;
  3382. if (FS.syncFSRequests > 1) {
  3383. console.log("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work")
  3384. }
  3385. var mounts = FS.getMounts(FS.root.mount);
  3386. var completed = 0;
  3387.  
  3388. function doCallback(err) {
  3389. assert(FS.syncFSRequests > 0);
  3390. FS.syncFSRequests--;
  3391. return callback(err)
  3392. }
  3393.  
  3394. function done(err) {
  3395. if (err) {
  3396. if (!done.errored) {
  3397. done.errored = true;
  3398. return doCallback(err)
  3399. }
  3400. return
  3401. }
  3402. if (++completed >= mounts.length) {
  3403. doCallback(null)
  3404. }
  3405. }
  3406. mounts.forEach((function (mount) {
  3407. if (!mount.type.syncfs) {
  3408. return done(null)
  3409. }
  3410. mount.type.syncfs(mount, populate, done)
  3411. }))
  3412. }),
  3413. mount: (function (type, opts, mountpoint) {
  3414. var root = mountpoint === "/";
  3415. var pseudo = !mountpoint;
  3416. var node;
  3417. if (root && FS.root) {
  3418. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3419. } else if (!root && !pseudo) {
  3420. var lookup = FS.lookupPath(mountpoint, {
  3421. follow_mount: false
  3422. });
  3423. mountpoint = lookup.path;
  3424. node = lookup.node;
  3425. if (FS.isMountpoint(node)) {
  3426. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3427. }
  3428. if (!FS.isDir(node.mode)) {
  3429. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3430. }
  3431. }
  3432. var mount = {
  3433. type: type,
  3434. opts: opts,
  3435. mountpoint: mountpoint,
  3436. mounts: []
  3437. };
  3438. var mountRoot = type.mount(mount);
  3439. mountRoot.mount = mount;
  3440. mount.root = mountRoot;
  3441. if (root) {
  3442. FS.root = mountRoot
  3443. } else if (node) {
  3444. node.mounted = mount;
  3445. if (node.mount) {
  3446. node.mount.mounts.push(mount)
  3447. }
  3448. }
  3449. return mountRoot
  3450. }),
  3451. unmount: (function (mountpoint) {
  3452. var lookup = FS.lookupPath(mountpoint, {
  3453. follow_mount: false
  3454. });
  3455. if (!FS.isMountpoint(lookup.node)) {
  3456. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3457. }
  3458. var node = lookup.node;
  3459. var mount = node.mounted;
  3460. var mounts = FS.getMounts(mount);
  3461. Object.keys(FS.nameTable).forEach((function (hash) {
  3462. var current = FS.nameTable[hash];
  3463. while (current) {
  3464. var next = current.name_next;
  3465. if (mounts.indexOf(current.mount) !== -1) {
  3466. FS.destroyNode(current)
  3467. }
  3468. current = next
  3469. }
  3470. }));
  3471. node.mounted = null;
  3472. var idx = node.mount.mounts.indexOf(mount);
  3473. assert(idx !== -1);
  3474. node.mount.mounts.splice(idx, 1)
  3475. }),
  3476. lookup: (function (parent, name) {
  3477. return parent.node_ops.lookup(parent, name)
  3478. }),
  3479. mknod: (function (path, mode, dev) {
  3480. var lookup = FS.lookupPath(path, {
  3481. parent: true
  3482. });
  3483. var parent = lookup.node;
  3484. var name = PATH.basename(path);
  3485. if (!name || name === "." || name === "..") {
  3486. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3487. }
  3488. var err = FS.mayCreate(parent, name);
  3489. if (err) {
  3490. throw new FS.ErrnoError(err)
  3491. }
  3492. if (!parent.node_ops.mknod) {
  3493. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3494. }
  3495. return parent.node_ops.mknod(parent, name, mode, dev)
  3496. }),
  3497. create: (function (path, mode) {
  3498. mode = mode !== undefined ? mode : 438;
  3499. mode &= 4095;
  3500. mode |= 32768;
  3501. return FS.mknod(path, mode, 0)
  3502. }),
  3503. mkdir: (function (path, mode) {
  3504. mode = mode !== undefined ? mode : 511;
  3505. mode &= 511 | 512;
  3506. mode |= 16384;
  3507. return FS.mknod(path, mode, 0)
  3508. }),
  3509. mkdirTree: (function (path, mode) {
  3510. var dirs = path.split("/");
  3511. var d = "";
  3512. for (var i = 0; i < dirs.length; ++i) {
  3513. if (!dirs[i]) continue;
  3514. d += "/" + dirs[i];
  3515. try {
  3516. FS.mkdir(d, mode)
  3517. } catch (e) {
  3518. if (e.errno != ERRNO_CODES.EEXIST) throw e
  3519. }
  3520. }
  3521. }),
  3522. mkdev: (function (path, mode, dev) {
  3523. if (typeof dev === "undefined") {
  3524. dev = mode;
  3525. mode = 438
  3526. }
  3527. mode |= 8192;
  3528. return FS.mknod(path, mode, dev)
  3529. }),
  3530. symlink: (function (oldpath, newpath) {
  3531. if (!PATH.resolve(oldpath)) {
  3532. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3533. }
  3534. var lookup = FS.lookupPath(newpath, {
  3535. parent: true
  3536. });
  3537. var parent = lookup.node;
  3538. if (!parent) {
  3539. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3540. }
  3541. var newname = PATH.basename(newpath);
  3542. var err = FS.mayCreate(parent, newname);
  3543. if (err) {
  3544. throw new FS.ErrnoError(err)
  3545. }
  3546. if (!parent.node_ops.symlink) {
  3547. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3548. }
  3549. return parent.node_ops.symlink(parent, newname, oldpath)
  3550. }),
  3551. rename: (function (old_path, new_path) {
  3552. var old_dirname = PATH.dirname(old_path);
  3553. var new_dirname = PATH.dirname(new_path);
  3554. var old_name = PATH.basename(old_path);
  3555. var new_name = PATH.basename(new_path);
  3556. var lookup, old_dir, new_dir;
  3557. try {
  3558. lookup = FS.lookupPath(old_path, {
  3559. parent: true
  3560. });
  3561. old_dir = lookup.node;
  3562. lookup = FS.lookupPath(new_path, {
  3563. parent: true
  3564. });
  3565. new_dir = lookup.node
  3566. } catch (e) {
  3567. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3568. }
  3569. if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
  3570. if (old_dir.mount !== new_dir.mount) {
  3571. throw new FS.ErrnoError(ERRNO_CODES.EXDEV)
  3572. }
  3573. var old_node = FS.lookupNode(old_dir, old_name);
  3574. var relative = PATH.relative(old_path, new_dirname);
  3575. if (relative.charAt(0) !== ".") {
  3576. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3577. }
  3578. relative = PATH.relative(new_path, old_dirname);
  3579. if (relative.charAt(0) !== ".") {
  3580. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  3581. }
  3582. var new_node;
  3583. try {
  3584. new_node = FS.lookupNode(new_dir, new_name)
  3585. } catch (e) {}
  3586. if (old_node === new_node) {
  3587. return
  3588. }
  3589. var isdir = FS.isDir(old_node.mode);
  3590. var err = FS.mayDelete(old_dir, old_name, isdir);
  3591. if (err) {
  3592. throw new FS.ErrnoError(err)
  3593. }
  3594. err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
  3595. if (err) {
  3596. throw new FS.ErrnoError(err)
  3597. }
  3598. if (!old_dir.node_ops.rename) {
  3599. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3600. }
  3601. if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
  3602. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3603. }
  3604. if (new_dir !== old_dir) {
  3605. err = FS.nodePermissions(old_dir, "w");
  3606. if (err) {
  3607. throw new FS.ErrnoError(err)
  3608. }
  3609. }
  3610. try {
  3611. if (FS.trackingDelegate["willMovePath"]) {
  3612. FS.trackingDelegate["willMovePath"](old_path, new_path)
  3613. }
  3614. } catch (e) {
  3615. console.log("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3616. }
  3617. FS.hashRemoveNode(old_node);
  3618. try {
  3619. old_dir.node_ops.rename(old_node, new_dir, new_name)
  3620. } catch (e) {
  3621. throw e
  3622. } finally {
  3623. FS.hashAddNode(old_node)
  3624. }
  3625. try {
  3626. if (FS.trackingDelegate["onMovePath"]) FS.trackingDelegate["onMovePath"](old_path, new_path)
  3627. } catch (e) {
  3628. console.log("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3629. }
  3630. }),
  3631. rmdir: (function (path) {
  3632. var lookup = FS.lookupPath(path, {
  3633. parent: true
  3634. });
  3635. var parent = lookup.node;
  3636. var name = PATH.basename(path);
  3637. var node = FS.lookupNode(parent, name);
  3638. var err = FS.mayDelete(parent, name, true);
  3639. if (err) {
  3640. throw new FS.ErrnoError(err)
  3641. }
  3642. if (!parent.node_ops.rmdir) {
  3643. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3644. }
  3645. if (FS.isMountpoint(node)) {
  3646. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3647. }
  3648. try {
  3649. if (FS.trackingDelegate["willDeletePath"]) {
  3650. FS.trackingDelegate["willDeletePath"](path)
  3651. }
  3652. } catch (e) {
  3653. console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  3654. }
  3655. parent.node_ops.rmdir(parent, name);
  3656. FS.destroyNode(node);
  3657. try {
  3658. if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path)
  3659. } catch (e) {
  3660. console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  3661. }
  3662. }),
  3663. readdir: (function (path) {
  3664. var lookup = FS.lookupPath(path, {
  3665. follow: true
  3666. });
  3667. var node = lookup.node;
  3668. if (!node.node_ops.readdir) {
  3669. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3670. }
  3671. return node.node_ops.readdir(node)
  3672. }),
  3673. unlink: (function (path) {
  3674. var lookup = FS.lookupPath(path, {
  3675. parent: true
  3676. });
  3677. var parent = lookup.node;
  3678. var name = PATH.basename(path);
  3679. var node = FS.lookupNode(parent, name);
  3680. var err = FS.mayDelete(parent, name, false);
  3681. if (err) {
  3682. throw new FS.ErrnoError(err)
  3683. }
  3684. if (!parent.node_ops.unlink) {
  3685. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3686. }
  3687. if (FS.isMountpoint(node)) {
  3688. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3689. }
  3690. try {
  3691. if (FS.trackingDelegate["willDeletePath"]) {
  3692. FS.trackingDelegate["willDeletePath"](path)
  3693. }
  3694. } catch (e) {
  3695. console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  3696. }
  3697. parent.node_ops.unlink(parent, name);
  3698. FS.destroyNode(node);
  3699. try {
  3700. if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path)
  3701. } catch (e) {
  3702. console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  3703. }
  3704. }),
  3705. readlink: (function (path) {
  3706. var lookup = FS.lookupPath(path);
  3707. var link = lookup.node;
  3708. if (!link) {
  3709. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3710. }
  3711. if (!link.node_ops.readlink) {
  3712. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3713. }
  3714. return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link))
  3715. }),
  3716. stat: (function (path, dontFollow) {
  3717. var lookup = FS.lookupPath(path, {
  3718. follow: !dontFollow
  3719. });
  3720. var node = lookup.node;
  3721. if (!node) {
  3722. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3723. }
  3724. if (!node.node_ops.getattr) {
  3725. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3726. }
  3727. return node.node_ops.getattr(node)
  3728. }),
  3729. lstat: (function (path) {
  3730. return FS.stat(path, true)
  3731. }),
  3732. chmod: (function (path, mode, dontFollow) {
  3733. var node;
  3734. if (typeof path === "string") {
  3735. var lookup = FS.lookupPath(path, {
  3736. follow: !dontFollow
  3737. });
  3738. node = lookup.node
  3739. } else {
  3740. node = path
  3741. }
  3742. if (!node.node_ops.setattr) {
  3743. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3744. }
  3745. node.node_ops.setattr(node, {
  3746. mode: mode & 4095 | node.mode & ~4095,
  3747. timestamp: Date.now()
  3748. })
  3749. }),
  3750. lchmod: (function (path, mode) {
  3751. FS.chmod(path, mode, true)
  3752. }),
  3753. fchmod: (function (fd, mode) {
  3754. var stream = FS.getStream(fd);
  3755. if (!stream) {
  3756. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3757. }
  3758. FS.chmod(stream.node, mode)
  3759. }),
  3760. chown: (function (path, uid, gid, dontFollow) {
  3761. var node;
  3762. if (typeof path === "string") {
  3763. var lookup = FS.lookupPath(path, {
  3764. follow: !dontFollow
  3765. });
  3766. node = lookup.node
  3767. } else {
  3768. node = path
  3769. }
  3770. if (!node.node_ops.setattr) {
  3771. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3772. }
  3773. node.node_ops.setattr(node, {
  3774. timestamp: Date.now()
  3775. })
  3776. }),
  3777. lchown: (function (path, uid, gid) {
  3778. FS.chown(path, uid, gid, true)
  3779. }),
  3780. fchown: (function (fd, uid, gid) {
  3781. var stream = FS.getStream(fd);
  3782. if (!stream) {
  3783. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3784. }
  3785. FS.chown(stream.node, uid, gid)
  3786. }),
  3787. truncate: (function (path, len) {
  3788. if (len < 0) {
  3789. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3790. }
  3791. var node;
  3792. if (typeof path === "string") {
  3793. var lookup = FS.lookupPath(path, {
  3794. follow: true
  3795. });
  3796. node = lookup.node
  3797. } else {
  3798. node = path
  3799. }
  3800. if (!node.node_ops.setattr) {
  3801. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3802. }
  3803. if (FS.isDir(node.mode)) {
  3804. throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3805. }
  3806. if (!FS.isFile(node.mode)) {
  3807. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3808. }
  3809. var err = FS.nodePermissions(node, "w");
  3810. if (err) {
  3811. throw new FS.ErrnoError(err)
  3812. }
  3813. node.node_ops.setattr(node, {
  3814. size: len,
  3815. timestamp: Date.now()
  3816. })
  3817. }),
  3818. ftruncate: (function (fd, len) {
  3819. var stream = FS.getStream(fd);
  3820. if (!stream) {
  3821. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3822. }
  3823. if ((stream.flags & 2097155) === 0) {
  3824. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3825. }
  3826. FS.truncate(stream.node, len)
  3827. }),
  3828. utime: (function (path, atime, mtime) {
  3829. var lookup = FS.lookupPath(path, {
  3830. follow: true
  3831. });
  3832. var node = lookup.node;
  3833. node.node_ops.setattr(node, {
  3834. timestamp: Math.max(atime, mtime)
  3835. })
  3836. }),
  3837. open: (function (path, flags, mode, fd_start, fd_end) {
  3838. if (path === "") {
  3839. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3840. }
  3841. flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  3842. mode = typeof mode === "undefined" ? 438 : mode;
  3843. if (flags & 64) {
  3844. mode = mode & 4095 | 32768
  3845. } else {
  3846. mode = 0
  3847. }
  3848. var node;
  3849. if (typeof path === "object") {
  3850. node = path
  3851. } else {
  3852. path = PATH.normalize(path);
  3853. try {
  3854. var lookup = FS.lookupPath(path, {
  3855. follow: !(flags & 131072)
  3856. });
  3857. node = lookup.node
  3858. } catch (e) {}
  3859. }
  3860. var created = false;
  3861. if (flags & 64) {
  3862. if (node) {
  3863. if (flags & 128) {
  3864. throw new FS.ErrnoError(ERRNO_CODES.EEXIST)
  3865. }
  3866. } else {
  3867. node = FS.mknod(path, mode, 0);
  3868. created = true
  3869. }
  3870. }
  3871. if (!node) {
  3872. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3873. }
  3874. if (FS.isChrdev(node.mode)) {
  3875. flags &= ~512
  3876. }
  3877. if (flags & 65536 && !FS.isDir(node.mode)) {
  3878. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3879. }
  3880. if (!created) {
  3881. var err = FS.mayOpen(node, flags);
  3882. if (err) {
  3883. throw new FS.ErrnoError(err)
  3884. }
  3885. }
  3886. if (flags & 512) {
  3887. FS.truncate(node, 0)
  3888. }
  3889. flags &= ~(128 | 512);
  3890. var stream = FS.createStream({
  3891. node: node,
  3892. path: FS.getPath(node),
  3893. flags: flags,
  3894. seekable: true,
  3895. position: 0,
  3896. stream_ops: node.stream_ops,
  3897. ungotten: [],
  3898. error: false
  3899. }, fd_start, fd_end);
  3900. if (stream.stream_ops.open) {
  3901. stream.stream_ops.open(stream)
  3902. }
  3903. if (Module["logReadFiles"] && !(flags & 1)) {
  3904. if (!FS.readFiles) FS.readFiles = {};
  3905. if (!(path in FS.readFiles)) {
  3906. FS.readFiles[path] = 1;
  3907. Module["printErr"]("read file: " + path)
  3908. }
  3909. }
  3910. try {
  3911. if (FS.trackingDelegate["onOpenFile"]) {
  3912. var trackingFlags = 0;
  3913. if ((flags & 2097155) !== 1) {
  3914. trackingFlags |= FS.tracking.openFlags.READ
  3915. }
  3916. if ((flags & 2097155) !== 0) {
  3917. trackingFlags |= FS.tracking.openFlags.WRITE
  3918. }
  3919. FS.trackingDelegate["onOpenFile"](path, trackingFlags)
  3920. }
  3921. } catch (e) {
  3922. console.log("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message)
  3923. }
  3924. return stream
  3925. }),
  3926. close: (function (stream) {
  3927. if (stream.getdents) stream.getdents = null;
  3928. try {
  3929. if (stream.stream_ops.close) {
  3930. stream.stream_ops.close(stream)
  3931. }
  3932. } catch (e) {
  3933. throw e
  3934. } finally {
  3935. FS.closeStream(stream.fd)
  3936. }
  3937. }),
  3938. llseek: (function (stream, offset, whence) {
  3939. if (!stream.seekable || !stream.stream_ops.llseek) {
  3940. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3941. }
  3942. stream.position = stream.stream_ops.llseek(stream, offset, whence);
  3943. stream.ungotten = [];
  3944. return stream.position
  3945. }),
  3946. read: (function (stream, buffer, offset, length, position) {
  3947. if (length < 0 || position < 0) {
  3948. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3949. }
  3950. if ((stream.flags & 2097155) === 1) {
  3951. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3952. }
  3953. if (FS.isDir(stream.node.mode)) {
  3954. throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3955. }
  3956. if (!stream.stream_ops.read) {
  3957. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3958. }
  3959. var seeking = true;
  3960. if (typeof position === "undefined") {
  3961. position = stream.position;
  3962. seeking = false
  3963. } else if (!stream.seekable) {
  3964. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3965. }
  3966. var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
  3967. if (!seeking) stream.position += bytesRead;
  3968. return bytesRead
  3969. }),
  3970. write: (function (stream, buffer, offset, length, position, canOwn) {
  3971. if (length < 0 || position < 0) {
  3972. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3973. }
  3974. if ((stream.flags & 2097155) === 0) {
  3975. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3976. }
  3977. if (FS.isDir(stream.node.mode)) {
  3978. throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3979. }
  3980. if (!stream.stream_ops.write) {
  3981. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3982. }
  3983. if (stream.flags & 1024) {
  3984. FS.llseek(stream, 0, 2)
  3985. }
  3986. var seeking = true;
  3987. if (typeof position === "undefined") {
  3988. position = stream.position;
  3989. seeking = false
  3990. } else if (!stream.seekable) {
  3991. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3992. }
  3993. var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
  3994. if (!seeking) stream.position += bytesWritten;
  3995. try {
  3996. if (stream.path && FS.trackingDelegate["onWriteToFile"]) FS.trackingDelegate["onWriteToFile"](stream.path)
  3997. } catch (e) {
  3998. console.log("FS.trackingDelegate['onWriteToFile']('" + path + "') threw an exception: " + e.message)
  3999. }
  4000. return bytesWritten
  4001. }),
  4002. allocate: (function (stream, offset, length) {
  4003. if (offset < 0 || length <= 0) {
  4004. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4005. }
  4006. if ((stream.flags & 2097155) === 0) {
  4007. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4008. }
  4009. if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  4010. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  4011. }
  4012. if (!stream.stream_ops.allocate) {
  4013. throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)
  4014. }
  4015. stream.stream_ops.allocate(stream, offset, length)
  4016. }),
  4017. mmap: (function (stream, buffer, offset, length, position, prot, flags) {
  4018. if ((stream.flags & 2097155) === 1) {
  4019. throw new FS.ErrnoError(ERRNO_CODES.EACCES)
  4020. }
  4021. if (!stream.stream_ops.mmap) {
  4022. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  4023. }
  4024. return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags)
  4025. }),
  4026. msync: (function (stream, buffer, offset, length, mmapFlags) {
  4027. if (!stream || !stream.stream_ops.msync) {
  4028. return 0
  4029. }
  4030. return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)
  4031. }),
  4032. munmap: (function (stream) {
  4033. return 0
  4034. }),
  4035. ioctl: (function (stream, cmd, arg) {
  4036. if (!stream.stream_ops.ioctl) {
  4037. throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)
  4038. }
  4039. return stream.stream_ops.ioctl(stream, cmd, arg)
  4040. }),
  4041. readFile: (function (path, opts) {
  4042. opts = opts || {};
  4043. opts.flags = opts.flags || "r";
  4044. opts.encoding = opts.encoding || "binary";
  4045. if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  4046. throw new Error('Invalid encoding type "' + opts.encoding + '"')
  4047. }
  4048. var ret;
  4049. var stream = FS.open(path, opts.flags);
  4050. var stat = FS.stat(path);
  4051. var length = stat.size;
  4052. var buf = new Uint8Array(length);
  4053. FS.read(stream, buf, 0, length, 0);
  4054. if (opts.encoding === "utf8") {
  4055. ret = UTF8ArrayToString(buf, 0)
  4056. } else if (opts.encoding === "binary") {
  4057. ret = buf
  4058. }
  4059. FS.close(stream);
  4060. return ret
  4061. }),
  4062. writeFile: (function (path, data, opts) {
  4063. opts = opts || {};
  4064. opts.flags = opts.flags || "w";
  4065. opts.encoding = opts.encoding || "utf8";
  4066. if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  4067. throw new Error('Invalid encoding type "' + opts.encoding + '"')
  4068. }
  4069. var stream = FS.open(path, opts.flags, opts.mode);
  4070. if (opts.encoding === "utf8") {
  4071. var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  4072. var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  4073. FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn)
  4074. } else if (opts.encoding === "binary") {
  4075. FS.write(stream, data, 0, data.length, 0, opts.canOwn)
  4076. }
  4077. FS.close(stream)
  4078. }),
  4079. cwd: (function () {
  4080. return FS.currentPath
  4081. }),
  4082. chdir: (function (path) {
  4083. var lookup = FS.lookupPath(path, {
  4084. follow: true
  4085. });
  4086. if (lookup.node === null) {
  4087. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  4088. }
  4089. if (!FS.isDir(lookup.node.mode)) {
  4090. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  4091. }
  4092. var err = FS.nodePermissions(lookup.node, "x");
  4093. if (err) {
  4094. throw new FS.ErrnoError(err)
  4095. }
  4096. FS.currentPath = lookup.path
  4097. }),
  4098. createDefaultDirectories: (function () {
  4099. FS.mkdir("/tmp");
  4100. FS.mkdir("/home");
  4101. FS.mkdir("/home/web_user")
  4102. }),
  4103. createDefaultDevices: (function () {
  4104. FS.mkdir("/dev");
  4105. FS.registerDevice(FS.makedev(1, 3), {
  4106. read: (function () {
  4107. return 0
  4108. }),
  4109. write: (function (stream, buffer, offset, length, pos) {
  4110. return length
  4111. })
  4112. });
  4113. FS.mkdev("/dev/null", FS.makedev(1, 3));
  4114. TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  4115. TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  4116. FS.mkdev("/dev/tty", FS.makedev(5, 0));
  4117. FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  4118. var random_device;
  4119. if (typeof crypto !== "undefined") {
  4120. var randomBuffer = new Uint8Array(1);
  4121. random_device = (function () {
  4122. crypto.getRandomValues(randomBuffer);
  4123. return randomBuffer[0]
  4124. })
  4125. } else if (ENVIRONMENT_IS_NODE) {
  4126. random_device = (function () {
  4127. return require("crypto").randomBytes(1)[0]
  4128. })
  4129. } else {
  4130. random_device = (function () {
  4131. return Math.random() * 256 | 0
  4132. })
  4133. }
  4134. FS.createDevice("/dev", "random", random_device);
  4135. FS.createDevice("/dev", "urandom", random_device);
  4136. FS.mkdir("/dev/shm");
  4137. FS.mkdir("/dev/shm/tmp")
  4138. }),
  4139. createSpecialDirectories: (function () {
  4140. FS.mkdir("/proc");
  4141. FS.mkdir("/proc/self");
  4142. FS.mkdir("/proc/self/fd");
  4143. FS.mount({
  4144. mount: (function () {
  4145. var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
  4146. node.node_ops = {
  4147. lookup: (function (parent, name) {
  4148. var fd = +name;
  4149. var stream = FS.getStream(fd);
  4150. if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4151. var ret = {
  4152. parent: null,
  4153. mount: {
  4154. mountpoint: "fake"
  4155. },
  4156. node_ops: {
  4157. readlink: (function () {
  4158. return stream.path
  4159. })
  4160. }
  4161. };
  4162. ret.parent = ret;
  4163. return ret
  4164. })
  4165. };
  4166. return node
  4167. })
  4168. }, {}, "/proc/self/fd")
  4169. }),
  4170. createStandardStreams: (function () {
  4171. if (Module["stdin"]) {
  4172. FS.createDevice("/dev", "stdin", Module["stdin"])
  4173. } else {
  4174. FS.symlink("/dev/tty", "/dev/stdin")
  4175. }
  4176. if (Module["stdout"]) {
  4177. FS.createDevice("/dev", "stdout", null, Module["stdout"])
  4178. } else {
  4179. FS.symlink("/dev/tty", "/dev/stdout")
  4180. }
  4181. if (Module["stderr"]) {
  4182. FS.createDevice("/dev", "stderr", null, Module["stderr"])
  4183. } else {
  4184. FS.symlink("/dev/tty1", "/dev/stderr")
  4185. }
  4186. var stdin = FS.open("/dev/stdin", "r");
  4187. assert(stdin.fd === 0, "invalid handle for stdin (" + stdin.fd + ")");
  4188. var stdout = FS.open("/dev/stdout", "w");
  4189. assert(stdout.fd === 1, "invalid handle for stdout (" + stdout.fd + ")");
  4190. var stderr = FS.open("/dev/stderr", "w");
  4191. assert(stderr.fd === 2, "invalid handle for stderr (" + stderr.fd + ")")
  4192. }),
  4193. ensureErrnoError: (function () {
  4194. if (FS.ErrnoError) return;
  4195. FS.ErrnoError = function ErrnoError(errno, node) {
  4196. this.node = node;
  4197. this.setErrno = (function (errno) {
  4198. this.errno = errno;
  4199. for (var key in ERRNO_CODES) {
  4200. if (ERRNO_CODES[key] === errno) {
  4201. this.code = key;
  4202. break
  4203. }
  4204. }
  4205. });
  4206. this.setErrno(errno);
  4207. this.message = ERRNO_MESSAGES[errno]
  4208. };
  4209. FS.ErrnoError.prototype = new Error;
  4210. FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  4211. [ERRNO_CODES.ENOENT].forEach((function (code) {
  4212. FS.genericErrors[code] = new FS.ErrnoError(code);
  4213. FS.genericErrors[code].stack = "<generic error, no stack>"
  4214. }))
  4215. }),
  4216. staticInit: (function () {
  4217. FS.ensureErrnoError();
  4218. FS.nameTable = new Array(4096);
  4219. FS.mount(MEMFS, {}, "/");
  4220. FS.createDefaultDirectories();
  4221. FS.createDefaultDevices();
  4222. FS.createSpecialDirectories();
  4223. FS.filesystems = {
  4224. "MEMFS": MEMFS,
  4225. "IDBFS": IDBFS,
  4226. "NODEFS": NODEFS,
  4227. "WORKERFS": WORKERFS
  4228. }
  4229. }),
  4230. init: (function (input, output, error) {
  4231. assert(!FS.init.initialized, "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
  4232. FS.init.initialized = true;
  4233. FS.ensureErrnoError();
  4234. Module["stdin"] = input || Module["stdin"];
  4235. Module["stdout"] = output || Module["stdout"];
  4236. Module["stderr"] = error || Module["stderr"];
  4237. FS.createStandardStreams()
  4238. }),
  4239. quit: (function () {
  4240. FS.init.initialized = false;
  4241. var fflush = Module["_fflush"];
  4242. if (fflush) fflush(0);
  4243. for (var i = 0; i < FS.streams.length; i++) {
  4244. var stream = FS.streams[i];
  4245. if (!stream) {
  4246. continue
  4247. }
  4248. FS.close(stream)
  4249. }
  4250. }),
  4251. getMode: (function (canRead, canWrite) {
  4252. var mode = 0;
  4253. if (canRead) mode |= 292 | 73;
  4254. if (canWrite) mode |= 146;
  4255. return mode
  4256. }),
  4257. joinPath: (function (parts, forceRelative) {
  4258. var path = PATH.join.apply(null, parts);
  4259. if (forceRelative && path[0] == "/") path = path.substr(1);
  4260. return path
  4261. }),
  4262. absolutePath: (function (relative, base) {
  4263. return PATH.resolve(base, relative)
  4264. }),
  4265. standardizePath: (function (path) {
  4266. return PATH.normalize(path)
  4267. }),
  4268. findObject: (function (path, dontResolveLastLink) {
  4269. var ret = FS.analyzePath(path, dontResolveLastLink);
  4270. if (ret.exists) {
  4271. return ret.object
  4272. } else {
  4273. ___setErrNo(ret.error);
  4274. return null
  4275. }
  4276. }),
  4277. analyzePath: (function (path, dontResolveLastLink) {
  4278. try {
  4279. var lookup = FS.lookupPath(path, {
  4280. follow: !dontResolveLastLink
  4281. });
  4282. path = lookup.path
  4283. } catch (e) {}
  4284. var ret = {
  4285. isRoot: false,
  4286. exists: false,
  4287. error: 0,
  4288. name: null,
  4289. path: null,
  4290. object: null,
  4291. parentExists: false,
  4292. parentPath: null,
  4293. parentObject: null
  4294. };
  4295. try {
  4296. var lookup = FS.lookupPath(path, {
  4297. parent: true
  4298. });
  4299. ret.parentExists = true;
  4300. ret.parentPath = lookup.path;
  4301. ret.parentObject = lookup.node;
  4302. ret.name = PATH.basename(path);
  4303. lookup = FS.lookupPath(path, {
  4304. follow: !dontResolveLastLink
  4305. });
  4306. ret.exists = true;
  4307. ret.path = lookup.path;
  4308. ret.object = lookup.node;
  4309. ret.name = lookup.node.name;
  4310. ret.isRoot = lookup.path === "/"
  4311. } catch (e) {
  4312. ret.error = e.errno
  4313. }
  4314. return ret
  4315. }),
  4316. createFolder: (function (parent, name, canRead, canWrite) {
  4317. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4318. var mode = FS.getMode(canRead, canWrite);
  4319. return FS.mkdir(path, mode)
  4320. }),
  4321. createPath: (function (parent, path, canRead, canWrite) {
  4322. parent = typeof parent === "string" ? parent : FS.getPath(parent);
  4323. var parts = path.split("/").reverse();
  4324. while (parts.length) {
  4325. var part = parts.pop();
  4326. if (!part) continue;
  4327. var current = PATH.join2(parent, part);
  4328. try {
  4329. FS.mkdir(current)
  4330. } catch (e) {}
  4331. parent = current
  4332. }
  4333. return current
  4334. }),
  4335. createFile: (function (parent, name, properties, canRead, canWrite) {
  4336. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4337. var mode = FS.getMode(canRead, canWrite);
  4338. return FS.create(path, mode)
  4339. }),
  4340. createDataFile: (function (parent, name, data, canRead, canWrite, canOwn) {
  4341. var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
  4342. var mode = FS.getMode(canRead, canWrite);
  4343. var node = FS.create(path, mode);
  4344. if (data) {
  4345. if (typeof data === "string") {
  4346. var arr = new Array(data.length);
  4347. for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
  4348. data = arr
  4349. }
  4350. FS.chmod(node, mode | 146);
  4351. var stream = FS.open(node, "w");
  4352. FS.write(stream, data, 0, data.length, 0, canOwn);
  4353. FS.close(stream);
  4354. FS.chmod(node, mode)
  4355. }
  4356. return node
  4357. }),
  4358. createDevice: (function (parent, name, input, output) {
  4359. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4360. var mode = FS.getMode(!!input, !!output);
  4361. if (!FS.createDevice.major) FS.createDevice.major = 64;
  4362. var dev = FS.makedev(FS.createDevice.major++, 0);
  4363. FS.registerDevice(dev, {
  4364. open: (function (stream) {
  4365. stream.seekable = false
  4366. }),
  4367. close: (function (stream) {
  4368. if (output && output.buffer && output.buffer.length) {
  4369. output(10)
  4370. }
  4371. }),
  4372. read: (function (stream, buffer, offset, length, pos) {
  4373. var bytesRead = 0;
  4374. for (var i = 0; i < length; i++) {
  4375. var result;
  4376. try {
  4377. result = input()
  4378. } catch (e) {
  4379. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4380. }
  4381. if (result === undefined && bytesRead === 0) {
  4382. throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  4383. }
  4384. if (result === null || result === undefined) break;
  4385. bytesRead++;
  4386. buffer[offset + i] = result
  4387. }
  4388. if (bytesRead) {
  4389. stream.node.timestamp = Date.now()
  4390. }
  4391. return bytesRead
  4392. }),
  4393. write: (function (stream, buffer, offset, length, pos) {
  4394. for (var i = 0; i < length; i++) {
  4395. try {
  4396. output(buffer[offset + i])
  4397. } catch (e) {
  4398. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4399. }
  4400. }
  4401. if (length) {
  4402. stream.node.timestamp = Date.now()
  4403. }
  4404. return i
  4405. })
  4406. });
  4407. return FS.mkdev(path, mode, dev)
  4408. }),
  4409. createLink: (function (parent, name, target, canRead, canWrite) {
  4410. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4411. return FS.symlink(target, path)
  4412. }),
  4413. forceLoadFile: (function (obj) {
  4414. if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
  4415. var success = true;
  4416. if (typeof XMLHttpRequest !== "undefined") {
  4417. 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.")
  4418. } else if (Module["read"]) {
  4419. try {
  4420. obj.contents = intArrayFromString(Module["read"](obj.url), true);
  4421. obj.usedBytes = obj.contents.length
  4422. } catch (e) {
  4423. success = false
  4424. }
  4425. } else {
  4426. throw new Error("Cannot load without read() or XMLHttpRequest.")
  4427. }
  4428. if (!success) ___setErrNo(ERRNO_CODES.EIO);
  4429. return success
  4430. }),
  4431. createLazyFile: (function (parent, name, url, canRead, canWrite) {
  4432. function LazyUint8Array() {
  4433. this.lengthKnown = false;
  4434. this.chunks = []
  4435. }
  4436. LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  4437. if (idx > this.length - 1 || idx < 0) {
  4438. return undefined
  4439. }
  4440. var chunkOffset = idx % this.chunkSize;
  4441. var chunkNum = idx / this.chunkSize | 0;
  4442. return this.getter(chunkNum)[chunkOffset]
  4443. };
  4444. LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
  4445. this.getter = getter
  4446. };
  4447. LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  4448. var xhr = new XMLHttpRequest;
  4449. xhr.open("HEAD", url, false);
  4450. xhr.send(null);
  4451. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4452. var datalength = Number(xhr.getResponseHeader("Content-length"));
  4453. var header;
  4454. var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
  4455. var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
  4456. var chunkSize = 1024 * 1024;
  4457. if (!hasByteServing) chunkSize = datalength;
  4458. var doXHR = (function (from, to) {
  4459. if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
  4460. if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!");
  4461. var xhr = new XMLHttpRequest;
  4462. xhr.open("GET", url, false);
  4463. if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
  4464. if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer";
  4465. if (xhr.overrideMimeType) {
  4466. xhr.overrideMimeType("text/plain; charset=x-user-defined")
  4467. }
  4468. xhr.send(null);
  4469. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4470. if (xhr.response !== undefined) {
  4471. return new Uint8Array(xhr.response || [])
  4472. } else {
  4473. return intArrayFromString(xhr.responseText || "", true)
  4474. }
  4475. });
  4476. var lazyArray = this;
  4477. lazyArray.setDataGetter((function (chunkNum) {
  4478. var start = chunkNum * chunkSize;
  4479. var end = (chunkNum + 1) * chunkSize - 1;
  4480. end = Math.min(end, datalength - 1);
  4481. if (typeof lazyArray.chunks[chunkNum] === "undefined") {
  4482. lazyArray.chunks[chunkNum] = doXHR(start, end)
  4483. }
  4484. if (typeof lazyArray.chunks[chunkNum] === "undefined") throw new Error("doXHR failed!");
  4485. return lazyArray.chunks[chunkNum]
  4486. }));
  4487. if (usesGzip || !datalength) {
  4488. chunkSize = datalength = 1;
  4489. datalength = this.getter(0).length;
  4490. chunkSize = datalength;
  4491. console.log("LazyFiles on gzip forces download of the whole file when length is accessed")
  4492. }
  4493. this._length = datalength;
  4494. this._chunkSize = chunkSize;
  4495. this.lengthKnown = true
  4496. };
  4497. if (typeof XMLHttpRequest !== "undefined") {
  4498. if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  4499. var lazyArray = new LazyUint8Array;
  4500. Object.defineProperties(lazyArray, {
  4501. length: {
  4502. get: (function () {
  4503. if (!this.lengthKnown) {
  4504. this.cacheLength()
  4505. }
  4506. return this._length
  4507. })
  4508. },
  4509. chunkSize: {
  4510. get: (function () {
  4511. if (!this.lengthKnown) {
  4512. this.cacheLength()
  4513. }
  4514. return this._chunkSize
  4515. })
  4516. }
  4517. });
  4518. var properties = {
  4519. isDevice: false,
  4520. contents: lazyArray
  4521. }
  4522. } else {
  4523. var properties = {
  4524. isDevice: false,
  4525. url: url
  4526. }
  4527. }
  4528. var node = FS.createFile(parent, name, properties, canRead, canWrite);
  4529. if (properties.contents) {
  4530. node.contents = properties.contents
  4531. } else if (properties.url) {
  4532. node.contents = null;
  4533. node.url = properties.url
  4534. }
  4535. Object.defineProperties(node, {
  4536. usedBytes: {
  4537. get: (function () {
  4538. return this.contents.length
  4539. })
  4540. }
  4541. });
  4542. var stream_ops = {};
  4543. var keys = Object.keys(node.stream_ops);
  4544. keys.forEach((function (key) {
  4545. var fn = node.stream_ops[key];
  4546. stream_ops[key] = function forceLoadLazyFile() {
  4547. if (!FS.forceLoadFile(node)) {
  4548. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4549. }
  4550. return fn.apply(null, arguments)
  4551. }
  4552. }));
  4553. stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
  4554. if (!FS.forceLoadFile(node)) {
  4555. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4556. }
  4557. var contents = stream.node.contents;
  4558. if (position >= contents.length) return 0;
  4559. var size = Math.min(contents.length - position, length);
  4560. assert(size >= 0);
  4561. if (contents.slice) {
  4562. for (var i = 0; i < size; i++) {
  4563. buffer[offset + i] = contents[position + i]
  4564. }
  4565. } else {
  4566. for (var i = 0; i < size; i++) {
  4567. buffer[offset + i] = contents.get(position + i)
  4568. }
  4569. }
  4570. return size
  4571. };
  4572. node.stream_ops = stream_ops;
  4573. return node
  4574. }),
  4575. createPreloadedFile: (function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
  4576. Browser.init();
  4577. var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
  4578. var dep = getUniqueRunDependency("cp " + fullname);
  4579.  
  4580. function processData(byteArray) {
  4581. function finish(byteArray) {
  4582. if (preFinish) preFinish();
  4583. if (!dontCreateFile) {
  4584. FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn)
  4585. }
  4586. if (onload) onload();
  4587. removeRunDependency(dep)
  4588. }
  4589. var handled = false;
  4590. Module["preloadPlugins"].forEach((function (plugin) {
  4591. if (handled) return;
  4592. if (plugin["canHandle"](fullname)) {
  4593. plugin["handle"](byteArray, fullname, finish, (function () {
  4594. if (onerror) onerror();
  4595. removeRunDependency(dep)
  4596. }));
  4597. handled = true
  4598. }
  4599. }));
  4600. if (!handled) finish(byteArray)
  4601. }
  4602. addRunDependency(dep);
  4603. if (typeof url == "string") {
  4604. Browser.asyncLoad(url, (function (byteArray) {
  4605. processData(byteArray)
  4606. }), onerror)
  4607. } else {
  4608. processData(url)
  4609. }
  4610. }),
  4611. indexedDB: (function () {
  4612. return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
  4613. }),
  4614. DB_NAME: (function () {
  4615. return "EM_FS_" + window.location.pathname
  4616. }),
  4617. DB_VERSION: 20,
  4618. DB_STORE_NAME: "FILE_DATA",
  4619. saveFilesToDB: (function (paths, onload, onerror) {
  4620. onload = onload || (function () {});
  4621. onerror = onerror || (function () {});
  4622. var indexedDB = FS.indexedDB();
  4623. try {
  4624. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4625. } catch (e) {
  4626. return onerror(e)
  4627. }
  4628. openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  4629. console.log("creating db");
  4630. var db = openRequest.result;
  4631. db.createObjectStore(FS.DB_STORE_NAME)
  4632. };
  4633. openRequest.onsuccess = function openRequest_onsuccess() {
  4634. var db = openRequest.result;
  4635. var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite");
  4636. var files = transaction.objectStore(FS.DB_STORE_NAME);
  4637. var ok = 0,
  4638. fail = 0,
  4639. total = paths.length;
  4640.  
  4641. function finish() {
  4642. if (fail == 0) onload();
  4643. else onerror()
  4644. }
  4645. paths.forEach((function (path) {
  4646. var putRequest = files.put(FS.analyzePath(path).object.contents, path);
  4647. putRequest.onsuccess = function putRequest_onsuccess() {
  4648. ok++;
  4649. if (ok + fail == total) finish()
  4650. };
  4651. putRequest.onerror = function putRequest_onerror() {
  4652. fail++;
  4653. if (ok + fail == total) finish()
  4654. }
  4655. }));
  4656. transaction.onerror = onerror
  4657. };
  4658. openRequest.onerror = onerror
  4659. }),
  4660. loadFilesFromDB: (function (paths, onload, onerror) {
  4661. onload = onload || (function () {});
  4662. onerror = onerror || (function () {});
  4663. var indexedDB = FS.indexedDB();
  4664. try {
  4665. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4666. } catch (e) {
  4667. return onerror(e)
  4668. }
  4669. openRequest.onupgradeneeded = onerror;
  4670. openRequest.onsuccess = function openRequest_onsuccess() {
  4671. var db = openRequest.result;
  4672. try {
  4673. var transaction = db.transaction([FS.DB_STORE_NAME], "readonly")
  4674. } catch (e) {
  4675. onerror(e);
  4676. return
  4677. }
  4678. var files = transaction.objectStore(FS.DB_STORE_NAME);
  4679. var ok = 0,
  4680. fail = 0,
  4681. total = paths.length;
  4682.  
  4683. function finish() {
  4684. if (fail == 0) onload();
  4685. else onerror()
  4686. }
  4687. paths.forEach((function (path) {
  4688. var getRequest = files.get(path);
  4689. getRequest.onsuccess = function getRequest_onsuccess() {
  4690. if (FS.analyzePath(path).exists) {
  4691. FS.unlink(path)
  4692. }
  4693. FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
  4694. ok++;
  4695. if (ok + fail == total) finish()
  4696. };
  4697. getRequest.onerror = function getRequest_onerror() {
  4698. fail++;
  4699. if (ok + fail == total) finish()
  4700. }
  4701. }));
  4702. transaction.onerror = onerror
  4703. };
  4704. openRequest.onerror = onerror
  4705. })
  4706. };
  4707. var SYSCALLS = {
  4708. DEFAULT_POLLMASK: 5,
  4709. mappings: {},
  4710. umask: 511,
  4711. calculateAt: (function (dirfd, path) {
  4712. if (path[0] !== "/") {
  4713. var dir;
  4714. if (dirfd === -100) {
  4715. dir = FS.cwd()
  4716. } else {
  4717. var dirstream = FS.getStream(dirfd);
  4718. if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4719. dir = dirstream.path
  4720. }
  4721. path = PATH.join2(dir, path)
  4722. }
  4723. return path
  4724. }),
  4725. doStat: (function (func, path, buf) {
  4726. try {
  4727. var stat = func(path)
  4728. } catch (e) {
  4729. if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
  4730. return -ERRNO_CODES.ENOTDIR
  4731. }
  4732. throw e
  4733. }
  4734. HEAP32[buf >> 2] = stat.dev;
  4735. HEAP32[buf + 4 >> 2] = 0;
  4736. HEAP32[buf + 8 >> 2] = stat.ino;
  4737. HEAP32[buf + 12 >> 2] = stat.mode;
  4738. HEAP32[buf + 16 >> 2] = stat.nlink;
  4739. HEAP32[buf + 20 >> 2] = stat.uid;
  4740. HEAP32[buf + 24 >> 2] = stat.gid;
  4741. HEAP32[buf + 28 >> 2] = stat.rdev;
  4742. HEAP32[buf + 32 >> 2] = 0;
  4743. HEAP32[buf + 36 >> 2] = stat.size;
  4744. HEAP32[buf + 40 >> 2] = 4096;
  4745. HEAP32[buf + 44 >> 2] = stat.blocks;
  4746. HEAP32[buf + 48 >> 2] = stat.atime.getTime() / 1e3 | 0;
  4747. HEAP32[buf + 52 >> 2] = 0;
  4748. HEAP32[buf + 56 >> 2] = stat.mtime.getTime() / 1e3 | 0;
  4749. HEAP32[buf + 60 >> 2] = 0;
  4750. HEAP32[buf + 64 >> 2] = stat.ctime.getTime() / 1e3 | 0;
  4751. HEAP32[buf + 68 >> 2] = 0;
  4752. HEAP32[buf + 72 >> 2] = stat.ino;
  4753. return 0
  4754. }),
  4755. doMsync: (function (addr, stream, len, flags) {
  4756. var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
  4757. FS.msync(stream, buffer, 0, len, flags)
  4758. }),
  4759. doMkdir: (function (path, mode) {
  4760. path = PATH.normalize(path);
  4761. if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1);
  4762. FS.mkdir(path, mode, 0);
  4763. return 0
  4764. }),
  4765. doMknod: (function (path, mode, dev) {
  4766. switch (mode & 61440) {
  4767. case 32768:
  4768. case 8192:
  4769. case 24576:
  4770. case 4096:
  4771. case 49152:
  4772. break;
  4773. default:
  4774. return -ERRNO_CODES.EINVAL
  4775. }
  4776. FS.mknod(path, mode, dev);
  4777. return 0
  4778. }),
  4779. doReadlink: (function (path, buf, bufsize) {
  4780. if (bufsize <= 0) return -ERRNO_CODES.EINVAL;
  4781. var ret = FS.readlink(path);
  4782. var len = Math.min(bufsize, lengthBytesUTF8(ret));
  4783. var endChar = HEAP8[buf + len];
  4784. stringToUTF8(ret, buf, bufsize + 1);
  4785. HEAP8[buf + len] = endChar;
  4786. return len
  4787. }),
  4788. doAccess: (function (path, amode) {
  4789. if (amode & ~7) {
  4790. return -ERRNO_CODES.EINVAL
  4791. }
  4792. var node;
  4793. var lookup = FS.lookupPath(path, {
  4794. follow: true
  4795. });
  4796. node = lookup.node;
  4797. var perms = "";
  4798. if (amode & 4) perms += "r";
  4799. if (amode & 2) perms += "w";
  4800. if (amode & 1) perms += "x";
  4801. if (perms && FS.nodePermissions(node, perms)) {
  4802. return -ERRNO_CODES.EACCES
  4803. }
  4804. return 0
  4805. }),
  4806. doDup: (function (path, flags, suggestFD) {
  4807. var suggest = FS.getStream(suggestFD);
  4808. if (suggest) FS.close(suggest);
  4809. return FS.open(path, flags, 0, suggestFD, suggestFD).fd
  4810. }),
  4811. doReadv: (function (stream, iov, iovcnt, offset) {
  4812. var ret = 0;
  4813. for (var i = 0; i < iovcnt; i++) {
  4814. var ptr = HEAP32[iov + i * 8 >> 2];
  4815. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  4816. var curr = FS.read(stream, HEAP8, ptr, len, offset);
  4817. if (curr < 0) return -1;
  4818. ret += curr;
  4819. if (curr < len) break
  4820. }
  4821. return ret
  4822. }),
  4823. doWritev: (function (stream, iov, iovcnt, offset) {
  4824. var ret = 0;
  4825. for (var i = 0; i < iovcnt; i++) {
  4826. var ptr = HEAP32[iov + i * 8 >> 2];
  4827. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  4828. var curr = FS.write(stream, HEAP8, ptr, len, offset);
  4829. if (curr < 0) return -1;
  4830. ret += curr
  4831. }
  4832. return ret
  4833. }),
  4834. varargs: 0,
  4835. get: (function (varargs) {
  4836. SYSCALLS.varargs += 4;
  4837. var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
  4838. return ret
  4839. }),
  4840. getStr: (function () {
  4841. var ret = Pointer_stringify(SYSCALLS.get());
  4842. return ret
  4843. }),
  4844. getStreamFromFD: (function () {
  4845. var stream = FS.getStream(SYSCALLS.get());
  4846. if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4847. return stream
  4848. }),
  4849. getSocketFromFD: (function () {
  4850. var socket = SOCKFS.getSocket(SYSCALLS.get());
  4851. if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4852. return socket
  4853. }),
  4854. getSocketAddress: (function (allowNull) {
  4855. var addrp = SYSCALLS.get(),
  4856. addrlen = SYSCALLS.get();
  4857. if (allowNull && addrp === 0) return null;
  4858. var info = __read_sockaddr(addrp, addrlen);
  4859. if (info.errno) throw new FS.ErrnoError(info.errno);
  4860. info.addr = DNS.lookup_addr(info.addr) || info.addr;
  4861. return info
  4862. }),
  4863. get64: (function () {
  4864. var low = SYSCALLS.get(),
  4865. high = SYSCALLS.get();
  4866. if (low >= 0) assert(high === 0);
  4867. else assert(high === -1);
  4868. return low
  4869. }),
  4870. getZero: (function () {
  4871. assert(SYSCALLS.get() === 0)
  4872. })
  4873. };
  4874.  
  4875. function ___syscall20(which, varargs) {
  4876. SYSCALLS.varargs = varargs;
  4877. try {
  4878. return PROCINFO.pid
  4879. } catch (e) {
  4880. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4881. return -e.errno
  4882. }
  4883. }
  4884. var ___tm_current = STATICTOP;
  4885. STATICTOP += 48;
  4886. var ___tm_timezone = allocate(intArrayFromString("GMT"), "i8", ALLOC_STATIC);
  4887.  
  4888. function _gmtime_r(time, tmPtr) {
  4889. var date = new Date(HEAP32[time >> 2] * 1e3);
  4890. HEAP32[tmPtr >> 2] = date.getUTCSeconds();
  4891. HEAP32[tmPtr + 4 >> 2] = date.getUTCMinutes();
  4892. HEAP32[tmPtr + 8 >> 2] = date.getUTCHours();
  4893. HEAP32[tmPtr + 12 >> 2] = date.getUTCDate();
  4894. HEAP32[tmPtr + 16 >> 2] = date.getUTCMonth();
  4895. HEAP32[tmPtr + 20 >> 2] = date.getUTCFullYear() - 1900;
  4896. HEAP32[tmPtr + 24 >> 2] = date.getUTCDay();
  4897. HEAP32[tmPtr + 36 >> 2] = 0;
  4898. HEAP32[tmPtr + 32 >> 2] = 0;
  4899. var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
  4900. var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0;
  4901. HEAP32[tmPtr + 28 >> 2] = yday;
  4902. HEAP32[tmPtr + 40 >> 2] = ___tm_timezone;
  4903. return tmPtr
  4904. }
  4905.  
  4906. function _gmtime(time) {
  4907. return _gmtime_r(time, ___tm_current)
  4908. }
  4909.  
  4910. function ___lock() {}
  4911.  
  4912. function ___unlock() {}
  4913.  
  4914. function ___syscall6(which, varargs) {
  4915. SYSCALLS.varargs = varargs;
  4916. try {
  4917. var stream = SYSCALLS.getStreamFromFD();
  4918. FS.close(stream);
  4919. return 0
  4920. } catch (e) {
  4921. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4922. return -e.errno
  4923. }
  4924. }
  4925.  
  4926. function _emscripten_memcpy_big(dest, src, num) {
  4927. HEAPU8.set(HEAPU8.subarray(src, src + num), dest);
  4928. return dest
  4929. }
  4930.  
  4931. function _ftime(p) {
  4932. var millis = Date.now();
  4933. HEAP32[p >> 2] = millis / 1e3 | 0;
  4934. HEAP16[p + 4 >> 1] = millis % 1e3;
  4935. HEAP16[p + 6 >> 1] = 0;
  4936. HEAP16[p + 8 >> 1] = 0;
  4937. return 0
  4938. }
  4939.  
  4940. function ___syscall140(which, varargs) {
  4941. SYSCALLS.varargs = varargs;
  4942. try {
  4943. var stream = SYSCALLS.getStreamFromFD(),
  4944. offset_high = SYSCALLS.get(),
  4945. offset_low = SYSCALLS.get(),
  4946. result = SYSCALLS.get(),
  4947. whence = SYSCALLS.get();
  4948. var offset = offset_low;
  4949. FS.llseek(stream, offset, whence);
  4950. HEAP32[result >> 2] = stream.position;
  4951. if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null;
  4952. return 0
  4953. } catch (e) {
  4954. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4955. return -e.errno
  4956. }
  4957. }
  4958.  
  4959. function ___syscall146(which, varargs) {
  4960. SYSCALLS.varargs = varargs;
  4961. try {
  4962. var stream = SYSCALLS.getStreamFromFD(),
  4963. iov = SYSCALLS.get(),
  4964. iovcnt = SYSCALLS.get();
  4965. return SYSCALLS.doWritev(stream, iov, iovcnt)
  4966. } catch (e) {
  4967. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4968. return -e.errno
  4969. }
  4970. }
  4971.  
  4972. function ___syscall54(which, varargs) {
  4973. SYSCALLS.varargs = varargs;
  4974. try {
  4975. var stream = SYSCALLS.getStreamFromFD(),
  4976. op = SYSCALLS.get();
  4977. switch (op) {
  4978. case 21505:
  4979. {
  4980. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4981. return 0
  4982. };
  4983. case 21506:
  4984. {
  4985. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4986. return 0
  4987. };
  4988. case 21519:
  4989. {
  4990. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4991. var argp = SYSCALLS.get();HEAP32[argp >> 2] = 0;
  4992. return 0
  4993. };
  4994. case 21520:
  4995. {
  4996. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4997. return -ERRNO_CODES.EINVAL
  4998. };
  4999. case 21531:
  5000. {
  5001. var argp = SYSCALLS.get();
  5002. return FS.ioctl(stream, op, argp)
  5003. };
  5004. case 21523:
  5005. {
  5006. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  5007. return 0
  5008. };
  5009. default:
  5010. abort("bad ioctl syscall " + op)
  5011. }
  5012. } catch (e) {
  5013. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  5014. return -e.errno
  5015. }
  5016. }
  5017. FS.staticInit();
  5018. __ATINIT__.unshift((function () {
  5019. if (!Module["noFSInit"] && !FS.init.initialized) FS.init()
  5020. }));
  5021. __ATMAIN__.push((function () {
  5022. FS.ignorePermissions = false
  5023. }));
  5024. __ATEXIT__.push((function () {
  5025. FS.quit()
  5026. }));
  5027. Module["FS_createFolder"] = FS.createFolder;
  5028. Module["FS_createPath"] = FS.createPath;
  5029. Module["FS_createDataFile"] = FS.createDataFile;
  5030. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  5031. Module["FS_createLazyFile"] = FS.createLazyFile;
  5032. Module["FS_createLink"] = FS.createLink;
  5033. Module["FS_createDevice"] = FS.createDevice;
  5034. Module["FS_unlink"] = FS.unlink;
  5035. __ATINIT__.unshift((function () {
  5036. TTY.init()
  5037. }));
  5038. __ATEXIT__.push((function () {
  5039. TTY.shutdown()
  5040. }));
  5041. if (ENVIRONMENT_IS_NODE) {
  5042. var fs = require("fs");
  5043. var NODEJS_PATH = require("path");
  5044. NODEFS.staticInit()
  5045. }
  5046. DYNAMICTOP_PTR = allocate(1, "i32", ALLOC_STATIC);
  5047. STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
  5048. STACK_MAX = STACK_BASE + TOTAL_STACK;
  5049. DYNAMIC_BASE = Runtime.alignMemory(STACK_MAX);
  5050. HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;
  5051. staticSealed = true;
  5052. Module["wasmTableSize"] = 14;
  5053. Module["wasmMaxTableSize"] = 14;
  5054.  
  5055. function invoke_ii(index, a1) {
  5056. try {
  5057. return Module["dynCall_ii"](index, a1)
  5058. } catch (e) {
  5059. if (typeof e !== "number" && e !== "longjmp") throw e;
  5060. Module["setThrew"](1, 0)
  5061. }
  5062. }
  5063.  
  5064. function invoke_iiii(index, a1, a2, a3) {
  5065. try {
  5066. return Module["dynCall_iiii"](index, a1, a2, a3)
  5067. } catch (e) {
  5068. if (typeof e !== "number" && e !== "longjmp") throw e;
  5069. Module["setThrew"](1, 0)
  5070. }
  5071. }
  5072.  
  5073. function invoke_viii(index, a1, a2, a3) {
  5074. try {
  5075. Module["dynCall_viii"](index, a1, a2, a3)
  5076. } catch (e) {
  5077. if (typeof e !== "number" && e !== "longjmp") throw e;
  5078. Module["setThrew"](1, 0)
  5079. }
  5080. }
  5081. Module.asmGlobalArg = {
  5082. "Math": Math,
  5083. "Int8Array": Int8Array,
  5084. "Int16Array": Int16Array,
  5085. "Int32Array": Int32Array,
  5086. "Uint8Array": Uint8Array,
  5087. "Uint16Array": Uint16Array,
  5088. "Uint32Array": Uint32Array,
  5089. "Float32Array": Float32Array,
  5090. "Float64Array": Float64Array,
  5091. "NaN": NaN,
  5092. "Infinity": Infinity
  5093. };
  5094. Module.asmLibraryArg = {
  5095. "abort": abort,
  5096. "assert": assert,
  5097. "enlargeMemory": enlargeMemory,
  5098. "getTotalMemory": getTotalMemory,
  5099. "abortOnCannotGrowMemory": abortOnCannotGrowMemory,
  5100. "invoke_ii": invoke_ii,
  5101. "invoke_iiii": invoke_iiii,
  5102. "invoke_viii": invoke_viii,
  5103. "_gmtime_r": _gmtime_r,
  5104. "_gmtime": _gmtime,
  5105. "___lock": ___lock,
  5106. "___syscall6": ___syscall6,
  5107. "___setErrNo": ___setErrNo,
  5108. "___unlock": ___unlock,
  5109. "_ftime": _ftime,
  5110. "_emscripten_memcpy_big": _emscripten_memcpy_big,
  5111. "___syscall54": ___syscall54,
  5112. "___syscall140": ___syscall140,
  5113. "___syscall20": ___syscall20,
  5114. "___assert_fail": ___assert_fail,
  5115. "___syscall146": ___syscall146,
  5116. "DYNAMICTOP_PTR": DYNAMICTOP_PTR,
  5117. "tempDoublePtr": tempDoublePtr,
  5118. "ABORT": ABORT,
  5119. "STACKTOP": STACKTOP,
  5120. "STACK_MAX": STACK_MAX
  5121. };
  5122. var asm = Module["asm"](Module.asmGlobalArg, Module.asmLibraryArg, buffer);
  5123. Module["asm"] = asm;
  5124. var _cryptonight_hash = Module["_cryptonight_hash"] = (function () {
  5125. return Module["asm"]["_cryptonight_hash"].apply(null, arguments)
  5126. });
  5127. var getTempRet0 = Module["getTempRet0"] = (function () {
  5128. return Module["asm"]["getTempRet0"].apply(null, arguments)
  5129. });
  5130. var _free = Module["_free"] = (function () {
  5131. return Module["asm"]["_free"].apply(null, arguments)
  5132. });
  5133. var runPostSets = Module["runPostSets"] = (function () {
  5134. return Module["asm"]["runPostSets"].apply(null, arguments)
  5135. });
  5136. var setTempRet0 = Module["setTempRet0"] = (function () {
  5137. return Module["asm"]["setTempRet0"].apply(null, arguments)
  5138. });
  5139. var establishStackSpace = Module["establishStackSpace"] = (function () {
  5140. return Module["asm"]["establishStackSpace"].apply(null, arguments)
  5141. });
  5142. var _memmove = Module["_memmove"] = (function () {
  5143. return Module["asm"]["_memmove"].apply(null, arguments)
  5144. });
  5145. var stackSave = Module["stackSave"] = (function () {
  5146. return Module["asm"]["stackSave"].apply(null, arguments)
  5147. });
  5148. var _memset = Module["_memset"] = (function () {
  5149. return Module["asm"]["_memset"].apply(null, arguments)
  5150. });
  5151. var _malloc = Module["_malloc"] = (function () {
  5152. return Module["asm"]["_malloc"].apply(null, arguments)
  5153. });
  5154. var _cryptonight_create = Module["_cryptonight_create"] = (function () {
  5155. return Module["asm"]["_cryptonight_create"].apply(null, arguments)
  5156. });
  5157. var _memcpy = Module["_memcpy"] = (function () {
  5158. return Module["asm"]["_memcpy"].apply(null, arguments)
  5159. });
  5160. var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = (function () {
  5161. return Module["asm"]["_emscripten_get_global_libc"].apply(null, arguments)
  5162. });
  5163. var stackAlloc = Module["stackAlloc"] = (function () {
  5164. return Module["asm"]["stackAlloc"].apply(null, arguments)
  5165. });
  5166. var setThrew = Module["setThrew"] = (function () {
  5167. return Module["asm"]["setThrew"].apply(null, arguments)
  5168. });
  5169. var _sbrk = Module["_sbrk"] = (function () {
  5170. return Module["asm"]["_sbrk"].apply(null, arguments)
  5171. });
  5172. var _fflush = Module["_fflush"] = (function () {
  5173. return Module["asm"]["_fflush"].apply(null, arguments)
  5174. });
  5175. var stackRestore = Module["stackRestore"] = (function () {
  5176. return Module["asm"]["stackRestore"].apply(null, arguments)
  5177. });
  5178. var _cryptonight_destroy = Module["_cryptonight_destroy"] = (function () {
  5179. return Module["asm"]["_cryptonight_destroy"].apply(null, arguments)
  5180. });
  5181. var ___errno_location = Module["___errno_location"] = (function () {
  5182. return Module["asm"]["___errno_location"].apply(null, arguments)
  5183. });
  5184. var dynCall_ii = Module["dynCall_ii"] = (function () {
  5185. return Module["asm"]["dynCall_ii"].apply(null, arguments)
  5186. });
  5187. var dynCall_iiii = Module["dynCall_iiii"] = (function () {
  5188. return Module["asm"]["dynCall_iiii"].apply(null, arguments)
  5189. });
  5190. var dynCall_viii = Module["dynCall_viii"] = (function () {
  5191. return Module["asm"]["dynCall_viii"].apply(null, arguments)
  5192. });
  5193. Runtime.stackAlloc = Module["stackAlloc"];
  5194. Runtime.stackSave = Module["stackSave"];
  5195. Runtime.stackRestore = Module["stackRestore"];
  5196. Runtime.establishStackSpace = Module["establishStackSpace"];
  5197. Runtime.setTempRet0 = Module["setTempRet0"];
  5198. Runtime.getTempRet0 = Module["getTempRet0"];
  5199. Module["asm"] = asm;
  5200. if (memoryInitializer) {
  5201. if (typeof Module["locateFile"] === "function") {
  5202. memoryInitializer = Module["locateFile"](memoryInitializer)
  5203. } else if (Module["memoryInitializerPrefixURL"]) {
  5204. memoryInitializer = Module["memoryInitializerPrefixURL"] + memoryInitializer
  5205. }
  5206. if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
  5207. var data = Module["readBinary"](memoryInitializer);
  5208. HEAPU8.set(data, Runtime.GLOBAL_BASE)
  5209. } else {
  5210. addRunDependency("memory initializer");
  5211. var applyMemoryInitializer = (function (data) {
  5212. if (data.byteLength) data = new Uint8Array(data);
  5213. HEAPU8.set(data, Runtime.GLOBAL_BASE);
  5214. if (Module["memoryInitializerRequest"]) delete Module["memoryInitializerRequest"].response;
  5215. removeRunDependency("memory initializer")
  5216. });
  5217.  
  5218. function doBrowserLoad() {
  5219. Module["readAsync"](memoryInitializer, applyMemoryInitializer, (function () {
  5220. throw "could not load memory initializer " + memoryInitializer
  5221. }))
  5222. }
  5223. if (Module["memoryInitializerRequest"]) {
  5224. function useRequest() {
  5225. var request = Module["memoryInitializerRequest"];
  5226. if (request.status !== 200 && request.status !== 0) {
  5227. console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: " + request.status + ", retrying " + memoryInitializer);
  5228. doBrowserLoad();
  5229. return
  5230. }
  5231. applyMemoryInitializer(request.response)
  5232. }
  5233. if (Module["memoryInitializerRequest"].response) {
  5234. setTimeout(useRequest, 0)
  5235. } else {
  5236. Module["memoryInitializerRequest"].addEventListener("load", useRequest)
  5237. }
  5238. } else {
  5239. doBrowserLoad()
  5240. }
  5241. }
  5242. }
  5243.  
  5244. function ExitStatus(status) {
  5245. this.name = "ExitStatus";
  5246. this.message = "Program terminated with exit(" + status + ")";
  5247. this.status = status
  5248. }
  5249. ExitStatus.prototype = new Error;
  5250. ExitStatus.prototype.constructor = ExitStatus;
  5251. var initialStackTop;
  5252. var preloadStartTime = null;
  5253. var calledMain = false;
  5254. dependenciesFulfilled = function runCaller() {
  5255. if (!Module["calledRun"]) run();
  5256. if (!Module["calledRun"]) dependenciesFulfilled = runCaller
  5257. };
  5258. Module["callMain"] = Module.callMain = function callMain(args) {
  5259. args = args || [];
  5260. ensureInitRuntime();
  5261. var argc = args.length + 1;
  5262.  
  5263. function pad() {
  5264. for (var i = 0; i < 4 - 1; i++) {
  5265. argv.push(0)
  5266. }
  5267. }
  5268. var argv = [allocate(intArrayFromString(Module["thisProgram"]), "i8", ALLOC_NORMAL)];
  5269. pad();
  5270. for (var i = 0; i < argc - 1; i = i + 1) {
  5271. argv.push(allocate(intArrayFromString(args[i]), "i8", ALLOC_NORMAL));
  5272. pad()
  5273. }
  5274. argv.push(0);
  5275. argv = allocate(argv, "i32", ALLOC_NORMAL);
  5276. try {
  5277. var ret = Module["_main"](argc, argv, 0);
  5278. exit(ret, true)
  5279. } catch (e) {
  5280. if (e instanceof ExitStatus) {
  5281. return
  5282. } else if (e == "SimulateInfiniteLoop") {
  5283. Module["noExitRuntime"] = true;
  5284. return
  5285. } else {
  5286. var toLog = e;
  5287. if (e && typeof e === "object" && e.stack) {
  5288. toLog = [e, e.stack]
  5289. }
  5290. Module.printErr("exception thrown: " + toLog);
  5291. Module["quit"](1, e)
  5292. }
  5293. } finally {
  5294. calledMain = true
  5295. }
  5296. };
  5297.  
  5298. function run(args) {
  5299. args = args || Module["arguments"];
  5300. if (preloadStartTime === null) preloadStartTime = Date.now();
  5301. if (runDependencies > 0) {
  5302. return
  5303. }
  5304. preRun();
  5305. if (runDependencies > 0) return;
  5306. if (Module["calledRun"]) return;
  5307.  
  5308. function doRun() {
  5309. if (Module["calledRun"]) return;
  5310. Module["calledRun"] = true;
  5311. if (ABORT) return;
  5312. ensureInitRuntime();
  5313. preMain();
  5314. if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
  5315. if (Module["_main"] && shouldRunNow) Module["callMain"](args);
  5316. postRun()
  5317. }
  5318. if (Module["setStatus"]) {
  5319. Module["setStatus"]("Running...");
  5320. setTimeout((function () {
  5321. setTimeout((function () {
  5322. Module["setStatus"]("")
  5323. }), 1);
  5324. doRun()
  5325. }), 1)
  5326. } else {
  5327. doRun()
  5328. }
  5329. }
  5330. Module["run"] = Module.run = run;
  5331.  
  5332. function exit(status, implicit) {
  5333. if (implicit && Module["noExitRuntime"]) {
  5334. return
  5335. }
  5336. if (Module["noExitRuntime"]) {} else {
  5337. ABORT = true;
  5338. EXITSTATUS = status;
  5339. STACKTOP = initialStackTop;
  5340. exitRuntime();
  5341. if (Module["onExit"]) Module["onExit"](status)
  5342. }
  5343. if (ENVIRONMENT_IS_NODE) {
  5344. process["exit"](status)
  5345. }
  5346. Module["quit"](status, new ExitStatus(status))
  5347. }
  5348. Module["exit"] = Module.exit = exit;
  5349. var abortDecorators = [];
  5350.  
  5351. function abort(what) {
  5352. if (Module["onAbort"]) {
  5353. Module["onAbort"](what)
  5354. }
  5355. if (what !== undefined) {
  5356. Module.print(what);
  5357. Module.printErr(what);
  5358. what = JSON.stringify(what)
  5359. } else {
  5360. what = ""
  5361. }
  5362. ABORT = true;
  5363. EXITSTATUS = 1;
  5364. var extra = "\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";
  5365. var output = "abort(" + what + ") at " + stackTrace() + extra;
  5366. if (abortDecorators) {
  5367. abortDecorators.forEach((function (decorator) {
  5368. output = decorator(output, what)
  5369. }))
  5370. }
  5371. throw output
  5372. }
  5373. Module["abort"] = Module.abort = abort;
  5374. if (Module["preInit"]) {
  5375. if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]];
  5376. while (Module["preInit"].length > 0) {
  5377. Module["preInit"].pop()()
  5378. }
  5379. }
  5380. var shouldRunNow = true;
  5381. if (Module["noInitialRun"]) {
  5382. shouldRunNow = false
  5383. }
  5384. run();
  5385. var CryptonightWASMWrapper = (function () {
  5386. this.ctx = _cryptonight_create();
  5387. this.throttleWait = 0;
  5388. this.throttledStart = 0;
  5389. this.throttledHashes = 0;
  5390. this.workThrottledBound = this.workThrottled.bind(this);
  5391. this.currentJob = null;
  5392. this.target = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]);
  5393. var heap = Module.HEAPU8.buffer;
  5394. this.input = new Uint8Array(heap, Module._malloc(84), 84);
  5395. this.output = new Uint8Array(heap, Module._malloc(32), 32);
  5396. self.postMessage("ready");
  5397. self.onmessage = this.onMessage.bind(this)
  5398. });
  5399. CryptonightWASMWrapper.prototype.onMessage = (function (msg) {
  5400. var job = msg.data;
  5401. if (job.verify_id) {
  5402. this.verify(job);
  5403. return
  5404. }
  5405. if (!this.currentJob || this.currentJob.job_id !== job.job_id) {
  5406. this.setJob(job)
  5407. }
  5408. if (job.throttle) {
  5409. this.throttleWait = 1 / (1 - job.throttle) - 1;
  5410. this.throttledStart = this.now();
  5411. this.throttledHashes = 0;
  5412. this.workThrottled()
  5413. } else {
  5414. this.work()
  5415. }
  5416. });
  5417. CryptonightWASMWrapper.prototype.destroy = (function () {
  5418. _cryptonight_destroy(this.ctx)
  5419. });
  5420. CryptonightWASMWrapper.prototype.hexToBytes = (function (hex, bytes) {
  5421. var bytes = new Uint8Array(hex.length / 2);
  5422. for (var i = 0, c = 0; c < hex.length; c += 2, i++) {
  5423. bytes[i] = parseInt(hex.substr(c, 2), 16)
  5424. }
  5425. return bytes
  5426. });
  5427. CryptonightWASMWrapper.prototype.bytesToHex = (function (bytes) {
  5428. for (var hex = "", i = 0; i < bytes.length; i++) {
  5429. hex += (bytes[i] >>> 4).toString(16);
  5430. hex += (bytes[i] & 15).toString(16)
  5431. }
  5432. return hex
  5433. });
  5434. CryptonightWASMWrapper.prototype.meetsTarget = (function (hash, target) {
  5435. for (var i = 0; i < target.length; i++) {
  5436. var hi = hash.length - i - 1,
  5437. ti = target.length - i - 1;
  5438. if (hash[hi] > target[ti]) {
  5439. return false
  5440. } else if (hash[hi] < target[ti]) {
  5441. return true
  5442. }
  5443. }
  5444. return false
  5445. });
  5446. CryptonightWASMWrapper.prototype.setJob = (function (job) {
  5447. this.currentJob = job;
  5448. this.blob = this.hexToBytes(job.blob);
  5449. this.input.set(this.blob);
  5450. var target = this.hexToBytes(job.target);
  5451. if (target.length <= 8) {
  5452. for (var i = 0; i < target.length; i++) {
  5453. this.target[this.target.length - i - 1] = target[target.length - i - 1]
  5454. }
  5455. for (var i = 0; i < this.target.length - target.length; i++) {
  5456. this.target[i] = 255
  5457. }
  5458. } else {
  5459. this.target = target
  5460. }
  5461. });
  5462. CryptonightWASMWrapper.prototype.now = (function () {
  5463. return self.performance ? self.performance.now() : Date.now()
  5464. });
  5465. CryptonightWASMWrapper.prototype.hash = (function (input, output, length) {
  5466. var nonce = Math.random() * 4294967295 + 1 >>> 0;
  5467. this.input[39] = (nonce & 4278190080) >> 24;
  5468. this.input[40] = (nonce & 16711680) >> 16;
  5469. this.input[41] = (nonce & 65280) >> 8;
  5470. this.input[42] = (nonce & 255) >> 0;
  5471. _cryptonight_hash(this.ctx, input.byteOffset, output.byteOffset, length)
  5472. });
  5473. CryptonightWASMWrapper.prototype.verify = (function (job) {
  5474. this.blob = this.hexToBytes(job.blob);
  5475. this.input.set(this.blob);
  5476. for (var i = 0, c = 0; c < job.nonce.length; c += 2, i++) {
  5477. this.input[39 + i] = parseInt(job.nonce.substr(c, 2), 16)
  5478. }
  5479. _cryptonight_hash(this.ctx, this.input.byteOffset, this.output.byteOffset, this.blob.length);
  5480. var result = this.bytesToHex(this.output);
  5481. self.postMessage({
  5482. verify_id: job.verify_id,
  5483. verified: result === job.result
  5484. })
  5485. });
  5486. CryptonightWASMWrapper.prototype.work = (function () {
  5487. var hashes = 0;
  5488. var meetsTarget = false;
  5489. var start = this.now();
  5490. var elapsed = 0;
  5491. do {
  5492. this.hash(this.input, this.output, this.blob.length);
  5493. hashes++;
  5494. meetsTarget = this.meetsTarget(this.output, this.target);
  5495. elapsed = this.now() - start
  5496. } while (!meetsTarget && elapsed < 1e3);
  5497. var hashesPerSecond = hashes / (elapsed / 1e3);
  5498. if (meetsTarget) {
  5499. var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  5500. var resultHex = this.bytesToHex(this.output);
  5501. self.postMessage({
  5502. hashesPerSecond: hashesPerSecond,
  5503. hashes: hashes,
  5504. job_id: this.currentJob.job_id,
  5505. nonce: nonceHex,
  5506. result: resultHex
  5507. })
  5508. } else {
  5509. self.postMessage({
  5510. hashesPerSecond: hashesPerSecond,
  5511. hashes: hashes
  5512. })
  5513. }
  5514. });
  5515. CryptonightWASMWrapper.prototype.workThrottled = (function () {
  5516. var start = this.now();
  5517. this.hash(this.input, this.output, this.blob.length);
  5518. var end = this.now();
  5519. var timePerHash = end - start;
  5520. this.throttledHashes++;
  5521. var elapsed = end - this.throttledStart;
  5522. var hashesPerSecond = this.throttledHashes / (elapsed / 1e3);
  5523. if (this.meetsTarget(this.output, this.target)) {
  5524. var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  5525. var resultHex = this.bytesToHex(this.output);
  5526. self.postMessage({
  5527. hashesPerSecond: hashesPerSecond,
  5528. hashes: this.throttledHashes,
  5529. job_id: this.currentJob.job_id,
  5530. nonce: nonceHex,
  5531. result: resultHex
  5532. });
  5533. this.throttledHashes = 0
  5534. } else if (elapsed > 1e3) {
  5535. self.postMessage({
  5536. hashesPerSecond: hashesPerSecond,
  5537. hashes: this.throttledHashes
  5538. });
  5539. this.throttledHashes = 0
  5540. } else {
  5541. var wait = Math.min(2e3, timePerHash * this.throttleWait);
  5542. setTimeout(this.workThrottledBound, wait)
  5543. }
  5544. });
  5545. Module["onRuntimeInitialized"] = (function () {
  5546. var cryptonight = new CryptonightWASMWrapper
  5547. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement