aiden-shared-calculations-unified 1.0.81 → 1.0.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4911 @@
1
+ const nodePath = require('path');
2
+ const nodeFs = require('fs');
3
+
4
+ (function (global, factory) {
5
+ typeof exports === 'object' && typeof module !== 'undefined'
6
+ ? factory(exports)
7
+ : typeof define === 'function' && define.amd
8
+ ? define(['exports'], factory)
9
+ : ((global = global || self), factory((global['@hpcc-js/wasm'] = {})));
10
+ })(this, function (exports) {
11
+ 'use strict';
12
+
13
+ function createCommonjsModule(fn, module) {
14
+ return (
15
+ (module = { exports: {} }), fn(module, module.exports), module.exports
16
+ );
17
+ }
18
+
19
+ var globalNS = new Function('return this;')();
20
+ var _wasmFolder = globalNS.__hpcc_wasmFolder || undefined;
21
+ function wasmFolder(_) {
22
+ if (_ === void 0) return _wasmFolder;
23
+ var retVal = _wasmFolder;
24
+ _wasmFolder = _;
25
+ return retVal;
26
+ }
27
+ function trimEnd(str, charToRemove) {
28
+ while (str.charAt(str.length - 1) === charToRemove) {
29
+ str = str.substring(0, str.length - 1);
30
+ }
31
+ return str;
32
+ }
33
+ function trimStart(str, charToRemove) {
34
+ while (str.charAt(0) === charToRemove) {
35
+ str = str.substring(1);
36
+ }
37
+ return str;
38
+ }
39
+ function loadWasm(_wasmLib, wf) {
40
+ var wasmLib = _wasmLib.default || _wasmLib;
41
+ // Prevent double load ---
42
+ if (!wasmLib.__hpcc_promise) {
43
+ wasmLib.__hpcc_promise = new Promise(function (resolve) {
44
+ wasmLib({
45
+ locateFile: function (path, prefix) {
46
+ return (
47
+ trimEnd(wf || wasmFolder() || prefix || '.', '/') +
48
+ '/' +
49
+ trimStart(path, '/')
50
+ );
51
+ },
52
+ }).then(function (instance) {
53
+ // Not a real promise, remove "then" to prevent infinite loop ---
54
+ delete instance.then;
55
+ resolve(instance);
56
+ });
57
+ });
58
+ }
59
+ return wasmLib.__hpcc_promise;
60
+ }
61
+
62
+ var graphvizlib = createCommonjsModule(function (module, exports) {
63
+ var cpp = (function () {
64
+ var _scriptDir = undefined;
65
+
66
+ return function (cpp) {
67
+ cpp = cpp || {};
68
+
69
+ var Module = typeof cpp !== 'undefined' ? cpp : {};
70
+ var readyPromiseResolve;
71
+ Module['ready'] = new Promise(function (resolve, reject) {
72
+ readyPromiseResolve = resolve;
73
+ });
74
+ var moduleOverrides = {};
75
+ var key;
76
+ for (key in Module) {
77
+ if (Module.hasOwnProperty(key)) {
78
+ moduleOverrides[key] = Module[key];
79
+ }
80
+ }
81
+ var arguments_ = [];
82
+ var thisProgram = './this.program';
83
+ var quit_ = function (status, toThrow) {
84
+ throw toThrow;
85
+ };
86
+ var ENVIRONMENT_IS_WEB = true;
87
+ var scriptDirectory = '';
88
+ function locateFile(path) {
89
+ if (Module['locateFile']) {
90
+ return Module['locateFile'](path, scriptDirectory);
91
+ }
92
+ return scriptDirectory + path;
93
+ }
94
+ var read_, readBinary;
95
+ {
96
+ if (_scriptDir) {
97
+ scriptDirectory = _scriptDir;
98
+ }
99
+ if (scriptDirectory.indexOf('blob:') !== 0) {
100
+ scriptDirectory = scriptDirectory.substr(
101
+ 0,
102
+ scriptDirectory.lastIndexOf('/') + 1
103
+ );
104
+ } else {
105
+ scriptDirectory = '';
106
+ }
107
+ {
108
+ read_ = function shell_read(url) {
109
+ var xhr = new XMLHttpRequest();
110
+ xhr.open('GET', url, false);
111
+ xhr.send(null);
112
+ return xhr.responseText;
113
+ };
114
+ }
115
+ }
116
+ var out = Module['print'] || console.log.bind(console);
117
+ var err = Module['printErr'] || console.warn.bind(console);
118
+ for (key in moduleOverrides) {
119
+ if (moduleOverrides.hasOwnProperty(key)) {
120
+ Module[key] = moduleOverrides[key];
121
+ }
122
+ }
123
+ moduleOverrides = null;
124
+ if (Module['arguments']) arguments_ = Module['arguments'];
125
+ if (Module['thisProgram']) thisProgram = Module['thisProgram'];
126
+ if (Module['quit']) quit_ = Module['quit'];
127
+ var tempRet0 = 0;
128
+ var setTempRet0 = function (value) {
129
+ tempRet0 = value;
130
+ };
131
+ var getTempRet0 = function () {
132
+ return tempRet0;
133
+ };
134
+ var wasmBinary;
135
+ if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
136
+ var noExitRuntime;
137
+ if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime'];
138
+ if (typeof WebAssembly !== 'object') {
139
+ err('no native wasm support detected');
140
+ }
141
+ var wasmMemory;
142
+ var wasmTable = new WebAssembly.Table({
143
+ initial: 928,
144
+ maximum: 928 + 0,
145
+ element: 'anyfunc',
146
+ });
147
+ var ABORT = false;
148
+ function assert(condition, text) {
149
+ if (!condition) {
150
+ abort('Assertion failed: ' + text);
151
+ }
152
+ }
153
+ var UTF8Decoder =
154
+ typeof TextDecoder !== 'undefined'
155
+ ? new TextDecoder('utf8')
156
+ : undefined;
157
+ function UTF8ArrayToString(heap, idx, maxBytesToRead) {
158
+ var endIdx = idx + maxBytesToRead;
159
+ var endPtr = idx;
160
+ while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;
161
+ if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
162
+ return UTF8Decoder.decode(heap.subarray(idx, endPtr));
163
+ } else {
164
+ var str = '';
165
+ while (idx < endPtr) {
166
+ var u0 = heap[idx++];
167
+ if (!(u0 & 128)) {
168
+ str += String.fromCharCode(u0);
169
+ continue;
170
+ }
171
+ var u1 = heap[idx++] & 63;
172
+ if ((u0 & 224) == 192) {
173
+ str += String.fromCharCode(((u0 & 31) << 6) | u1);
174
+ continue;
175
+ }
176
+ var u2 = heap[idx++] & 63;
177
+ if ((u0 & 240) == 224) {
178
+ u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
179
+ } else {
180
+ u0 =
181
+ ((u0 & 7) << 18) |
182
+ (u1 << 12) |
183
+ (u2 << 6) |
184
+ (heap[idx++] & 63);
185
+ }
186
+ if (u0 < 65536) {
187
+ str += String.fromCharCode(u0);
188
+ } else {
189
+ var ch = u0 - 65536;
190
+ str += String.fromCharCode(
191
+ 55296 | (ch >> 10),
192
+ 56320 | (ch & 1023)
193
+ );
194
+ }
195
+ }
196
+ }
197
+ return str;
198
+ }
199
+ function UTF8ToString(ptr, maxBytesToRead) {
200
+ return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
201
+ }
202
+ function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
203
+ if (!(maxBytesToWrite > 0)) return 0;
204
+ var startIdx = outIdx;
205
+ var endIdx = outIdx + maxBytesToWrite - 1;
206
+ for (var i = 0; i < str.length; ++i) {
207
+ var u = str.charCodeAt(i);
208
+ if (u >= 55296 && u <= 57343) {
209
+ var u1 = str.charCodeAt(++i);
210
+ u = (65536 + ((u & 1023) << 10)) | (u1 & 1023);
211
+ }
212
+ if (u <= 127) {
213
+ if (outIdx >= endIdx) break;
214
+ heap[outIdx++] = u;
215
+ } else if (u <= 2047) {
216
+ if (outIdx + 1 >= endIdx) break;
217
+ heap[outIdx++] = 192 | (u >> 6);
218
+ heap[outIdx++] = 128 | (u & 63);
219
+ } else if (u <= 65535) {
220
+ if (outIdx + 2 >= endIdx) break;
221
+ heap[outIdx++] = 224 | (u >> 12);
222
+ heap[outIdx++] = 128 | ((u >> 6) & 63);
223
+ heap[outIdx++] = 128 | (u & 63);
224
+ } else {
225
+ if (outIdx + 3 >= endIdx) break;
226
+ heap[outIdx++] = 240 | (u >> 18);
227
+ heap[outIdx++] = 128 | ((u >> 12) & 63);
228
+ heap[outIdx++] = 128 | ((u >> 6) & 63);
229
+ heap[outIdx++] = 128 | (u & 63);
230
+ }
231
+ }
232
+ heap[outIdx] = 0;
233
+ return outIdx - startIdx;
234
+ }
235
+ function stringToUTF8(str, outPtr, maxBytesToWrite) {
236
+ return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
237
+ }
238
+ function lengthBytesUTF8(str) {
239
+ var len = 0;
240
+ for (var i = 0; i < str.length; ++i) {
241
+ var u = str.charCodeAt(i);
242
+ if (u >= 55296 && u <= 57343)
243
+ u = (65536 + ((u & 1023) << 10)) | (str.charCodeAt(++i) & 1023);
244
+ if (u <= 127) ++len;
245
+ else if (u <= 2047) len += 2;
246
+ else if (u <= 65535) len += 3;
247
+ else len += 4;
248
+ }
249
+ return len;
250
+ }
251
+ function writeArrayToMemory(array, buffer) {
252
+ HEAP8.set(array, buffer);
253
+ }
254
+ function writeAsciiToMemory(str, buffer, dontAddNull) {
255
+ for (var i = 0; i < str.length; ++i) {
256
+ HEAP8[buffer++ >> 0] = str.charCodeAt(i);
257
+ }
258
+ if (!dontAddNull) HEAP8[buffer >> 0] = 0;
259
+ }
260
+ var WASM_PAGE_SIZE = 65536;
261
+ function alignUp(x, multiple) {
262
+ if (x % multiple > 0) {
263
+ x += multiple - (x % multiple);
264
+ }
265
+ return x;
266
+ }
267
+ var buffer,
268
+ HEAP8,
269
+ HEAPU8,
270
+ HEAP16,
271
+ HEAPU16,
272
+ HEAP32,
273
+ HEAPU32,
274
+ HEAPF32,
275
+ HEAPF64;
276
+ function updateGlobalBufferAndViews(buf) {
277
+ buffer = buf;
278
+ Module['HEAP8'] = HEAP8 = new Int8Array(buf);
279
+ Module['HEAP16'] = HEAP16 = new Int16Array(buf);
280
+ Module['HEAP32'] = HEAP32 = new Int32Array(buf);
281
+ Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
282
+ Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);
283
+ Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
284
+ Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);
285
+ Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);
286
+ }
287
+ var DYNAMIC_BASE = 5461776,
288
+ DYNAMICTOP_PTR = 218736;
289
+ var INITIAL_INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;
290
+ if (Module['wasmMemory']) {
291
+ wasmMemory = Module['wasmMemory'];
292
+ } else {
293
+ wasmMemory = new WebAssembly.Memory({
294
+ initial: INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE,
295
+ maximum: 2147483648 / WASM_PAGE_SIZE,
296
+ });
297
+ }
298
+ if (wasmMemory) {
299
+ buffer = wasmMemory.buffer;
300
+ }
301
+ INITIAL_INITIAL_MEMORY = buffer.byteLength;
302
+ updateGlobalBufferAndViews(buffer);
303
+ HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;
304
+ function callRuntimeCallbacks(callbacks) {
305
+ while (callbacks.length > 0) {
306
+ var callback = callbacks.shift();
307
+ if (typeof callback == 'function') {
308
+ callback(Module);
309
+ continue;
310
+ }
311
+ var func = callback.func;
312
+ if (typeof func === 'number') {
313
+ if (callback.arg === undefined) {
314
+ Module['dynCall_v'](func);
315
+ } else {
316
+ Module['dynCall_vi'](func, callback.arg);
317
+ }
318
+ } else {
319
+ func(callback.arg === undefined ? null : callback.arg);
320
+ }
321
+ }
322
+ }
323
+ var __ATPRERUN__ = [];
324
+ var __ATINIT__ = [];
325
+ var __ATMAIN__ = [];
326
+ var __ATPOSTRUN__ = [];
327
+ function preRun() {
328
+ if (Module['preRun']) {
329
+ if (typeof Module['preRun'] == 'function')
330
+ Module['preRun'] = [Module['preRun']];
331
+ while (Module['preRun'].length) {
332
+ addOnPreRun(Module['preRun'].shift());
333
+ }
334
+ }
335
+ callRuntimeCallbacks(__ATPRERUN__);
336
+ }
337
+ function initRuntime() {
338
+ if (!Module['noFSInit'] && !FS.init.initialized) FS.init();
339
+ TTY.init();
340
+ callRuntimeCallbacks(__ATINIT__);
341
+ }
342
+ function preMain() {
343
+ FS.ignorePermissions = false;
344
+ callRuntimeCallbacks(__ATMAIN__);
345
+ }
346
+ function postRun() {
347
+ if (Module['postRun']) {
348
+ if (typeof Module['postRun'] == 'function')
349
+ Module['postRun'] = [Module['postRun']];
350
+ while (Module['postRun'].length) {
351
+ addOnPostRun(Module['postRun'].shift());
352
+ }
353
+ }
354
+ callRuntimeCallbacks(__ATPOSTRUN__);
355
+ }
356
+ function addOnPreRun(cb) {
357
+ __ATPRERUN__.unshift(cb);
358
+ }
359
+ function addOnPostRun(cb) {
360
+ __ATPOSTRUN__.unshift(cb);
361
+ }
362
+ var Math_abs = Math.abs;
363
+ var Math_ceil = Math.ceil;
364
+ var Math_floor = Math.floor;
365
+ var Math_min = Math.min;
366
+ var runDependencies = 0;
367
+ var dependenciesFulfilled = null;
368
+ function addRunDependency(id) {
369
+ runDependencies++;
370
+ if (Module['monitorRunDependencies']) {
371
+ Module['monitorRunDependencies'](runDependencies);
372
+ }
373
+ }
374
+ function removeRunDependency(id) {
375
+ runDependencies--;
376
+ if (Module['monitorRunDependencies']) {
377
+ Module['monitorRunDependencies'](runDependencies);
378
+ }
379
+ if (runDependencies == 0) {
380
+ if (dependenciesFulfilled) {
381
+ var callback = dependenciesFulfilled;
382
+ dependenciesFulfilled = null;
383
+ callback();
384
+ }
385
+ }
386
+ }
387
+ Module['preloadedImages'] = {};
388
+ Module['preloadedAudios'] = {};
389
+ function abort(what) {
390
+ if (Module['onAbort']) {
391
+ Module['onAbort'](what);
392
+ }
393
+ what += '';
394
+ out(what);
395
+ err(what);
396
+ ABORT = true;
397
+ what =
398
+ 'abort(' + what + '). Build with -s ASSERTIONS=1 for more info.';
399
+ throw new WebAssembly.RuntimeError(what);
400
+ }
401
+ function hasPrefix(str, prefix) {
402
+ return String.prototype.startsWith
403
+ ? str.startsWith(prefix)
404
+ : str.indexOf(prefix) === 0;
405
+ }
406
+ var dataURIPrefix = 'data:application/octet-stream;base64,';
407
+ function isDataURI(filename) {
408
+ return hasPrefix(filename, dataURIPrefix);
409
+ }
410
+ var wasmBinaryFile = 'graphvizlib.wasm';
411
+ if (!isDataURI(wasmBinaryFile)) {
412
+ wasmBinaryFile = locateFile(wasmBinaryFile);
413
+ }
414
+ function getBinaryPromise() {
415
+ if (wasmBinary) {
416
+ Promise.resolve(wasmBinary);
417
+ }
418
+ return new Promise(function (resolve, reject) {
419
+ const binaryPath = nodePath.join(
420
+ __dirname,
421
+ 'bin',
422
+ 'graphvizlib.wasm'
423
+ );
424
+ nodeFs.readFile(binaryPath, function (err, binary) {
425
+ wasmBinary = binary;
426
+ resolve(binary);
427
+ });
428
+ });
429
+ }
430
+ function createWasm() {
431
+ var info = { a: asmLibraryArg };
432
+ function receiveInstance(instance, module) {
433
+ var exports = instance.exports;
434
+ Module['asm'] = exports;
435
+ removeRunDependency();
436
+ }
437
+ addRunDependency();
438
+ function receiveInstantiatedSource(output) {
439
+ receiveInstance(output['instance']);
440
+ }
441
+ function instantiateArrayBuffer(receiver) {
442
+ return getBinaryPromise()
443
+ .then(function (binary) {
444
+ return WebAssembly.instantiate(binary, info);
445
+ })
446
+ .then(receiver, function (reason) {
447
+ err('failed to asynchronously prepare wasm: ' + reason);
448
+ abort(reason);
449
+ });
450
+ }
451
+ function instantiateAsync() {
452
+ if (
453
+ !wasmBinary &&
454
+ typeof WebAssembly.instantiateStreaming === 'function' &&
455
+ !isDataURI(wasmBinaryFile) &&
456
+ typeof fetch === 'function',
457
+ typeof process !== 'object' // only if NOT Node environment
458
+ ) {
459
+ // Node v17 and above fails on `fetch` since Node has `fetch` integrated natively.
460
+ // So `fetch === function` is actually true.
461
+ // Error is: `ERR_INVALID_URL` since it cannot fetch local files eg.: "./graphvizlib.wasm"
462
+ fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(
463
+ function (response) {
464
+ var result = WebAssembly.instantiateStreaming(response, info);
465
+ return result.then(receiveInstantiatedSource, function (
466
+ reason
467
+ ) {
468
+ err('wasm streaming compile failed: ' + reason);
469
+ err('falling back to ArrayBuffer instantiation');
470
+ instantiateArrayBuffer(receiveInstantiatedSource);
471
+ });
472
+ }
473
+ );
474
+ } else {
475
+ return instantiateArrayBuffer(receiveInstantiatedSource);
476
+ }
477
+ }
478
+ if (Module['instantiateWasm']) {
479
+ try {
480
+ var exports = Module['instantiateWasm'](info, receiveInstance);
481
+ return exports;
482
+ } catch (e) {
483
+ err('Module.instantiateWasm callback failed with error: ' + e);
484
+ return false;
485
+ }
486
+ }
487
+ instantiateAsync();
488
+ return {};
489
+ }
490
+ var tempDouble;
491
+ var tempI64;
492
+ var ASM_CONSTS = {
493
+ 1186: function ($0, $1) {
494
+ var path = UTF8ToString($0);
495
+ var data = UTF8ToString($1);
496
+ FS.createPath('/', PATH.dirname(path));
497
+ FS.writeFile(PATH.join('/', path), data);
498
+ },
499
+ };
500
+ function _emscripten_asm_const_iii(code, sigPtr, argbuf) {
501
+ var args = readAsmConstArgs(sigPtr, argbuf);
502
+ return ASM_CONSTS[code].apply(null, args);
503
+ }
504
+ __ATINIT__.push({
505
+ func: function () {
506
+ ___wasm_call_ctors();
507
+ },
508
+ });
509
+ function demangle(func) {
510
+ return func;
511
+ }
512
+ function demangleAll(text) {
513
+ var regex = /\b_Z[\w\d_]+/g;
514
+ return text.replace(regex, function (x) {
515
+ var y = demangle(x);
516
+ return x === y ? x : y + ' [' + x + ']';
517
+ });
518
+ }
519
+ function jsStackTrace() {
520
+ var err = new Error();
521
+ if (!err.stack) {
522
+ try {
523
+ throw new Error();
524
+ } catch (e) {
525
+ err = e;
526
+ }
527
+ if (!err.stack) {
528
+ return '(no stack trace available)';
529
+ }
530
+ }
531
+ return err.stack.toString();
532
+ }
533
+ function stackTrace() {
534
+ var js = jsStackTrace();
535
+ if (Module['extraStackTrace'])
536
+ js += '\n' + Module['extraStackTrace']();
537
+ return demangleAll(js);
538
+ }
539
+ var _emscripten_get_now;
540
+ _emscripten_get_now = function () {
541
+ return performance.now();
542
+ };
543
+ var _emscripten_get_now_is_monotonic = true;
544
+ function setErrNo(value) {
545
+ HEAP32[___errno_location() >> 2] = value;
546
+ return value;
547
+ }
548
+ function _clock_gettime(clk_id, tp) {
549
+ var now;
550
+ if (clk_id === 0) {
551
+ now = Date.now();
552
+ } else if (
553
+ (clk_id === 1 || clk_id === 4) &&
554
+ _emscripten_get_now_is_monotonic
555
+ ) {
556
+ now = _emscripten_get_now();
557
+ } else {
558
+ setErrNo(28);
559
+ return -1;
560
+ }
561
+ HEAP32[tp >> 2] = (now / 1e3) | 0;
562
+ HEAP32[(tp + 4) >> 2] = ((now % 1e3) * 1e3 * 1e3) | 0;
563
+ return 0;
564
+ }
565
+ function ___clock_gettime(a0, a1) {
566
+ return _clock_gettime(a0, a1);
567
+ }
568
+ function ___cxa_allocate_exception(size) {
569
+ return _malloc(size);
570
+ }
571
+ function ___cxa_throw(ptr, type, destructor) {
572
+ throw ptr;
573
+ }
574
+ function ___map_file(pathname, size) {
575
+ setErrNo(63);
576
+ return -1;
577
+ }
578
+ var PATH = {
579
+ splitPath: function (filename) {
580
+ var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
581
+ return splitPathRe.exec(filename).slice(1);
582
+ },
583
+ normalizeArray: function (parts, allowAboveRoot) {
584
+ var up = 0;
585
+ for (var i = parts.length - 1; i >= 0; i--) {
586
+ var last = parts[i];
587
+ if (last === '.') {
588
+ parts.splice(i, 1);
589
+ } else if (last === '..') {
590
+ parts.splice(i, 1);
591
+ up++;
592
+ } else if (up) {
593
+ parts.splice(i, 1);
594
+ up--;
595
+ }
596
+ }
597
+ if (allowAboveRoot) {
598
+ for (; up; up--) {
599
+ parts.unshift('..');
600
+ }
601
+ }
602
+ return parts;
603
+ },
604
+ normalize: function (path) {
605
+ var isAbsolute = path.charAt(0) === '/',
606
+ trailingSlash = path.substr(-1) === '/';
607
+ path = PATH.normalizeArray(
608
+ path.split('/').filter(function (p) {
609
+ return !!p;
610
+ }),
611
+ !isAbsolute
612
+ ).join('/');
613
+ if (!path && !isAbsolute) {
614
+ path = '.';
615
+ }
616
+ if (path && trailingSlash) {
617
+ path += '/';
618
+ }
619
+ return (isAbsolute ? '/' : '') + path;
620
+ },
621
+ dirname: function (path) {
622
+ var result = PATH.splitPath(path),
623
+ root = result[0],
624
+ dir = result[1];
625
+ if (!root && !dir) {
626
+ return '.';
627
+ }
628
+ if (dir) {
629
+ dir = dir.substr(0, dir.length - 1);
630
+ }
631
+ return root + dir;
632
+ },
633
+ basename: function (path) {
634
+ if (path === '/') return '/';
635
+ var lastSlash = path.lastIndexOf('/');
636
+ if (lastSlash === -1) return path;
637
+ return path.substr(lastSlash + 1);
638
+ },
639
+ extname: function (path) {
640
+ return PATH.splitPath(path)[3];
641
+ },
642
+ join: function () {
643
+ var paths = Array.prototype.slice.call(arguments, 0);
644
+ return PATH.normalize(paths.join('/'));
645
+ },
646
+ join2: function (l, r) {
647
+ return PATH.normalize(l + '/' + r);
648
+ },
649
+ };
650
+ var PATH_FS = {
651
+ resolve: function () {
652
+ var resolvedPath = '',
653
+ resolvedAbsolute = false;
654
+ for (
655
+ var i = arguments.length - 1;
656
+ i >= -1 && !resolvedAbsolute;
657
+ i--
658
+ ) {
659
+ var path = i >= 0 ? arguments[i] : FS.cwd();
660
+ if (typeof path !== 'string') {
661
+ throw new TypeError(
662
+ 'Arguments to path.resolve must be strings'
663
+ );
664
+ } else if (!path) {
665
+ return '';
666
+ }
667
+ resolvedPath = path + '/' + resolvedPath;
668
+ resolvedAbsolute = path.charAt(0) === '/';
669
+ }
670
+ resolvedPath = PATH.normalizeArray(
671
+ resolvedPath.split('/').filter(function (p) {
672
+ return !!p;
673
+ }),
674
+ !resolvedAbsolute
675
+ ).join('/');
676
+ return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';
677
+ },
678
+ relative: function (from, to) {
679
+ from = PATH_FS.resolve(from).substr(1);
680
+ to = PATH_FS.resolve(to).substr(1);
681
+ function trim(arr) {
682
+ var start = 0;
683
+ for (; start < arr.length; start++) {
684
+ if (arr[start] !== '') break;
685
+ }
686
+ var end = arr.length - 1;
687
+ for (; end >= 0; end--) {
688
+ if (arr[end] !== '') break;
689
+ }
690
+ if (start > end) return [];
691
+ return arr.slice(start, end - start + 1);
692
+ }
693
+ var fromParts = trim(from.split('/'));
694
+ var toParts = trim(to.split('/'));
695
+ var length = Math.min(fromParts.length, toParts.length);
696
+ var samePartsLength = length;
697
+ for (var i = 0; i < length; i++) {
698
+ if (fromParts[i] !== toParts[i]) {
699
+ samePartsLength = i;
700
+ break;
701
+ }
702
+ }
703
+ var outputParts = [];
704
+ for (var i = samePartsLength; i < fromParts.length; i++) {
705
+ outputParts.push('..');
706
+ }
707
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
708
+ return outputParts.join('/');
709
+ },
710
+ };
711
+ var TTY = {
712
+ ttys: [],
713
+ init: function () {},
714
+ shutdown: function () {},
715
+ register: function (dev, ops) {
716
+ TTY.ttys[dev] = { input: [], output: [], ops: ops };
717
+ FS.registerDevice(dev, TTY.stream_ops);
718
+ },
719
+ stream_ops: {
720
+ open: function (stream) {
721
+ var tty = TTY.ttys[stream.node.rdev];
722
+ if (!tty) {
723
+ throw new FS.ErrnoError(43);
724
+ }
725
+ stream.tty = tty;
726
+ stream.seekable = false;
727
+ },
728
+ close: function (stream) {
729
+ stream.tty.ops.flush(stream.tty);
730
+ },
731
+ flush: function (stream) {
732
+ stream.tty.ops.flush(stream.tty);
733
+ },
734
+ read: function (stream, buffer, offset, length, pos) {
735
+ if (!stream.tty || !stream.tty.ops.get_char) {
736
+ throw new FS.ErrnoError(60);
737
+ }
738
+ var bytesRead = 0;
739
+ for (var i = 0; i < length; i++) {
740
+ var result;
741
+ try {
742
+ result = stream.tty.ops.get_char(stream.tty);
743
+ } catch (e) {
744
+ throw new FS.ErrnoError(29);
745
+ }
746
+ if (result === undefined && bytesRead === 0) {
747
+ throw new FS.ErrnoError(6);
748
+ }
749
+ if (result === null || result === undefined) break;
750
+ bytesRead++;
751
+ buffer[offset + i] = result;
752
+ }
753
+ if (bytesRead) {
754
+ stream.node.timestamp = Date.now();
755
+ }
756
+ return bytesRead;
757
+ },
758
+ write: function (stream, buffer, offset, length, pos) {
759
+ if (!stream.tty || !stream.tty.ops.put_char) {
760
+ throw new FS.ErrnoError(60);
761
+ }
762
+ try {
763
+ for (var i = 0; i < length; i++) {
764
+ stream.tty.ops.put_char(stream.tty, buffer[offset + i]);
765
+ }
766
+ } catch (e) {
767
+ throw new FS.ErrnoError(29);
768
+ }
769
+ if (length) {
770
+ stream.node.timestamp = Date.now();
771
+ }
772
+ return i;
773
+ },
774
+ },
775
+ default_tty_ops: {
776
+ get_char: function (tty) {
777
+ if (!tty.input.length) {
778
+ var result = null;
779
+ if (
780
+ typeof window != 'undefined' &&
781
+ typeof window.prompt == 'function'
782
+ ) {
783
+ result = window.prompt('Input: ');
784
+ if (result !== null) {
785
+ result += '\n';
786
+ }
787
+ } else if (typeof readline == 'function') {
788
+ result = readline();
789
+ if (result !== null) {
790
+ result += '\n';
791
+ }
792
+ }
793
+ if (!result) {
794
+ return null;
795
+ }
796
+ tty.input = intArrayFromString(result, true);
797
+ }
798
+ return tty.input.shift();
799
+ },
800
+ put_char: function (tty, val) {
801
+ if (val === null || val === 10) {
802
+ out(UTF8ArrayToString(tty.output, 0));
803
+ tty.output = [];
804
+ } else {
805
+ if (val != 0) tty.output.push(val);
806
+ }
807
+ },
808
+ flush: function (tty) {
809
+ if (tty.output && tty.output.length > 0) {
810
+ out(UTF8ArrayToString(tty.output, 0));
811
+ tty.output = [];
812
+ }
813
+ },
814
+ },
815
+ default_tty1_ops: {
816
+ put_char: function (tty, val) {
817
+ if (val === null || val === 10) {
818
+ err(UTF8ArrayToString(tty.output, 0));
819
+ tty.output = [];
820
+ } else {
821
+ if (val != 0) tty.output.push(val);
822
+ }
823
+ },
824
+ flush: function (tty) {
825
+ if (tty.output && tty.output.length > 0) {
826
+ err(UTF8ArrayToString(tty.output, 0));
827
+ tty.output = [];
828
+ }
829
+ },
830
+ },
831
+ };
832
+ var MEMFS = {
833
+ ops_table: null,
834
+ mount: function (mount) {
835
+ return MEMFS.createNode(null, '/', 16384 | 511, 0);
836
+ },
837
+ createNode: function (parent, name, mode, dev) {
838
+ if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
839
+ throw new FS.ErrnoError(63);
840
+ }
841
+ if (!MEMFS.ops_table) {
842
+ MEMFS.ops_table = {
843
+ dir: {
844
+ node: {
845
+ getattr: MEMFS.node_ops.getattr,
846
+ setattr: MEMFS.node_ops.setattr,
847
+ lookup: MEMFS.node_ops.lookup,
848
+ mknod: MEMFS.node_ops.mknod,
849
+ rename: MEMFS.node_ops.rename,
850
+ unlink: MEMFS.node_ops.unlink,
851
+ rmdir: MEMFS.node_ops.rmdir,
852
+ readdir: MEMFS.node_ops.readdir,
853
+ symlink: MEMFS.node_ops.symlink,
854
+ },
855
+ stream: { llseek: MEMFS.stream_ops.llseek },
856
+ },
857
+ file: {
858
+ node: {
859
+ getattr: MEMFS.node_ops.getattr,
860
+ setattr: MEMFS.node_ops.setattr,
861
+ },
862
+ stream: {
863
+ llseek: MEMFS.stream_ops.llseek,
864
+ read: MEMFS.stream_ops.read,
865
+ write: MEMFS.stream_ops.write,
866
+ allocate: MEMFS.stream_ops.allocate,
867
+ mmap: MEMFS.stream_ops.mmap,
868
+ msync: MEMFS.stream_ops.msync,
869
+ },
870
+ },
871
+ link: {
872
+ node: {
873
+ getattr: MEMFS.node_ops.getattr,
874
+ setattr: MEMFS.node_ops.setattr,
875
+ readlink: MEMFS.node_ops.readlink,
876
+ },
877
+ stream: {},
878
+ },
879
+ chrdev: {
880
+ node: {
881
+ getattr: MEMFS.node_ops.getattr,
882
+ setattr: MEMFS.node_ops.setattr,
883
+ },
884
+ stream: FS.chrdev_stream_ops,
885
+ },
886
+ };
887
+ }
888
+ var node = FS.createNode(parent, name, mode, dev);
889
+ if (FS.isDir(node.mode)) {
890
+ node.node_ops = MEMFS.ops_table.dir.node;
891
+ node.stream_ops = MEMFS.ops_table.dir.stream;
892
+ node.contents = {};
893
+ } else if (FS.isFile(node.mode)) {
894
+ node.node_ops = MEMFS.ops_table.file.node;
895
+ node.stream_ops = MEMFS.ops_table.file.stream;
896
+ node.usedBytes = 0;
897
+ node.contents = null;
898
+ } else if (FS.isLink(node.mode)) {
899
+ node.node_ops = MEMFS.ops_table.link.node;
900
+ node.stream_ops = MEMFS.ops_table.link.stream;
901
+ } else if (FS.isChrdev(node.mode)) {
902
+ node.node_ops = MEMFS.ops_table.chrdev.node;
903
+ node.stream_ops = MEMFS.ops_table.chrdev.stream;
904
+ }
905
+ node.timestamp = Date.now();
906
+ if (parent) {
907
+ parent.contents[name] = node;
908
+ }
909
+ return node;
910
+ },
911
+ getFileDataAsRegularArray: function (node) {
912
+ if (node.contents && node.contents.subarray) {
913
+ var arr = [];
914
+ for (var i = 0; i < node.usedBytes; ++i)
915
+ arr.push(node.contents[i]);
916
+ return arr;
917
+ }
918
+ return node.contents;
919
+ },
920
+ getFileDataAsTypedArray: function (node) {
921
+ if (!node.contents) return new Uint8Array(0);
922
+ if (node.contents.subarray)
923
+ return node.contents.subarray(0, node.usedBytes);
924
+ return new Uint8Array(node.contents);
925
+ },
926
+ expandFileStorage: function (node, newCapacity) {
927
+ var prevCapacity = node.contents ? node.contents.length : 0;
928
+ if (prevCapacity >= newCapacity) return;
929
+ var CAPACITY_DOUBLING_MAX = 1024 * 1024;
930
+ newCapacity = Math.max(
931
+ newCapacity,
932
+ (prevCapacity *
933
+ (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>>
934
+ 0
935
+ );
936
+ if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);
937
+ var oldContents = node.contents;
938
+ node.contents = new Uint8Array(newCapacity);
939
+ if (node.usedBytes > 0)
940
+ node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
941
+ return;
942
+ },
943
+ resizeFileStorage: function (node, newSize) {
944
+ if (node.usedBytes == newSize) return;
945
+ if (newSize == 0) {
946
+ node.contents = null;
947
+ node.usedBytes = 0;
948
+ return;
949
+ }
950
+ if (!node.contents || node.contents.subarray) {
951
+ var oldContents = node.contents;
952
+ node.contents = new Uint8Array(newSize);
953
+ if (oldContents) {
954
+ node.contents.set(
955
+ oldContents.subarray(0, Math.min(newSize, node.usedBytes))
956
+ );
957
+ }
958
+ node.usedBytes = newSize;
959
+ return;
960
+ }
961
+ if (!node.contents) node.contents = [];
962
+ if (node.contents.length > newSize) node.contents.length = newSize;
963
+ else while (node.contents.length < newSize) node.contents.push(0);
964
+ node.usedBytes = newSize;
965
+ },
966
+ node_ops: {
967
+ getattr: function (node) {
968
+ var attr = {};
969
+ attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
970
+ attr.ino = node.id;
971
+ attr.mode = node.mode;
972
+ attr.nlink = 1;
973
+ attr.uid = 0;
974
+ attr.gid = 0;
975
+ attr.rdev = node.rdev;
976
+ if (FS.isDir(node.mode)) {
977
+ attr.size = 4096;
978
+ } else if (FS.isFile(node.mode)) {
979
+ attr.size = node.usedBytes;
980
+ } else if (FS.isLink(node.mode)) {
981
+ attr.size = node.link.length;
982
+ } else {
983
+ attr.size = 0;
984
+ }
985
+ attr.atime = new Date(node.timestamp);
986
+ attr.mtime = new Date(node.timestamp);
987
+ attr.ctime = new Date(node.timestamp);
988
+ attr.blksize = 4096;
989
+ attr.blocks = Math.ceil(attr.size / attr.blksize);
990
+ return attr;
991
+ },
992
+ setattr: function (node, attr) {
993
+ if (attr.mode !== undefined) {
994
+ node.mode = attr.mode;
995
+ }
996
+ if (attr.timestamp !== undefined) {
997
+ node.timestamp = attr.timestamp;
998
+ }
999
+ if (attr.size !== undefined) {
1000
+ MEMFS.resizeFileStorage(node, attr.size);
1001
+ }
1002
+ },
1003
+ lookup: function (parent, name) {
1004
+ throw FS.genericErrors[44];
1005
+ },
1006
+ mknod: function (parent, name, mode, dev) {
1007
+ return MEMFS.createNode(parent, name, mode, dev);
1008
+ },
1009
+ rename: function (old_node, new_dir, new_name) {
1010
+ if (FS.isDir(old_node.mode)) {
1011
+ var new_node;
1012
+ try {
1013
+ new_node = FS.lookupNode(new_dir, new_name);
1014
+ } catch (e) {}
1015
+ if (new_node) {
1016
+ for (var i in new_node.contents) {
1017
+ throw new FS.ErrnoError(55);
1018
+ }
1019
+ }
1020
+ }
1021
+ delete old_node.parent.contents[old_node.name];
1022
+ old_node.name = new_name;
1023
+ new_dir.contents[new_name] = old_node;
1024
+ old_node.parent = new_dir;
1025
+ },
1026
+ unlink: function (parent, name) {
1027
+ delete parent.contents[name];
1028
+ },
1029
+ rmdir: function (parent, name) {
1030
+ var node = FS.lookupNode(parent, name);
1031
+ for (var i in node.contents) {
1032
+ throw new FS.ErrnoError(55);
1033
+ }
1034
+ delete parent.contents[name];
1035
+ },
1036
+ readdir: function (node) {
1037
+ var entries = ['.', '..'];
1038
+ for (var key in node.contents) {
1039
+ if (!node.contents.hasOwnProperty(key)) {
1040
+ continue;
1041
+ }
1042
+ entries.push(key);
1043
+ }
1044
+ return entries;
1045
+ },
1046
+ symlink: function (parent, newname, oldpath) {
1047
+ var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
1048
+ node.link = oldpath;
1049
+ return node;
1050
+ },
1051
+ readlink: function (node) {
1052
+ if (!FS.isLink(node.mode)) {
1053
+ throw new FS.ErrnoError(28);
1054
+ }
1055
+ return node.link;
1056
+ },
1057
+ },
1058
+ stream_ops: {
1059
+ read: function (stream, buffer, offset, length, position) {
1060
+ var contents = stream.node.contents;
1061
+ if (position >= stream.node.usedBytes) return 0;
1062
+ var size = Math.min(stream.node.usedBytes - position, length);
1063
+ if (size > 8 && contents.subarray) {
1064
+ buffer.set(
1065
+ contents.subarray(position, position + size),
1066
+ offset
1067
+ );
1068
+ } else {
1069
+ for (var i = 0; i < size; i++)
1070
+ buffer[offset + i] = contents[position + i];
1071
+ }
1072
+ return size;
1073
+ },
1074
+ write: function (stream, buffer, offset, length, position, canOwn) {
1075
+ if (buffer.buffer === HEAP8.buffer) {
1076
+ canOwn = false;
1077
+ }
1078
+ if (!length) return 0;
1079
+ var node = stream.node;
1080
+ node.timestamp = Date.now();
1081
+ if (
1082
+ buffer.subarray &&
1083
+ (!node.contents || node.contents.subarray)
1084
+ ) {
1085
+ if (canOwn) {
1086
+ node.contents = buffer.subarray(offset, offset + length);
1087
+ node.usedBytes = length;
1088
+ return length;
1089
+ } else if (node.usedBytes === 0 && position === 0) {
1090
+ node.contents = buffer.slice(offset, offset + length);
1091
+ node.usedBytes = length;
1092
+ return length;
1093
+ } else if (position + length <= node.usedBytes) {
1094
+ node.contents.set(
1095
+ buffer.subarray(offset, offset + length),
1096
+ position
1097
+ );
1098
+ return length;
1099
+ }
1100
+ }
1101
+ MEMFS.expandFileStorage(node, position + length);
1102
+ if (node.contents.subarray && buffer.subarray)
1103
+ node.contents.set(
1104
+ buffer.subarray(offset, offset + length),
1105
+ position
1106
+ );
1107
+ else {
1108
+ for (var i = 0; i < length; i++) {
1109
+ node.contents[position + i] = buffer[offset + i];
1110
+ }
1111
+ }
1112
+ node.usedBytes = Math.max(node.usedBytes, position + length);
1113
+ return length;
1114
+ },
1115
+ llseek: function (stream, offset, whence) {
1116
+ var position = offset;
1117
+ if (whence === 1) {
1118
+ position += stream.position;
1119
+ } else if (whence === 2) {
1120
+ if (FS.isFile(stream.node.mode)) {
1121
+ position += stream.node.usedBytes;
1122
+ }
1123
+ }
1124
+ if (position < 0) {
1125
+ throw new FS.ErrnoError(28);
1126
+ }
1127
+ return position;
1128
+ },
1129
+ allocate: function (stream, offset, length) {
1130
+ MEMFS.expandFileStorage(stream.node, offset + length);
1131
+ stream.node.usedBytes = Math.max(
1132
+ stream.node.usedBytes,
1133
+ offset + length
1134
+ );
1135
+ },
1136
+ mmap: function (
1137
+ stream,
1138
+ buffer,
1139
+ offset,
1140
+ length,
1141
+ position,
1142
+ prot,
1143
+ flags
1144
+ ) {
1145
+ if (!FS.isFile(stream.node.mode)) {
1146
+ throw new FS.ErrnoError(43);
1147
+ }
1148
+ var ptr;
1149
+ var allocated;
1150
+ var contents = stream.node.contents;
1151
+ if (!(flags & 2) && contents.buffer === buffer.buffer) {
1152
+ allocated = false;
1153
+ ptr = contents.byteOffset;
1154
+ } else {
1155
+ if (position > 0 || position + length < contents.length) {
1156
+ if (contents.subarray) {
1157
+ contents = contents.subarray(position, position + length);
1158
+ } else {
1159
+ contents = Array.prototype.slice.call(
1160
+ contents,
1161
+ position,
1162
+ position + length
1163
+ );
1164
+ }
1165
+ }
1166
+ allocated = true;
1167
+ var fromHeap = buffer.buffer == HEAP8.buffer;
1168
+ ptr = _malloc(length);
1169
+ if (!ptr) {
1170
+ throw new FS.ErrnoError(48);
1171
+ }
1172
+ (fromHeap ? HEAP8 : buffer).set(contents, ptr);
1173
+ }
1174
+ return { ptr: ptr, allocated: allocated };
1175
+ },
1176
+ msync: function (stream, buffer, offset, length, mmapFlags) {
1177
+ if (!FS.isFile(stream.node.mode)) {
1178
+ throw new FS.ErrnoError(43);
1179
+ }
1180
+ if (mmapFlags & 2) {
1181
+ return 0;
1182
+ }
1183
+ var bytesWritten = MEMFS.stream_ops.write(
1184
+ stream,
1185
+ buffer,
1186
+ 0,
1187
+ length,
1188
+ offset,
1189
+ false
1190
+ );
1191
+ return 0;
1192
+ },
1193
+ },
1194
+ };
1195
+ var FS = {
1196
+ root: null,
1197
+ mounts: [],
1198
+ devices: {},
1199
+ streams: [],
1200
+ nextInode: 1,
1201
+ nameTable: null,
1202
+ currentPath: '/',
1203
+ initialized: false,
1204
+ ignorePermissions: true,
1205
+ trackingDelegate: {},
1206
+ tracking: { openFlags: { READ: 1, WRITE: 2 } },
1207
+ ErrnoError: null,
1208
+ genericErrors: {},
1209
+ filesystems: null,
1210
+ syncFSRequests: 0,
1211
+ handleFSError: function (e) {
1212
+ if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
1213
+ return setErrNo(e.errno);
1214
+ },
1215
+ lookupPath: function (path, opts) {
1216
+ path = PATH_FS.resolve(FS.cwd(), path);
1217
+ opts = opts || {};
1218
+ if (!path) return { path: '', node: null };
1219
+ var defaults = { follow_mount: true, recurse_count: 0 };
1220
+ for (var key in defaults) {
1221
+ if (opts[key] === undefined) {
1222
+ opts[key] = defaults[key];
1223
+ }
1224
+ }
1225
+ if (opts.recurse_count > 8) {
1226
+ throw new FS.ErrnoError(32);
1227
+ }
1228
+ var parts = PATH.normalizeArray(
1229
+ path.split('/').filter(function (p) {
1230
+ return !!p;
1231
+ }),
1232
+ false
1233
+ );
1234
+ var current = FS.root;
1235
+ var current_path = '/';
1236
+ for (var i = 0; i < parts.length; i++) {
1237
+ var islast = i === parts.length - 1;
1238
+ if (islast && opts.parent) {
1239
+ break;
1240
+ }
1241
+ current = FS.lookupNode(current, parts[i]);
1242
+ current_path = PATH.join2(current_path, parts[i]);
1243
+ if (FS.isMountpoint(current)) {
1244
+ if (!islast || (islast && opts.follow_mount)) {
1245
+ current = current.mounted.root;
1246
+ }
1247
+ }
1248
+ if (!islast || opts.follow) {
1249
+ var count = 0;
1250
+ while (FS.isLink(current.mode)) {
1251
+ var link = FS.readlink(current_path);
1252
+ current_path = PATH_FS.resolve(
1253
+ PATH.dirname(current_path),
1254
+ link
1255
+ );
1256
+ var lookup = FS.lookupPath(current_path, {
1257
+ recurse_count: opts.recurse_count,
1258
+ });
1259
+ current = lookup.node;
1260
+ if (count++ > 40) {
1261
+ throw new FS.ErrnoError(32);
1262
+ }
1263
+ }
1264
+ }
1265
+ }
1266
+ return { path: current_path, node: current };
1267
+ },
1268
+ getPath: function (node) {
1269
+ var path;
1270
+ while (true) {
1271
+ if (FS.isRoot(node)) {
1272
+ var mount = node.mount.mountpoint;
1273
+ if (!path) return mount;
1274
+ return mount[mount.length - 1] !== '/'
1275
+ ? mount + '/' + path
1276
+ : mount + path;
1277
+ }
1278
+ path = path ? node.name + '/' + path : node.name;
1279
+ node = node.parent;
1280
+ }
1281
+ },
1282
+ hashName: function (parentid, name) {
1283
+ var hash = 0;
1284
+ for (var i = 0; i < name.length; i++) {
1285
+ hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
1286
+ }
1287
+ return ((parentid + hash) >>> 0) % FS.nameTable.length;
1288
+ },
1289
+ hashAddNode: function (node) {
1290
+ var hash = FS.hashName(node.parent.id, node.name);
1291
+ node.name_next = FS.nameTable[hash];
1292
+ FS.nameTable[hash] = node;
1293
+ },
1294
+ hashRemoveNode: function (node) {
1295
+ var hash = FS.hashName(node.parent.id, node.name);
1296
+ if (FS.nameTable[hash] === node) {
1297
+ FS.nameTable[hash] = node.name_next;
1298
+ } else {
1299
+ var current = FS.nameTable[hash];
1300
+ while (current) {
1301
+ if (current.name_next === node) {
1302
+ current.name_next = node.name_next;
1303
+ break;
1304
+ }
1305
+ current = current.name_next;
1306
+ }
1307
+ }
1308
+ },
1309
+ lookupNode: function (parent, name) {
1310
+ var errCode = FS.mayLookup(parent);
1311
+ if (errCode) {
1312
+ throw new FS.ErrnoError(errCode, parent);
1313
+ }
1314
+ var hash = FS.hashName(parent.id, name);
1315
+ for (var node = FS.nameTable[hash]; node; node = node.name_next) {
1316
+ var nodeName = node.name;
1317
+ if (node.parent.id === parent.id && nodeName === name) {
1318
+ return node;
1319
+ }
1320
+ }
1321
+ return FS.lookup(parent, name);
1322
+ },
1323
+ createNode: function (parent, name, mode, rdev) {
1324
+ var node = new FS.FSNode(parent, name, mode, rdev);
1325
+ FS.hashAddNode(node);
1326
+ return node;
1327
+ },
1328
+ destroyNode: function (node) {
1329
+ FS.hashRemoveNode(node);
1330
+ },
1331
+ isRoot: function (node) {
1332
+ return node === node.parent;
1333
+ },
1334
+ isMountpoint: function (node) {
1335
+ return !!node.mounted;
1336
+ },
1337
+ isFile: function (mode) {
1338
+ return (mode & 61440) === 32768;
1339
+ },
1340
+ isDir: function (mode) {
1341
+ return (mode & 61440) === 16384;
1342
+ },
1343
+ isLink: function (mode) {
1344
+ return (mode & 61440) === 40960;
1345
+ },
1346
+ isChrdev: function (mode) {
1347
+ return (mode & 61440) === 8192;
1348
+ },
1349
+ isBlkdev: function (mode) {
1350
+ return (mode & 61440) === 24576;
1351
+ },
1352
+ isFIFO: function (mode) {
1353
+ return (mode & 61440) === 4096;
1354
+ },
1355
+ isSocket: function (mode) {
1356
+ return (mode & 49152) === 49152;
1357
+ },
1358
+ flagModes: {
1359
+ r: 0,
1360
+ rs: 1052672,
1361
+ 'r+': 2,
1362
+ w: 577,
1363
+ wx: 705,
1364
+ xw: 705,
1365
+ 'w+': 578,
1366
+ 'wx+': 706,
1367
+ 'xw+': 706,
1368
+ a: 1089,
1369
+ ax: 1217,
1370
+ xa: 1217,
1371
+ 'a+': 1090,
1372
+ 'ax+': 1218,
1373
+ 'xa+': 1218,
1374
+ },
1375
+ modeStringToFlags: function (str) {
1376
+ var flags = FS.flagModes[str];
1377
+ if (typeof flags === 'undefined') {
1378
+ throw new Error('Unknown file open mode: ' + str);
1379
+ }
1380
+ return flags;
1381
+ },
1382
+ flagsToPermissionString: function (flag) {
1383
+ var perms = ['r', 'w', 'rw'][flag & 3];
1384
+ if (flag & 512) {
1385
+ perms += 'w';
1386
+ }
1387
+ return perms;
1388
+ },
1389
+ nodePermissions: function (node, perms) {
1390
+ if (FS.ignorePermissions) {
1391
+ return 0;
1392
+ }
1393
+ if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
1394
+ return 2;
1395
+ } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
1396
+ return 2;
1397
+ } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
1398
+ return 2;
1399
+ }
1400
+ return 0;
1401
+ },
1402
+ mayLookup: function (dir) {
1403
+ var errCode = FS.nodePermissions(dir, 'x');
1404
+ if (errCode) return errCode;
1405
+ if (!dir.node_ops.lookup) return 2;
1406
+ return 0;
1407
+ },
1408
+ mayCreate: function (dir, name) {
1409
+ try {
1410
+ var node = FS.lookupNode(dir, name);
1411
+ return 20;
1412
+ } catch (e) {}
1413
+ return FS.nodePermissions(dir, 'wx');
1414
+ },
1415
+ mayDelete: function (dir, name, isdir) {
1416
+ var node;
1417
+ try {
1418
+ node = FS.lookupNode(dir, name);
1419
+ } catch (e) {
1420
+ return e.errno;
1421
+ }
1422
+ var errCode = FS.nodePermissions(dir, 'wx');
1423
+ if (errCode) {
1424
+ return errCode;
1425
+ }
1426
+ if (isdir) {
1427
+ if (!FS.isDir(node.mode)) {
1428
+ return 54;
1429
+ }
1430
+ if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
1431
+ return 10;
1432
+ }
1433
+ } else {
1434
+ if (FS.isDir(node.mode)) {
1435
+ return 31;
1436
+ }
1437
+ }
1438
+ return 0;
1439
+ },
1440
+ mayOpen: function (node, flags) {
1441
+ if (!node) {
1442
+ return 44;
1443
+ }
1444
+ if (FS.isLink(node.mode)) {
1445
+ return 32;
1446
+ } else if (FS.isDir(node.mode)) {
1447
+ if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) {
1448
+ return 31;
1449
+ }
1450
+ }
1451
+ return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
1452
+ },
1453
+ MAX_OPEN_FDS: 4096,
1454
+ nextfd: function (fd_start, fd_end) {
1455
+ fd_start = fd_start || 0;
1456
+ fd_end = fd_end || FS.MAX_OPEN_FDS;
1457
+ for (var fd = fd_start; fd <= fd_end; fd++) {
1458
+ if (!FS.streams[fd]) {
1459
+ return fd;
1460
+ }
1461
+ }
1462
+ throw new FS.ErrnoError(33);
1463
+ },
1464
+ getStream: function (fd) {
1465
+ return FS.streams[fd];
1466
+ },
1467
+ createStream: function (stream, fd_start, fd_end) {
1468
+ if (!FS.FSStream) {
1469
+ FS.FSStream = function () {};
1470
+ FS.FSStream.prototype = {
1471
+ object: {
1472
+ get: function () {
1473
+ return this.node;
1474
+ },
1475
+ set: function (val) {
1476
+ this.node = val;
1477
+ },
1478
+ },
1479
+ isRead: {
1480
+ get: function () {
1481
+ return (this.flags & 2097155) !== 1;
1482
+ },
1483
+ },
1484
+ isWrite: {
1485
+ get: function () {
1486
+ return (this.flags & 2097155) !== 0;
1487
+ },
1488
+ },
1489
+ isAppend: {
1490
+ get: function () {
1491
+ return this.flags & 1024;
1492
+ },
1493
+ },
1494
+ };
1495
+ }
1496
+ var newStream = new FS.FSStream();
1497
+ for (var p in stream) {
1498
+ newStream[p] = stream[p];
1499
+ }
1500
+ stream = newStream;
1501
+ var fd = FS.nextfd(fd_start, fd_end);
1502
+ stream.fd = fd;
1503
+ FS.streams[fd] = stream;
1504
+ return stream;
1505
+ },
1506
+ closeStream: function (fd) {
1507
+ FS.streams[fd] = null;
1508
+ },
1509
+ chrdev_stream_ops: {
1510
+ open: function (stream) {
1511
+ var device = FS.getDevice(stream.node.rdev);
1512
+ stream.stream_ops = device.stream_ops;
1513
+ if (stream.stream_ops.open) {
1514
+ stream.stream_ops.open(stream);
1515
+ }
1516
+ },
1517
+ llseek: function () {
1518
+ throw new FS.ErrnoError(70);
1519
+ },
1520
+ },
1521
+ major: function (dev) {
1522
+ return dev >> 8;
1523
+ },
1524
+ minor: function (dev) {
1525
+ return dev & 255;
1526
+ },
1527
+ makedev: function (ma, mi) {
1528
+ return (ma << 8) | mi;
1529
+ },
1530
+ registerDevice: function (dev, ops) {
1531
+ FS.devices[dev] = { stream_ops: ops };
1532
+ },
1533
+ getDevice: function (dev) {
1534
+ return FS.devices[dev];
1535
+ },
1536
+ getMounts: function (mount) {
1537
+ var mounts = [];
1538
+ var check = [mount];
1539
+ while (check.length) {
1540
+ var m = check.pop();
1541
+ mounts.push(m);
1542
+ check.push.apply(check, m.mounts);
1543
+ }
1544
+ return mounts;
1545
+ },
1546
+ syncfs: function (populate, callback) {
1547
+ if (typeof populate === 'function') {
1548
+ callback = populate;
1549
+ populate = false;
1550
+ }
1551
+ FS.syncFSRequests++;
1552
+ if (FS.syncFSRequests > 1) {
1553
+ err(
1554
+ 'warning: ' +
1555
+ FS.syncFSRequests +
1556
+ ' FS.syncfs operations in flight at once, probably just doing extra work'
1557
+ );
1558
+ }
1559
+ var mounts = FS.getMounts(FS.root.mount);
1560
+ var completed = 0;
1561
+ function doCallback(errCode) {
1562
+ FS.syncFSRequests--;
1563
+ return callback(errCode);
1564
+ }
1565
+ function done(errCode) {
1566
+ if (errCode) {
1567
+ if (!done.errored) {
1568
+ done.errored = true;
1569
+ return doCallback(errCode);
1570
+ }
1571
+ return;
1572
+ }
1573
+ if (++completed >= mounts.length) {
1574
+ doCallback(null);
1575
+ }
1576
+ }
1577
+ mounts.forEach(function (mount) {
1578
+ if (!mount.type.syncfs) {
1579
+ return done(null);
1580
+ }
1581
+ mount.type.syncfs(mount, populate, done);
1582
+ });
1583
+ },
1584
+ mount: function (type, opts, mountpoint) {
1585
+ var root = mountpoint === '/';
1586
+ var pseudo = !mountpoint;
1587
+ var node;
1588
+ if (root && FS.root) {
1589
+ throw new FS.ErrnoError(10);
1590
+ } else if (!root && !pseudo) {
1591
+ var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
1592
+ mountpoint = lookup.path;
1593
+ node = lookup.node;
1594
+ if (FS.isMountpoint(node)) {
1595
+ throw new FS.ErrnoError(10);
1596
+ }
1597
+ if (!FS.isDir(node.mode)) {
1598
+ throw new FS.ErrnoError(54);
1599
+ }
1600
+ }
1601
+ var mount = {
1602
+ type: type,
1603
+ opts: opts,
1604
+ mountpoint: mountpoint,
1605
+ mounts: [],
1606
+ };
1607
+ var mountRoot = type.mount(mount);
1608
+ mountRoot.mount = mount;
1609
+ mount.root = mountRoot;
1610
+ if (root) {
1611
+ FS.root = mountRoot;
1612
+ } else if (node) {
1613
+ node.mounted = mount;
1614
+ if (node.mount) {
1615
+ node.mount.mounts.push(mount);
1616
+ }
1617
+ }
1618
+ return mountRoot;
1619
+ },
1620
+ unmount: function (mountpoint) {
1621
+ var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
1622
+ if (!FS.isMountpoint(lookup.node)) {
1623
+ throw new FS.ErrnoError(28);
1624
+ }
1625
+ var node = lookup.node;
1626
+ var mount = node.mounted;
1627
+ var mounts = FS.getMounts(mount);
1628
+ Object.keys(FS.nameTable).forEach(function (hash) {
1629
+ var current = FS.nameTable[hash];
1630
+ while (current) {
1631
+ var next = current.name_next;
1632
+ if (mounts.indexOf(current.mount) !== -1) {
1633
+ FS.destroyNode(current);
1634
+ }
1635
+ current = next;
1636
+ }
1637
+ });
1638
+ node.mounted = null;
1639
+ var idx = node.mount.mounts.indexOf(mount);
1640
+ node.mount.mounts.splice(idx, 1);
1641
+ },
1642
+ lookup: function (parent, name) {
1643
+ return parent.node_ops.lookup(parent, name);
1644
+ },
1645
+ mknod: function (path, mode, dev) {
1646
+ var lookup = FS.lookupPath(path, { parent: true });
1647
+ var parent = lookup.node;
1648
+ var name = PATH.basename(path);
1649
+ if (!name || name === '.' || name === '..') {
1650
+ throw new FS.ErrnoError(28);
1651
+ }
1652
+ var errCode = FS.mayCreate(parent, name);
1653
+ if (errCode) {
1654
+ throw new FS.ErrnoError(errCode);
1655
+ }
1656
+ if (!parent.node_ops.mknod) {
1657
+ throw new FS.ErrnoError(63);
1658
+ }
1659
+ return parent.node_ops.mknod(parent, name, mode, dev);
1660
+ },
1661
+ create: function (path, mode) {
1662
+ mode = mode !== undefined ? mode : 438;
1663
+ mode &= 4095;
1664
+ mode |= 32768;
1665
+ return FS.mknod(path, mode, 0);
1666
+ },
1667
+ mkdir: function (path, mode) {
1668
+ mode = mode !== undefined ? mode : 511;
1669
+ mode &= 511 | 512;
1670
+ mode |= 16384;
1671
+ return FS.mknod(path, mode, 0);
1672
+ },
1673
+ mkdirTree: function (path, mode) {
1674
+ var dirs = path.split('/');
1675
+ var d = '';
1676
+ for (var i = 0; i < dirs.length; ++i) {
1677
+ if (!dirs[i]) continue;
1678
+ d += '/' + dirs[i];
1679
+ try {
1680
+ FS.mkdir(d, mode);
1681
+ } catch (e) {
1682
+ if (e.errno != 20) throw e;
1683
+ }
1684
+ }
1685
+ },
1686
+ mkdev: function (path, mode, dev) {
1687
+ if (typeof dev === 'undefined') {
1688
+ dev = mode;
1689
+ mode = 438;
1690
+ }
1691
+ mode |= 8192;
1692
+ return FS.mknod(path, mode, dev);
1693
+ },
1694
+ symlink: function (oldpath, newpath) {
1695
+ if (!PATH_FS.resolve(oldpath)) {
1696
+ throw new FS.ErrnoError(44);
1697
+ }
1698
+ var lookup = FS.lookupPath(newpath, { parent: true });
1699
+ var parent = lookup.node;
1700
+ if (!parent) {
1701
+ throw new FS.ErrnoError(44);
1702
+ }
1703
+ var newname = PATH.basename(newpath);
1704
+ var errCode = FS.mayCreate(parent, newname);
1705
+ if (errCode) {
1706
+ throw new FS.ErrnoError(errCode);
1707
+ }
1708
+ if (!parent.node_ops.symlink) {
1709
+ throw new FS.ErrnoError(63);
1710
+ }
1711
+ return parent.node_ops.symlink(parent, newname, oldpath);
1712
+ },
1713
+ rename: function (old_path, new_path) {
1714
+ var old_dirname = PATH.dirname(old_path);
1715
+ var new_dirname = PATH.dirname(new_path);
1716
+ var old_name = PATH.basename(old_path);
1717
+ var new_name = PATH.basename(new_path);
1718
+ var lookup, old_dir, new_dir;
1719
+ try {
1720
+ lookup = FS.lookupPath(old_path, { parent: true });
1721
+ old_dir = lookup.node;
1722
+ lookup = FS.lookupPath(new_path, { parent: true });
1723
+ new_dir = lookup.node;
1724
+ } catch (e) {
1725
+ throw new FS.ErrnoError(10);
1726
+ }
1727
+ if (!old_dir || !new_dir) throw new FS.ErrnoError(44);
1728
+ if (old_dir.mount !== new_dir.mount) {
1729
+ throw new FS.ErrnoError(75);
1730
+ }
1731
+ var old_node = FS.lookupNode(old_dir, old_name);
1732
+ var relative = PATH_FS.relative(old_path, new_dirname);
1733
+ if (relative.charAt(0) !== '.') {
1734
+ throw new FS.ErrnoError(28);
1735
+ }
1736
+ relative = PATH_FS.relative(new_path, old_dirname);
1737
+ if (relative.charAt(0) !== '.') {
1738
+ throw new FS.ErrnoError(55);
1739
+ }
1740
+ var new_node;
1741
+ try {
1742
+ new_node = FS.lookupNode(new_dir, new_name);
1743
+ } catch (e) {}
1744
+ if (old_node === new_node) {
1745
+ return;
1746
+ }
1747
+ var isdir = FS.isDir(old_node.mode);
1748
+ var errCode = FS.mayDelete(old_dir, old_name, isdir);
1749
+ if (errCode) {
1750
+ throw new FS.ErrnoError(errCode);
1751
+ }
1752
+ errCode = new_node
1753
+ ? FS.mayDelete(new_dir, new_name, isdir)
1754
+ : FS.mayCreate(new_dir, new_name);
1755
+ if (errCode) {
1756
+ throw new FS.ErrnoError(errCode);
1757
+ }
1758
+ if (!old_dir.node_ops.rename) {
1759
+ throw new FS.ErrnoError(63);
1760
+ }
1761
+ if (
1762
+ FS.isMountpoint(old_node) ||
1763
+ (new_node && FS.isMountpoint(new_node))
1764
+ ) {
1765
+ throw new FS.ErrnoError(10);
1766
+ }
1767
+ if (new_dir !== old_dir) {
1768
+ errCode = FS.nodePermissions(old_dir, 'w');
1769
+ if (errCode) {
1770
+ throw new FS.ErrnoError(errCode);
1771
+ }
1772
+ }
1773
+ try {
1774
+ if (FS.trackingDelegate['willMovePath']) {
1775
+ FS.trackingDelegate['willMovePath'](old_path, new_path);
1776
+ }
1777
+ } catch (e) {
1778
+ err(
1779
+ "FS.trackingDelegate['willMovePath']('" +
1780
+ old_path +
1781
+ "', '" +
1782
+ new_path +
1783
+ "') threw an exception: " +
1784
+ e.message
1785
+ );
1786
+ }
1787
+ FS.hashRemoveNode(old_node);
1788
+ try {
1789
+ old_dir.node_ops.rename(old_node, new_dir, new_name);
1790
+ } catch (e) {
1791
+ throw e;
1792
+ } finally {
1793
+ FS.hashAddNode(old_node);
1794
+ }
1795
+ try {
1796
+ if (FS.trackingDelegate['onMovePath'])
1797
+ FS.trackingDelegate['onMovePath'](old_path, new_path);
1798
+ } catch (e) {
1799
+ err(
1800
+ "FS.trackingDelegate['onMovePath']('" +
1801
+ old_path +
1802
+ "', '" +
1803
+ new_path +
1804
+ "') threw an exception: " +
1805
+ e.message
1806
+ );
1807
+ }
1808
+ },
1809
+ rmdir: function (path) {
1810
+ var lookup = FS.lookupPath(path, { parent: true });
1811
+ var parent = lookup.node;
1812
+ var name = PATH.basename(path);
1813
+ var node = FS.lookupNode(parent, name);
1814
+ var errCode = FS.mayDelete(parent, name, true);
1815
+ if (errCode) {
1816
+ throw new FS.ErrnoError(errCode);
1817
+ }
1818
+ if (!parent.node_ops.rmdir) {
1819
+ throw new FS.ErrnoError(63);
1820
+ }
1821
+ if (FS.isMountpoint(node)) {
1822
+ throw new FS.ErrnoError(10);
1823
+ }
1824
+ try {
1825
+ if (FS.trackingDelegate['willDeletePath']) {
1826
+ FS.trackingDelegate['willDeletePath'](path);
1827
+ }
1828
+ } catch (e) {
1829
+ err(
1830
+ "FS.trackingDelegate['willDeletePath']('" +
1831
+ path +
1832
+ "') threw an exception: " +
1833
+ e.message
1834
+ );
1835
+ }
1836
+ parent.node_ops.rmdir(parent, name);
1837
+ FS.destroyNode(node);
1838
+ try {
1839
+ if (FS.trackingDelegate['onDeletePath'])
1840
+ FS.trackingDelegate['onDeletePath'](path);
1841
+ } catch (e) {
1842
+ err(
1843
+ "FS.trackingDelegate['onDeletePath']('" +
1844
+ path +
1845
+ "') threw an exception: " +
1846
+ e.message
1847
+ );
1848
+ }
1849
+ },
1850
+ readdir: function (path) {
1851
+ var lookup = FS.lookupPath(path, { follow: true });
1852
+ var node = lookup.node;
1853
+ if (!node.node_ops.readdir) {
1854
+ throw new FS.ErrnoError(54);
1855
+ }
1856
+ return node.node_ops.readdir(node);
1857
+ },
1858
+ unlink: function (path) {
1859
+ var lookup = FS.lookupPath(path, { parent: true });
1860
+ var parent = lookup.node;
1861
+ var name = PATH.basename(path);
1862
+ var node = FS.lookupNode(parent, name);
1863
+ var errCode = FS.mayDelete(parent, name, false);
1864
+ if (errCode) {
1865
+ throw new FS.ErrnoError(errCode);
1866
+ }
1867
+ if (!parent.node_ops.unlink) {
1868
+ throw new FS.ErrnoError(63);
1869
+ }
1870
+ if (FS.isMountpoint(node)) {
1871
+ throw new FS.ErrnoError(10);
1872
+ }
1873
+ try {
1874
+ if (FS.trackingDelegate['willDeletePath']) {
1875
+ FS.trackingDelegate['willDeletePath'](path);
1876
+ }
1877
+ } catch (e) {
1878
+ err(
1879
+ "FS.trackingDelegate['willDeletePath']('" +
1880
+ path +
1881
+ "') threw an exception: " +
1882
+ e.message
1883
+ );
1884
+ }
1885
+ parent.node_ops.unlink(parent, name);
1886
+ FS.destroyNode(node);
1887
+ try {
1888
+ if (FS.trackingDelegate['onDeletePath'])
1889
+ FS.trackingDelegate['onDeletePath'](path);
1890
+ } catch (e) {
1891
+ err(
1892
+ "FS.trackingDelegate['onDeletePath']('" +
1893
+ path +
1894
+ "') threw an exception: " +
1895
+ e.message
1896
+ );
1897
+ }
1898
+ },
1899
+ readlink: function (path) {
1900
+ var lookup = FS.lookupPath(path);
1901
+ var link = lookup.node;
1902
+ if (!link) {
1903
+ throw new FS.ErrnoError(44);
1904
+ }
1905
+ if (!link.node_ops.readlink) {
1906
+ throw new FS.ErrnoError(28);
1907
+ }
1908
+ return PATH_FS.resolve(
1909
+ FS.getPath(link.parent),
1910
+ link.node_ops.readlink(link)
1911
+ );
1912
+ },
1913
+ stat: function (path, dontFollow) {
1914
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
1915
+ var node = lookup.node;
1916
+ if (!node) {
1917
+ throw new FS.ErrnoError(44);
1918
+ }
1919
+ if (!node.node_ops.getattr) {
1920
+ throw new FS.ErrnoError(63);
1921
+ }
1922
+ return node.node_ops.getattr(node);
1923
+ },
1924
+ lstat: function (path) {
1925
+ return FS.stat(path, true);
1926
+ },
1927
+ chmod: function (path, mode, dontFollow) {
1928
+ var node;
1929
+ if (typeof path === 'string') {
1930
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
1931
+ node = lookup.node;
1932
+ } else {
1933
+ node = path;
1934
+ }
1935
+ if (!node.node_ops.setattr) {
1936
+ throw new FS.ErrnoError(63);
1937
+ }
1938
+ node.node_ops.setattr(node, {
1939
+ mode: (mode & 4095) | (node.mode & ~4095),
1940
+ timestamp: Date.now(),
1941
+ });
1942
+ },
1943
+ lchmod: function (path, mode) {
1944
+ FS.chmod(path, mode, true);
1945
+ },
1946
+ fchmod: function (fd, mode) {
1947
+ var stream = FS.getStream(fd);
1948
+ if (!stream) {
1949
+ throw new FS.ErrnoError(8);
1950
+ }
1951
+ FS.chmod(stream.node, mode);
1952
+ },
1953
+ chown: function (path, uid, gid, dontFollow) {
1954
+ var node;
1955
+ if (typeof path === 'string') {
1956
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
1957
+ node = lookup.node;
1958
+ } else {
1959
+ node = path;
1960
+ }
1961
+ if (!node.node_ops.setattr) {
1962
+ throw new FS.ErrnoError(63);
1963
+ }
1964
+ node.node_ops.setattr(node, { timestamp: Date.now() });
1965
+ },
1966
+ lchown: function (path, uid, gid) {
1967
+ FS.chown(path, uid, gid, true);
1968
+ },
1969
+ fchown: function (fd, uid, gid) {
1970
+ var stream = FS.getStream(fd);
1971
+ if (!stream) {
1972
+ throw new FS.ErrnoError(8);
1973
+ }
1974
+ FS.chown(stream.node, uid, gid);
1975
+ },
1976
+ truncate: function (path, len) {
1977
+ if (len < 0) {
1978
+ throw new FS.ErrnoError(28);
1979
+ }
1980
+ var node;
1981
+ if (typeof path === 'string') {
1982
+ var lookup = FS.lookupPath(path, { follow: true });
1983
+ node = lookup.node;
1984
+ } else {
1985
+ node = path;
1986
+ }
1987
+ if (!node.node_ops.setattr) {
1988
+ throw new FS.ErrnoError(63);
1989
+ }
1990
+ if (FS.isDir(node.mode)) {
1991
+ throw new FS.ErrnoError(31);
1992
+ }
1993
+ if (!FS.isFile(node.mode)) {
1994
+ throw new FS.ErrnoError(28);
1995
+ }
1996
+ var errCode = FS.nodePermissions(node, 'w');
1997
+ if (errCode) {
1998
+ throw new FS.ErrnoError(errCode);
1999
+ }
2000
+ node.node_ops.setattr(node, { size: len, timestamp: Date.now() });
2001
+ },
2002
+ ftruncate: function (fd, len) {
2003
+ var stream = FS.getStream(fd);
2004
+ if (!stream) {
2005
+ throw new FS.ErrnoError(8);
2006
+ }
2007
+ if ((stream.flags & 2097155) === 0) {
2008
+ throw new FS.ErrnoError(28);
2009
+ }
2010
+ FS.truncate(stream.node, len);
2011
+ },
2012
+ utime: function (path, atime, mtime) {
2013
+ var lookup = FS.lookupPath(path, { follow: true });
2014
+ var node = lookup.node;
2015
+ node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) });
2016
+ },
2017
+ open: function (path, flags, mode, fd_start, fd_end) {
2018
+ if (path === '') {
2019
+ throw new FS.ErrnoError(44);
2020
+ }
2021
+ flags =
2022
+ typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
2023
+ mode = typeof mode === 'undefined' ? 438 : mode;
2024
+ if (flags & 64) {
2025
+ mode = (mode & 4095) | 32768;
2026
+ } else {
2027
+ mode = 0;
2028
+ }
2029
+ var node;
2030
+ if (typeof path === 'object') {
2031
+ node = path;
2032
+ } else {
2033
+ path = PATH.normalize(path);
2034
+ try {
2035
+ var lookup = FS.lookupPath(path, { follow: !(flags & 131072) });
2036
+ node = lookup.node;
2037
+ } catch (e) {}
2038
+ }
2039
+ var created = false;
2040
+ if (flags & 64) {
2041
+ if (node) {
2042
+ if (flags & 128) {
2043
+ throw new FS.ErrnoError(20);
2044
+ }
2045
+ } else {
2046
+ node = FS.mknod(path, mode, 0);
2047
+ created = true;
2048
+ }
2049
+ }
2050
+ if (!node) {
2051
+ throw new FS.ErrnoError(44);
2052
+ }
2053
+ if (FS.isChrdev(node.mode)) {
2054
+ flags &= ~512;
2055
+ }
2056
+ if (flags & 65536 && !FS.isDir(node.mode)) {
2057
+ throw new FS.ErrnoError(54);
2058
+ }
2059
+ if (!created) {
2060
+ var errCode = FS.mayOpen(node, flags);
2061
+ if (errCode) {
2062
+ throw new FS.ErrnoError(errCode);
2063
+ }
2064
+ }
2065
+ if (flags & 512) {
2066
+ FS.truncate(node, 0);
2067
+ }
2068
+ flags &= ~(128 | 512 | 131072);
2069
+ var stream = FS.createStream(
2070
+ {
2071
+ node: node,
2072
+ path: FS.getPath(node),
2073
+ flags: flags,
2074
+ seekable: true,
2075
+ position: 0,
2076
+ stream_ops: node.stream_ops,
2077
+ ungotten: [],
2078
+ error: false,
2079
+ },
2080
+ fd_start,
2081
+ fd_end
2082
+ );
2083
+ if (stream.stream_ops.open) {
2084
+ stream.stream_ops.open(stream);
2085
+ }
2086
+ if (Module['logReadFiles'] && !(flags & 1)) {
2087
+ if (!FS.readFiles) FS.readFiles = {};
2088
+ if (!(path in FS.readFiles)) {
2089
+ FS.readFiles[path] = 1;
2090
+ err('FS.trackingDelegate error on read file: ' + path);
2091
+ }
2092
+ }
2093
+ try {
2094
+ if (FS.trackingDelegate['onOpenFile']) {
2095
+ var trackingFlags = 0;
2096
+ if ((flags & 2097155) !== 1) {
2097
+ trackingFlags |= FS.tracking.openFlags.READ;
2098
+ }
2099
+ if ((flags & 2097155) !== 0) {
2100
+ trackingFlags |= FS.tracking.openFlags.WRITE;
2101
+ }
2102
+ FS.trackingDelegate['onOpenFile'](path, trackingFlags);
2103
+ }
2104
+ } catch (e) {
2105
+ err(
2106
+ "FS.trackingDelegate['onOpenFile']('" +
2107
+ path +
2108
+ "', flags) threw an exception: " +
2109
+ e.message
2110
+ );
2111
+ }
2112
+ return stream;
2113
+ },
2114
+ close: function (stream) {
2115
+ if (FS.isClosed(stream)) {
2116
+ throw new FS.ErrnoError(8);
2117
+ }
2118
+ if (stream.getdents) stream.getdents = null;
2119
+ try {
2120
+ if (stream.stream_ops.close) {
2121
+ stream.stream_ops.close(stream);
2122
+ }
2123
+ } catch (e) {
2124
+ throw e;
2125
+ } finally {
2126
+ FS.closeStream(stream.fd);
2127
+ }
2128
+ stream.fd = null;
2129
+ },
2130
+ isClosed: function (stream) {
2131
+ return stream.fd === null;
2132
+ },
2133
+ llseek: function (stream, offset, whence) {
2134
+ if (FS.isClosed(stream)) {
2135
+ throw new FS.ErrnoError(8);
2136
+ }
2137
+ if (!stream.seekable || !stream.stream_ops.llseek) {
2138
+ throw new FS.ErrnoError(70);
2139
+ }
2140
+ if (whence != 0 && whence != 1 && whence != 2) {
2141
+ throw new FS.ErrnoError(28);
2142
+ }
2143
+ stream.position = stream.stream_ops.llseek(stream, offset, whence);
2144
+ stream.ungotten = [];
2145
+ return stream.position;
2146
+ },
2147
+ read: function (stream, buffer, offset, length, position) {
2148
+ if (length < 0 || position < 0) {
2149
+ throw new FS.ErrnoError(28);
2150
+ }
2151
+ if (FS.isClosed(stream)) {
2152
+ throw new FS.ErrnoError(8);
2153
+ }
2154
+ if ((stream.flags & 2097155) === 1) {
2155
+ throw new FS.ErrnoError(8);
2156
+ }
2157
+ if (FS.isDir(stream.node.mode)) {
2158
+ throw new FS.ErrnoError(31);
2159
+ }
2160
+ if (!stream.stream_ops.read) {
2161
+ throw new FS.ErrnoError(28);
2162
+ }
2163
+ var seeking = typeof position !== 'undefined';
2164
+ if (!seeking) {
2165
+ position = stream.position;
2166
+ } else if (!stream.seekable) {
2167
+ throw new FS.ErrnoError(70);
2168
+ }
2169
+ var bytesRead = stream.stream_ops.read(
2170
+ stream,
2171
+ buffer,
2172
+ offset,
2173
+ length,
2174
+ position
2175
+ );
2176
+ if (!seeking) stream.position += bytesRead;
2177
+ return bytesRead;
2178
+ },
2179
+ write: function (stream, buffer, offset, length, position, canOwn) {
2180
+ if (length < 0 || position < 0) {
2181
+ throw new FS.ErrnoError(28);
2182
+ }
2183
+ if (FS.isClosed(stream)) {
2184
+ throw new FS.ErrnoError(8);
2185
+ }
2186
+ if ((stream.flags & 2097155) === 0) {
2187
+ throw new FS.ErrnoError(8);
2188
+ }
2189
+ if (FS.isDir(stream.node.mode)) {
2190
+ throw new FS.ErrnoError(31);
2191
+ }
2192
+ if (!stream.stream_ops.write) {
2193
+ throw new FS.ErrnoError(28);
2194
+ }
2195
+ if (stream.seekable && stream.flags & 1024) {
2196
+ FS.llseek(stream, 0, 2);
2197
+ }
2198
+ var seeking = typeof position !== 'undefined';
2199
+ if (!seeking) {
2200
+ position = stream.position;
2201
+ } else if (!stream.seekable) {
2202
+ throw new FS.ErrnoError(70);
2203
+ }
2204
+ var bytesWritten = stream.stream_ops.write(
2205
+ stream,
2206
+ buffer,
2207
+ offset,
2208
+ length,
2209
+ position,
2210
+ canOwn
2211
+ );
2212
+ if (!seeking) stream.position += bytesWritten;
2213
+ try {
2214
+ if (stream.path && FS.trackingDelegate['onWriteToFile'])
2215
+ FS.trackingDelegate['onWriteToFile'](stream.path);
2216
+ } catch (e) {
2217
+ err(
2218
+ "FS.trackingDelegate['onWriteToFile']('" +
2219
+ stream.path +
2220
+ "') threw an exception: " +
2221
+ e.message
2222
+ );
2223
+ }
2224
+ return bytesWritten;
2225
+ },
2226
+ allocate: function (stream, offset, length) {
2227
+ if (FS.isClosed(stream)) {
2228
+ throw new FS.ErrnoError(8);
2229
+ }
2230
+ if (offset < 0 || length <= 0) {
2231
+ throw new FS.ErrnoError(28);
2232
+ }
2233
+ if ((stream.flags & 2097155) === 0) {
2234
+ throw new FS.ErrnoError(8);
2235
+ }
2236
+ if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
2237
+ throw new FS.ErrnoError(43);
2238
+ }
2239
+ if (!stream.stream_ops.allocate) {
2240
+ throw new FS.ErrnoError(138);
2241
+ }
2242
+ stream.stream_ops.allocate(stream, offset, length);
2243
+ },
2244
+ mmap: function (
2245
+ stream,
2246
+ buffer,
2247
+ offset,
2248
+ length,
2249
+ position,
2250
+ prot,
2251
+ flags
2252
+ ) {
2253
+ if (
2254
+ (prot & 2) !== 0 &&
2255
+ (flags & 2) === 0 &&
2256
+ (stream.flags & 2097155) !== 2
2257
+ ) {
2258
+ throw new FS.ErrnoError(2);
2259
+ }
2260
+ if ((stream.flags & 2097155) === 1) {
2261
+ throw new FS.ErrnoError(2);
2262
+ }
2263
+ if (!stream.stream_ops.mmap) {
2264
+ throw new FS.ErrnoError(43);
2265
+ }
2266
+ return stream.stream_ops.mmap(
2267
+ stream,
2268
+ buffer,
2269
+ offset,
2270
+ length,
2271
+ position,
2272
+ prot,
2273
+ flags
2274
+ );
2275
+ },
2276
+ msync: function (stream, buffer, offset, length, mmapFlags) {
2277
+ if (!stream || !stream.stream_ops.msync) {
2278
+ return 0;
2279
+ }
2280
+ return stream.stream_ops.msync(
2281
+ stream,
2282
+ buffer,
2283
+ offset,
2284
+ length,
2285
+ mmapFlags
2286
+ );
2287
+ },
2288
+ munmap: function (stream) {
2289
+ return 0;
2290
+ },
2291
+ ioctl: function (stream, cmd, arg) {
2292
+ if (!stream.stream_ops.ioctl) {
2293
+ throw new FS.ErrnoError(59);
2294
+ }
2295
+ return stream.stream_ops.ioctl(stream, cmd, arg);
2296
+ },
2297
+ readFile: function (path, opts) {
2298
+ opts = opts || {};
2299
+ opts.flags = opts.flags || 'r';
2300
+ opts.encoding = opts.encoding || 'binary';
2301
+ if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
2302
+ throw new Error('Invalid encoding type "' + opts.encoding + '"');
2303
+ }
2304
+ var ret;
2305
+ var stream = FS.open(path, opts.flags);
2306
+ var stat = FS.stat(path);
2307
+ var length = stat.size;
2308
+ var buf = new Uint8Array(length);
2309
+ FS.read(stream, buf, 0, length, 0);
2310
+ if (opts.encoding === 'utf8') {
2311
+ ret = UTF8ArrayToString(buf, 0);
2312
+ } else if (opts.encoding === 'binary') {
2313
+ ret = buf;
2314
+ }
2315
+ FS.close(stream);
2316
+ return ret;
2317
+ },
2318
+ writeFile: function (path, data, opts) {
2319
+ opts = opts || {};
2320
+ opts.flags = opts.flags || 'w';
2321
+ var stream = FS.open(path, opts.flags, opts.mode);
2322
+ if (typeof data === 'string') {
2323
+ var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
2324
+ var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
2325
+ FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);
2326
+ } else if (ArrayBuffer.isView(data)) {
2327
+ FS.write(
2328
+ stream,
2329
+ data,
2330
+ 0,
2331
+ data.byteLength,
2332
+ undefined,
2333
+ opts.canOwn
2334
+ );
2335
+ } else {
2336
+ throw new Error('Unsupported data type');
2337
+ }
2338
+ FS.close(stream);
2339
+ },
2340
+ cwd: function () {
2341
+ return FS.currentPath;
2342
+ },
2343
+ chdir: function (path) {
2344
+ var lookup = FS.lookupPath(path, { follow: true });
2345
+ if (lookup.node === null) {
2346
+ throw new FS.ErrnoError(44);
2347
+ }
2348
+ if (!FS.isDir(lookup.node.mode)) {
2349
+ throw new FS.ErrnoError(54);
2350
+ }
2351
+ var errCode = FS.nodePermissions(lookup.node, 'x');
2352
+ if (errCode) {
2353
+ throw new FS.ErrnoError(errCode);
2354
+ }
2355
+ FS.currentPath = lookup.path;
2356
+ },
2357
+ createDefaultDirectories: function () {
2358
+ FS.mkdir('/tmp');
2359
+ FS.mkdir('/home');
2360
+ FS.mkdir('/home/web_user');
2361
+ },
2362
+ createDefaultDevices: function () {
2363
+ FS.mkdir('/dev');
2364
+ FS.registerDevice(FS.makedev(1, 3), {
2365
+ read: function () {
2366
+ return 0;
2367
+ },
2368
+ write: function (stream, buffer, offset, length, pos) {
2369
+ return length;
2370
+ },
2371
+ });
2372
+ FS.mkdev('/dev/null', FS.makedev(1, 3));
2373
+ TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
2374
+ TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
2375
+ FS.mkdev('/dev/tty', FS.makedev(5, 0));
2376
+ FS.mkdev('/dev/tty1', FS.makedev(6, 0));
2377
+ var random_device;
2378
+ if (
2379
+ typeof crypto === 'object' &&
2380
+ typeof crypto['getRandomValues'] === 'function'
2381
+ ) {
2382
+ var randomBuffer = new Uint8Array(1);
2383
+ random_device = function () {
2384
+ crypto.getRandomValues(randomBuffer);
2385
+ return randomBuffer[0];
2386
+ };
2387
+ }
2388
+ if (!random_device) {
2389
+ random_device = function () {
2390
+ abort('random_device');
2391
+ };
2392
+ }
2393
+ FS.createDevice('/dev', 'random', random_device);
2394
+ FS.createDevice('/dev', 'urandom', random_device);
2395
+ FS.mkdir('/dev/shm');
2396
+ FS.mkdir('/dev/shm/tmp');
2397
+ },
2398
+ createSpecialDirectories: function () {
2399
+ FS.mkdir('/proc');
2400
+ FS.mkdir('/proc/self');
2401
+ FS.mkdir('/proc/self/fd');
2402
+ FS.mount(
2403
+ {
2404
+ mount: function () {
2405
+ var node = FS.createNode('/proc/self', 'fd', 16384 | 511, 73);
2406
+ node.node_ops = {
2407
+ lookup: function (parent, name) {
2408
+ var fd = +name;
2409
+ var stream = FS.getStream(fd);
2410
+ if (!stream) throw new FS.ErrnoError(8);
2411
+ var ret = {
2412
+ parent: null,
2413
+ mount: { mountpoint: 'fake' },
2414
+ node_ops: {
2415
+ readlink: function () {
2416
+ return stream.path;
2417
+ },
2418
+ },
2419
+ };
2420
+ ret.parent = ret;
2421
+ return ret;
2422
+ },
2423
+ };
2424
+ return node;
2425
+ },
2426
+ },
2427
+ {},
2428
+ '/proc/self/fd'
2429
+ );
2430
+ },
2431
+ createStandardStreams: function () {
2432
+ if (Module['stdin']) {
2433
+ FS.createDevice('/dev', 'stdin', Module['stdin']);
2434
+ } else {
2435
+ FS.symlink('/dev/tty', '/dev/stdin');
2436
+ }
2437
+ if (Module['stdout']) {
2438
+ FS.createDevice('/dev', 'stdout', null, Module['stdout']);
2439
+ } else {
2440
+ FS.symlink('/dev/tty', '/dev/stdout');
2441
+ }
2442
+ if (Module['stderr']) {
2443
+ FS.createDevice('/dev', 'stderr', null, Module['stderr']);
2444
+ } else {
2445
+ FS.symlink('/dev/tty1', '/dev/stderr');
2446
+ }
2447
+ var stdin = FS.open('/dev/stdin', 'r');
2448
+ var stdout = FS.open('/dev/stdout', 'w');
2449
+ var stderr = FS.open('/dev/stderr', 'w');
2450
+ },
2451
+ ensureErrnoError: function () {
2452
+ if (FS.ErrnoError) return;
2453
+ FS.ErrnoError = function ErrnoError(errno, node) {
2454
+ this.node = node;
2455
+ this.setErrno = function (errno) {
2456
+ this.errno = errno;
2457
+ };
2458
+ this.setErrno(errno);
2459
+ this.message = 'FS error';
2460
+ };
2461
+ FS.ErrnoError.prototype = new Error();
2462
+ FS.ErrnoError.prototype.constructor = FS.ErrnoError;
2463
+ [44].forEach(function (code) {
2464
+ FS.genericErrors[code] = new FS.ErrnoError(code);
2465
+ FS.genericErrors[code].stack = '<generic error, no stack>';
2466
+ });
2467
+ },
2468
+ staticInit: function () {
2469
+ FS.ensureErrnoError();
2470
+ FS.nameTable = new Array(4096);
2471
+ FS.mount(MEMFS, {}, '/');
2472
+ FS.createDefaultDirectories();
2473
+ FS.createDefaultDevices();
2474
+ FS.createSpecialDirectories();
2475
+ FS.filesystems = { MEMFS: MEMFS };
2476
+ },
2477
+ init: function (input, output, error) {
2478
+ FS.init.initialized = true;
2479
+ FS.ensureErrnoError();
2480
+ Module['stdin'] = input || Module['stdin'];
2481
+ Module['stdout'] = output || Module['stdout'];
2482
+ Module['stderr'] = error || Module['stderr'];
2483
+ FS.createStandardStreams();
2484
+ },
2485
+ quit: function () {
2486
+ FS.init.initialized = false;
2487
+ var fflush = Module['_fflush'];
2488
+ if (fflush) fflush(0);
2489
+ for (var i = 0; i < FS.streams.length; i++) {
2490
+ var stream = FS.streams[i];
2491
+ if (!stream) {
2492
+ continue;
2493
+ }
2494
+ FS.close(stream);
2495
+ }
2496
+ },
2497
+ getMode: function (canRead, canWrite) {
2498
+ var mode = 0;
2499
+ if (canRead) mode |= 292 | 73;
2500
+ if (canWrite) mode |= 146;
2501
+ return mode;
2502
+ },
2503
+ joinPath: function (parts, forceRelative) {
2504
+ var path = PATH.join.apply(null, parts);
2505
+ if (forceRelative && path[0] == '/') path = path.substr(1);
2506
+ return path;
2507
+ },
2508
+ absolutePath: function (relative, base) {
2509
+ return PATH_FS.resolve(base, relative);
2510
+ },
2511
+ standardizePath: function (path) {
2512
+ return PATH.normalize(path);
2513
+ },
2514
+ findObject: function (path, dontResolveLastLink) {
2515
+ var ret = FS.analyzePath(path, dontResolveLastLink);
2516
+ if (ret.exists) {
2517
+ return ret.object;
2518
+ } else {
2519
+ setErrNo(ret.error);
2520
+ return null;
2521
+ }
2522
+ },
2523
+ analyzePath: function (path, dontResolveLastLink) {
2524
+ try {
2525
+ var lookup = FS.lookupPath(path, {
2526
+ follow: !dontResolveLastLink,
2527
+ });
2528
+ path = lookup.path;
2529
+ } catch (e) {}
2530
+ var ret = {
2531
+ isRoot: false,
2532
+ exists: false,
2533
+ error: 0,
2534
+ name: null,
2535
+ path: null,
2536
+ object: null,
2537
+ parentExists: false,
2538
+ parentPath: null,
2539
+ parentObject: null,
2540
+ };
2541
+ try {
2542
+ var lookup = FS.lookupPath(path, { parent: true });
2543
+ ret.parentExists = true;
2544
+ ret.parentPath = lookup.path;
2545
+ ret.parentObject = lookup.node;
2546
+ ret.name = PATH.basename(path);
2547
+ lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
2548
+ ret.exists = true;
2549
+ ret.path = lookup.path;
2550
+ ret.object = lookup.node;
2551
+ ret.name = lookup.node.name;
2552
+ ret.isRoot = lookup.path === '/';
2553
+ } catch (e) {
2554
+ ret.error = e.errno;
2555
+ }
2556
+ return ret;
2557
+ },
2558
+ createFolder: function (parent, name, canRead, canWrite) {
2559
+ var path = PATH.join2(
2560
+ typeof parent === 'string' ? parent : FS.getPath(parent),
2561
+ name
2562
+ );
2563
+ var mode = FS.getMode(canRead, canWrite);
2564
+ return FS.mkdir(path, mode);
2565
+ },
2566
+ createPath: function (parent, path, canRead, canWrite) {
2567
+ parent = typeof parent === 'string' ? parent : FS.getPath(parent);
2568
+ var parts = path.split('/').reverse();
2569
+ while (parts.length) {
2570
+ var part = parts.pop();
2571
+ if (!part) continue;
2572
+ var current = PATH.join2(parent, part);
2573
+ try {
2574
+ FS.mkdir(current);
2575
+ } catch (e) {}
2576
+ parent = current;
2577
+ }
2578
+ return current;
2579
+ },
2580
+ createFile: function (parent, name, properties, canRead, canWrite) {
2581
+ var path = PATH.join2(
2582
+ typeof parent === 'string' ? parent : FS.getPath(parent),
2583
+ name
2584
+ );
2585
+ var mode = FS.getMode(canRead, canWrite);
2586
+ return FS.create(path, mode);
2587
+ },
2588
+ createDataFile: function (
2589
+ parent,
2590
+ name,
2591
+ data,
2592
+ canRead,
2593
+ canWrite,
2594
+ canOwn
2595
+ ) {
2596
+ var path = name
2597
+ ? PATH.join2(
2598
+ typeof parent === 'string' ? parent : FS.getPath(parent),
2599
+ name
2600
+ )
2601
+ : parent;
2602
+ var mode = FS.getMode(canRead, canWrite);
2603
+ var node = FS.create(path, mode);
2604
+ if (data) {
2605
+ if (typeof data === 'string') {
2606
+ var arr = new Array(data.length);
2607
+ for (var i = 0, len = data.length; i < len; ++i)
2608
+ arr[i] = data.charCodeAt(i);
2609
+ data = arr;
2610
+ }
2611
+ FS.chmod(node, mode | 146);
2612
+ var stream = FS.open(node, 'w');
2613
+ FS.write(stream, data, 0, data.length, 0, canOwn);
2614
+ FS.close(stream);
2615
+ FS.chmod(node, mode);
2616
+ }
2617
+ return node;
2618
+ },
2619
+ createDevice: function (parent, name, input, output) {
2620
+ var path = PATH.join2(
2621
+ typeof parent === 'string' ? parent : FS.getPath(parent),
2622
+ name
2623
+ );
2624
+ var mode = FS.getMode(!!input, !!output);
2625
+ if (!FS.createDevice.major) FS.createDevice.major = 64;
2626
+ var dev = FS.makedev(FS.createDevice.major++, 0);
2627
+ FS.registerDevice(dev, {
2628
+ open: function (stream) {
2629
+ stream.seekable = false;
2630
+ },
2631
+ close: function (stream) {
2632
+ if (output && output.buffer && output.buffer.length) {
2633
+ output(10);
2634
+ }
2635
+ },
2636
+ read: function (stream, buffer, offset, length, pos) {
2637
+ var bytesRead = 0;
2638
+ for (var i = 0; i < length; i++) {
2639
+ var result;
2640
+ try {
2641
+ result = input();
2642
+ } catch (e) {
2643
+ throw new FS.ErrnoError(29);
2644
+ }
2645
+ if (result === undefined && bytesRead === 0) {
2646
+ throw new FS.ErrnoError(6);
2647
+ }
2648
+ if (result === null || result === undefined) break;
2649
+ bytesRead++;
2650
+ buffer[offset + i] = result;
2651
+ }
2652
+ if (bytesRead) {
2653
+ stream.node.timestamp = Date.now();
2654
+ }
2655
+ return bytesRead;
2656
+ },
2657
+ write: function (stream, buffer, offset, length, pos) {
2658
+ for (var i = 0; i < length; i++) {
2659
+ try {
2660
+ output(buffer[offset + i]);
2661
+ } catch (e) {
2662
+ throw new FS.ErrnoError(29);
2663
+ }
2664
+ }
2665
+ if (length) {
2666
+ stream.node.timestamp = Date.now();
2667
+ }
2668
+ return i;
2669
+ },
2670
+ });
2671
+ return FS.mkdev(path, mode, dev);
2672
+ },
2673
+ createLink: function (parent, name, target, canRead, canWrite) {
2674
+ var path = PATH.join2(
2675
+ typeof parent === 'string' ? parent : FS.getPath(parent),
2676
+ name
2677
+ );
2678
+ return FS.symlink(target, path);
2679
+ },
2680
+ forceLoadFile: function (obj) {
2681
+ if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
2682
+ return true;
2683
+ var success = true;
2684
+ if (typeof XMLHttpRequest !== 'undefined') {
2685
+ throw new Error(
2686
+ '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.'
2687
+ );
2688
+ } else if (read_) {
2689
+ try {
2690
+ obj.contents = intArrayFromString(read_(obj.url), true);
2691
+ obj.usedBytes = obj.contents.length;
2692
+ } catch (e) {
2693
+ success = false;
2694
+ }
2695
+ } else {
2696
+ throw new Error('Cannot load without read() or XMLHttpRequest.');
2697
+ }
2698
+ if (!success) setErrNo(29);
2699
+ return success;
2700
+ },
2701
+ createLazyFile: function (parent, name, url, canRead, canWrite) {
2702
+ function LazyUint8Array() {
2703
+ this.lengthKnown = false;
2704
+ this.chunks = [];
2705
+ }
2706
+ LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
2707
+ if (idx > this.length - 1 || idx < 0) {
2708
+ return undefined;
2709
+ }
2710
+ var chunkOffset = idx % this.chunkSize;
2711
+ var chunkNum = (idx / this.chunkSize) | 0;
2712
+ return this.getter(chunkNum)[chunkOffset];
2713
+ };
2714
+ LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(
2715
+ getter
2716
+ ) {
2717
+ this.getter = getter;
2718
+ };
2719
+ LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
2720
+ var xhr = new XMLHttpRequest();
2721
+ xhr.open('HEAD', url, false);
2722
+ xhr.send(null);
2723
+ if (
2724
+ !((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
2725
+ )
2726
+ throw new Error(
2727
+ "Couldn't load " + url + '. Status: ' + xhr.status
2728
+ );
2729
+ var datalength = Number(xhr.getResponseHeader('Content-length'));
2730
+ var header;
2731
+ var hasByteServing =
2732
+ (header = xhr.getResponseHeader('Accept-Ranges')) &&
2733
+ header === 'bytes';
2734
+ var usesGzip =
2735
+ (header = xhr.getResponseHeader('Content-Encoding')) &&
2736
+ header === 'gzip';
2737
+ var chunkSize = 1024 * 1024;
2738
+ if (!hasByteServing) chunkSize = datalength;
2739
+ var doXHR = function (from, to) {
2740
+ if (from > to)
2741
+ throw new Error(
2742
+ 'invalid range (' +
2743
+ from +
2744
+ ', ' +
2745
+ to +
2746
+ ') or no bytes requested!'
2747
+ );
2748
+ if (to > datalength - 1)
2749
+ throw new Error(
2750
+ 'only ' + datalength + ' bytes available! programmer error!'
2751
+ );
2752
+ var xhr = new XMLHttpRequest();
2753
+ xhr.open('GET', url, false);
2754
+ if (datalength !== chunkSize)
2755
+ xhr.setRequestHeader('Range', 'bytes=' + from + '-' + to);
2756
+ if (typeof Uint8Array != 'undefined')
2757
+ xhr.responseType = 'arraybuffer';
2758
+ if (xhr.overrideMimeType) {
2759
+ xhr.overrideMimeType('text/plain; charset=x-user-defined');
2760
+ }
2761
+ xhr.send(null);
2762
+ if (
2763
+ !(
2764
+ (xhr.status >= 200 && xhr.status < 300) ||
2765
+ xhr.status === 304
2766
+ )
2767
+ )
2768
+ throw new Error(
2769
+ "Couldn't load " + url + '. Status: ' + xhr.status
2770
+ );
2771
+ if (xhr.response !== undefined) {
2772
+ return new Uint8Array(xhr.response || []);
2773
+ } else {
2774
+ return intArrayFromString(xhr.responseText || '', true);
2775
+ }
2776
+ };
2777
+ var lazyArray = this;
2778
+ lazyArray.setDataGetter(function (chunkNum) {
2779
+ var start = chunkNum * chunkSize;
2780
+ var end = (chunkNum + 1) * chunkSize - 1;
2781
+ end = Math.min(end, datalength - 1);
2782
+ if (typeof lazyArray.chunks[chunkNum] === 'undefined') {
2783
+ lazyArray.chunks[chunkNum] = doXHR(start, end);
2784
+ }
2785
+ if (typeof lazyArray.chunks[chunkNum] === 'undefined')
2786
+ throw new Error('doXHR failed!');
2787
+ return lazyArray.chunks[chunkNum];
2788
+ });
2789
+ if (usesGzip || !datalength) {
2790
+ chunkSize = datalength = 1;
2791
+ datalength = this.getter(0).length;
2792
+ chunkSize = datalength;
2793
+ out(
2794
+ 'LazyFiles on gzip forces download of the whole file when length is accessed'
2795
+ );
2796
+ }
2797
+ this._length = datalength;
2798
+ this._chunkSize = chunkSize;
2799
+ this.lengthKnown = true;
2800
+ };
2801
+ if (typeof XMLHttpRequest !== 'undefined') {
2802
+ throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
2803
+ var lazyArray = new LazyUint8Array();
2804
+ var properties = { isDevice: false, contents: lazyArray };
2805
+ } else {
2806
+ var properties = { isDevice: false, url: url };
2807
+ }
2808
+ var node = FS.createFile(
2809
+ parent,
2810
+ name,
2811
+ properties,
2812
+ canRead,
2813
+ canWrite
2814
+ );
2815
+ if (properties.contents) {
2816
+ node.contents = properties.contents;
2817
+ } else if (properties.url) {
2818
+ node.contents = null;
2819
+ node.url = properties.url;
2820
+ }
2821
+ Object.defineProperties(node, {
2822
+ usedBytes: {
2823
+ get: function () {
2824
+ return this.contents.length;
2825
+ },
2826
+ },
2827
+ });
2828
+ var stream_ops = {};
2829
+ var keys = Object.keys(node.stream_ops);
2830
+ keys.forEach(function (key) {
2831
+ var fn = node.stream_ops[key];
2832
+ stream_ops[key] = function forceLoadLazyFile() {
2833
+ if (!FS.forceLoadFile(node)) {
2834
+ throw new FS.ErrnoError(29);
2835
+ }
2836
+ return fn.apply(null, arguments);
2837
+ };
2838
+ });
2839
+ stream_ops.read = function stream_ops_read(
2840
+ stream,
2841
+ buffer,
2842
+ offset,
2843
+ length,
2844
+ position
2845
+ ) {
2846
+ if (!FS.forceLoadFile(node)) {
2847
+ throw new FS.ErrnoError(29);
2848
+ }
2849
+ var contents = stream.node.contents;
2850
+ if (position >= contents.length) return 0;
2851
+ var size = Math.min(contents.length - position, length);
2852
+ if (contents.slice) {
2853
+ for (var i = 0; i < size; i++) {
2854
+ buffer[offset + i] = contents[position + i];
2855
+ }
2856
+ } else {
2857
+ for (var i = 0; i < size; i++) {
2858
+ buffer[offset + i] = contents.get(position + i);
2859
+ }
2860
+ }
2861
+ return size;
2862
+ };
2863
+ node.stream_ops = stream_ops;
2864
+ return node;
2865
+ },
2866
+ createPreloadedFile: function (
2867
+ parent,
2868
+ name,
2869
+ url,
2870
+ canRead,
2871
+ canWrite,
2872
+ onload,
2873
+ onerror,
2874
+ dontCreateFile,
2875
+ canOwn,
2876
+ preFinish
2877
+ ) {
2878
+ Browser.init();
2879
+ var fullname = name
2880
+ ? PATH_FS.resolve(PATH.join2(parent, name))
2881
+ : parent;
2882
+ function processData(byteArray) {
2883
+ function finish(byteArray) {
2884
+ if (preFinish) preFinish();
2885
+ if (!dontCreateFile) {
2886
+ FS.createDataFile(
2887
+ parent,
2888
+ name,
2889
+ byteArray,
2890
+ canRead,
2891
+ canWrite,
2892
+ canOwn
2893
+ );
2894
+ }
2895
+ if (onload) onload();
2896
+ removeRunDependency();
2897
+ }
2898
+ var handled = false;
2899
+ Module['preloadPlugins'].forEach(function (plugin) {
2900
+ if (handled) return;
2901
+ if (plugin['canHandle'](fullname)) {
2902
+ plugin['handle'](byteArray, fullname, finish, function () {
2903
+ if (onerror) onerror();
2904
+ removeRunDependency();
2905
+ });
2906
+ handled = true;
2907
+ }
2908
+ });
2909
+ if (!handled) finish(byteArray);
2910
+ }
2911
+ addRunDependency();
2912
+ if (typeof url == 'string') {
2913
+ Browser.asyncLoad(
2914
+ url,
2915
+ function (byteArray) {
2916
+ processData(byteArray);
2917
+ },
2918
+ onerror
2919
+ );
2920
+ } else {
2921
+ processData(url);
2922
+ }
2923
+ },
2924
+ indexedDB: function () {
2925
+ return (
2926
+ window.indexedDB ||
2927
+ window.mozIndexedDB ||
2928
+ window.webkitIndexedDB ||
2929
+ window.msIndexedDB
2930
+ );
2931
+ },
2932
+ DB_NAME: function () {
2933
+ return 'EM_FS_' + window.location.pathname;
2934
+ },
2935
+ DB_VERSION: 20,
2936
+ DB_STORE_NAME: 'FILE_DATA',
2937
+ saveFilesToDB: function (paths, onload, onerror) {
2938
+ onload = onload || function () {};
2939
+ onerror = onerror || function () {};
2940
+ var indexedDB = FS.indexedDB();
2941
+ try {
2942
+ var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
2943
+ } catch (e) {
2944
+ return onerror(e);
2945
+ }
2946
+ openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
2947
+ out('creating db');
2948
+ var db = openRequest.result;
2949
+ db.createObjectStore(FS.DB_STORE_NAME);
2950
+ };
2951
+ openRequest.onsuccess = function openRequest_onsuccess() {
2952
+ var db = openRequest.result;
2953
+ var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
2954
+ var files = transaction.objectStore(FS.DB_STORE_NAME);
2955
+ var ok = 0,
2956
+ fail = 0,
2957
+ total = paths.length;
2958
+ function finish() {
2959
+ if (fail == 0) onload();
2960
+ else onerror();
2961
+ }
2962
+ paths.forEach(function (path) {
2963
+ var putRequest = files.put(
2964
+ FS.analyzePath(path).object.contents,
2965
+ path
2966
+ );
2967
+ putRequest.onsuccess = function putRequest_onsuccess() {
2968
+ ok++;
2969
+ if (ok + fail == total) finish();
2970
+ };
2971
+ putRequest.onerror = function putRequest_onerror() {
2972
+ fail++;
2973
+ if (ok + fail == total) finish();
2974
+ };
2975
+ });
2976
+ transaction.onerror = onerror;
2977
+ };
2978
+ openRequest.onerror = onerror;
2979
+ },
2980
+ loadFilesFromDB: function (paths, onload, onerror) {
2981
+ onload = onload || function () {};
2982
+ onerror = onerror || function () {};
2983
+ var indexedDB = FS.indexedDB();
2984
+ try {
2985
+ var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
2986
+ } catch (e) {
2987
+ return onerror(e);
2988
+ }
2989
+ openRequest.onupgradeneeded = onerror;
2990
+ openRequest.onsuccess = function openRequest_onsuccess() {
2991
+ var db = openRequest.result;
2992
+ try {
2993
+ var transaction = db.transaction(
2994
+ [FS.DB_STORE_NAME],
2995
+ 'readonly'
2996
+ );
2997
+ } catch (e) {
2998
+ onerror(e);
2999
+ return;
3000
+ }
3001
+ var files = transaction.objectStore(FS.DB_STORE_NAME);
3002
+ var ok = 0,
3003
+ fail = 0,
3004
+ total = paths.length;
3005
+ function finish() {
3006
+ if (fail == 0) onload();
3007
+ else onerror();
3008
+ }
3009
+ paths.forEach(function (path) {
3010
+ var getRequest = files.get(path);
3011
+ getRequest.onsuccess = function getRequest_onsuccess() {
3012
+ if (FS.analyzePath(path).exists) {
3013
+ FS.unlink(path);
3014
+ }
3015
+ FS.createDataFile(
3016
+ PATH.dirname(path),
3017
+ PATH.basename(path),
3018
+ getRequest.result,
3019
+ true,
3020
+ true,
3021
+ true
3022
+ );
3023
+ ok++;
3024
+ if (ok + fail == total) finish();
3025
+ };
3026
+ getRequest.onerror = function getRequest_onerror() {
3027
+ fail++;
3028
+ if (ok + fail == total) finish();
3029
+ };
3030
+ });
3031
+ transaction.onerror = onerror;
3032
+ };
3033
+ openRequest.onerror = onerror;
3034
+ },
3035
+ };
3036
+ var SYSCALLS = {
3037
+ mappings: {},
3038
+ DEFAULT_POLLMASK: 5,
3039
+ umask: 511,
3040
+ calculateAt: function (dirfd, path) {
3041
+ if (path[0] !== '/') {
3042
+ var dir;
3043
+ if (dirfd === -100) {
3044
+ dir = FS.cwd();
3045
+ } else {
3046
+ var dirstream = FS.getStream(dirfd);
3047
+ if (!dirstream) throw new FS.ErrnoError(8);
3048
+ dir = dirstream.path;
3049
+ }
3050
+ path = PATH.join2(dir, path);
3051
+ }
3052
+ return path;
3053
+ },
3054
+ doStat: function (func, path, buf) {
3055
+ try {
3056
+ var stat = func(path);
3057
+ } catch (e) {
3058
+ if (
3059
+ e &&
3060
+ e.node &&
3061
+ PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))
3062
+ ) {
3063
+ return -54;
3064
+ }
3065
+ throw e;
3066
+ }
3067
+ HEAP32[buf >> 2] = stat.dev;
3068
+ HEAP32[(buf + 4) >> 2] = 0;
3069
+ HEAP32[(buf + 8) >> 2] = stat.ino;
3070
+ HEAP32[(buf + 12) >> 2] = stat.mode;
3071
+ HEAP32[(buf + 16) >> 2] = stat.nlink;
3072
+ HEAP32[(buf + 20) >> 2] = stat.uid;
3073
+ HEAP32[(buf + 24) >> 2] = stat.gid;
3074
+ HEAP32[(buf + 28) >> 2] = stat.rdev;
3075
+ HEAP32[(buf + 32) >> 2] = 0;
3076
+ (tempI64 = [
3077
+ stat.size >>> 0,
3078
+ ((tempDouble = stat.size),
3079
+ +Math_abs(tempDouble) >= 1
3080
+ ? tempDouble > 0
3081
+ ? (Math_min(
3082
+ +Math_floor(tempDouble / 4294967296),
3083
+ 4294967295
3084
+ ) |
3085
+ 0) >>>
3086
+ 0
3087
+ : ~~+Math_ceil(
3088
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
3089
+ ) >>> 0
3090
+ : 0),
3091
+ ]),
3092
+ (HEAP32[(buf + 40) >> 2] = tempI64[0]),
3093
+ (HEAP32[(buf + 44) >> 2] = tempI64[1]);
3094
+ HEAP32[(buf + 48) >> 2] = 4096;
3095
+ HEAP32[(buf + 52) >> 2] = stat.blocks;
3096
+ HEAP32[(buf + 56) >> 2] = (stat.atime.getTime() / 1e3) | 0;
3097
+ HEAP32[(buf + 60) >> 2] = 0;
3098
+ HEAP32[(buf + 64) >> 2] = (stat.mtime.getTime() / 1e3) | 0;
3099
+ HEAP32[(buf + 68) >> 2] = 0;
3100
+ HEAP32[(buf + 72) >> 2] = (stat.ctime.getTime() / 1e3) | 0;
3101
+ HEAP32[(buf + 76) >> 2] = 0;
3102
+ (tempI64 = [
3103
+ stat.ino >>> 0,
3104
+ ((tempDouble = stat.ino),
3105
+ +Math_abs(tempDouble) >= 1
3106
+ ? tempDouble > 0
3107
+ ? (Math_min(
3108
+ +Math_floor(tempDouble / 4294967296),
3109
+ 4294967295
3110
+ ) |
3111
+ 0) >>>
3112
+ 0
3113
+ : ~~+Math_ceil(
3114
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
3115
+ ) >>> 0
3116
+ : 0),
3117
+ ]),
3118
+ (HEAP32[(buf + 80) >> 2] = tempI64[0]),
3119
+ (HEAP32[(buf + 84) >> 2] = tempI64[1]);
3120
+ return 0;
3121
+ },
3122
+ doMsync: function (addr, stream, len, flags, offset) {
3123
+ var buffer = HEAPU8.slice(addr, addr + len);
3124
+ FS.msync(stream, buffer, offset, len, flags);
3125
+ },
3126
+ doMkdir: function (path, mode) {
3127
+ path = PATH.normalize(path);
3128
+ if (path[path.length - 1] === '/')
3129
+ path = path.substr(0, path.length - 1);
3130
+ FS.mkdir(path, mode, 0);
3131
+ return 0;
3132
+ },
3133
+ doMknod: function (path, mode, dev) {
3134
+ switch (mode & 61440) {
3135
+ case 32768:
3136
+ case 8192:
3137
+ case 24576:
3138
+ case 4096:
3139
+ case 49152:
3140
+ break;
3141
+ default:
3142
+ return -28;
3143
+ }
3144
+ FS.mknod(path, mode, dev);
3145
+ return 0;
3146
+ },
3147
+ doReadlink: function (path, buf, bufsize) {
3148
+ if (bufsize <= 0) return -28;
3149
+ var ret = FS.readlink(path);
3150
+ var len = Math.min(bufsize, lengthBytesUTF8(ret));
3151
+ var endChar = HEAP8[buf + len];
3152
+ stringToUTF8(ret, buf, bufsize + 1);
3153
+ HEAP8[buf + len] = endChar;
3154
+ return len;
3155
+ },
3156
+ doAccess: function (path, amode) {
3157
+ if (amode & ~7) {
3158
+ return -28;
3159
+ }
3160
+ var node;
3161
+ var lookup = FS.lookupPath(path, { follow: true });
3162
+ node = lookup.node;
3163
+ if (!node) {
3164
+ return -44;
3165
+ }
3166
+ var perms = '';
3167
+ if (amode & 4) perms += 'r';
3168
+ if (amode & 2) perms += 'w';
3169
+ if (amode & 1) perms += 'x';
3170
+ if (perms && FS.nodePermissions(node, perms)) {
3171
+ return -2;
3172
+ }
3173
+ return 0;
3174
+ },
3175
+ doDup: function (path, flags, suggestFD) {
3176
+ var suggest = FS.getStream(suggestFD);
3177
+ if (suggest) FS.close(suggest);
3178
+ return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
3179
+ },
3180
+ doReadv: function (stream, iov, iovcnt, offset) {
3181
+ var ret = 0;
3182
+ for (var i = 0; i < iovcnt; i++) {
3183
+ var ptr = HEAP32[(iov + i * 8) >> 2];
3184
+ var len = HEAP32[(iov + (i * 8 + 4)) >> 2];
3185
+ var curr = FS.read(stream, HEAP8, ptr, len, offset);
3186
+ if (curr < 0) return -1;
3187
+ ret += curr;
3188
+ if (curr < len) break;
3189
+ }
3190
+ return ret;
3191
+ },
3192
+ doWritev: function (stream, iov, iovcnt, offset) {
3193
+ var ret = 0;
3194
+ for (var i = 0; i < iovcnt; i++) {
3195
+ var ptr = HEAP32[(iov + i * 8) >> 2];
3196
+ var len = HEAP32[(iov + (i * 8 + 4)) >> 2];
3197
+ var curr = FS.write(stream, HEAP8, ptr, len, offset);
3198
+ if (curr < 0) return -1;
3199
+ ret += curr;
3200
+ }
3201
+ return ret;
3202
+ },
3203
+ varargs: undefined,
3204
+ get: function () {
3205
+ SYSCALLS.varargs += 4;
3206
+ var ret = HEAP32[(SYSCALLS.varargs - 4) >> 2];
3207
+ return ret;
3208
+ },
3209
+ getStr: function (ptr) {
3210
+ var ret = UTF8ToString(ptr);
3211
+ return ret;
3212
+ },
3213
+ getStreamFromFD: function (fd) {
3214
+ var stream = FS.getStream(fd);
3215
+ if (!stream) throw new FS.ErrnoError(8);
3216
+ return stream;
3217
+ },
3218
+ get64: function (low, high) {
3219
+ return low;
3220
+ },
3221
+ };
3222
+ function ___sys_access(path, amode) {
3223
+ try {
3224
+ path = SYSCALLS.getStr(path);
3225
+ return SYSCALLS.doAccess(path, amode);
3226
+ } catch (e) {
3227
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3228
+ abort(e);
3229
+ return -e.errno;
3230
+ }
3231
+ }
3232
+ function ___sys_fcntl64(fd, cmd, varargs) {
3233
+ SYSCALLS.varargs = varargs;
3234
+ try {
3235
+ var stream = SYSCALLS.getStreamFromFD(fd);
3236
+ switch (cmd) {
3237
+ case 0: {
3238
+ var arg = SYSCALLS.get();
3239
+ if (arg < 0) {
3240
+ return -28;
3241
+ }
3242
+ var newStream;
3243
+ newStream = FS.open(stream.path, stream.flags, 0, arg);
3244
+ return newStream.fd;
3245
+ }
3246
+ case 1:
3247
+ case 2:
3248
+ return 0;
3249
+ case 3:
3250
+ return stream.flags;
3251
+ case 4: {
3252
+ var arg = SYSCALLS.get();
3253
+ stream.flags |= arg;
3254
+ return 0;
3255
+ }
3256
+ case 12: {
3257
+ var arg = SYSCALLS.get();
3258
+ var offset = 0;
3259
+ HEAP16[(arg + offset) >> 1] = 2;
3260
+ return 0;
3261
+ }
3262
+ case 13:
3263
+ case 14:
3264
+ return 0;
3265
+ case 16:
3266
+ case 8:
3267
+ return -28;
3268
+ case 9:
3269
+ setErrNo(28);
3270
+ return -1;
3271
+ default: {
3272
+ return -28;
3273
+ }
3274
+ }
3275
+ } catch (e) {
3276
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3277
+ abort(e);
3278
+ return -e.errno;
3279
+ }
3280
+ }
3281
+ function ___sys_fstat64(fd, buf) {
3282
+ try {
3283
+ var stream = SYSCALLS.getStreamFromFD(fd);
3284
+ return SYSCALLS.doStat(FS.stat, stream.path, buf);
3285
+ } catch (e) {
3286
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3287
+ abort(e);
3288
+ return -e.errno;
3289
+ }
3290
+ }
3291
+ function ___sys_getpid() {
3292
+ return 42;
3293
+ }
3294
+ function ___sys_ioctl(fd, op, varargs) {
3295
+ SYSCALLS.varargs = varargs;
3296
+ try {
3297
+ var stream = SYSCALLS.getStreamFromFD(fd);
3298
+ switch (op) {
3299
+ case 21509:
3300
+ case 21505: {
3301
+ if (!stream.tty) return -59;
3302
+ return 0;
3303
+ }
3304
+ case 21510:
3305
+ case 21511:
3306
+ case 21512:
3307
+ case 21506:
3308
+ case 21507:
3309
+ case 21508: {
3310
+ if (!stream.tty) return -59;
3311
+ return 0;
3312
+ }
3313
+ case 21519: {
3314
+ if (!stream.tty) return -59;
3315
+ var argp = SYSCALLS.get();
3316
+ HEAP32[argp >> 2] = 0;
3317
+ return 0;
3318
+ }
3319
+ case 21520: {
3320
+ if (!stream.tty) return -59;
3321
+ return -28;
3322
+ }
3323
+ case 21531: {
3324
+ var argp = SYSCALLS.get();
3325
+ return FS.ioctl(stream, op, argp);
3326
+ }
3327
+ case 21523: {
3328
+ if (!stream.tty) return -59;
3329
+ return 0;
3330
+ }
3331
+ case 21524: {
3332
+ if (!stream.tty) return -59;
3333
+ return 0;
3334
+ }
3335
+ default:
3336
+ abort('bad ioctl syscall ' + op);
3337
+ }
3338
+ } catch (e) {
3339
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3340
+ abort(e);
3341
+ return -e.errno;
3342
+ }
3343
+ }
3344
+ function syscallMmap2(addr, len, prot, flags, fd, off) {
3345
+ off <<= 12;
3346
+ var ptr;
3347
+ var allocated = false;
3348
+ if ((flags & 16) !== 0 && addr % 16384 !== 0) {
3349
+ return -28;
3350
+ }
3351
+ if ((flags & 32) !== 0) {
3352
+ ptr = _memalign(16384, len);
3353
+ if (!ptr) return -48;
3354
+ _memset(ptr, 0, len);
3355
+ allocated = true;
3356
+ } else {
3357
+ var info = FS.getStream(fd);
3358
+ if (!info) return -8;
3359
+ var res = FS.mmap(info, HEAPU8, addr, len, off, prot, flags);
3360
+ ptr = res.ptr;
3361
+ allocated = res.allocated;
3362
+ }
3363
+ SYSCALLS.mappings[ptr] = {
3364
+ malloc: ptr,
3365
+ len: len,
3366
+ allocated: allocated,
3367
+ fd: fd,
3368
+ prot: prot,
3369
+ flags: flags,
3370
+ offset: off,
3371
+ };
3372
+ return ptr;
3373
+ }
3374
+ function ___sys_mmap2(addr, len, prot, flags, fd, off) {
3375
+ try {
3376
+ return syscallMmap2(addr, len, prot, flags, fd, off);
3377
+ } catch (e) {
3378
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3379
+ abort(e);
3380
+ return -e.errno;
3381
+ }
3382
+ }
3383
+ function syscallMunmap(addr, len) {
3384
+ if ((addr | 0) === -1 || len === 0) {
3385
+ return -28;
3386
+ }
3387
+ var info = SYSCALLS.mappings[addr];
3388
+ if (!info) return 0;
3389
+ if (len === info.len) {
3390
+ var stream = FS.getStream(info.fd);
3391
+ if (info.prot & 2) {
3392
+ SYSCALLS.doMsync(addr, stream, len, info.flags, info.offset);
3393
+ }
3394
+ FS.munmap(stream);
3395
+ SYSCALLS.mappings[addr] = null;
3396
+ if (info.allocated) {
3397
+ _free(info.malloc);
3398
+ }
3399
+ }
3400
+ return 0;
3401
+ }
3402
+ function ___sys_munmap(addr, len) {
3403
+ try {
3404
+ return syscallMunmap(addr, len);
3405
+ } catch (e) {
3406
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3407
+ abort(e);
3408
+ return -e.errno;
3409
+ }
3410
+ }
3411
+ function ___sys_open(path, flags, varargs) {
3412
+ SYSCALLS.varargs = varargs;
3413
+ try {
3414
+ var pathname = SYSCALLS.getStr(path);
3415
+ var mode = SYSCALLS.get();
3416
+ var stream = FS.open(pathname, flags, mode);
3417
+ return stream.fd;
3418
+ } catch (e) {
3419
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3420
+ abort(e);
3421
+ return -e.errno;
3422
+ }
3423
+ }
3424
+ function ___sys_stat64(path, buf) {
3425
+ try {
3426
+ path = SYSCALLS.getStr(path);
3427
+ return SYSCALLS.doStat(FS.stat, path, buf);
3428
+ } catch (e) {
3429
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3430
+ abort(e);
3431
+ return -e.errno;
3432
+ }
3433
+ }
3434
+ function ___sys_unlink(path) {
3435
+ try {
3436
+ path = SYSCALLS.getStr(path);
3437
+ FS.unlink(path);
3438
+ return 0;
3439
+ } catch (e) {
3440
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3441
+ abort(e);
3442
+ return -e.errno;
3443
+ }
3444
+ }
3445
+ function _abort() {
3446
+ abort();
3447
+ }
3448
+ var setjmpId = 0;
3449
+ function _saveSetjmp(env, label, table, size) {
3450
+ env = env | 0;
3451
+ label = label | 0;
3452
+ table = table | 0;
3453
+ size = size | 0;
3454
+ var i = 0;
3455
+ setjmpId = (setjmpId + 1) | 0;
3456
+ HEAP32[env >> 2] = setjmpId;
3457
+ while ((i | 0) < (size | 0)) {
3458
+ if ((HEAP32[(table + (i << 3)) >> 2] | 0) == 0) {
3459
+ HEAP32[(table + (i << 3)) >> 2] = setjmpId;
3460
+ HEAP32[(table + ((i << 3) + 4)) >> 2] = label;
3461
+ HEAP32[(table + ((i << 3) + 8)) >> 2] = 0;
3462
+ setTempRet0(size | 0);
3463
+ return table | 0;
3464
+ }
3465
+ i = (i + 1) | 0;
3466
+ }
3467
+ size = (size * 2) | 0;
3468
+ table = _realloc(table | 0, (8 * ((size + 1) | 0)) | 0) | 0;
3469
+ table = _saveSetjmp(env | 0, label | 0, table | 0, size | 0) | 0;
3470
+ setTempRet0(size | 0);
3471
+ return table | 0;
3472
+ }
3473
+ function _testSetjmp(id, table, size) {
3474
+ id = id | 0;
3475
+ table = table | 0;
3476
+ size = size | 0;
3477
+ var i = 0,
3478
+ curr = 0;
3479
+ while ((i | 0) < (size | 0)) {
3480
+ curr = HEAP32[(table + (i << 3)) >> 2] | 0;
3481
+ if ((curr | 0) == 0) break;
3482
+ if ((curr | 0) == (id | 0)) {
3483
+ return HEAP32[(table + ((i << 3) + 4)) >> 2] | 0;
3484
+ }
3485
+ i = (i + 1) | 0;
3486
+ }
3487
+ return 0;
3488
+ }
3489
+ function _longjmp(env, value) {
3490
+ _setThrew(env, value || 1);
3491
+ throw 'longjmp';
3492
+ }
3493
+ function _emscripten_longjmp(env, value) {
3494
+ _longjmp(env, value);
3495
+ }
3496
+ function _emscripten_memcpy_big(dest, src, num) {
3497
+ HEAPU8.copyWithin(dest, src, src + num);
3498
+ }
3499
+ function _emscripten_get_heap_size() {
3500
+ return HEAPU8.length;
3501
+ }
3502
+ function emscripten_realloc_buffer(size) {
3503
+ try {
3504
+ wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16);
3505
+ updateGlobalBufferAndViews(wasmMemory.buffer);
3506
+ return 1;
3507
+ } catch (e) {}
3508
+ }
3509
+ function _emscripten_resize_heap(requestedSize) {
3510
+ requestedSize = requestedSize >>> 0;
3511
+ var oldSize = _emscripten_get_heap_size();
3512
+ var PAGE_MULTIPLE = 65536;
3513
+ var maxHeapSize = 2147483648;
3514
+ if (requestedSize > maxHeapSize) {
3515
+ return false;
3516
+ }
3517
+ var minHeapSize = 16777216;
3518
+ for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
3519
+ var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);
3520
+ overGrownHeapSize = Math.min(
3521
+ overGrownHeapSize,
3522
+ requestedSize + 100663296
3523
+ );
3524
+ var newSize = Math.min(
3525
+ maxHeapSize,
3526
+ alignUp(
3527
+ Math.max(minHeapSize, requestedSize, overGrownHeapSize),
3528
+ PAGE_MULTIPLE
3529
+ )
3530
+ );
3531
+ var replacement = emscripten_realloc_buffer(newSize);
3532
+ if (replacement) {
3533
+ return true;
3534
+ }
3535
+ }
3536
+ return false;
3537
+ }
3538
+ var ENV = {};
3539
+ function __getExecutableName() {
3540
+ return thisProgram || './this.program';
3541
+ }
3542
+ function getEnvStrings() {
3543
+ if (!getEnvStrings.strings) {
3544
+ var env = {
3545
+ USER: 'web_user',
3546
+ LOGNAME: 'web_user',
3547
+ PATH: '/',
3548
+ PWD: '/',
3549
+ HOME: '/home/web_user',
3550
+ LANG:
3551
+ (
3552
+ (typeof navigator === 'object' &&
3553
+ navigator.languages &&
3554
+ navigator.languages[0]) ||
3555
+ 'C'
3556
+ ).replace('-', '_') + '.UTF-8',
3557
+ _: __getExecutableName(),
3558
+ };
3559
+ for (var x in ENV) {
3560
+ env[x] = ENV[x];
3561
+ }
3562
+ var strings = [];
3563
+ for (var x in env) {
3564
+ strings.push(x + '=' + env[x]);
3565
+ }
3566
+ getEnvStrings.strings = strings;
3567
+ }
3568
+ return getEnvStrings.strings;
3569
+ }
3570
+ function _environ_get(__environ, environ_buf) {
3571
+ var bufSize = 0;
3572
+ getEnvStrings().forEach(function (string, i) {
3573
+ var ptr = environ_buf + bufSize;
3574
+ HEAP32[(__environ + i * 4) >> 2] = ptr;
3575
+ writeAsciiToMemory(string, ptr);
3576
+ bufSize += string.length + 1;
3577
+ });
3578
+ return 0;
3579
+ }
3580
+ function _environ_sizes_get(penviron_count, penviron_buf_size) {
3581
+ var strings = getEnvStrings();
3582
+ HEAP32[penviron_count >> 2] = strings.length;
3583
+ var bufSize = 0;
3584
+ strings.forEach(function (string) {
3585
+ bufSize += string.length + 1;
3586
+ });
3587
+ HEAP32[penviron_buf_size >> 2] = bufSize;
3588
+ return 0;
3589
+ }
3590
+ function _exit(status) {
3591
+ exit(status);
3592
+ }
3593
+ function _fd_close(fd) {
3594
+ try {
3595
+ var stream = SYSCALLS.getStreamFromFD(fd);
3596
+ FS.close(stream);
3597
+ return 0;
3598
+ } catch (e) {
3599
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3600
+ abort(e);
3601
+ return e.errno;
3602
+ }
3603
+ }
3604
+ function _fd_fdstat_get(fd, pbuf) {
3605
+ try {
3606
+ var stream = SYSCALLS.getStreamFromFD(fd);
3607
+ var type = stream.tty
3608
+ ? 2
3609
+ : FS.isDir(stream.mode)
3610
+ ? 3
3611
+ : FS.isLink(stream.mode)
3612
+ ? 7
3613
+ : 4;
3614
+ HEAP8[pbuf >> 0] = type;
3615
+ return 0;
3616
+ } catch (e) {
3617
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3618
+ abort(e);
3619
+ return e.errno;
3620
+ }
3621
+ }
3622
+ function _fd_read(fd, iov, iovcnt, pnum) {
3623
+ try {
3624
+ var stream = SYSCALLS.getStreamFromFD(fd);
3625
+ var num = SYSCALLS.doReadv(stream, iov, iovcnt);
3626
+ HEAP32[pnum >> 2] = num;
3627
+ return 0;
3628
+ } catch (e) {
3629
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3630
+ abort(e);
3631
+ return e.errno;
3632
+ }
3633
+ }
3634
+ function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
3635
+ try {
3636
+ var stream = SYSCALLS.getStreamFromFD(fd);
3637
+ var HIGH_OFFSET = 4294967296;
3638
+ var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0);
3639
+ var DOUBLE_LIMIT = 9007199254740992;
3640
+ if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) {
3641
+ return -61;
3642
+ }
3643
+ FS.llseek(stream, offset, whence);
3644
+ (tempI64 = [
3645
+ stream.position >>> 0,
3646
+ ((tempDouble = stream.position),
3647
+ +Math_abs(tempDouble) >= 1
3648
+ ? tempDouble > 0
3649
+ ? (Math_min(
3650
+ +Math_floor(tempDouble / 4294967296),
3651
+ 4294967295
3652
+ ) |
3653
+ 0) >>>
3654
+ 0
3655
+ : ~~+Math_ceil(
3656
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
3657
+ ) >>> 0
3658
+ : 0),
3659
+ ]),
3660
+ (HEAP32[newOffset >> 2] = tempI64[0]),
3661
+ (HEAP32[(newOffset + 4) >> 2] = tempI64[1]);
3662
+ if (stream.getdents && offset === 0 && whence === 0)
3663
+ stream.getdents = null;
3664
+ return 0;
3665
+ } catch (e) {
3666
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3667
+ abort(e);
3668
+ return e.errno;
3669
+ }
3670
+ }
3671
+ function _fd_write(fd, iov, iovcnt, pnum) {
3672
+ try {
3673
+ var stream = SYSCALLS.getStreamFromFD(fd);
3674
+ var num = SYSCALLS.doWritev(stream, iov, iovcnt);
3675
+ HEAP32[pnum >> 2] = num;
3676
+ return 0;
3677
+ } catch (e) {
3678
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError))
3679
+ abort(e);
3680
+ return e.errno;
3681
+ }
3682
+ }
3683
+ function _getTempRet0() {
3684
+ return getTempRet0() | 0;
3685
+ }
3686
+ function _gettimeofday(ptr) {
3687
+ var now = Date.now();
3688
+ HEAP32[ptr >> 2] = (now / 1e3) | 0;
3689
+ HEAP32[(ptr + 4) >> 2] = ((now % 1e3) * 1e3) | 0;
3690
+ return 0;
3691
+ }
3692
+ function _setTempRet0($i) {
3693
+ setTempRet0($i | 0);
3694
+ }
3695
+ function __isLeapYear(year) {
3696
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
3697
+ }
3698
+ function __arraySum(array, index) {
3699
+ var sum = 0;
3700
+ for (var i = 0; i <= index; sum += array[i++]) {}
3701
+ return sum;
3702
+ }
3703
+ var __MONTH_DAYS_LEAP = [
3704
+ 31,
3705
+ 29,
3706
+ 31,
3707
+ 30,
3708
+ 31,
3709
+ 30,
3710
+ 31,
3711
+ 31,
3712
+ 30,
3713
+ 31,
3714
+ 30,
3715
+ 31,
3716
+ ];
3717
+ var __MONTH_DAYS_REGULAR = [
3718
+ 31,
3719
+ 28,
3720
+ 31,
3721
+ 30,
3722
+ 31,
3723
+ 30,
3724
+ 31,
3725
+ 31,
3726
+ 30,
3727
+ 31,
3728
+ 30,
3729
+ 31,
3730
+ ];
3731
+ function __addDays(date, days) {
3732
+ var newDate = new Date(date.getTime());
3733
+ while (days > 0) {
3734
+ var leap = __isLeapYear(newDate.getFullYear());
3735
+ var currentMonth = newDate.getMonth();
3736
+ var daysInCurrentMonth = (leap
3737
+ ? __MONTH_DAYS_LEAP
3738
+ : __MONTH_DAYS_REGULAR)[currentMonth];
3739
+ if (days > daysInCurrentMonth - newDate.getDate()) {
3740
+ days -= daysInCurrentMonth - newDate.getDate() + 1;
3741
+ newDate.setDate(1);
3742
+ if (currentMonth < 11) {
3743
+ newDate.setMonth(currentMonth + 1);
3744
+ } else {
3745
+ newDate.setMonth(0);
3746
+ newDate.setFullYear(newDate.getFullYear() + 1);
3747
+ }
3748
+ } else {
3749
+ newDate.setDate(newDate.getDate() + days);
3750
+ return newDate;
3751
+ }
3752
+ }
3753
+ return newDate;
3754
+ }
3755
+ function _strftime(s, maxsize, format, tm) {
3756
+ var tm_zone = HEAP32[(tm + 40) >> 2];
3757
+ var date = {
3758
+ tm_sec: HEAP32[tm >> 2],
3759
+ tm_min: HEAP32[(tm + 4) >> 2],
3760
+ tm_hour: HEAP32[(tm + 8) >> 2],
3761
+ tm_mday: HEAP32[(tm + 12) >> 2],
3762
+ tm_mon: HEAP32[(tm + 16) >> 2],
3763
+ tm_year: HEAP32[(tm + 20) >> 2],
3764
+ tm_wday: HEAP32[(tm + 24) >> 2],
3765
+ tm_yday: HEAP32[(tm + 28) >> 2],
3766
+ tm_isdst: HEAP32[(tm + 32) >> 2],
3767
+ tm_gmtoff: HEAP32[(tm + 36) >> 2],
3768
+ tm_zone: tm_zone ? UTF8ToString(tm_zone) : '',
3769
+ };
3770
+ var pattern = UTF8ToString(format);
3771
+ var EXPANSION_RULES_1 = {
3772
+ '%c': '%a %b %d %H:%M:%S %Y',
3773
+ '%D': '%m/%d/%y',
3774
+ '%F': '%Y-%m-%d',
3775
+ '%h': '%b',
3776
+ '%r': '%I:%M:%S %p',
3777
+ '%R': '%H:%M',
3778
+ '%T': '%H:%M:%S',
3779
+ '%x': '%m/%d/%y',
3780
+ '%X': '%H:%M:%S',
3781
+ '%Ec': '%c',
3782
+ '%EC': '%C',
3783
+ '%Ex': '%m/%d/%y',
3784
+ '%EX': '%H:%M:%S',
3785
+ '%Ey': '%y',
3786
+ '%EY': '%Y',
3787
+ '%Od': '%d',
3788
+ '%Oe': '%e',
3789
+ '%OH': '%H',
3790
+ '%OI': '%I',
3791
+ '%Om': '%m',
3792
+ '%OM': '%M',
3793
+ '%OS': '%S',
3794
+ '%Ou': '%u',
3795
+ '%OU': '%U',
3796
+ '%OV': '%V',
3797
+ '%Ow': '%w',
3798
+ '%OW': '%W',
3799
+ '%Oy': '%y',
3800
+ };
3801
+ for (var rule in EXPANSION_RULES_1) {
3802
+ pattern = pattern.replace(
3803
+ new RegExp(rule, 'g'),
3804
+ EXPANSION_RULES_1[rule]
3805
+ );
3806
+ }
3807
+ var WEEKDAYS = [
3808
+ 'Sunday',
3809
+ 'Monday',
3810
+ 'Tuesday',
3811
+ 'Wednesday',
3812
+ 'Thursday',
3813
+ 'Friday',
3814
+ 'Saturday',
3815
+ ];
3816
+ var MONTHS = [
3817
+ 'January',
3818
+ 'February',
3819
+ 'March',
3820
+ 'April',
3821
+ 'May',
3822
+ 'June',
3823
+ 'July',
3824
+ 'August',
3825
+ 'September',
3826
+ 'October',
3827
+ 'November',
3828
+ 'December',
3829
+ ];
3830
+ function leadingSomething(value, digits, character) {
3831
+ var str =
3832
+ typeof value === 'number' ? value.toString() : value || '';
3833
+ while (str.length < digits) {
3834
+ str = character[0] + str;
3835
+ }
3836
+ return str;
3837
+ }
3838
+ function leadingNulls(value, digits) {
3839
+ return leadingSomething(value, digits, '0');
3840
+ }
3841
+ function compareByDay(date1, date2) {
3842
+ function sgn(value) {
3843
+ return value < 0 ? -1 : value > 0 ? 1 : 0;
3844
+ }
3845
+ var compare;
3846
+ if (
3847
+ (compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0
3848
+ ) {
3849
+ if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) {
3850
+ compare = sgn(date1.getDate() - date2.getDate());
3851
+ }
3852
+ }
3853
+ return compare;
3854
+ }
3855
+ function getFirstWeekStartDate(janFourth) {
3856
+ switch (janFourth.getDay()) {
3857
+ case 0:
3858
+ return new Date(janFourth.getFullYear() - 1, 11, 29);
3859
+ case 1:
3860
+ return janFourth;
3861
+ case 2:
3862
+ return new Date(janFourth.getFullYear(), 0, 3);
3863
+ case 3:
3864
+ return new Date(janFourth.getFullYear(), 0, 2);
3865
+ case 4:
3866
+ return new Date(janFourth.getFullYear(), 0, 1);
3867
+ case 5:
3868
+ return new Date(janFourth.getFullYear() - 1, 11, 31);
3869
+ case 6:
3870
+ return new Date(janFourth.getFullYear() - 1, 11, 30);
3871
+ }
3872
+ }
3873
+ function getWeekBasedYear(date) {
3874
+ var thisDate = __addDays(
3875
+ new Date(date.tm_year + 1900, 0, 1),
3876
+ date.tm_yday
3877
+ );
3878
+ var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
3879
+ var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4);
3880
+ var firstWeekStartThisYear = getFirstWeekStartDate(
3881
+ janFourthThisYear
3882
+ );
3883
+ var firstWeekStartNextYear = getFirstWeekStartDate(
3884
+ janFourthNextYear
3885
+ );
3886
+ if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
3887
+ if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
3888
+ return thisDate.getFullYear() + 1;
3889
+ } else {
3890
+ return thisDate.getFullYear();
3891
+ }
3892
+ } else {
3893
+ return thisDate.getFullYear() - 1;
3894
+ }
3895
+ }
3896
+ var EXPANSION_RULES_2 = {
3897
+ '%a': function (date) {
3898
+ return WEEKDAYS[date.tm_wday].substring(0, 3);
3899
+ },
3900
+ '%A': function (date) {
3901
+ return WEEKDAYS[date.tm_wday];
3902
+ },
3903
+ '%b': function (date) {
3904
+ return MONTHS[date.tm_mon].substring(0, 3);
3905
+ },
3906
+ '%B': function (date) {
3907
+ return MONTHS[date.tm_mon];
3908
+ },
3909
+ '%C': function (date) {
3910
+ var year = date.tm_year + 1900;
3911
+ return leadingNulls((year / 100) | 0, 2);
3912
+ },
3913
+ '%d': function (date) {
3914
+ return leadingNulls(date.tm_mday, 2);
3915
+ },
3916
+ '%e': function (date) {
3917
+ return leadingSomething(date.tm_mday, 2, ' ');
3918
+ },
3919
+ '%g': function (date) {
3920
+ return getWeekBasedYear(date).toString().substring(2);
3921
+ },
3922
+ '%G': function (date) {
3923
+ return getWeekBasedYear(date);
3924
+ },
3925
+ '%H': function (date) {
3926
+ return leadingNulls(date.tm_hour, 2);
3927
+ },
3928
+ '%I': function (date) {
3929
+ var twelveHour = date.tm_hour;
3930
+ if (twelveHour == 0) twelveHour = 12;
3931
+ else if (twelveHour > 12) twelveHour -= 12;
3932
+ return leadingNulls(twelveHour, 2);
3933
+ },
3934
+ '%j': function (date) {
3935
+ return leadingNulls(
3936
+ date.tm_mday +
3937
+ __arraySum(
3938
+ __isLeapYear(date.tm_year + 1900)
3939
+ ? __MONTH_DAYS_LEAP
3940
+ : __MONTH_DAYS_REGULAR,
3941
+ date.tm_mon - 1
3942
+ ),
3943
+ 3
3944
+ );
3945
+ },
3946
+ '%m': function (date) {
3947
+ return leadingNulls(date.tm_mon + 1, 2);
3948
+ },
3949
+ '%M': function (date) {
3950
+ return leadingNulls(date.tm_min, 2);
3951
+ },
3952
+ '%n': function () {
3953
+ return '\n';
3954
+ },
3955
+ '%p': function (date) {
3956
+ if (date.tm_hour >= 0 && date.tm_hour < 12) {
3957
+ return 'AM';
3958
+ } else {
3959
+ return 'PM';
3960
+ }
3961
+ },
3962
+ '%S': function (date) {
3963
+ return leadingNulls(date.tm_sec, 2);
3964
+ },
3965
+ '%t': function () {
3966
+ return '\t';
3967
+ },
3968
+ '%u': function (date) {
3969
+ return date.tm_wday || 7;
3970
+ },
3971
+ '%U': function (date) {
3972
+ var janFirst = new Date(date.tm_year + 1900, 0, 1);
3973
+ var firstSunday =
3974
+ janFirst.getDay() === 0
3975
+ ? janFirst
3976
+ : __addDays(janFirst, 7 - janFirst.getDay());
3977
+ var endDate = new Date(
3978
+ date.tm_year + 1900,
3979
+ date.tm_mon,
3980
+ date.tm_mday
3981
+ );
3982
+ if (compareByDay(firstSunday, endDate) < 0) {
3983
+ var februaryFirstUntilEndMonth =
3984
+ __arraySum(
3985
+ __isLeapYear(endDate.getFullYear())
3986
+ ? __MONTH_DAYS_LEAP
3987
+ : __MONTH_DAYS_REGULAR,
3988
+ endDate.getMonth() - 1
3989
+ ) - 31;
3990
+ var firstSundayUntilEndJanuary = 31 - firstSunday.getDate();
3991
+ var days =
3992
+ firstSundayUntilEndJanuary +
3993
+ februaryFirstUntilEndMonth +
3994
+ endDate.getDate();
3995
+ return leadingNulls(Math.ceil(days / 7), 2);
3996
+ }
3997
+ return compareByDay(firstSunday, janFirst) === 0 ? '01' : '00';
3998
+ },
3999
+ '%V': function (date) {
4000
+ var janFourthThisYear = new Date(date.tm_year + 1900, 0, 4);
4001
+ var janFourthNextYear = new Date(date.tm_year + 1901, 0, 4);
4002
+ var firstWeekStartThisYear = getFirstWeekStartDate(
4003
+ janFourthThisYear
4004
+ );
4005
+ var firstWeekStartNextYear = getFirstWeekStartDate(
4006
+ janFourthNextYear
4007
+ );
4008
+ var endDate = __addDays(
4009
+ new Date(date.tm_year + 1900, 0, 1),
4010
+ date.tm_yday
4011
+ );
4012
+ if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
4013
+ return '53';
4014
+ }
4015
+ if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
4016
+ return '01';
4017
+ }
4018
+ var daysDifference;
4019
+ if (firstWeekStartThisYear.getFullYear() < date.tm_year + 1900) {
4020
+ daysDifference =
4021
+ date.tm_yday + 32 - firstWeekStartThisYear.getDate();
4022
+ } else {
4023
+ daysDifference =
4024
+ date.tm_yday + 1 - firstWeekStartThisYear.getDate();
4025
+ }
4026
+ return leadingNulls(Math.ceil(daysDifference / 7), 2);
4027
+ },
4028
+ '%w': function (date) {
4029
+ return date.tm_wday;
4030
+ },
4031
+ '%W': function (date) {
4032
+ var janFirst = new Date(date.tm_year, 0, 1);
4033
+ var firstMonday =
4034
+ janFirst.getDay() === 1
4035
+ ? janFirst
4036
+ : __addDays(
4037
+ janFirst,
4038
+ janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1
4039
+ );
4040
+ var endDate = new Date(
4041
+ date.tm_year + 1900,
4042
+ date.tm_mon,
4043
+ date.tm_mday
4044
+ );
4045
+ if (compareByDay(firstMonday, endDate) < 0) {
4046
+ var februaryFirstUntilEndMonth =
4047
+ __arraySum(
4048
+ __isLeapYear(endDate.getFullYear())
4049
+ ? __MONTH_DAYS_LEAP
4050
+ : __MONTH_DAYS_REGULAR,
4051
+ endDate.getMonth() - 1
4052
+ ) - 31;
4053
+ var firstMondayUntilEndJanuary = 31 - firstMonday.getDate();
4054
+ var days =
4055
+ firstMondayUntilEndJanuary +
4056
+ februaryFirstUntilEndMonth +
4057
+ endDate.getDate();
4058
+ return leadingNulls(Math.ceil(days / 7), 2);
4059
+ }
4060
+ return compareByDay(firstMonday, janFirst) === 0 ? '01' : '00';
4061
+ },
4062
+ '%y': function (date) {
4063
+ return (date.tm_year + 1900).toString().substring(2);
4064
+ },
4065
+ '%Y': function (date) {
4066
+ return date.tm_year + 1900;
4067
+ },
4068
+ '%z': function (date) {
4069
+ var off = date.tm_gmtoff;
4070
+ var ahead = off >= 0;
4071
+ off = Math.abs(off) / 60;
4072
+ off = (off / 60) * 100 + (off % 60);
4073
+ return (ahead ? '+' : '-') + String('0000' + off).slice(-4);
4074
+ },
4075
+ '%Z': function (date) {
4076
+ return date.tm_zone;
4077
+ },
4078
+ '%%': function () {
4079
+ return '%';
4080
+ },
4081
+ };
4082
+ for (var rule in EXPANSION_RULES_2) {
4083
+ if (pattern.indexOf(rule) >= 0) {
4084
+ pattern = pattern.replace(
4085
+ new RegExp(rule, 'g'),
4086
+ EXPANSION_RULES_2[rule](date)
4087
+ );
4088
+ }
4089
+ }
4090
+ var bytes = intArrayFromString(pattern, false);
4091
+ if (bytes.length > maxsize) {
4092
+ return 0;
4093
+ }
4094
+ writeArrayToMemory(bytes, s);
4095
+ return bytes.length - 1;
4096
+ }
4097
+ function _strftime_l(s, maxsize, format, tm) {
4098
+ return _strftime(s, maxsize, format, tm);
4099
+ }
4100
+ function _time(ptr) {
4101
+ var ret = (Date.now() / 1e3) | 0;
4102
+ if (ptr) {
4103
+ HEAP32[ptr >> 2] = ret;
4104
+ }
4105
+ return ret;
4106
+ }
4107
+ function _times(buffer) {
4108
+ if (buffer !== 0) {
4109
+ _memset(buffer, 0, 16);
4110
+ }
4111
+ return 0;
4112
+ }
4113
+ function readAsmConstArgs(sigPtr, buf) {
4114
+ if (!readAsmConstArgs.array) {
4115
+ readAsmConstArgs.array = [];
4116
+ }
4117
+ var args = readAsmConstArgs.array;
4118
+ args.length = 0;
4119
+ var ch;
4120
+ while ((ch = HEAPU8[sigPtr++])) {
4121
+ if (ch === 100 || ch === 102) {
4122
+ buf = (buf + 7) & ~7;
4123
+ args.push(HEAPF64[buf >> 3]);
4124
+ buf += 8;
4125
+ } else {
4126
+ buf = (buf + 3) & ~3;
4127
+ args.push(HEAP32[buf >> 2]);
4128
+ buf += 4;
4129
+ }
4130
+ }
4131
+ return args;
4132
+ }
4133
+ var FSNode = function (parent, name, mode, rdev) {
4134
+ if (!parent) {
4135
+ parent = this;
4136
+ }
4137
+ this.parent = parent;
4138
+ this.mount = parent.mount;
4139
+ this.mounted = null;
4140
+ this.id = FS.nextInode++;
4141
+ this.name = name;
4142
+ this.mode = mode;
4143
+ this.node_ops = {};
4144
+ this.stream_ops = {};
4145
+ this.rdev = rdev;
4146
+ };
4147
+ var readMode = 292 | 73;
4148
+ var writeMode = 146;
4149
+ Object.defineProperties(FSNode.prototype, {
4150
+ read: {
4151
+ get: function () {
4152
+ return (this.mode & readMode) === readMode;
4153
+ },
4154
+ set: function (val) {
4155
+ val ? (this.mode |= readMode) : (this.mode &= ~readMode);
4156
+ },
4157
+ },
4158
+ write: {
4159
+ get: function () {
4160
+ return (this.mode & writeMode) === writeMode;
4161
+ },
4162
+ set: function (val) {
4163
+ val ? (this.mode |= writeMode) : (this.mode &= ~writeMode);
4164
+ },
4165
+ },
4166
+ isFolder: {
4167
+ get: function () {
4168
+ return FS.isDir(this.mode);
4169
+ },
4170
+ },
4171
+ isDevice: {
4172
+ get: function () {
4173
+ return FS.isChrdev(this.mode);
4174
+ },
4175
+ },
4176
+ });
4177
+ FS.FSNode = FSNode;
4178
+ FS.staticInit();
4179
+ function intArrayFromString(stringy, dontAddNull, length) {
4180
+ var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
4181
+ var u8array = new Array(len);
4182
+ var numBytesWritten = stringToUTF8Array(
4183
+ stringy,
4184
+ u8array,
4185
+ 0,
4186
+ u8array.length
4187
+ );
4188
+ if (dontAddNull) u8array.length = numBytesWritten;
4189
+ return u8array;
4190
+ }
4191
+ var asmLibraryArg = {
4192
+ L: ___clock_gettime,
4193
+ k: ___cxa_allocate_exception,
4194
+ j: ___cxa_throw,
4195
+ J: ___map_file,
4196
+ Q: ___sys_access,
4197
+ x: ___sys_fcntl64,
4198
+ S: ___sys_fstat64,
4199
+ p: ___sys_getpid,
4200
+ N: ___sys_ioctl,
4201
+ O: ___sys_mmap2,
4202
+ P: ___sys_munmap,
4203
+ y: ___sys_open,
4204
+ R: ___sys_stat64,
4205
+ K: ___sys_unlink,
4206
+ v: _abort,
4207
+ B: _emscripten_asm_const_iii,
4208
+ d: _emscripten_longjmp,
4209
+ D: _emscripten_memcpy_big,
4210
+ E: _emscripten_resize_heap,
4211
+ H: _environ_get,
4212
+ I: _environ_sizes_get,
4213
+ l: _exit,
4214
+ o: _fd_close,
4215
+ G: _fd_fdstat_get,
4216
+ M: _fd_read,
4217
+ C: _fd_seek,
4218
+ w: _fd_write,
4219
+ a: _getTempRet0,
4220
+ V: _gettimeofday,
4221
+ W: invoke_d,
4222
+ T: invoke_di,
4223
+ u: invoke_i,
4224
+ f: invoke_ii,
4225
+ e: invoke_iii,
4226
+ g: invoke_iiii,
4227
+ m: invoke_iiiii,
4228
+ U: invoke_iiiiiii,
4229
+ r: invoke_v,
4230
+ h: invoke_vi,
4231
+ n: invoke_vii,
4232
+ t: invoke_viii,
4233
+ s: invoke_viiii,
4234
+ q: invoke_viiiii,
4235
+ memory: wasmMemory,
4236
+ i: _saveSetjmp,
4237
+ b: _setTempRet0,
4238
+ F: _strftime_l,
4239
+ table: wasmTable,
4240
+ c: _testSetjmp,
4241
+ z: _time,
4242
+ A: _times,
4243
+ };
4244
+ var asm = createWasm();
4245
+ Module['asm'] = asm;
4246
+ var ___wasm_call_ctors = (Module['___wasm_call_ctors'] = function () {
4247
+ return (___wasm_call_ctors = Module['___wasm_call_ctors'] =
4248
+ Module['asm']['X']).apply(null, arguments);
4249
+ });
4250
+ var ___em_js__array_bounds_check_error = (Module[
4251
+ '___em_js__array_bounds_check_error'
4252
+ ] = function () {
4253
+ return (___em_js__array_bounds_check_error = Module[
4254
+ '___em_js__array_bounds_check_error'
4255
+ ] = Module['asm']['Y']).apply(null, arguments);
4256
+ });
4257
+ var _emscripten_bind_VoidPtr___destroy___0 = (Module[
4258
+ '_emscripten_bind_VoidPtr___destroy___0'
4259
+ ] = function () {
4260
+ return (_emscripten_bind_VoidPtr___destroy___0 = Module[
4261
+ '_emscripten_bind_VoidPtr___destroy___0'
4262
+ ] = Module['asm']['Z']).apply(null, arguments);
4263
+ });
4264
+ var _emscripten_bind_Main_layout_3 = (Module[
4265
+ '_emscripten_bind_Main_layout_3'
4266
+ ] = function () {
4267
+ return (_emscripten_bind_Main_layout_3 = Module[
4268
+ '_emscripten_bind_Main_layout_3'
4269
+ ] = Module['asm']['_']).apply(null, arguments);
4270
+ });
4271
+ var _emscripten_bind_Main_lastError_0 = (Module[
4272
+ '_emscripten_bind_Main_lastError_0'
4273
+ ] = function () {
4274
+ return (_emscripten_bind_Main_lastError_0 = Module[
4275
+ '_emscripten_bind_Main_lastError_0'
4276
+ ] = Module['asm']['$']).apply(null, arguments);
4277
+ });
4278
+ var _emscripten_bind_Main_createFile_2 = (Module[
4279
+ '_emscripten_bind_Main_createFile_2'
4280
+ ] = function () {
4281
+ return (_emscripten_bind_Main_createFile_2 = Module[
4282
+ '_emscripten_bind_Main_createFile_2'
4283
+ ] = Module['asm']['aa']).apply(null, arguments);
4284
+ });
4285
+ var _emscripten_bind_Main___destroy___0 = (Module[
4286
+ '_emscripten_bind_Main___destroy___0'
4287
+ ] = function () {
4288
+ return (_emscripten_bind_Main___destroy___0 = Module[
4289
+ '_emscripten_bind_Main___destroy___0'
4290
+ ] = Module['asm']['ba']).apply(null, arguments);
4291
+ });
4292
+ var _malloc = (Module['_malloc'] = function () {
4293
+ return (_malloc = Module['_malloc'] = Module['asm']['ca']).apply(
4294
+ null,
4295
+ arguments
4296
+ );
4297
+ });
4298
+ var _free = (Module['_free'] = function () {
4299
+ return (_free = Module['_free'] = Module['asm']['da']).apply(
4300
+ null,
4301
+ arguments
4302
+ );
4303
+ });
4304
+ var _realloc = (Module['_realloc'] = function () {
4305
+ return (_realloc = Module['_realloc'] = Module['asm']['ea']).apply(
4306
+ null,
4307
+ arguments
4308
+ );
4309
+ });
4310
+ var ___errno_location = (Module['___errno_location'] = function () {
4311
+ return (___errno_location = Module['___errno_location'] =
4312
+ Module['asm']['fa']).apply(null, arguments);
4313
+ });
4314
+ var _memset = (Module['_memset'] = function () {
4315
+ return (_memset = Module['_memset'] = Module['asm']['ga']).apply(
4316
+ null,
4317
+ arguments
4318
+ );
4319
+ });
4320
+ var _setThrew = (Module['_setThrew'] = function () {
4321
+ return (_setThrew = Module['_setThrew'] = Module['asm']['ha']).apply(
4322
+ null,
4323
+ arguments
4324
+ );
4325
+ });
4326
+ var _memalign = (Module['_memalign'] = function () {
4327
+ return (_memalign = Module['_memalign'] = Module['asm']['ia']).apply(
4328
+ null,
4329
+ arguments
4330
+ );
4331
+ });
4332
+ var dynCall_v = (Module['dynCall_v'] = function () {
4333
+ return (dynCall_v = Module['dynCall_v'] = Module['asm']['ja']).apply(
4334
+ null,
4335
+ arguments
4336
+ );
4337
+ });
4338
+ var dynCall_vi = (Module['dynCall_vi'] = function () {
4339
+ return (dynCall_vi = Module['dynCall_vi'] =
4340
+ Module['asm']['ka']).apply(null, arguments);
4341
+ });
4342
+ var dynCall_vii = (Module['dynCall_vii'] = function () {
4343
+ return (dynCall_vii = Module['dynCall_vii'] =
4344
+ Module['asm']['la']).apply(null, arguments);
4345
+ });
4346
+ var dynCall_viii = (Module['dynCall_viii'] = function () {
4347
+ return (dynCall_viii = Module['dynCall_viii'] =
4348
+ Module['asm']['ma']).apply(null, arguments);
4349
+ });
4350
+ var dynCall_viiii = (Module['dynCall_viiii'] = function () {
4351
+ return (dynCall_viiii = Module['dynCall_viiii'] =
4352
+ Module['asm']['na']).apply(null, arguments);
4353
+ });
4354
+ var dynCall_viiiii = (Module['dynCall_viiiii'] = function () {
4355
+ return (dynCall_viiiii = Module['dynCall_viiiii'] =
4356
+ Module['asm']['oa']).apply(null, arguments);
4357
+ });
4358
+ var dynCall_i = (Module['dynCall_i'] = function () {
4359
+ return (dynCall_i = Module['dynCall_i'] = Module['asm']['pa']).apply(
4360
+ null,
4361
+ arguments
4362
+ );
4363
+ });
4364
+ var dynCall_ii = (Module['dynCall_ii'] = function () {
4365
+ return (dynCall_ii = Module['dynCall_ii'] =
4366
+ Module['asm']['qa']).apply(null, arguments);
4367
+ });
4368
+ var dynCall_iii = (Module['dynCall_iii'] = function () {
4369
+ return (dynCall_iii = Module['dynCall_iii'] =
4370
+ Module['asm']['ra']).apply(null, arguments);
4371
+ });
4372
+ var dynCall_iiii = (Module['dynCall_iiii'] = function () {
4373
+ return (dynCall_iiii = Module['dynCall_iiii'] =
4374
+ Module['asm']['sa']).apply(null, arguments);
4375
+ });
4376
+ var dynCall_iiiii = (Module['dynCall_iiiii'] = function () {
4377
+ return (dynCall_iiiii = Module['dynCall_iiiii'] =
4378
+ Module['asm']['ta']).apply(null, arguments);
4379
+ });
4380
+ var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = function () {
4381
+ return (dynCall_iiiiiii = Module['dynCall_iiiiiii'] =
4382
+ Module['asm']['ua']).apply(null, arguments);
4383
+ });
4384
+ var dynCall_d = (Module['dynCall_d'] = function () {
4385
+ return (dynCall_d = Module['dynCall_d'] = Module['asm']['va']).apply(
4386
+ null,
4387
+ arguments
4388
+ );
4389
+ });
4390
+ var dynCall_di = (Module['dynCall_di'] = function () {
4391
+ return (dynCall_di = Module['dynCall_di'] =
4392
+ Module['asm']['wa']).apply(null, arguments);
4393
+ });
4394
+ var stackSave = (Module['stackSave'] = function () {
4395
+ return (stackSave = Module['stackSave'] = Module['asm']['xa']).apply(
4396
+ null,
4397
+ arguments
4398
+ );
4399
+ });
4400
+ var stackRestore = (Module['stackRestore'] = function () {
4401
+ return (stackRestore = Module['stackRestore'] =
4402
+ Module['asm']['ya']).apply(null, arguments);
4403
+ });
4404
+ function invoke_ii(index, a1) {
4405
+ var sp = stackSave();
4406
+ try {
4407
+ return dynCall_ii(index, a1);
4408
+ } catch (e) {
4409
+ stackRestore(sp);
4410
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4411
+ _setThrew(1, 0);
4412
+ }
4413
+ }
4414
+ function invoke_i(index) {
4415
+ var sp = stackSave();
4416
+ try {
4417
+ return dynCall_i(index);
4418
+ } catch (e) {
4419
+ stackRestore(sp);
4420
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4421
+ _setThrew(1, 0);
4422
+ }
4423
+ }
4424
+ function invoke_iii(index, a1, a2) {
4425
+ var sp = stackSave();
4426
+ try {
4427
+ return dynCall_iii(index, a1, a2);
4428
+ } catch (e) {
4429
+ stackRestore(sp);
4430
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4431
+ _setThrew(1, 0);
4432
+ }
4433
+ }
4434
+ function invoke_iiii(index, a1, a2, a3) {
4435
+ var sp = stackSave();
4436
+ try {
4437
+ return dynCall_iiii(index, a1, a2, a3);
4438
+ } catch (e) {
4439
+ stackRestore(sp);
4440
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4441
+ _setThrew(1, 0);
4442
+ }
4443
+ }
4444
+ function invoke_vii(index, a1, a2) {
4445
+ var sp = stackSave();
4446
+ try {
4447
+ dynCall_vii(index, a1, a2);
4448
+ } catch (e) {
4449
+ stackRestore(sp);
4450
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4451
+ _setThrew(1, 0);
4452
+ }
4453
+ }
4454
+ function invoke_viii(index, a1, a2, a3) {
4455
+ var sp = stackSave();
4456
+ try {
4457
+ dynCall_viii(index, a1, a2, a3);
4458
+ } catch (e) {
4459
+ stackRestore(sp);
4460
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4461
+ _setThrew(1, 0);
4462
+ }
4463
+ }
4464
+ function invoke_viiii(index, a1, a2, a3, a4) {
4465
+ var sp = stackSave();
4466
+ try {
4467
+ dynCall_viiii(index, a1, a2, a3, a4);
4468
+ } catch (e) {
4469
+ stackRestore(sp);
4470
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4471
+ _setThrew(1, 0);
4472
+ }
4473
+ }
4474
+ function invoke_vi(index, a1) {
4475
+ var sp = stackSave();
4476
+ try {
4477
+ dynCall_vi(index, a1);
4478
+ } catch (e) {
4479
+ stackRestore(sp);
4480
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4481
+ _setThrew(1, 0);
4482
+ }
4483
+ }
4484
+ function invoke_v(index) {
4485
+ var sp = stackSave();
4486
+ try {
4487
+ dynCall_v(index);
4488
+ } catch (e) {
4489
+ stackRestore(sp);
4490
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4491
+ _setThrew(1, 0);
4492
+ }
4493
+ }
4494
+ function invoke_viiiii(index, a1, a2, a3, a4, a5) {
4495
+ var sp = stackSave();
4496
+ try {
4497
+ dynCall_viiiii(index, a1, a2, a3, a4, a5);
4498
+ } catch (e) {
4499
+ stackRestore(sp);
4500
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4501
+ _setThrew(1, 0);
4502
+ }
4503
+ }
4504
+ function invoke_d(index) {
4505
+ var sp = stackSave();
4506
+ try {
4507
+ return dynCall_d(index);
4508
+ } catch (e) {
4509
+ stackRestore(sp);
4510
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4511
+ _setThrew(1, 0);
4512
+ }
4513
+ }
4514
+ function invoke_iiiii(index, a1, a2, a3, a4) {
4515
+ var sp = stackSave();
4516
+ try {
4517
+ return dynCall_iiiii(index, a1, a2, a3, a4);
4518
+ } catch (e) {
4519
+ stackRestore(sp);
4520
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4521
+ _setThrew(1, 0);
4522
+ }
4523
+ }
4524
+ function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) {
4525
+ var sp = stackSave();
4526
+ try {
4527
+ return dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6);
4528
+ } catch (e) {
4529
+ stackRestore(sp);
4530
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4531
+ _setThrew(1, 0);
4532
+ }
4533
+ }
4534
+ function invoke_di(index, a1) {
4535
+ var sp = stackSave();
4536
+ try {
4537
+ return dynCall_di(index, a1);
4538
+ } catch (e) {
4539
+ stackRestore(sp);
4540
+ if (e !== e + 0 && e !== 'longjmp') throw e;
4541
+ _setThrew(1, 0);
4542
+ }
4543
+ }
4544
+ Module['asm'] = asm;
4545
+ var calledRun;
4546
+ function ExitStatus(status) {
4547
+ this.name = 'ExitStatus';
4548
+ this.message = 'Program terminated with exit(' + status + ')';
4549
+ this.status = status;
4550
+ }
4551
+ dependenciesFulfilled = function runCaller() {
4552
+ if (!calledRun) run();
4553
+ if (!calledRun) dependenciesFulfilled = runCaller;
4554
+ };
4555
+ function run(args) {
4556
+ if (runDependencies > 0) {
4557
+ return;
4558
+ }
4559
+ preRun();
4560
+ if (runDependencies > 0) return;
4561
+ function doRun() {
4562
+ if (calledRun) return;
4563
+ calledRun = true;
4564
+ Module['calledRun'] = true;
4565
+ if (ABORT) return;
4566
+ initRuntime();
4567
+ preMain();
4568
+ readyPromiseResolve(Module);
4569
+ if (Module['onRuntimeInitialized'])
4570
+ Module['onRuntimeInitialized']();
4571
+ postRun();
4572
+ }
4573
+ if (Module['setStatus']) {
4574
+ Module['setStatus']('Running...');
4575
+ setTimeout(function () {
4576
+ setTimeout(function () {
4577
+ Module['setStatus']('');
4578
+ }, 1);
4579
+ doRun();
4580
+ }, 1);
4581
+ } else {
4582
+ doRun();
4583
+ }
4584
+ }
4585
+ Module['run'] = run;
4586
+ function exit(status, implicit) {
4587
+ if (implicit && noExitRuntime && status === 0) {
4588
+ return;
4589
+ }
4590
+ if (noExitRuntime);
4591
+ else {
4592
+ ABORT = true;
4593
+ if (Module['onExit']) Module['onExit'](status);
4594
+ }
4595
+ quit_(status, new ExitStatus(status));
4596
+ }
4597
+ if (Module['preInit']) {
4598
+ if (typeof Module['preInit'] == 'function')
4599
+ Module['preInit'] = [Module['preInit']];
4600
+ while (Module['preInit'].length > 0) {
4601
+ Module['preInit'].pop()();
4602
+ }
4603
+ }
4604
+ noExitRuntime = true;
4605
+ run();
4606
+ function WrapperObject() {}
4607
+ WrapperObject.prototype = Object.create(WrapperObject.prototype);
4608
+ WrapperObject.prototype.constructor = WrapperObject;
4609
+ WrapperObject.prototype.__class__ = WrapperObject;
4610
+ WrapperObject.__cache__ = {};
4611
+ Module['WrapperObject'] = WrapperObject;
4612
+ function getCache(__class__) {
4613
+ return (__class__ || WrapperObject).__cache__;
4614
+ }
4615
+ Module['getCache'] = getCache;
4616
+ function wrapPointer(ptr, __class__) {
4617
+ var cache = getCache(__class__);
4618
+ var ret = cache[ptr];
4619
+ if (ret) return ret;
4620
+ ret = Object.create((__class__ || WrapperObject).prototype);
4621
+ ret.ptr = ptr;
4622
+ return (cache[ptr] = ret);
4623
+ }
4624
+ Module['wrapPointer'] = wrapPointer;
4625
+ function castObject(obj, __class__) {
4626
+ return wrapPointer(obj.ptr, __class__);
4627
+ }
4628
+ Module['castObject'] = castObject;
4629
+ Module['NULL'] = wrapPointer(0);
4630
+ function destroy(obj) {
4631
+ if (!obj['__destroy__'])
4632
+ throw 'Error: Cannot destroy object. (Did you create it yourself?)';
4633
+ obj['__destroy__']();
4634
+ delete getCache(obj.__class__)[obj.ptr];
4635
+ }
4636
+ Module['destroy'] = destroy;
4637
+ function compare(obj1, obj2) {
4638
+ return obj1.ptr === obj2.ptr;
4639
+ }
4640
+ Module['compare'] = compare;
4641
+ function getPointer(obj) {
4642
+ return obj.ptr;
4643
+ }
4644
+ Module['getPointer'] = getPointer;
4645
+ function getClass(obj) {
4646
+ return obj.__class__;
4647
+ }
4648
+ Module['getClass'] = getClass;
4649
+ var ensureCache = {
4650
+ buffer: 0,
4651
+ size: 0,
4652
+ pos: 0,
4653
+ temps: [],
4654
+ needed: 0,
4655
+ prepare: function () {
4656
+ if (ensureCache.needed) {
4657
+ for (var i = 0; i < ensureCache.temps.length; i++) {
4658
+ Module['_free'](ensureCache.temps[i]);
4659
+ }
4660
+ ensureCache.temps.length = 0;
4661
+ Module['_free'](ensureCache.buffer);
4662
+ ensureCache.buffer = 0;
4663
+ ensureCache.size += ensureCache.needed;
4664
+ ensureCache.needed = 0;
4665
+ }
4666
+ if (!ensureCache.buffer) {
4667
+ ensureCache.size += 128;
4668
+ ensureCache.buffer = Module['_malloc'](ensureCache.size);
4669
+ assert(ensureCache.buffer);
4670
+ }
4671
+ ensureCache.pos = 0;
4672
+ },
4673
+ alloc: function (array, view) {
4674
+ assert(ensureCache.buffer);
4675
+ var bytes = view.BYTES_PER_ELEMENT;
4676
+ var len = array.length * bytes;
4677
+ len = (len + 7) & -8;
4678
+ var ret;
4679
+ if (ensureCache.pos + len >= ensureCache.size) {
4680
+ assert(len > 0);
4681
+ ensureCache.needed += len;
4682
+ ret = Module['_malloc'](len);
4683
+ ensureCache.temps.push(ret);
4684
+ } else {
4685
+ ret = ensureCache.buffer + ensureCache.pos;
4686
+ ensureCache.pos += len;
4687
+ }
4688
+ return ret;
4689
+ },
4690
+ copy: function (array, view, offset) {
4691
+ offset >>>= 0;
4692
+ var bytes = view.BYTES_PER_ELEMENT;
4693
+ switch (bytes) {
4694
+ case 2:
4695
+ offset >>>= 1;
4696
+ break;
4697
+ case 4:
4698
+ offset >>>= 2;
4699
+ break;
4700
+ case 8:
4701
+ offset >>>= 3;
4702
+ break;
4703
+ }
4704
+ for (var i = 0; i < array.length; i++) {
4705
+ view[offset + i] = array[i];
4706
+ }
4707
+ },
4708
+ };
4709
+ function ensureString(value) {
4710
+ if (typeof value === 'string') {
4711
+ var intArray = intArrayFromString(value);
4712
+ var offset = ensureCache.alloc(intArray, HEAP8);
4713
+ ensureCache.copy(intArray, HEAP8, offset);
4714
+ return offset;
4715
+ }
4716
+ return value;
4717
+ }
4718
+ function VoidPtr() {
4719
+ throw 'cannot construct a VoidPtr, no constructor in IDL';
4720
+ }
4721
+ VoidPtr.prototype = Object.create(WrapperObject.prototype);
4722
+ VoidPtr.prototype.constructor = VoidPtr;
4723
+ VoidPtr.prototype.__class__ = VoidPtr;
4724
+ VoidPtr.__cache__ = {};
4725
+ Module['VoidPtr'] = VoidPtr;
4726
+ VoidPtr.prototype[
4727
+ '__destroy__'
4728
+ ] = VoidPtr.prototype.__destroy__ = function () {
4729
+ var self = this.ptr;
4730
+ _emscripten_bind_VoidPtr___destroy___0(self);
4731
+ };
4732
+ function Main() {
4733
+ throw 'cannot construct a Main, no constructor in IDL';
4734
+ }
4735
+ Main.prototype = Object.create(WrapperObject.prototype);
4736
+ Main.prototype.constructor = Main;
4737
+ Main.prototype.__class__ = Main;
4738
+ Main.__cache__ = {};
4739
+ Module['Main'] = Main;
4740
+ Main.prototype['layout'] = Main.prototype.layout = function (
4741
+ dot,
4742
+ format,
4743
+ engine
4744
+ ) {
4745
+ var self = this.ptr;
4746
+ ensureCache.prepare();
4747
+ if (dot && typeof dot === 'object') dot = dot.ptr;
4748
+ else dot = ensureString(dot);
4749
+ if (format && typeof format === 'object') format = format.ptr;
4750
+ else format = ensureString(format);
4751
+ if (engine && typeof engine === 'object') engine = engine.ptr;
4752
+ else engine = ensureString(engine);
4753
+ return UTF8ToString(
4754
+ _emscripten_bind_Main_layout_3(self, dot, format, engine)
4755
+ );
4756
+ };
4757
+ Main.prototype['lastError'] = Main.prototype.lastError = function () {
4758
+ var self = this.ptr;
4759
+ return UTF8ToString(_emscripten_bind_Main_lastError_0(self));
4760
+ };
4761
+ Main.prototype['createFile'] = Main.prototype.createFile = function (
4762
+ file,
4763
+ data
4764
+ ) {
4765
+ var self = this.ptr;
4766
+ ensureCache.prepare();
4767
+ if (file && typeof file === 'object') file = file.ptr;
4768
+ else file = ensureString(file);
4769
+ if (data && typeof data === 'object') data = data.ptr;
4770
+ else data = ensureString(data);
4771
+ _emscripten_bind_Main_createFile_2(self, file, data);
4772
+ };
4773
+ Main.prototype[
4774
+ '__destroy__'
4775
+ ] = Main.prototype.__destroy__ = function () {
4776
+ var self = this.ptr;
4777
+ _emscripten_bind_Main___destroy___0(self);
4778
+ };
4779
+
4780
+ return cpp.ready;
4781
+ };
4782
+ })();
4783
+ module.exports = cpp;
4784
+ });
4785
+
4786
+ var graphvizlib$1 = /*#__PURE__*/ Object.freeze({
4787
+ __proto__: null,
4788
+ default: graphvizlib,
4789
+ __moduleExports: graphvizlib,
4790
+ });
4791
+
4792
+ var __assign =
4793
+ (undefined && undefined.__assign) ||
4794
+ function () {
4795
+ __assign =
4796
+ Object.assign ||
4797
+ function (t) {
4798
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4799
+ s = arguments[i];
4800
+ for (var p in s)
4801
+ if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
4802
+ }
4803
+ return t;
4804
+ };
4805
+ return __assign.apply(this, arguments);
4806
+ };
4807
+ var __spreadArrays =
4808
+ (undefined && undefined.__spreadArrays) ||
4809
+ function () {
4810
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++)
4811
+ s += arguments[i].length;
4812
+ for (var r = Array(s), k = 0, i = 0; i < il; i++)
4813
+ for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
4814
+ r[k] = a[j];
4815
+ return r;
4816
+ };
4817
+ function imageToFile(image) {
4818
+ return {
4819
+ path: image.path,
4820
+ data:
4821
+ '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n<svg width="' +
4822
+ image.width +
4823
+ '" height="' +
4824
+ image.height +
4825
+ '"></svg>',
4826
+ };
4827
+ }
4828
+ function imagesToFiles(images) {
4829
+ return images.map(imageToFile);
4830
+ }
4831
+ function createFiles(wasm, _ext) {
4832
+ var ext = __assign({ images: [], files: [] }, _ext);
4833
+ __spreadArrays(ext.files, imagesToFiles(ext.images)).forEach(function (
4834
+ file
4835
+ ) {
4836
+ return wasm.Main.prototype.createFile(file.path, file.data);
4837
+ });
4838
+ }
4839
+ var graphviz = {
4840
+ layout: function (dotSource, outputFormat, layoutEngine, ext) {
4841
+ if (outputFormat === void 0) {
4842
+ outputFormat = 'svg';
4843
+ }
4844
+ if (layoutEngine === void 0) {
4845
+ layoutEngine = 'dot';
4846
+ }
4847
+ if (!dotSource) return Promise.resolve('');
4848
+ return loadWasm(
4849
+ graphvizlib$1,
4850
+ ext === null || ext === void 0 ? void 0 : ext.wasmFolder
4851
+ ).then(function (wasm) {
4852
+ createFiles(wasm, ext);
4853
+ var retVal = wasm.Main.prototype.layout(
4854
+ dotSource,
4855
+ outputFormat,
4856
+ layoutEngine
4857
+ );
4858
+ if (!retVal) {
4859
+ throw new Error(wasm.Main.prototype.lastError());
4860
+ }
4861
+ return retVal;
4862
+ });
4863
+ },
4864
+ circo: function (dotSource, outputFormat, ext) {
4865
+ if (outputFormat === void 0) {
4866
+ outputFormat = 'svg';
4867
+ }
4868
+ return this.layout(dotSource, outputFormat, 'circo', ext);
4869
+ },
4870
+ dot: function (dotSource, outputFormat, ext) {
4871
+ if (outputFormat === void 0) {
4872
+ outputFormat = 'svg';
4873
+ }
4874
+ return this.layout(dotSource, outputFormat, 'dot', ext);
4875
+ },
4876
+ fdp: function (dotSource, outputFormat, ext) {
4877
+ if (outputFormat === void 0) {
4878
+ outputFormat = 'svg';
4879
+ }
4880
+ return this.layout(dotSource, outputFormat, 'fdp', ext);
4881
+ },
4882
+ neato: function (dotSource, outputFormat, ext) {
4883
+ if (outputFormat === void 0) {
4884
+ outputFormat = 'svg';
4885
+ }
4886
+ return this.layout(dotSource, outputFormat, 'neato', ext);
4887
+ },
4888
+ osage: function (dotSource, outputFormat, ext) {
4889
+ if (outputFormat === void 0) {
4890
+ outputFormat = 'svg';
4891
+ }
4892
+ return this.layout(dotSource, outputFormat, 'osage', ext);
4893
+ },
4894
+ patchwork: function (dotSource, outputFormat, ext) {
4895
+ if (outputFormat === void 0) {
4896
+ outputFormat = 'svg';
4897
+ }
4898
+ return this.layout(dotSource, outputFormat, 'patchwork', ext);
4899
+ },
4900
+ twopi: function (dotSource, outputFormat, ext) {
4901
+ if (outputFormat === void 0) {
4902
+ outputFormat = 'svg';
4903
+ }
4904
+ return this.layout(dotSource, outputFormat, 'twopi', ext);
4905
+ },
4906
+ };
4907
+
4908
+ exports.graphviz = graphviz;
4909
+
4910
+ Object.defineProperty(exports, '__esModule', { value: true });
4911
+ });