From 505fddc1dba9541887d4442fc563193bb6221383 Mon Sep 17 00:00:00 2001 From: aryasalehi Date: Fri, 6 Jan 2023 15:25:57 +0330 Subject: [PATCH 1/4] remove old dominator code --- task/tracker.cc | 111 ------------------------------------------------ task/tracker.h | 19 --------- 2 files changed, 130 deletions(-) diff --git a/task/tracker.cc b/task/tracker.cc index b38d9e2..54bd665 100644 --- a/task/tracker.cc +++ b/task/tracker.cc @@ -162,72 +162,6 @@ uint8_t *TrackerUpdate::getBuffer() const { return ptr; } -// - -/* std::vector DataRequest::getBuffer() const { - size_t size = 0; - size += sizeof(vm::ivec3); // min - size += sizeof(int); // lod - - std::vector result(size); - int index = 0; - - // min - std::memcpy(result.data() + index, &node->min, sizeof(vm::ivec3)); - index += sizeof(vm::ivec3); - - // lod - *((int *)(result.data() + index)) = node->lod; - index += sizeof(int); - - return result; -} - -std::vector DataRequestUpdate::getBuffer() const { - return std::vector(); // XXX -} */ - -// - -Dominator::Dominator(OctreeNodePtr node) : - node(node) - {} - -// - -std::vector Dominator::getBuffer() const { - size_t size = 0; - size += sizeof(uint32_t); // numNewChunks - size += sizeof(uint32_t); // numOldChunks - size += sizeof(uint32_t) * newChunks.size(); // new chunk hashes - size += sizeof(uint32_t) * oldChunks.size(); // old chunk hashes - - std::vector result(size); - int index = 0; - // numNewChunks - *((uint32_t *)(result.data() + index)) = newChunks.size(); - index += sizeof(uint32_t); - // numOldChunks - *((uint32_t *)(result.data() + index)) = oldChunks.size(); - index += sizeof(uint32_t); - // new chunk hashes - for (auto chunk : newChunks) { - uint64_t hash = hashOctreeMinLod(chunk->min, chunk->lod); - *((uint32_t *)(result.data() + index)) = hash; - index += sizeof(uint32_t); - } - // old chunk hashes - for (auto chunk : oldChunks) { - uint64_t hash = hashOctreeMinLod(chunk->min, chunk->lod); - *((uint32_t *)(result.data() + index)) = hash; - index += sizeof(uint32_t); - } - - return result; -} - -// - bool containsPoint(const vm::ivec2 &min, const int lod, const vm::ivec2 &p) { return p.x >= min.x && p.x < min.x + lod && p.y >= min.y && p.y < min.y + lod; @@ -973,52 +907,7 @@ DataRequestUpdate Tracker::updateDataRequests( return dataRequestUpdate; } -/* std::unordered_map Tracker::updateDominators( - const std::vector &oldRenderedChunks, - const std::vector &newRenderedChunks -) { - // compute dominators. a dominator is a chunk lod that contains a a transform from old chunks to new chunks. - std::unordered_map dominators; - auto addChunk = [&](const OctreeNodePtr &chunk, bool isNew) -> void { - OctreeNodePtr oldLeafNode = findLeafNodeForPosition(oldRenderedChunks, chunk->min); - OctreeNodePtr newLeafNode = findLeafNodeForPosition(newRenderedChunks, chunk->min); - OctreeNodePtr maxLodChunk = nullptr; - if (oldLeafNode != nullptr && newLeafNode != nullptr) { - maxLodChunk = oldLeafNode->size > newLeafNode->size ? oldLeafNode : newLeafNode; - } else if (oldLeafNode != nullptr) { - maxLodChunk = oldLeafNode; - } else if (newLeafNode != nullptr) { - maxLodChunk = newLeafNode; - } else { - std::cout << "no chunk match in any leaf set" << std::endl; - abort(); - } - uint64_t maxLodHash = hashOctreeMinLod(maxLodChunk->min, maxLodChunk->lod); - auto dominatorIter = dominators.find(maxLodHash); - if (dominatorIter == dominators.end()) { - auto insertResult = dominators.emplace( - std::piecewise_construct, - std::forward_as_tuple(maxLodHash), - std::forward_as_tuple(maxLodChunk) - ); - dominatorIter = insertResult.first; - } - Dominator &dominator = dominatorIter->second; - if (isNew) { - dominator.newChunks.push_back(chunk); - } else { - dominator.oldChunks.push_back(chunk); - } - }; - for (auto chunk : oldRenderedChunks) { - addChunk(chunk, false); - } - for (auto chunk : newRenderedChunks) { - addChunk(chunk, true); - } - return dominators; -} */ TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int minLod, int maxLod, int lod1Range) { std::lock_guard lock(mutex); diff --git a/task/tracker.h b/task/tracker.h index 66f3dfd..ec5d341 100644 --- a/task/tracker.h +++ b/task/tracker.h @@ -50,21 +50,6 @@ class DataRequestUpdate { std::vector getBuffer() const; }; -// - -class Dominator { -public: - OctreeNodePtr node; - std::vector newChunks; - std::vector oldChunks; - - Dominator(OctreeNodePtr node); - - std::vector getBuffer() const; -}; - -// - extern std::atomic nextTrackerId; class TrackerUpdate { @@ -148,10 +133,6 @@ class Tracker { const std::unordered_map &dataRequests, const std::vector &leafNodes ); - /* std::unordered_map updateDominators( - const std::vector &oldRenderedChunks, - std::unordered_map &dataRequests - ); */ TrackerUpdate update(PGInstance *inst, const vm::vec3 &position, int minLod, int maxLod, int lod1Range); }; From c443d3c793aba41ab7e7c23ffb11f30e3259f602 Mon Sep 17 00:00:00 2001 From: aryasalehi Date: Fri, 6 Jan 2023 17:37:50 +0330 Subject: [PATCH 2/4] remove old commented code --- bin/pg.wasm | Bin 298573 -> 285107 bytes task/promise.h | 5 +- task/result.h | 2 - task/sync.cc | 19 +-- task/task.cc | 98 +---------- task/task.h | 1 - task/tracker.cc | 434 +----------------------------------------------- 7 files changed, 11 insertions(+), 548 deletions(-) diff --git a/bin/pg.wasm b/bin/pg.wasm index 0ff4a5e57fc44babb00ce2d1347ff038d3fe9169..a99a9569cf85e8b64ee2ce2be08140ce1426becf 100644 GIT binary patch delta 17800 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 delta 29019 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 live; Promise(uint32_t id, ResultQueue *resultQueue); ~Promise(); - // void *get(); bool resolve(void *value = nullptr); bool kill(); - // void wait(); }; #endif // PROMISE_H diff --git a/task/result.h b/task/result.h index e3bc06f..7a31187 100644 --- a/task/result.h +++ b/task/result.h @@ -17,13 +17,11 @@ class Promise; class ResultQueue { public: Mutex mutex; - // uint32_t ids; std::deque> livePromises; ResultQueue(); ~ResultQueue(); - // uint32_t getNextId(); std::shared_ptr createPromise(uint32_t id); std::shared_ptr findPromise(uint32_t id); void cancelPromise(uint32_t id); diff --git a/task/sync.cc b/task/sync.cc index d0f5d59..8eeb674 100644 --- a/task/sync.cc +++ b/task/sync.cc @@ -20,15 +20,6 @@ void Mutex::unlock() { bool Mutex::try_lock() { return mutex.try_lock(); } -/* bool Mutex::test() { - return !flag.test(); -} -void Mutex::wait() { - lock(); - unlock(); -} */ - -// Semaphore::Semaphore(int count) : count(count) {} void Semaphore::signal() { @@ -42,12 +33,4 @@ void Semaphore::wait() { cv.wait(lock); } count--; -} -/* bool Semaphore::try_wait() { - std::lock_guard lock(mutex_); - if(count_) { - --count_; - return true; - } - return false; -} */ \ No newline at end of file +} \ No newline at end of file diff --git a/task/task.cc b/task/task.cc index 809e02f..90b5059 100644 --- a/task/task.cc +++ b/task/task.cc @@ -122,75 +122,18 @@ void TaskQueue::pushTask(Task *task) { } taskSemaphore.signal(); } -// std::atomic numActiveThreads(NUM_THREADS); -Task *TaskQueue::popLockTask() { - /* EM_ASM( - console.log('pop lock task 1'); - ); */ - // int currentNumActiveThreads = numActiveThreads.fetch_sub(1) - 1; - /* EM_ASM({ - console.log('try to pop task', $0); - }, currentNumActiveThreads); */ - - /* EM_ASM({ - globalThis.lockStartTime = performance.now(); - }); */ - - /* if (currentNumActiveThreads < 2) { - std::cout << "pop task 1 " << currentNumActiveThreads << std::endl; - } */ +Task *TaskQueue::popLockTask() { taskSemaphore.wait(); - /* double time = EM_ASM_DOUBLE({ - const lockEndTime = performance.now(); - return lockEndTime - globalThis.lockStartTime; - }); - int currentNumActiveThreads2 = numActiveThreads.fetch_add(1) + 1; - if (currentNumActiveThreads2 < 2) { - std::cout << "pop task 2 " << currentNumActiveThreads2 << " " << time << std::endl; - } */ - - /* EM_ASM({ - // console.time('pop task ' + $0); - globalThis.requestStartTime = performance.now(); - }); */ - - /* EM_ASM({ - console.timeEnd('pop task ' + $0); - console.log('num active threads', $1, $2, $3); - }, pthread_self(), currentNumActiveThreads, currentNumActiveThreads2, tasks.size()); */ - - /* EM_ASM( - console.log('pop lock sema waited'); - ); */ - Task *task; { std::unique_lock lock(taskMutex); - // lock.lock(); - - /* if (lockedTasks.size() == 0) { - abort(); - } */ task = tasks.front(); tasks.pop_front(); - - /* if (currentNumActiveThreads < 8) { - EM_ASM({ - console.log('fewer than 8 threads', $0, $1); - }, currentNumActiveThreads, tasks.size()); - } */ - - // task->ensurePop(); } - /* if (task == nullptr) { - EM_ASM( - console.log('failed to pop task!'); - ); - abort(); - } */ + return task; } void TaskQueue::cancelTask(uint32_t taskId) { @@ -198,19 +141,12 @@ void TaskQueue::cancelTask(uint32_t taskId) { for (auto it = tasks.begin(); it != tasks.end(); it++) { Task *task = (*it); if (task->id == taskId && task->live) { - /* EM_ASM({ - console.log('cancel task', $0); - }, task->id); */ task->cancel(); break; } } } void TaskQueue::runLoop() { - /* EM_ASM( - console.log('run loop'); - ); */ - // { for (;;) { Task *task = popLockTask(); if (!task) { @@ -220,19 +156,13 @@ void TaskQueue::runLoop() { if (task->live) { task->run(); } - /* EM_ASM({ - console.log('done running task'); - }); */ delete task; - // task = nullptr; } - // } - /* EM_ASM( - console.log('thread exited due to no task!'); - ); */ + std::cout << "main loop exited" << std::endl; abort(); } + void TaskQueue::setCamera(const vm::vec3 &worldPosition, const vm::vec3 &cameraPosition, const Quat &cameraQuaternion, const std::array &projectionMatrix) { std::unique_lock lock(taskMutex); @@ -293,24 +223,4 @@ void TaskQueue::sortTasksInternal() { Frustum frustum = getFrustum(); sort(tasks, worldPosition, frustum); - - /* std::vector> taskDistances; - taskDistances.reserve(tasks.size()); - for (size_t i = 0; i < tasks.size(); i++) { - Task *task = tasks[i]; - float distance = getTaskDistance(task, frustum); - taskDistances.push_back(std::pair(task, distance)); - } - - std::sort( - taskDistances.begin(), - taskDistances.end(), - [&](const std::pair &a, const std::pair &b) -> bool { - return a.second < b.second; - } - ); - - for (size_t i = 0; i < taskDistances.size(); i++) { - tasks[i] = taskDistances[i].first; - } */ } \ No newline at end of file diff --git a/task/task.h b/task/task.h index 3e3fc8b..32eee81 100644 --- a/task/task.h +++ b/task/task.h @@ -38,7 +38,6 @@ class Task { class TaskQueue { public: - // DCInstance *inst; std::deque tasks; Mutex taskMutex; diff --git a/task/tracker.cc b/task/tracker.cc index 54bd665..f83d688 100644 --- a/task/tracker.cc +++ b/task/tracker.cc @@ -2,94 +2,6 @@ #include "../instance.h" #include -/* -tracker = await dcWorkerManager.createTracker(3, 2, true); trackerUpdate = await dcWorkerManager.trackerUpdate(tracker, new THREE.Vector3(1, 2, 3)); -*/ - -// - -// std::atomic nextTrackerId(0); - -// - -/* bool TrackerTask::isNop() const { - auto task = this; - return task->newNodes.size() == task->oldNodes.size() && - std::all_of(task->newNodes.begin(), task->newNodes.end(), [&](OctreeNodePtr newNode) -> bool { - return std::any_of(task->oldNodes.begin(), task->oldNodes.end(), [&](OctreeNodePtr oldNode) -> bool { - return equalsNodeLod(*oldNode, *newNode); - }); - }); -} -std::vector TrackerTask::getBuffer() const { - size_t size = 0; - // header - size += sizeof(int); // id - size += sizeof(int); // type - // max lod node - size += sizeof(vm::ivec3); // min - size += sizeof(int); // lod - size += sizeof(int); // isLeaf - size += sizeof(int[8]); // lodArray - // old nodes - size += sizeof(uint32_t); // numOldNodes - size += sizeof(vm::ivec3) * oldNodes.size(); // min - size += sizeof(int) * oldNodes.size(); // lod - size += sizeof(int) * oldNodes.size(); // isLeaf - size += sizeof(int[8]) * oldNodes.size(); // lodArray - // new nodes - size += sizeof(uint32_t); // numNewNodes - size += sizeof(vm::ivec3) * newNodes.size(); // min - size += sizeof(int) * newNodes.size(); // lod - size += sizeof(int) * newNodes.size(); // isLeaf - size += sizeof(int[8]) * newNodes.size(); // lodArray - - std::vector result(size); - int index = 0; - // id - *((int *)(result.data() + index)) = id; - index += sizeof(int); - // type - *((int *)(result.data() + index)) = type; - index += sizeof(int); - // max lod node - std::memcpy(result.data() + index, &maxLodNode->min, sizeof(vm::ivec3)); - index += sizeof(vm::ivec3); - *((int *)(result.data() + index)) = maxLodNode->size; - index += sizeof(int); - *((int *)(result.data() + index)) = (maxLodNode->type == Node_Leaf) ? 1 : 0; - index += sizeof(int); - std::memcpy(result.data() + index, &maxLodNode->lodArray[0], sizeof(int[8])); - index += sizeof(int[8]); - // old nodes - *((uint32_t *)(result.data() + index)) = oldNodes.size(); - index += sizeof(uint32_t); - for (auto oldNode : oldNodes) { - std::memcpy(result.data() + index, &oldNode->min, sizeof(vm::ivec3)); - index += sizeof(vm::ivec3); - *((int *)(result.data() + index)) = oldNode->size; - index += sizeof(int); - *((int *)(result.data() + index)) = (oldNode->type == Node_Leaf) ? 1 : 0; - index += sizeof(int); - std::memcpy(result.data() + index, &oldNode->lodArray[0], sizeof(int[8])); - index += sizeof(int[8]); - } - // new nodes - *((uint32_t *)(result.data() + index)) = newNodes.size(); - index += sizeof(uint32_t); - for (auto newNode : newNodes) { - std::memcpy(result.data() + index, &newNode->min, sizeof(vm::ivec3)); - index += sizeof(vm::ivec3); - *((int *)(result.data() + index)) = newNode->size; - index += sizeof(int); - *((int *)(result.data() + index)) = (newNode->type == Node_Leaf) ? 1 : 0; - index += sizeof(int); - std::memcpy(result.data() + index, &newNode->lodArray[0], sizeof(int[8])); - index += sizeof(int[8]); - } - - return result; -} */ void serializeOctreeNodes(const std::vector &datas, uint8_t *ptr, int &index) { // std::cout << "serialize octree nodes" << datas.size() << std::endl; @@ -107,6 +19,7 @@ void serializeOctreeNodes(const std::vector &datas, uint8_t *ptr, index += sizeof(int[2]); } } + void serializeDataRequests(const std::vector &datas, uint8_t *ptr, int &index) { // std::cout << "serialize data requests" << datas.size() << std::endl; @@ -124,10 +37,6 @@ void serializeDataRequests(const std::vector &datas, uint8_t *pt index += sizeof(int[2]); } } -/* void serializeChunkPosition(const vm::ivec2 &chunkPosition, uint8_t *ptr, int &index) { - memcpy(ptr + index, &chunkPosition, sizeof(chunkPosition)); - index += sizeof(vm::ivec2); -} */ uint8_t *TrackerUpdate::getBuffer() const { // compute size @@ -157,7 +66,6 @@ uint8_t *TrackerUpdate::getBuffer() const { serializeDataRequests(newDataRequests, ptr, index); serializeDataRequests(keepDataRequests, ptr, index); serializeDataRequests(cancelDataRequests, ptr, index); - // serializeChunkPosition(chunkPosition, ptr, index); return ptr; } @@ -188,11 +96,6 @@ bool equalsNodeLod(const OctreeNode &node, const OctreeNode &other) { if (node.lod != other.lod) { return false; } - /* for (size_t i = 0; i < node.lodArray.size(); i++) { - if (node.lodArray[i] != other.lodArray[i]) { - return false; - } - } */ return true; } else { return false; @@ -207,48 +110,17 @@ bool equalsNodeLodArray(const OctreeNode &node, const OctreeNode &other) { return false; } return true; - } else { - return false; } + + return false; } -/* bool intersectsNode(const OctreeNode &node, const OctreeNode &other) { - return containsNode(node, other) || containsNode(other, node); -} */ -// returns whether the box of min1 + lod1 intersects the box of min2 + lod2 + bool chunksIntersect(const vm::ivec2 &min1, const int lod1, const vm::ivec2 &min2, const int lod2) { return min1.x < min2.x + lod2 && min1.x + lod1 > min2.x && min1.y < min2.y + lod2 && min1.y + lod1 > min2.y; } -// - -/* std::array lodOffsets = { - vm::ivec3{0, 0, 0}, - vm::ivec3{1, 0, 0}, - vm::ivec3{0, 0, 1}, - vm::ivec3{1, 0, 1}, - vm::ivec3{0, 1, 0}, - vm::ivec3{1, 1, 0}, - vm::ivec3{0, 1, 1}, - vm::ivec3{1, 1, 1} -}; */ -// OctreeNodeAllocator octreeNodeAllocator; - -// - -/* OctreeNodeAllocator::OctreeNodeAllocator() { - for (int i = 0; i < rawNodes.size(); i++) { - OctreeNode *node = &rawNodes[i]; - nodes.push_back(node); - } - this->deleter = [this](void *ptr) -> void { - this->nodes.push_back((OctreeNode *)ptr); - }; -} */ OctreeNodePtr OctreeNodeAllocator::alloc(const vm::ivec2 &min, int lod) { - // OctreeNode *octreeNode = new OctreeNode(min, lod); - // octreeNode->min = min; - // octreeNode->lod = lod; return std::make_shared(min, lod); } @@ -273,17 +145,6 @@ std::vector OctreeContext::getLeafNodes() { return leafNodes; } -// - -/* OctreeNodePtr getLeafNodeFromPoint(const std::vector &leafNodes, const vm::ivec2 &p) { - for (size_t i = 0; i < leafNodes.size(); i++) { - auto leafNode = leafNodes[i]; - if (containsPoint(*leafNode, p)) { - return leafNode; - } - } - return nullptr; -} */ std::unordered_map>::iterator getNodeIter(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) { auto &nodeMap = octreeContext.nodeMap; @@ -316,31 +177,7 @@ OctreeNodePtr getOrCreateNode(OctreeContext &octreeContext, const vm::ivec2 &min } return node; } -/* OctreeNodePtr scanForNode(OctreeContext &octreeContext, const vm::ivec2 &min, int minSearchLod, int maxSearchLod) { - for (int lod = minSearchLod; lod <= maxSearchLod; lod *= 2) { - vm::ivec2 snapPosition{ - (min.x / lod) * lod, - (min.y / lod) * lod - }; - auto node = getNode(octreeContext, snapPosition, lod); - if (node) { - return node; - } - } - return nullptr; -} */ -/* OctreeNodePtr findContainingNode(OctreeContext &octreeContext, const vm::ivec2 &min) { - auto &nodeMap = octreeContext.nodeMap; - std::vector leafNodes; - for (const auto &iter : nodeMap) { - auto node = iter.second; - if (containsPoint(*node, min)) { - return node; - } - } - return nullptr; -} */ std::unordered_map>::iterator findNodeIterAtPoint(OctreeContext &octreeContext, const vm::ivec2 &position) { auto &nodeMap = octreeContext.nodeMap; @@ -379,48 +216,7 @@ bool removeNode(OctreeContext &octreeContext, OctreeNodePtr node) { return false; } } -/* void ensureChildren(OctreeContext &octreeContext, OctreeNode *parentNode) { - // auto &nodeMap = octreeContext.nodeMap; - - const vm::ivec3 &lodMin = parentNode->min; - const int &lod = parentNode->size; - - for (int dx = 0; dx < 2; dx++) { - for (int dy = 0; dy < 2; dy++) { - for (int dz = 0; dz < 2; dz++) { - int childIndex = dx + 2 * (dy + 2 * dz); - if (parentNode->children[childIndex] == nullptr) { - parentNode->children[childIndex] = createNode( - octreeContext, - lodMin + vm::ivec3{dx, dy, dz} * (lod / 2), - lod / 2, - true - ).get(); - // parentNode->children[childIndex].parent = parentNode; - } - } - } - } -} */ -/* void ensureChildLayer(OctreeContext &octreeContext, OctreeNodePtr parentNode) { - const vm::ivec2 &parentPosition = parentNode->min; - int childLod = parentNode->lod / 2; - - for (int i = 0; i < parentNode->children.size(); i++) { - // if (!parentNode->children[i]) { - vm::ivec2 childPosition{ - parentPosition.x + (i % 2) * childLod, - parentPosition.y + (i / 2) * childLod - }; - OctreeNodePtr childNode = getOrCreateNode( - octreeContext, - childPosition, - childLod - ); - parentNode->children[i] = childNode; - // } - } -} */ + void splitPointToLod( OctreeContext &octreeContext, const vm::ivec2 &absolutePosition, @@ -594,166 +390,10 @@ std::vector constructOctreeForLeaf( // return return leafNodes; } -/* std::vector constructOctreeForSeed(const vm::ivec2 &maxLodCenter, const int maxLod, const std::vector> &lodSplits) { - OctreeContext octreeContext; - constructSeedTree( - octreeContext, - currentCoord, - lod1Range, - minLod, - maxLod - ); - - std::vector leafNodes = octreeContext.getLeafNodes(); - - return leafNodes; -} */ -/* OctreeNodePtr getMaxLodNode(const std::vector &newLeafNodes, const std::vector &oldLeafNodes, const vm::ivec3 &min) { - auto newLeafNode = getLeafNodeFromPoint(newLeafNodes, min); - auto oldLeafNode = getLeafNodeFromPoint(oldLeafNodes, min); - if (newLeafNode != nullptr && oldLeafNode != nullptr) { - return newLeafNode->size > oldLeafNode->size ? newLeafNode : oldLeafNode; - } else if (newLeafNode != nullptr) { - return newLeafNode; - } else if (oldLeafNode != nullptr) { - return oldLeafNode; - } else { - return nullptr; - } -} */ -/* std::vector diffLeafNodes(const std::vector &newLeafNodes, const std::vector &oldLeafNodes) { - // map from min lod hash to task containing new nodes and old nodes - std::unordered_map taskMap; - - for (OctreeNodePtr newNode : newLeafNodes) { - OctreeNodePtr maxLodNode = getMaxLodNode(newLeafNodes, oldLeafNodes, newNode->min); - const uint64_t hash = hashOctreeMinLod(maxLodNode->min, maxLodNode->size); - - TrackerTaskPtr task; - const auto &iter = taskMap.find(hash); - if (iter != taskMap.end()) { - task = iter->second; - } else { - TrackerTask *trackerTask = new TrackerTask(); - trackerTask->id = ++nextTrackerId; - // std::cout << "increment 1 " << trackerTask->id << std::endl; - // trackerTask->maxLodNode = maxLodNode; - // trackerTask->type = TrackerTaskType::ADD; - - task = std::shared_ptr(trackerTask); - - taskMap[hash] = task; - } - task->newNodes.push_back(newNode); - } - for (OctreeNodePtr oldNode : oldLeafNodes) { - OctreeNodePtr maxLodNode = getMaxLodNode(newLeafNodes, oldLeafNodes, oldNode->min); - const uint64_t hash = hashOctreeMinLod(maxLodNode->min, maxLodNode->size); - - TrackerTaskPtr task; - const auto &iter = taskMap.find(hash); - if (iter != taskMap.end()) { - task = iter->second; - } else { - TrackerTask *trackerTask = new TrackerTask(); - trackerTask->id = ++nextTrackerId; - // std::cout << "increment 2 " << trackerTask->id << std::endl; - // trackerTask->maxLodNode = maxLodNode; - // trackerTask->type = TrackerTaskType::REMOVE; - - task = std::shared_ptr(trackerTask); - - taskMap[hash] = task; - } - task->oldNodes.push_back(oldNode); - } - - std::vector tasks; - for (const auto &iter : taskMap) { - tasks.push_back(iter.second); - } - return tasks; -} */ -/* // sort tasks by distance to world position of the central max lod node -std::vector sortTasks(const std::vector &tasks, const vm::vec3 &worldPosition) { - std::vector> taskDistances; - taskDistances.reserve(tasks.size()); - - for (const auto &task : tasks) { - const vm::ivec3 &min = task->maxLodNode->min; - const int &lod = task->maxLodNode->size; - - vm::vec3 center = vm::vec3{(float)min.x, (float)min.y, (float)min.z} + - vm::vec3{0.5, 0.5, 0.5} * (float)lod; - vm::vec3 delta = worldPosition - center; - float distance = vm::lengthSq(delta); - - taskDistances.push_back(std::pair(task, distance)); - } - - std::sort( - taskDistances.begin(), - taskDistances.end(), - [](const std::pair &a, const std::pair &b) -> bool { - return a.second < b.second; - } - ); - - std::vector sortedTasks; - for (const auto &iter : taskDistances) { - sortedTasks.push_back(iter.first); - } - return sortedTasks; -} */ -/* std::pair, std::vector> updateChunks(const std::vector &oldChunks, const std::vector &tasks) { - std::vector newChunks = oldChunks; - - // swap old chunks for new chunks - for (TrackerTaskPtr task : tasks) { - if (!task->isNop()) { - const std::vector &newNodes = task->newNodes; - const std::vector &oldNodes = task->oldNodes; - - for (OctreeNodePtr oldNode : oldNodes) { - const auto &iter = std::find_if( - newChunks.begin(), - newChunks.end(), - [&](auto &chunk) -> bool { - return equalsNode(*chunk, *oldNode); - } - ); - if (iter != newChunks.end()) { - newChunks.erase(iter); - } else { - std::cout << "failed to erase old node" << std::endl; - abort(); - } - } - for (OctreeNodePtr newNode : newNodes) { - newChunks.push_back(newNode); - } - } - } - - // compute extra tasks for outdated chunks - std::vector extraTasks; - - return std::pair, std::vector>( - std::move(newChunks), - std::move(extraTasks) - ); -} */ - -// Tracker::Tracker(PGInstance *inst) : inst(inst) - /* lastCoord{ - INT32_MAX, - INT32_MAX - }, */ - // lastEpoch(0) {} // static methods vm::ivec2 getCurrentCoord(const vm::vec3 &position, int chunkSize) { @@ -761,52 +401,7 @@ vm::ivec2 getCurrentCoord(const vm::vec3 &position, int chunkSize) { const int cz = std::floor(position.z / (float)chunkSize); return vm::ivec2{cx, cz}; } -/* bool duplicateTask(const std::vector &tasks) { - std::unordered_map seen; - for (TrackerTaskPtr task : tasks) { - int id = task->id; - if (seen.find(id) == seen.end()) { - seen[id] = true; - } else { - std::cout << "duplicate task: " << - task->maxLodNode->min.x << " " << task->maxLodNode->min.y << - id << std::endl; - abort(); - return true; - } - } - return false; -} -bool duplicateTask(const std::vector &tasks, const std::vector &tasks2) { - std::unordered_map seen; - - for (TrackerTaskPtr task : tasks) { - int id = task->id; - if (seen.find(id) == seen.end()) { - seen[id] = true; - } else { - std::cout << "duplicate task: " << - task->maxLodNode->min.x << " " << task->maxLodNode->min.y << - id << std::endl; - abort(); - return true; - } - } - for (TrackerTaskPtr task : tasks2) { - int id = task->id; - if (seen.find(id) == seen.end()) { - seen[id] = true; - } else { - std::cout << "duplicate task: " << - task->maxLodNode->min.x << " " << task->maxLodNode->min.y << " " << task->maxLodNode->min.z << " " << - id << std::endl; - abort(); - return true; - } - } - return false; -} */ // dynamic methods // sort nodes by distance to world position of the central max lod node void Tracker::sortNodes(std::vector &nodes) { @@ -839,19 +434,6 @@ void Tracker::sortNodes(std::vector &nodes) { sort(nodes, worldPosition, frustum); } -/* const OctreeNodePtr findLeafNodeForPosition( - const std::vector &nodes, - const vm::ivec3 &p -) { - for (auto iter = nodes.begin(); iter != nodes.end(); iter++) { - const OctreeNodePtr &node = *iter; - if (containsPoint(*node, p)) { - return node; - } - } - return nullptr; -} */ - DataRequestUpdate Tracker::updateDataRequests( const std::unordered_map &dataRequests, const std::vector &leafNodes @@ -914,8 +496,6 @@ TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int mi // new octrees const int chunkSize = this->inst->heightfieldGenerator.getChunkSize(); vm::ivec2 currentCoord = getCurrentCoord(position, chunkSize); // in chunk space - // int minLodInt = 1 << (minLod - 1); - // int maxLodInt = 1 << (maxLod - 1); std::vector octreeLeafNodes = constructOctreeForLeaf( currentCoord, lod1Range, @@ -928,8 +508,6 @@ TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int mi dataRequests = std::move(dataRequestUpdate.dataRequests); - // - TrackerUpdate result; result.leafNodes = std::move(octreeLeafNodes); @@ -937,7 +515,5 @@ TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int mi result.keepDataRequests = std::move(dataRequestUpdate.keepDataRequests); result.cancelDataRequests = std::move(dataRequestUpdate.cancelDataRequests); - // - return result; } \ No newline at end of file From f5383d18e0fdc1d40f8d698b5698ba9985ddc1f2 Mon Sep 17 00:00:00 2001 From: aryasalehi Date: Sun, 8 Jan 2023 21:36:22 +0330 Subject: [PATCH 3/4] add replacing nodes list --- bin/pg.js | 2 +- bin/pg.module.js | 2 +- bin/pg.wasm | Bin 285107 -> 299816 bytes generation/instance-generator.h | 1 + task/octree.cc | 8 + task/octree.h | 16 +- task/tracker.cc | 582 ++++++++++++++++++++------------ task/tracker.h | 50 +-- 8 files changed, 418 insertions(+), 243 deletions(-) diff --git a/bin/pg.js b/bin/pg.js index 25ad2b2..58d02eb 100644 --- a/bin/pg.js +++ b/bin/pg.js @@ -1,2 +1,2 @@ -var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var _scriptDir=typeof document!="undefined"&&document.currentScript?document.currentScript.src:undefined;if(ENVIRONMENT_IS_WORKER){_scriptDir=self.location.href}else if(ENVIRONMENT_IS_NODE){_scriptDir=__filename}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return "/"+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}var fs,nodePath;if(typeof require==="function"){fs=require("fs");nodePath=require("path")}read_=(filename,binary)=>{filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance=="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){defaultPrint=str=>fs.writeSync(1,str+"\n");defaultPrintErr=str=>fs.writeSync(2,str+"\n")}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof SharedArrayBuffer?heapOrArray.slice(idx,endPtr):heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||104857600;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":INITIAL_MEMORY/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){err("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="pg.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTLSInit(Module["asm"]["R"]);wasmTable=Module["asm"]["P"];addOnInit(Module["asm"]["z"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={26980:($0,$1)=>{handleResult($0,$1)}};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function killThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0}function cancelThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];assert(worker);PThread.returnWorkerToPool(worker)}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);PThread.pthreads[threadParams.pthread_ptr]=worker;worker.pthread_ptr=threadParams.pthread_ptr;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"pthread_ptr":threadParams.pthread_ptr};worker.runPthread=()=>{msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("randomDevice")}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;tempI64=[Math.floor(stat.atime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.atime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=0;tempI64=[Math.floor(stat.mtime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.mtime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=0;tempI64=[Math.floor(stat.ctime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.ctime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function _proc_exit(code){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,1,code);EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}_proc_exit(status)}var _exit=exitJS;function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init:function(){if(ENVIRONMENT_IS_PTHREAD){PThread.initWorker()}else{PThread.initMainThread()}},initMainThread:function(){var pthreadPoolSize=8;while(pthreadPoolSize--){PThread.allocateUnusedWorker()}},initWorker:function(){noExitRuntime=false},setExitStatus:function(status){EXITSTATUS=status},terminateAllThreads:function(){for(var worker of Object.values(PThread.pthreads)){PThread.returnWorkerToPool(worker)}for(var worker of PThread.unusedWorkers){worker.terminate()}PThread.unusedWorkers=[]},returnWorkerToPool:function(worker){var pthread_ptr=worker.pthread_ptr;delete PThread.pthreads[pthread_ptr];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0;__emscripten_thread_free_data(pthread_ptr)},receiveObjectTransfer:function(data){},threadInitTLS:function(){PThread.tlsInitFunctions.forEach(f=>f())},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=e=>{var d=e["data"];var cmd=d["cmd"];if(worker.pthread_ptr)PThread.currentProxiedOperationCallerThread=worker.pthread_ptr;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var targetWorker=PThread.pthreads[d.targetThread];if(targetWorker){targetWorker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processProxyingQueue"){executeNotifiedProxyingQueue(d["queue"])}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else if(cmd){err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=e=>{var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("pg.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};Module["PThread"]=PThread;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=HEAP32[pthread_ptr+44>>2];var stackSize=HEAP32[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){var result=getWasmTableEntry(ptr)(arg);if(keepRuntimeAlive()){PThread.setExitStatus(result)}else{__emscripten_thread_exit(result)}}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTLSInit(tlsInitFunc){PThread.tlsInitFunctions.push(tlsInitFunc)}function ___cxa_allocate_exception(size){return _malloc(size+24)+24}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){Atomics.add(HEAP32,this.ptr+0>>2,1)};this.release_ref=function(){var prev=Atomics.sub(HEAP32,this.ptr+0>>2,1);return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInitTLS()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,pthread_ptr,attr,startRoutine,arg);return ___pthread_create_js(pthread_ptr,attr,startRoutine,arg)}function ___pthread_create_js(pthread_ptr,attr,startRoutine,arg){if(typeof SharedArrayBuffer=="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg)}if(error)return error;var threadParams={startRoutine:startRoutine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function __emscripten_default_pthread_stack_size(){return 2097152}function executeNotifiedProxyingQueue(queue){Atomics.store(HEAP32,queue>>2,1);if(_pthread_self()){__emscripten_proxy_execute_task_queue(queue)}Atomics.compareExchange(HEAP32,queue>>2,1,0)}Module["executeNotifiedProxyingQueue"]=executeNotifiedProxyingQueue;function __emscripten_notify_task_queue(targetThreadId,currThreadId,mainThreadId,queue){if(targetThreadId==currThreadId){setTimeout(()=>executeNotifiedProxyingQueue(queue))}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processProxyingQueue","queue":queue})}else{var worker=PThread.pthreads[targetThreadId];if(!worker){return}worker.postMessage({"cmd":"processProxyingQueue","queue":queue})}return 1}function __emscripten_set_offscreencanvas_size(target,width,height){return-1}function _abort(){abort("")}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function mainThreadEM_ASM(code,sigPtr,argbuf,sync){var args=readAsmConstArgs(sigPtr,argbuf);if(ENVIRONMENT_IS_PTHREAD){return _emscripten_proxy_to_main_thread_js.apply(null,[-1-code,sync].concat(args))}return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_async_on_main_thread(code,sigPtr,argbuf){return mainThreadEM_ASM(code,sigPtr,argbuf,0)}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=()=>performance.now()-Module["__performance_now_clock_drift"]}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(()=>{var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>0;abortOnCannotGrowMemory(requestedSize)}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,__environ,environ_buf);var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,penviron_count,penviron_buf_size);var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(6,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(8,1,fd,offset_low,offset_high,whence,newOffset);try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(9,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm,loc){return _strftime(s,maxsize,format,tm)}PThread.init();var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var proxiedFunctionTable=[null,_proc_exit,exitOnMainThread,pthreadCreateProxied,_environ_get,_environ_sizes_get,_fd_close,_fd_read,_fd_seek,_fd_write];var asmLibraryArg={"e":___cxa_allocate_exception,"d":___cxa_throw,"y":___emscripten_init_main_thread_js,"h":___emscripten_thread_cleanup,"v":___pthread_create_js,"w":__emscripten_default_pthread_stack_size,"k":__emscripten_notify_task_queue,"j":__emscripten_set_offscreencanvas_size,"c":_abort,"m":_emscripten_asm_const_async_on_main_thread,"f":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"l":_emscripten_memcpy_big,"i":_emscripten_receive_on_main_thread_js,"t":_emscripten_resize_heap,"x":_emscripten_unwind_to_js_event_loop,"p":_environ_get,"q":_environ_sizes_get,"u":_exit,"r":_fd_close,"s":_fd_read,"n":_fd_seek,"g":_fd_write,"a":wasmMemory,"o":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["z"]).apply(null,arguments)};var _initialize=Module["_initialize"]=function(){return(_initialize=Module["_initialize"]=Module["asm"]["A"]).apply(null,arguments)};var _createInstance=Module["_createInstance"]=function(){return(_createInstance=Module["_createInstance"]=Module["asm"]["B"]).apply(null,arguments)};var _destroyInstance=Module["_destroyInstance"]=function(){return(_destroyInstance=Module["_destroyInstance"]=Module["asm"]["C"]).apply(null,arguments)};var _createChunkMeshAsync=Module["_createChunkMeshAsync"]=function(){return(_createChunkMeshAsync=Module["_createChunkMeshAsync"]=Module["asm"]["D"]).apply(null,arguments)};var _createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=function(){return(_createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=Module["asm"]["E"]).apply(null,arguments)};var _cancelTask=Module["_cancelTask"]=function(){return(_cancelTask=Module["_cancelTask"]=Module["asm"]["F"]).apply(null,arguments)};var _setCamera=Module["_setCamera"]=function(){return(_setCamera=Module["_setCamera"]=Module["asm"]["G"]).apply(null,arguments)};var _createTracker=Module["_createTracker"]=function(){return(_createTracker=Module["_createTracker"]=Module["asm"]["H"]).apply(null,arguments)};var _trackerUpdateAsync=Module["_trackerUpdateAsync"]=function(){return(_trackerUpdateAsync=Module["_trackerUpdateAsync"]=Module["asm"]["I"]).apply(null,arguments)};var _destroyTracker=Module["_destroyTracker"]=function(){return(_destroyTracker=Module["_destroyTracker"]=Module["asm"]["J"]).apply(null,arguments)};var _doMalloc=Module["_doMalloc"]=function(){return(_doMalloc=Module["_doMalloc"]=Module["asm"]["K"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["L"]).apply(null,arguments)};var _doFree=Module["_doFree"]=function(){return(_doFree=Module["_doFree"]=Module["asm"]["M"]).apply(null,arguments)};var _runLoop=Module["_runLoop"]=function(){return(_runLoop=Module["_runLoop"]=Module["asm"]["N"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["O"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["Q"]).apply(null,arguments)};var __emscripten_tls_init=Module["__emscripten_tls_init"]=function(){return(__emscripten_tls_init=Module["__emscripten_tls_init"]=Module["asm"]["R"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["S"]).apply(null,arguments)};var __emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=function(){return(__emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=Module["asm"]["T"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=function(){return(__emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=Module["asm"]["V"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["W"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["X"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["Y"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["Z"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["_"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["$"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["aa"]).apply(null,arguments)};Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); +var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var _scriptDir=typeof document!="undefined"&&document.currentScript?document.currentScript.src:undefined;if(ENVIRONMENT_IS_WORKER){_scriptDir=self.location.href}else if(ENVIRONMENT_IS_NODE){_scriptDir=__filename}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return "/"+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}var fs,nodePath;if(typeof require==="function"){fs=require("fs");nodePath=require("path")}read_=(filename,binary)=>{filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance=="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){defaultPrint=str=>fs.writeSync(1,str+"\n");defaultPrintErr=str=>fs.writeSync(2,str+"\n")}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof SharedArrayBuffer?heapOrArray.slice(idx,endPtr):heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||104857600;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":INITIAL_MEMORY/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){err("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="pg.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTLSInit(Module["asm"]["R"]);wasmTable=Module["asm"]["P"];addOnInit(Module["asm"]["z"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={26852:($0,$1)=>{handleResult($0,$1)}};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function killThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0}function cancelThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];assert(worker);PThread.returnWorkerToPool(worker)}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);PThread.pthreads[threadParams.pthread_ptr]=worker;worker.pthread_ptr=threadParams.pthread_ptr;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"pthread_ptr":threadParams.pthread_ptr};worker.runPthread=()=>{msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("randomDevice")}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;tempI64=[Math.floor(stat.atime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.atime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=0;tempI64=[Math.floor(stat.mtime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.mtime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=0;tempI64=[Math.floor(stat.ctime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.ctime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function _proc_exit(code){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,1,code);EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}_proc_exit(status)}var _exit=exitJS;function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init:function(){if(ENVIRONMENT_IS_PTHREAD){PThread.initWorker()}else{PThread.initMainThread()}},initMainThread:function(){var pthreadPoolSize=8;while(pthreadPoolSize--){PThread.allocateUnusedWorker()}},initWorker:function(){noExitRuntime=false},setExitStatus:function(status){EXITSTATUS=status},terminateAllThreads:function(){for(var worker of Object.values(PThread.pthreads)){PThread.returnWorkerToPool(worker)}for(var worker of PThread.unusedWorkers){worker.terminate()}PThread.unusedWorkers=[]},returnWorkerToPool:function(worker){var pthread_ptr=worker.pthread_ptr;delete PThread.pthreads[pthread_ptr];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0;__emscripten_thread_free_data(pthread_ptr)},receiveObjectTransfer:function(data){},threadInitTLS:function(){PThread.tlsInitFunctions.forEach(f=>f())},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=e=>{var d=e["data"];var cmd=d["cmd"];if(worker.pthread_ptr)PThread.currentProxiedOperationCallerThread=worker.pthread_ptr;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var targetWorker=PThread.pthreads[d.targetThread];if(targetWorker){targetWorker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processProxyingQueue"){executeNotifiedProxyingQueue(d["queue"])}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else if(cmd){err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=e=>{var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("pg.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};Module["PThread"]=PThread;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=HEAP32[pthread_ptr+44>>2];var stackSize=HEAP32[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){var result=getWasmTableEntry(ptr)(arg);if(keepRuntimeAlive()){PThread.setExitStatus(result)}else{__emscripten_thread_exit(result)}}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTLSInit(tlsInitFunc){PThread.tlsInitFunctions.push(tlsInitFunc)}function ___cxa_allocate_exception(size){return _malloc(size+24)+24}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){Atomics.add(HEAP32,this.ptr+0>>2,1)};this.release_ref=function(){var prev=Atomics.sub(HEAP32,this.ptr+0>>2,1);return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInitTLS()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,pthread_ptr,attr,startRoutine,arg);return ___pthread_create_js(pthread_ptr,attr,startRoutine,arg)}function ___pthread_create_js(pthread_ptr,attr,startRoutine,arg){if(typeof SharedArrayBuffer=="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg)}if(error)return error;var threadParams={startRoutine:startRoutine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function __emscripten_default_pthread_stack_size(){return 2097152}function executeNotifiedProxyingQueue(queue){Atomics.store(HEAP32,queue>>2,1);if(_pthread_self()){__emscripten_proxy_execute_task_queue(queue)}Atomics.compareExchange(HEAP32,queue>>2,1,0)}Module["executeNotifiedProxyingQueue"]=executeNotifiedProxyingQueue;function __emscripten_notify_task_queue(targetThreadId,currThreadId,mainThreadId,queue){if(targetThreadId==currThreadId){setTimeout(()=>executeNotifiedProxyingQueue(queue))}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processProxyingQueue","queue":queue})}else{var worker=PThread.pthreads[targetThreadId];if(!worker){return}worker.postMessage({"cmd":"processProxyingQueue","queue":queue})}return 1}function __emscripten_set_offscreencanvas_size(target,width,height){return-1}function _abort(){abort("")}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function mainThreadEM_ASM(code,sigPtr,argbuf,sync){var args=readAsmConstArgs(sigPtr,argbuf);if(ENVIRONMENT_IS_PTHREAD){return _emscripten_proxy_to_main_thread_js.apply(null,[-1-code,sync].concat(args))}return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_async_on_main_thread(code,sigPtr,argbuf){return mainThreadEM_ASM(code,sigPtr,argbuf,0)}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=()=>performance.now()-Module["__performance_now_clock_drift"]}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(()=>{var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>0;abortOnCannotGrowMemory(requestedSize)}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,__environ,environ_buf);var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,penviron_count,penviron_buf_size);var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(6,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(8,1,fd,offset_low,offset_high,whence,newOffset);try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(9,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm,loc){return _strftime(s,maxsize,format,tm)}PThread.init();var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var proxiedFunctionTable=[null,_proc_exit,exitOnMainThread,pthreadCreateProxied,_environ_get,_environ_sizes_get,_fd_close,_fd_read,_fd_seek,_fd_write];var asmLibraryArg={"e":___cxa_allocate_exception,"d":___cxa_throw,"y":___emscripten_init_main_thread_js,"h":___emscripten_thread_cleanup,"v":___pthread_create_js,"w":__emscripten_default_pthread_stack_size,"k":__emscripten_notify_task_queue,"j":__emscripten_set_offscreencanvas_size,"c":_abort,"m":_emscripten_asm_const_async_on_main_thread,"f":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"l":_emscripten_memcpy_big,"i":_emscripten_receive_on_main_thread_js,"t":_emscripten_resize_heap,"x":_emscripten_unwind_to_js_event_loop,"p":_environ_get,"q":_environ_sizes_get,"u":_exit,"r":_fd_close,"s":_fd_read,"n":_fd_seek,"g":_fd_write,"a":wasmMemory,"o":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["z"]).apply(null,arguments)};var _initialize=Module["_initialize"]=function(){return(_initialize=Module["_initialize"]=Module["asm"]["A"]).apply(null,arguments)};var _createInstance=Module["_createInstance"]=function(){return(_createInstance=Module["_createInstance"]=Module["asm"]["B"]).apply(null,arguments)};var _destroyInstance=Module["_destroyInstance"]=function(){return(_destroyInstance=Module["_destroyInstance"]=Module["asm"]["C"]).apply(null,arguments)};var _createChunkMeshAsync=Module["_createChunkMeshAsync"]=function(){return(_createChunkMeshAsync=Module["_createChunkMeshAsync"]=Module["asm"]["D"]).apply(null,arguments)};var _createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=function(){return(_createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=Module["asm"]["E"]).apply(null,arguments)};var _cancelTask=Module["_cancelTask"]=function(){return(_cancelTask=Module["_cancelTask"]=Module["asm"]["F"]).apply(null,arguments)};var _setCamera=Module["_setCamera"]=function(){return(_setCamera=Module["_setCamera"]=Module["asm"]["G"]).apply(null,arguments)};var _createTracker=Module["_createTracker"]=function(){return(_createTracker=Module["_createTracker"]=Module["asm"]["H"]).apply(null,arguments)};var _trackerUpdateAsync=Module["_trackerUpdateAsync"]=function(){return(_trackerUpdateAsync=Module["_trackerUpdateAsync"]=Module["asm"]["I"]).apply(null,arguments)};var _destroyTracker=Module["_destroyTracker"]=function(){return(_destroyTracker=Module["_destroyTracker"]=Module["asm"]["J"]).apply(null,arguments)};var _doMalloc=Module["_doMalloc"]=function(){return(_doMalloc=Module["_doMalloc"]=Module["asm"]["K"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["L"]).apply(null,arguments)};var _doFree=Module["_doFree"]=function(){return(_doFree=Module["_doFree"]=Module["asm"]["M"]).apply(null,arguments)};var _runLoop=Module["_runLoop"]=function(){return(_runLoop=Module["_runLoop"]=Module["asm"]["N"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["O"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["Q"]).apply(null,arguments)};var __emscripten_tls_init=Module["__emscripten_tls_init"]=function(){return(__emscripten_tls_init=Module["__emscripten_tls_init"]=Module["asm"]["R"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["S"]).apply(null,arguments)};var __emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=function(){return(__emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=Module["asm"]["T"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=function(){return(__emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=Module["asm"]["V"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["W"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["X"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["Y"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["Z"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["_"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["$"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["aa"]).apply(null,arguments)};Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); let accept, reject;const p = new Promise((a, r) => {accept = a; reject = r;});Module.postRun = () => {accept();};Module.waitForLoad = () => p; diff --git a/bin/pg.module.js b/bin/pg.module.js index d2edaaa..43581db 100644 --- a/bin/pg.module.js +++ b/bin/pg.module.js @@ -1,3 +1,3 @@ -var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var _scriptDir=typeof document!="undefined"&&document.currentScript?document.currentScript.src:undefined;if(ENVIRONMENT_IS_WORKER){_scriptDir=self.location.href}else if(ENVIRONMENT_IS_NODE){_scriptDir=__filename}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return "/"+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}var fs,nodePath;if(typeof require==="function"){fs=require("fs");nodePath=require("path")}read_=(filename,binary)=>{filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance=="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){defaultPrint=str=>fs.writeSync(1,str+"\n");defaultPrintErr=str=>fs.writeSync(2,str+"\n")}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof SharedArrayBuffer?heapOrArray.slice(idx,endPtr):heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||104857600;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":INITIAL_MEMORY/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){err("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="pg.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTLSInit(Module["asm"]["R"]);wasmTable=Module["asm"]["P"];addOnInit(Module["asm"]["z"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={26980:($0,$1)=>{handleResult($0,$1)}};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function killThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0}function cancelThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];assert(worker);PThread.returnWorkerToPool(worker)}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);PThread.pthreads[threadParams.pthread_ptr]=worker;worker.pthread_ptr=threadParams.pthread_ptr;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"pthread_ptr":threadParams.pthread_ptr};worker.runPthread=()=>{msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("randomDevice")}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;tempI64=[Math.floor(stat.atime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.atime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=0;tempI64=[Math.floor(stat.mtime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.mtime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=0;tempI64=[Math.floor(stat.ctime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.ctime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function _proc_exit(code){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,1,code);EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}_proc_exit(status)}var _exit=exitJS;function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init:function(){if(ENVIRONMENT_IS_PTHREAD){PThread.initWorker()}else{PThread.initMainThread()}},initMainThread:function(){var pthreadPoolSize=8;while(pthreadPoolSize--){PThread.allocateUnusedWorker()}},initWorker:function(){noExitRuntime=false},setExitStatus:function(status){EXITSTATUS=status},terminateAllThreads:function(){for(var worker of Object.values(PThread.pthreads)){PThread.returnWorkerToPool(worker)}for(var worker of PThread.unusedWorkers){worker.terminate()}PThread.unusedWorkers=[]},returnWorkerToPool:function(worker){var pthread_ptr=worker.pthread_ptr;delete PThread.pthreads[pthread_ptr];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0;__emscripten_thread_free_data(pthread_ptr)},receiveObjectTransfer:function(data){},threadInitTLS:function(){PThread.tlsInitFunctions.forEach(f=>f())},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=e=>{var d=e["data"];var cmd=d["cmd"];if(worker.pthread_ptr)PThread.currentProxiedOperationCallerThread=worker.pthread_ptr;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var targetWorker=PThread.pthreads[d.targetThread];if(targetWorker){targetWorker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processProxyingQueue"){executeNotifiedProxyingQueue(d["queue"])}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else if(cmd){err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=e=>{var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("pg.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};Module["PThread"]=PThread;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=HEAP32[pthread_ptr+44>>2];var stackSize=HEAP32[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){var result=getWasmTableEntry(ptr)(arg);if(keepRuntimeAlive()){PThread.setExitStatus(result)}else{__emscripten_thread_exit(result)}}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTLSInit(tlsInitFunc){PThread.tlsInitFunctions.push(tlsInitFunc)}function ___cxa_allocate_exception(size){return _malloc(size+24)+24}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){Atomics.add(HEAP32,this.ptr+0>>2,1)};this.release_ref=function(){var prev=Atomics.sub(HEAP32,this.ptr+0>>2,1);return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInitTLS()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,pthread_ptr,attr,startRoutine,arg);return ___pthread_create_js(pthread_ptr,attr,startRoutine,arg)}function ___pthread_create_js(pthread_ptr,attr,startRoutine,arg){if(typeof SharedArrayBuffer=="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg)}if(error)return error;var threadParams={startRoutine:startRoutine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function __emscripten_default_pthread_stack_size(){return 2097152}function executeNotifiedProxyingQueue(queue){Atomics.store(HEAP32,queue>>2,1);if(_pthread_self()){__emscripten_proxy_execute_task_queue(queue)}Atomics.compareExchange(HEAP32,queue>>2,1,0)}Module["executeNotifiedProxyingQueue"]=executeNotifiedProxyingQueue;function __emscripten_notify_task_queue(targetThreadId,currThreadId,mainThreadId,queue){if(targetThreadId==currThreadId){setTimeout(()=>executeNotifiedProxyingQueue(queue))}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processProxyingQueue","queue":queue})}else{var worker=PThread.pthreads[targetThreadId];if(!worker){return}worker.postMessage({"cmd":"processProxyingQueue","queue":queue})}return 1}function __emscripten_set_offscreencanvas_size(target,width,height){return-1}function _abort(){abort("")}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function mainThreadEM_ASM(code,sigPtr,argbuf,sync){var args=readAsmConstArgs(sigPtr,argbuf);if(ENVIRONMENT_IS_PTHREAD){return _emscripten_proxy_to_main_thread_js.apply(null,[-1-code,sync].concat(args))}return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_async_on_main_thread(code,sigPtr,argbuf){return mainThreadEM_ASM(code,sigPtr,argbuf,0)}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=()=>performance.now()-Module["__performance_now_clock_drift"]}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(()=>{var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>0;abortOnCannotGrowMemory(requestedSize)}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,__environ,environ_buf);var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,penviron_count,penviron_buf_size);var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(6,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(8,1,fd,offset_low,offset_high,whence,newOffset);try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(9,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm,loc){return _strftime(s,maxsize,format,tm)}PThread.init();var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var proxiedFunctionTable=[null,_proc_exit,exitOnMainThread,pthreadCreateProxied,_environ_get,_environ_sizes_get,_fd_close,_fd_read,_fd_seek,_fd_write];var asmLibraryArg={"e":___cxa_allocate_exception,"d":___cxa_throw,"y":___emscripten_init_main_thread_js,"h":___emscripten_thread_cleanup,"v":___pthread_create_js,"w":__emscripten_default_pthread_stack_size,"k":__emscripten_notify_task_queue,"j":__emscripten_set_offscreencanvas_size,"c":_abort,"m":_emscripten_asm_const_async_on_main_thread,"f":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"l":_emscripten_memcpy_big,"i":_emscripten_receive_on_main_thread_js,"t":_emscripten_resize_heap,"x":_emscripten_unwind_to_js_event_loop,"p":_environ_get,"q":_environ_sizes_get,"u":_exit,"r":_fd_close,"s":_fd_read,"n":_fd_seek,"g":_fd_write,"a":wasmMemory,"o":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["z"]).apply(null,arguments)};var _initialize=Module["_initialize"]=function(){return(_initialize=Module["_initialize"]=Module["asm"]["A"]).apply(null,arguments)};var _createInstance=Module["_createInstance"]=function(){return(_createInstance=Module["_createInstance"]=Module["asm"]["B"]).apply(null,arguments)};var _destroyInstance=Module["_destroyInstance"]=function(){return(_destroyInstance=Module["_destroyInstance"]=Module["asm"]["C"]).apply(null,arguments)};var _createChunkMeshAsync=Module["_createChunkMeshAsync"]=function(){return(_createChunkMeshAsync=Module["_createChunkMeshAsync"]=Module["asm"]["D"]).apply(null,arguments)};var _createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=function(){return(_createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=Module["asm"]["E"]).apply(null,arguments)};var _cancelTask=Module["_cancelTask"]=function(){return(_cancelTask=Module["_cancelTask"]=Module["asm"]["F"]).apply(null,arguments)};var _setCamera=Module["_setCamera"]=function(){return(_setCamera=Module["_setCamera"]=Module["asm"]["G"]).apply(null,arguments)};var _createTracker=Module["_createTracker"]=function(){return(_createTracker=Module["_createTracker"]=Module["asm"]["H"]).apply(null,arguments)};var _trackerUpdateAsync=Module["_trackerUpdateAsync"]=function(){return(_trackerUpdateAsync=Module["_trackerUpdateAsync"]=Module["asm"]["I"]).apply(null,arguments)};var _destroyTracker=Module["_destroyTracker"]=function(){return(_destroyTracker=Module["_destroyTracker"]=Module["asm"]["J"]).apply(null,arguments)};var _doMalloc=Module["_doMalloc"]=function(){return(_doMalloc=Module["_doMalloc"]=Module["asm"]["K"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["L"]).apply(null,arguments)};var _doFree=Module["_doFree"]=function(){return(_doFree=Module["_doFree"]=Module["asm"]["M"]).apply(null,arguments)};var _runLoop=Module["_runLoop"]=function(){return(_runLoop=Module["_runLoop"]=Module["asm"]["N"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["O"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["Q"]).apply(null,arguments)};var __emscripten_tls_init=Module["__emscripten_tls_init"]=function(){return(__emscripten_tls_init=Module["__emscripten_tls_init"]=Module["asm"]["R"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["S"]).apply(null,arguments)};var __emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=function(){return(__emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=Module["asm"]["T"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=function(){return(__emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=Module["asm"]["V"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["W"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["X"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["Y"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["Z"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["_"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["$"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["aa"]).apply(null,arguments)};Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); +var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var _scriptDir=typeof document!="undefined"&&document.currentScript?document.currentScript.src:undefined;if(ENVIRONMENT_IS_WORKER){_scriptDir=self.location.href}else if(ENVIRONMENT_IS_NODE){_scriptDir=__filename}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return "/"+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}var fs,nodePath;if(typeof require==="function"){fs=require("fs");nodePath=require("path")}read_=(filename,binary)=>{filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance=="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){defaultPrint=str=>fs.writeSync(1,str+"\n");defaultPrintErr=str=>fs.writeSync(2,str+"\n")}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof SharedArrayBuffer?heapOrArray.slice(idx,endPtr):heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||104857600;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":INITIAL_MEMORY/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){err("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="pg.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTLSInit(Module["asm"]["R"]);wasmTable=Module["asm"]["P"];addOnInit(Module["asm"]["z"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={26852:($0,$1)=>{handleResult($0,$1)}};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function killThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0}function cancelThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var worker=PThread.pthreads[pthread_ptr];assert(worker);PThread.returnWorkerToPool(worker)}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);PThread.pthreads[threadParams.pthread_ptr]=worker;worker.pthread_ptr=threadParams.pthread_ptr;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"pthread_ptr":threadParams.pthread_ptr};worker.runPthread=()=>{msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("randomDevice")}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;tempI64=[Math.floor(stat.atime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.atime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=0;tempI64=[Math.floor(stat.mtime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.mtime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=0;tempI64=[Math.floor(stat.ctime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.ctime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function _proc_exit(code){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,1,code);EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}_proc_exit(status)}var _exit=exitJS;function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init:function(){if(ENVIRONMENT_IS_PTHREAD){PThread.initWorker()}else{PThread.initMainThread()}},initMainThread:function(){var pthreadPoolSize=8;while(pthreadPoolSize--){PThread.allocateUnusedWorker()}},initWorker:function(){noExitRuntime=false},setExitStatus:function(status){EXITSTATUS=status},terminateAllThreads:function(){for(var worker of Object.values(PThread.pthreads)){PThread.returnWorkerToPool(worker)}for(var worker of PThread.unusedWorkers){worker.terminate()}PThread.unusedWorkers=[]},returnWorkerToPool:function(worker){var pthread_ptr=worker.pthread_ptr;delete PThread.pthreads[pthread_ptr];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0;__emscripten_thread_free_data(pthread_ptr)},receiveObjectTransfer:function(data){},threadInitTLS:function(){PThread.tlsInitFunctions.forEach(f=>f())},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=e=>{var d=e["data"];var cmd=d["cmd"];if(worker.pthread_ptr)PThread.currentProxiedOperationCallerThread=worker.pthread_ptr;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var targetWorker=PThread.pthreads[d.targetThread];if(targetWorker){targetWorker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processProxyingQueue"){executeNotifiedProxyingQueue(d["queue"])}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else if(cmd){err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=e=>{var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("pg.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};Module["PThread"]=PThread;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=HEAP32[pthread_ptr+44>>2];var stackSize=HEAP32[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){var result=getWasmTableEntry(ptr)(arg);if(keepRuntimeAlive()){PThread.setExitStatus(result)}else{__emscripten_thread_exit(result)}}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTLSInit(tlsInitFunc){PThread.tlsInitFunctions.push(tlsInitFunc)}function ___cxa_allocate_exception(size){return _malloc(size+24)+24}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){Atomics.add(HEAP32,this.ptr+0>>2,1)};this.release_ref=function(){var prev=Atomics.sub(HEAP32,this.ptr+0>>2,1);return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInitTLS()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,pthread_ptr,attr,startRoutine,arg);return ___pthread_create_js(pthread_ptr,attr,startRoutine,arg)}function ___pthread_create_js(pthread_ptr,attr,startRoutine,arg){if(typeof SharedArrayBuffer=="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg)}if(error)return error;var threadParams={startRoutine:startRoutine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function __emscripten_default_pthread_stack_size(){return 2097152}function executeNotifiedProxyingQueue(queue){Atomics.store(HEAP32,queue>>2,1);if(_pthread_self()){__emscripten_proxy_execute_task_queue(queue)}Atomics.compareExchange(HEAP32,queue>>2,1,0)}Module["executeNotifiedProxyingQueue"]=executeNotifiedProxyingQueue;function __emscripten_notify_task_queue(targetThreadId,currThreadId,mainThreadId,queue){if(targetThreadId==currThreadId){setTimeout(()=>executeNotifiedProxyingQueue(queue))}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processProxyingQueue","queue":queue})}else{var worker=PThread.pthreads[targetThreadId];if(!worker){return}worker.postMessage({"cmd":"processProxyingQueue","queue":queue})}return 1}function __emscripten_set_offscreencanvas_size(target,width,height){return-1}function _abort(){abort("")}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function mainThreadEM_ASM(code,sigPtr,argbuf,sync){var args=readAsmConstArgs(sigPtr,argbuf);if(ENVIRONMENT_IS_PTHREAD){return _emscripten_proxy_to_main_thread_js.apply(null,[-1-code,sync].concat(args))}return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_async_on_main_thread(code,sigPtr,argbuf){return mainThreadEM_ASM(code,sigPtr,argbuf,0)}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=()=>performance.now()-Module["__performance_now_clock_drift"]}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(()=>{var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>0;abortOnCannotGrowMemory(requestedSize)}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,__environ,environ_buf);var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,penviron_count,penviron_buf_size);var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(6,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(8,1,fd,offset_low,offset_high,whence,newOffset);try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(9,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm,loc){return _strftime(s,maxsize,format,tm)}PThread.init();var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var proxiedFunctionTable=[null,_proc_exit,exitOnMainThread,pthreadCreateProxied,_environ_get,_environ_sizes_get,_fd_close,_fd_read,_fd_seek,_fd_write];var asmLibraryArg={"e":___cxa_allocate_exception,"d":___cxa_throw,"y":___emscripten_init_main_thread_js,"h":___emscripten_thread_cleanup,"v":___pthread_create_js,"w":__emscripten_default_pthread_stack_size,"k":__emscripten_notify_task_queue,"j":__emscripten_set_offscreencanvas_size,"c":_abort,"m":_emscripten_asm_const_async_on_main_thread,"f":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"l":_emscripten_memcpy_big,"i":_emscripten_receive_on_main_thread_js,"t":_emscripten_resize_heap,"x":_emscripten_unwind_to_js_event_loop,"p":_environ_get,"q":_environ_sizes_get,"u":_exit,"r":_fd_close,"s":_fd_read,"n":_fd_seek,"g":_fd_write,"a":wasmMemory,"o":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["z"]).apply(null,arguments)};var _initialize=Module["_initialize"]=function(){return(_initialize=Module["_initialize"]=Module["asm"]["A"]).apply(null,arguments)};var _createInstance=Module["_createInstance"]=function(){return(_createInstance=Module["_createInstance"]=Module["asm"]["B"]).apply(null,arguments)};var _destroyInstance=Module["_destroyInstance"]=function(){return(_destroyInstance=Module["_destroyInstance"]=Module["asm"]["C"]).apply(null,arguments)};var _createChunkMeshAsync=Module["_createChunkMeshAsync"]=function(){return(_createChunkMeshAsync=Module["_createChunkMeshAsync"]=Module["asm"]["D"]).apply(null,arguments)};var _createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=function(){return(_createBarrierMeshAsync=Module["_createBarrierMeshAsync"]=Module["asm"]["E"]).apply(null,arguments)};var _cancelTask=Module["_cancelTask"]=function(){return(_cancelTask=Module["_cancelTask"]=Module["asm"]["F"]).apply(null,arguments)};var _setCamera=Module["_setCamera"]=function(){return(_setCamera=Module["_setCamera"]=Module["asm"]["G"]).apply(null,arguments)};var _createTracker=Module["_createTracker"]=function(){return(_createTracker=Module["_createTracker"]=Module["asm"]["H"]).apply(null,arguments)};var _trackerUpdateAsync=Module["_trackerUpdateAsync"]=function(){return(_trackerUpdateAsync=Module["_trackerUpdateAsync"]=Module["asm"]["I"]).apply(null,arguments)};var _destroyTracker=Module["_destroyTracker"]=function(){return(_destroyTracker=Module["_destroyTracker"]=Module["asm"]["J"]).apply(null,arguments)};var _doMalloc=Module["_doMalloc"]=function(){return(_doMalloc=Module["_doMalloc"]=Module["asm"]["K"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["L"]).apply(null,arguments)};var _doFree=Module["_doFree"]=function(){return(_doFree=Module["_doFree"]=Module["asm"]["M"]).apply(null,arguments)};var _runLoop=Module["_runLoop"]=function(){return(_runLoop=Module["_runLoop"]=Module["asm"]["N"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["O"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["Q"]).apply(null,arguments)};var __emscripten_tls_init=Module["__emscripten_tls_init"]=function(){return(__emscripten_tls_init=Module["__emscripten_tls_init"]=Module["asm"]["R"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["S"]).apply(null,arguments)};var __emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=function(){return(__emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=Module["asm"]["T"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=function(){return(__emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=Module["asm"]["V"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["W"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["X"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["Y"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["Z"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["_"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["$"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["aa"]).apply(null,arguments)};Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); let accept, reject;const p = new Promise((a, r) => {accept = a; reject = r;});Module.postRun = () => {accept();};Module.waitForLoad = () => p; export default Module; diff --git a/bin/pg.wasm b/bin/pg.wasm index a99a9569cf85e8b64ee2ce2be08140ce1426becf..fc975546499152c31c1a404a31ddee3d1b2e84c1 100644 GIT binary patch delta 50309 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 diff --git a/generation/instance-generator.h b/generation/instance-generator.h index fd7baf9..0e460ca 100644 --- a/generation/instance-generator.h +++ b/generation/instance-generator.h @@ -163,6 +163,7 @@ class InstanceGenerator { if (noises.uberNoise.instanceVisibility(ax, az, heightfield)) { + // ! Remove numInstances ? const int instanceId = (int)std::round(dis(rng) * (float)(numInstances - 1)); const float scale = noises.uberNoise.scaleNoise(ax, az, heightfield); const vm::vec3 rot = noises.uberNoise.rotationNoise(ax, az, heightfield); diff --git a/task/octree.cc b/task/octree.cc index 5a342d5..ee82ecc 100644 --- a/task/octree.cc +++ b/task/octree.cc @@ -1,6 +1,14 @@ #include "octree.h" #include +vm::ivec2 chunkMinForPosition(const vm::ivec2 &p, const int &lod) +{ + return vm::ivec2{ + (int)std::floor((float)p.x / (float)lod) * lod, + (int)std::floor((float)p.y / (float)lod) * lod + }; +} + uint64_t hashOctreeMin(const vm::ivec2 &min) { uint64_t result = uint16_t(min.x); diff --git a/task/octree.h b/task/octree.h index b1cafac..a4bfb5c 100644 --- a/task/octree.h +++ b/task/octree.h @@ -22,26 +22,36 @@ // -const vm::ivec3 chunkMinForPosition(const vm::ivec3 &p, const int &lod); -const vm::ivec3 chunkMinForPosition(const vm::vec3 &p, const int &lod); +vm::ivec2 chunkMinForPosition(const vm::ivec2 &p, const int &lod); uint64_t hashOctreeMin(const vm::ivec2 &min); uint64_t hashOctreeMin(const vm::ivec3 &min); uint64_t hashOctreeMinLod(const vm::ivec2 &min, int lod); uint64_t hashOctreeMinLod(const vm::ivec3 &min, int lod); +enum class REPLACING : int +{ + NON, + BIGGER, + SMALLER, +}; + class OctreeNodeSpec { public: vm::ivec2 min; int lod; int lodArray[2]; + int replacing = (int)REPLACING::NON; }; class OctreeNode : public OctreeNodeSpec { public: - OctreeNode(const vm::ivec2 &min, int lod) : + OctreeNode(const vm::ivec2 &min, const int &lod) : OctreeNodeSpec{min, lod, {0, 0}} {} + OctreeNode(const vm::ivec2 &min, const int &lod, const int &replacing) : + OctreeNodeSpec{min, lod, {0, 0}, replacing} + {} int getPriority() const { return 0; } diff --git a/task/tracker.cc b/task/tracker.cc index f83d688..c161fc0 100644 --- a/task/tracker.cc +++ b/task/tracker.cc @@ -2,13 +2,15 @@ #include "../instance.h" #include -void serializeOctreeNodes(const std::vector &datas, uint8_t *ptr, int &index) { +void serializeOctreeNodes(const std::vector &datas, uint8_t *ptr, int &index) +{ // std::cout << "serialize octree nodes" << datas.size() << std::endl; - - *((int32_t *)(ptr + index)) = datas.size(); + + *((int32_t *)(ptr + index)) = datas.size(); index += sizeof(int32_t); - for (const auto &data : datas) { + for (const auto &data : datas) + { std::memcpy(ptr + index, &data->min, sizeof(vm::ivec2)); index += sizeof(vm::ivec2); @@ -20,25 +22,31 @@ void serializeOctreeNodes(const std::vector &datas, uint8_t *ptr, } } -void serializeDataRequests(const std::vector &datas, uint8_t *ptr, int &index) { +void serializeDataRequests(const std::vector &datas, uint8_t *ptr, int &index) +{ // std::cout << "serialize data requests" << datas.size() << std::endl; - *((int32_t *)(ptr + index)) = datas.size(); + *((int32_t *)(ptr + index)) = datas.size(); index += sizeof(int32_t); - for (const auto &data : datas) { + for (const auto &data : datas) + { std::memcpy(ptr + index, &data->node->min, sizeof(vm::ivec2)); index += sizeof(vm::ivec2); *((int *)(ptr + index)) = data->node->lod; index += sizeof(int); - + std::memcpy(ptr + index, data->node->lodArray, sizeof(int[2])); index += sizeof(int[2]); + + *((int *)(ptr + index)) = data->node->replacing; + index += sizeof(int); } } -uint8_t *TrackerUpdate::getBuffer() const { +uint8_t *TrackerUpdate::getBuffer() const +{ // compute size size_t size = 0; @@ -50,8 +58,8 @@ uint8_t *TrackerUpdate::getBuffer() const { size += sizeof(int32_t); // numNewDataRequests size += octreeNodeSize * newDataRequests.size(); - size += sizeof(int32_t); // numKeepDataRequests - size += octreeNodeSize * keepDataRequests.size(); + size += sizeof(int32_t); // numReplacingRequests + size += octreeNodeSize * replacingRequests.size(); size += sizeof(int32_t); // numCancelDataRequests size += octreeNodeSize * cancelDataRequests.size(); @@ -64,105 +72,114 @@ uint8_t *TrackerUpdate::getBuffer() const { serializeOctreeNodes(leafNodes, ptr, index); serializeDataRequests(newDataRequests, ptr, index); - serializeDataRequests(keepDataRequests, ptr, index); + serializeDataRequests(replacingRequests, ptr, index); serializeDataRequests(cancelDataRequests, ptr, index); return ptr; } -bool containsPoint(const vm::ivec2 &min, const int lod, const vm::ivec2 &p) { +bool containsPoint(const vm::ivec2 &min, const int lod, const vm::ivec2 &p) +{ return p.x >= min.x && p.x < min.x + lod && - p.y >= min.y && p.y < min.y + lod; + p.y >= min.y && p.y < min.y + lod; } -bool containsPoint(const vm::vec2 &min, const int lod, const vm::vec2 &p) { +bool containsPoint(const vm::vec2 &min, const int lod, const vm::vec2 &p) +{ return p.x >= min.x && p.x < min.x + (float)lod && - p.y >= min.y && p.y < min.y + (float)lod; + p.y >= min.y && p.y < min.y + (float)lod; } -bool containsPoint(const OctreeNode &node, const vm::ivec2 &p) { +bool containsPoint(const OctreeNode &node, const vm::ivec2 &p) +{ return containsPoint(node.min, node.lod, p); } -bool containsNode(const OctreeNode &node, const OctreeNode &other) { +bool containsNode(const OctreeNode &node, const OctreeNode &other) +{ return containsPoint(node, other.min); } -bool equalsNode(const OctreeNode &node, const OctreeNode &other) { - if (node.min == other.min && node.lod == other.lod) { - return true; - } else { - return false; - } +bool equalsNodeMin(const OctreeNode &node, const OctreeNode &other) +{ + return node.min == other.min; } -bool equalsNodeLod(const OctreeNode &node, const OctreeNode &other) { - if (equalsNode(node, other)) { - if (node.lod != other.lod) { - return false; - } - return true; - } else { - return false; - } +bool equalsLod(const OctreeNode &node, const OctreeNode &other) +{ + return node.lod == other.lod; +} + +bool equalsNodeMinLod(const OctreeNode &node, const OctreeNode &other) +{ + return equalsNodeMin(node, other) && equalsLod(node, other); } -bool equalsNodeLodArray(const OctreeNode &node, const OctreeNode &other) { - if (equalsNode(node, other)) { - if ( - (node.lod != other.lod) || - (node.lodArray[0] != other.lodArray[0] || node.lodArray[1] != other.lodArray[1]) - ) { - return false; - } - return true; - } - return false; +bool equalsLodArray(const OctreeNode &node, const OctreeNode &other) +{ + return (node.lodArray[0] == other.lodArray[0]) && (node.lodArray[1] == other.lodArray[1]); } -bool chunksIntersect(const vm::ivec2 &min1, const int lod1, const vm::ivec2 &min2, const int lod2) { +bool equalsNode(const OctreeNode &node, const OctreeNode &other) +{ + return equalsNodeMinLod(node, other) && equalsLodArray(node, other); +} + +bool chunksIntersect(const vm::ivec2 &min1, const int lod1, const vm::ivec2 &min2, const int lod2) +{ return min1.x < min2.x + lod2 && min1.x + lod1 > min2.x && - min1.y < min2.y + lod2 && min1.y + lod1 > min2.y; + min1.y < min2.y + lod2 && min1.y + lod1 > min2.y; } -OctreeNodePtr OctreeNodeAllocator::alloc(const vm::ivec2 &min, int lod) { +OctreeNodePtr OctreeNodeAllocator::alloc(const vm::ivec2 &min, int lod) +{ return std::make_shared(min, lod); } -OctreeNodePtr OctreeContext::alloc(const vm::ivec2 &min, int lod) { +OctreeNodePtr OctreeContext::alloc(const vm::ivec2 &min, int lod) +{ auto node = OctreeNodeAllocator::alloc(min, lod); - if (node) { + if (node) + { node->min = min; node->lod = lod; - + uint64_t hash = hashOctreeMinLod(min, lod); nodeMap[hash] = node; } return node; } // OctreeContext::OctreeContext() {} -std::vector OctreeContext::getLeafNodes() { +std::vector OctreeContext::getLeafNodes() +{ std::vector leafNodes; - for (const auto &iter : nodeMap) { + for (const auto &iter : nodeMap) + { auto node = iter.second; leafNodes.push_back(node); } return leafNodes; } -std::unordered_map>::iterator getNodeIter(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) { +std::unordered_map>::iterator getNodeIter(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) +{ auto &nodeMap = octreeContext.nodeMap; uint64_t hash = hashOctreeMinLod(min, lod); auto iter = nodeMap.find(hash); return iter; } -OctreeNodePtr getNode(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) { +OctreeNodePtr getNode(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) +{ auto &nodeMap = octreeContext.nodeMap; auto iter = getNodeIter(octreeContext, min, lod); - if (iter != nodeMap.end()) { + if (iter != nodeMap.end()) + { return iter->second; - } else { + } + else + { return nullptr; } } -OctreeNodePtr createNode(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) { +OctreeNodePtr createNode(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) +{ auto &nodeMap = octreeContext.nodeMap; auto node = OctreeNodeAllocator::alloc(min, lod); @@ -170,47 +187,59 @@ OctreeNodePtr createNode(OctreeContext &octreeContext, const vm::ivec2 &min, int nodeMap[hash] = node; return node; } -OctreeNodePtr getOrCreateNode(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) { +OctreeNodePtr getOrCreateNode(OctreeContext &octreeContext, const vm::ivec2 &min, int lod) +{ OctreeNodePtr node = getNode(octreeContext, min, lod); - if (!node) { - node = createNode(octreeContext, min, lod); + if (!node) + { + node = createNode(octreeContext, min, lod); } return node; } -std::unordered_map>::iterator findNodeIterAtPoint(OctreeContext &octreeContext, const vm::ivec2 &position) { +std::unordered_map>::iterator findNodeIterAtPoint(OctreeContext &octreeContext, const vm::ivec2 &position) +{ auto &nodeMap = octreeContext.nodeMap; // std::vector leafNodes; - for (auto iter = nodeMap.begin(); iter != nodeMap.end(); iter++) { + for (auto iter = nodeMap.begin(); iter != nodeMap.end(); iter++) + { auto node = iter->second; - if (containsPoint(node->min, node->lod, position)) { + if (containsPoint(node->min, node->lod, position)) + { return iter; } } return nodeMap.end(); } -OctreeNodePtr findContainedNode(OctreeContext &octreeContext, const vm::ivec2 &min, const int lod) { +OctreeNodePtr findContainedNode(OctreeContext &octreeContext, const vm::ivec2 &min, const int lod) +{ auto &nodeMap = octreeContext.nodeMap; // std::vector leafNodes; - for (const auto &iter : nodeMap) { + for (const auto &iter : nodeMap) + { auto node = iter.second; - if (containsPoint(min, lod, node->min)) { + if (containsPoint(min, lod, node->min)) + { return node; } } return nullptr; } -bool removeNode(OctreeContext &octreeContext, OctreeNodePtr node) { +bool removeNode(OctreeContext &octreeContext, OctreeNodePtr node) +{ auto &nodeMap = octreeContext.nodeMap; uint64_t hash = hashOctreeMinLod(node->min, node->lod); auto iter = nodeMap.find(hash); - if (iter != nodeMap.end()) { + if (iter != nodeMap.end()) + { nodeMap.erase(iter); return true; - } else { + } + else + { std::cerr << "erase node not found: " << node->min.x << " " << node->min.y << " " << node->lod << std::endl; abort(); return false; @@ -218,19 +247,22 @@ bool removeNode(OctreeContext &octreeContext, OctreeNodePtr node) { } void splitPointToLod( - OctreeContext &octreeContext, - const vm::ivec2 &absolutePosition, - int targetLod -) { + OctreeContext &octreeContext, + const vm::ivec2 &absolutePosition, + int targetLod) +{ auto &nodeMap = octreeContext.nodeMap; - for (;;) { + for (;;) + { auto iter = findNodeIterAtPoint(octreeContext, absolutePosition); - if (iter != nodeMap.end()) { + if (iter != nodeMap.end()) + { OctreeNodePtr node = iter->second; int parentLod = node->lod; - - if (parentLod > targetLod) { + + if (parentLod > targetLod) + { const vm::ivec2 &parentPosition = node->min; int childLod = parentLod / 2; @@ -238,27 +270,32 @@ void splitPointToLod( nodeMap.erase(iter); - for (int dx = 0; dx < 2; dx++) { - for (int dy = 0; dy < 2; dy++) { + for (int dx = 0; dx < 2; dx++) + { + for (int dy = 0; dy < 2; dy++) + { vm::ivec2 min{ - parentPosition.x + dx * childLod, - parentPosition.y + dy * childLod - }; - + parentPosition.x + dx * childLod, + parentPosition.y + dy * childLod}; + OctreeNodePtr childNode = createNode( - octreeContext, - min, - childLod - ); + octreeContext, + min, + childLod); } } - } else { + } + else + { break; } - } else { + } + else + { std::cerr << "could not find split point node: " << absolutePosition.x << " " << absolutePosition.y << std::endl; std::cout << "existing nodes: "; - for (auto iter = nodeMap.begin(); iter != nodeMap.end(); iter++) { + for (auto iter = nodeMap.begin(); iter != nodeMap.end(); iter++) + { auto node = iter->second; std::cout << node->min.x << " " << node->min.y << " " << node->lod << ", "; } @@ -267,24 +304,24 @@ void splitPointToLod( } } } -void initializeLodArrays(OctreeContext &octreeContext) { +void initializeLodArrays(OctreeContext &octreeContext) +{ auto &nodeMap = octreeContext.nodeMap; - - for (auto iter = nodeMap.begin(); iter != nodeMap.end(); iter++) { + + for (auto iter = nodeMap.begin(); iter != nodeMap.end(); iter++) + { auto &node = iter->second; auto &min = node->min; auto &lod = node->lod; - + vm::ivec2 bottomNodePosition{ - min.x, - min.y + lod - }; + min.x, + min.y + lod}; auto bottomNodeIter = findNodeIterAtPoint(octreeContext, bottomNodePosition); vm::ivec2 rightNodePosition{ - min.x + lod, - min.y - }; + min.x + lod, + min.y}; auto rightNodeIter = findNodeIterAtPoint(octreeContext, rightNodePosition); node->lodArray[0] = bottomNodeIter != nodeMap.end() ? bottomNodeIter->second->lod : (lod * 2); @@ -292,12 +329,12 @@ void initializeLodArrays(OctreeContext &octreeContext) { } } void constructLodTree( - OctreeContext &octreeContext, - const vm::ivec2 ¤tCoord, - int lod1Range, - int minLod, - int maxLod -) { + OctreeContext &octreeContext, + const vm::ivec2 ¤tCoord, + int lod1Range, + int minLod, + int maxLod) +{ auto &nodeMap = octreeContext.nodeMap; int minLodInt = 1 << (minLod - 1); @@ -305,36 +342,37 @@ void constructLodTree( // initialize max lod vm::ivec2 maxLodCenter{ - (int)std::floor((float)currentCoord.x / (float)maxLodInt) * maxLodInt, - (int)std::floor((float)currentCoord.y / (float)maxLodInt) * maxLodInt - }; - for (int dx = -lod1Range * maxLodInt; dx <= lod1Range * maxLodInt; dx += maxLodInt) { - for (int dy = -lod1Range * maxLodInt; dy <= lod1Range * maxLodInt; dy += maxLodInt) { + (int)std::floor((float)currentCoord.x / (float)maxLodInt) * maxLodInt, + (int)std::floor((float)currentCoord.y / (float)maxLodInt) * maxLodInt}; + for (int dx = -lod1Range * maxLodInt; dx <= lod1Range * maxLodInt; dx += maxLodInt) + { + for (int dy = -lod1Range * maxLodInt; dy <= lod1Range * maxLodInt; dy += maxLodInt) + { vm::ivec2 childPosition{ - maxLodCenter.x + dx, - maxLodCenter.y + dy - }; + maxLodCenter.x + dx, + maxLodCenter.y + dy}; OctreeNodePtr childNode = getOrCreateNode( - octreeContext, - childPosition, - maxLodInt - ); + octreeContext, + childPosition, + maxLodInt); } } // initialize other lods - if (minLod != maxLod) { - for (int lod = minLodInt; lod <= maxLodInt; lod *= 2) { - for (int dx = -lod1Range * lod; dx <= lod1Range * lod; dx += lod) { - for (int dz = -lod1Range * lod; dz <= lod1Range * lod; dz += lod) { + if (minLod != maxLod) + { + for (int lod = minLodInt; lod <= maxLodInt; lod *= 2) + { + for (int dx = -lod1Range * lod; dx <= lod1Range * lod; dx += lod) + { + for (int dz = -lod1Range * lod; dz <= lod1Range * lod; dz += lod) + { vm::ivec2 currentCoordSnappedToLod{ - (int)std::floor((float)currentCoord.x / (float)lod) * lod, - (int)std::floor((float)currentCoord.y / (float)lod) * lod - }; + (int)std::floor((float)currentCoord.x / (float)lod) * lod, + (int)std::floor((float)currentCoord.y / (float)lod) * lod}; vm::ivec2 splitPosition{ - currentCoordSnappedToLod.x + dx, - currentCoordSnappedToLod.y + dz - }; + currentCoordSnappedToLod.x + dx, + currentCoordSnappedToLod.y + dz}; splitPointToLod(octreeContext, splitPosition, lod); } } @@ -344,45 +382,45 @@ void constructLodTree( initializeLodArrays(octreeContext); } void constructSeedTree( - OctreeContext &octreeContext, - const std::vector &maxLodChunkPositions, - const int maxLod, - const std::vector> &lodSplits -) { + OctreeContext &octreeContext, + const std::vector &maxLodChunkPositions, + const int maxLod, + const std::vector> &lodSplits) +{ auto &nodeMap = octreeContext.nodeMap; // initialize base lods - for (size_t i = 0; i < maxLodChunkPositions.size(); i++) { + for (size_t i = 0; i < maxLodChunkPositions.size(); i++) + { const vm::ivec2 &nodePos = maxLodChunkPositions[i]; OctreeNodePtr childNode = getOrCreateNode( - octreeContext, - nodePos, - maxLod - ); + octreeContext, + nodePos, + maxLod); } // initialize other lods - for (const std::pair &lodSplit : lodSplits) { + for (const std::pair &lodSplit : lodSplits) + { const vm::ivec2 &splitPosition = lodSplit.first; const int &lod = lodSplit.second; splitPointToLod(octreeContext, splitPosition, lod); } } std::vector constructOctreeForLeaf( - const vm::ivec2 ¤tCoord, - int lod1Range, - int minLod, - int maxLod -) { + const vm::ivec2 ¤tCoord, + int lod1Range, + int minLod, + int maxLod) +{ OctreeContext octreeContext; constructLodTree( - octreeContext, - currentCoord, - lod1Range, - minLod, - maxLod - ); + octreeContext, + currentCoord, + lod1Range, + minLod, + maxLod); // collect all nodes in the nodeMap std::vector leafNodes = octreeContext.getLeafNodes(); @@ -391,12 +429,12 @@ std::vector constructOctreeForLeaf( return leafNodes; } - -Tracker::Tracker(PGInstance *inst) : - inst(inst) -{} +Tracker::Tracker(PGInstance *inst) : inst(inst) +{ +} // static methods -vm::ivec2 getCurrentCoord(const vm::vec3 &position, int chunkSize) { +vm::ivec2 getCurrentCoord(const vm::vec3 &position, int chunkSize) +{ const int cx = std::floor(position.x / (float)chunkSize); const int cz = std::floor(position.z / (float)chunkSize); return vm::ivec2{cx, cz}; @@ -404,104 +442,214 @@ vm::ivec2 getCurrentCoord(const vm::vec3 &position, int chunkSize) { // dynamic methods // sort nodes by distance to world position of the central max lod node -void Tracker::sortNodes(std::vector &nodes) { +void Tracker::sortNodes(std::vector &nodes) +{ const vm::vec3 &worldPosition = inst->renderingInfo.worldPosition; const vm::vec3 &cameraPosition = inst->renderingInfo.cameraPosition; const Quat &cameraQuaternion = inst->renderingInfo.cameraQuaternion; std::array &projectionMatrix = inst->renderingInfo.projectionMatrix; - + // compute frustum Matrix matrixWorld( - Vec{ - cameraPosition.x, - cameraPosition.y, - cameraPosition.z - }, - Quat{ - cameraQuaternion.x, - cameraQuaternion.y, - cameraQuaternion.z, - cameraQuaternion.w - }, - Vec{1, 1, 1} - ); + Vec{ + cameraPosition.x, + cameraPosition.y, + cameraPosition.z}, + Quat{ + cameraQuaternion.x, + cameraQuaternion.y, + cameraQuaternion.z, + cameraQuaternion.w}, + Vec{1, 1, 1}); Matrix matrixWorldInverse(matrixWorld); matrixWorldInverse.invert(); Frustum frustum = Frustum::fromMatrix( - Matrix::fromArray(projectionMatrix.data()) *= matrixWorldInverse - ); + Matrix::fromArray(projectionMatrix.data()) *= matrixWorldInverse); sort(nodes, worldPosition, frustum); } DataRequestUpdate Tracker::updateDataRequests( - const std::unordered_map &dataRequests, - const std::vector &leafNodes -) { + const std::unordered_map &dataRequests, + const std::vector &leafNodes) +{ DataRequestUpdate dataRequestUpdate; dataRequestUpdate.dataRequests = dataRequests; - // cancel old data requests - for (auto iter = dataRequestUpdate.dataRequests.begin(); iter != dataRequestUpdate.dataRequests.end();) { + std::vector replacingNodes; + + // util lambda functions + auto createNewDataRequest = [&](const OctreeNodePtr &node, const uint64_t &hash) -> DataRequestPtr + { + DataRequestPtr dataRequest = std::make_shared(node); + dataRequestUpdate.dataRequests[hash] = dataRequest; + return dataRequest; + }; + auto cancelDataRequest = [](DataRequestUpdate &dataRequestUpdate, const DataRequestPtr &oldDataRequest, auto &iter) + { + dataRequestUpdate.cancelDataRequests.push_back(oldDataRequest); + // forget the data request + auto currentIter = iter; + auto nextIter = iter; + nextIter++; + dataRequestUpdate.dataRequests.erase(currentIter); + iter = nextIter; + }; + auto addReplacingRequest = [&](const OctreeNodePtr &node) + { + uint64_t hash = hashOctreeMinLod(node->min, node->lod); + replacingNodes.push_back(hash); + const DataRequestPtr dataRequest = createNewDataRequest(node, hash); + dataRequestUpdate.replacingRequests.push_back(dataRequest); + }; + + // cancel old data requests, and add replacing data requests + for (auto iter = dataRequestUpdate.dataRequests.begin(); iter != dataRequestUpdate.dataRequests.end();) + { const uint64_t &hash = iter->first; const DataRequestPtr &oldDataRequest = iter->second; - auto matchingLeafNodeIter = std::find_if( - leafNodes.begin(), - leafNodes.end(), - [&](const OctreeNodePtr &leafNode) -> bool { - return equalsNodeLodArray(*leafNode, *oldDataRequest->node); + auto matchingMinLeafNodeIter = std::find_if( + leafNodes.begin(), + leafNodes.end(), + [&](const OctreeNodePtr &leafNode) -> bool + { + return equalsNodeMin(*leafNode, *oldDataRequest->node); + }); + + if (matchingMinLeafNodeIter != leafNodes.end()) + { + const OctreeNode newNode = **matchingMinLeafNodeIter; + const OctreeNode oldNode = *oldDataRequest->node; + + if (equalsLod(newNode, oldNode)) + { + if (equalsLodArray(newNode, oldNode)) + { + // keep the data request + iter++; + } + else + { + cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); + } + } + else + { + cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); + + const float LOD_BALANCE = 1.f; + const float lodRatio = (float)newNode.lod / (float)oldNode.lod; + + if (lodRatio > LOD_BALANCE) + { + // new chunk is bigger than the old chunk + /* ........... ........... + . - . - . . . + ........... -> . + . + . - . - . . . + ........... ........... */ + + const vm::ivec2 min = newNode.min; + const int lod = newNode.lod; + const OctreeNodePtr node = std::make_shared(min, lod, (int)REPLACING::SMALLER); + + addReplacingRequest(node); + + // std::cout << "-4 -> +1 = " << lodRatio << std::endl; + + // in every chunk, we have an addition set, and a removal set + // const additionSet = [newNode]; + // const removalSet = [oldNode1, oldNode2, oldNode3, oldNode4]; + // the new node is responsible for removal of the old nodes + + // replaceFunc -> if 1 is ready -> (removeNodes() + addNode()) + + // in every chunk, we have an addition count, and a removal count + // when the addition count reaches its limit we add the chunk + // when the removal count reaches its limit we remove the chunk + + // we have the Min so we can use that to get the replaced nodes set + // we need to wait for the new chunk to get "Ready" and then we can remove the old ones + } + else + { + // old chunk is bigger than the new chunk + + /* ........... ........... + . . . + . + . + . - . -> ........... + . . . + . + . + ........... ........... */ + + const int DIMENSION = 2; + + for (int y = 0; y < DIMENSION; y++) + { + for (int x = 0; x < DIMENSION; x++) + { + const vm::ivec2 min = newNode.min + vm::ivec2{x, y} * newNode.lod; + const int lod = newNode.lod; + const OctreeNodePtr node = std::make_shared(min, lod, (int)REPLACING::BIGGER); + + addReplacingRequest(node); + } + } + + // std::cout << "-1 -> +4 = " << lodRatio << std::endl; + + // the new nodes are responsible for the removal of the old node + + // replaceFunc -> if 4 ready -> (removeNode() + addNodes()) + + // store the four replacing chunks in the removal function of the bigger one, + // when removal is called four times add the set, remove the old one + // in JS once the four chunks are ready, kill the one big chunk + + // const vm::ivec2 testMin = vm::ivec2{newNode.min.x, newNode.min.y} + newNode.lod; + // const vm::ivec2 rootMin = chunkMinForPosition(testMin, oldNode.lod); + // const vm::ivec2 baseMin = oldNode.min; + } } - ); - if (matchingLeafNodeIter != leafNodes.end()) { - // keep the data request - dataRequestUpdate.keepDataRequests.push_back(oldDataRequest); - - iter++; - } else { - // cancel the data request - dataRequestUpdate.cancelDataRequests.push_back(oldDataRequest); - // forget the data request - auto currentIter = iter; - auto nextIter = iter; - nextIter++; - dataRequestUpdate.dataRequests.erase(currentIter); - iter = nextIter; + } + else + { + cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); } } // add new data requests - for (auto chunk : leafNodes) { - uint64_t hash = hashOctreeMinLod(chunk->min, chunk->lod); + for (auto node : leafNodes) + { + uint64_t hash = hashOctreeMinLod(node->min, node->lod); auto dataRequestIter = dataRequestUpdate.dataRequests.find(hash); - if (dataRequestIter == dataRequestUpdate.dataRequests.end()) { - DataRequestPtr dataRequest(new DataRequest{chunk}); - - dataRequestUpdate.newDataRequests.push_back(dataRequest); - - dataRequestUpdate.dataRequests.emplace( - std::piecewise_construct, - std::forward_as_tuple(hash), - std::forward_as_tuple(dataRequest) - ); + if (dataRequestIter == dataRequestUpdate.dataRequests.end()) + { + const DataRequestPtr dataRequest = createNewDataRequest(node, hash); + const bool isReplacing = std::find(replacingNodes.begin(), replacingNodes.end(), hash) != replacingNodes.end(); + // replacing nodes won't get added right away, they get added once the data is ready (handled in Javascript) + if (!isReplacing) + { + dataRequestUpdate.newDataRequests.push_back(dataRequest); + } } } return dataRequestUpdate; } -TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int minLod, int maxLod, int lod1Range) { +TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int minLod, int maxLod, int lod1Range) +{ std::lock_guard lock(mutex); - + // new octrees const int chunkSize = this->inst->heightfieldGenerator.getChunkSize(); vm::ivec2 currentCoord = getCurrentCoord(position, chunkSize); // in chunk space std::vector octreeLeafNodes = constructOctreeForLeaf( - currentCoord, - lod1Range, - minLod, - maxLod - ); + currentCoord, + lod1Range, + minLod, + maxLod); sortNodes(octreeLeafNodes); DataRequestUpdate dataRequestUpdate = updateDataRequests(this->dataRequests, octreeLeafNodes); @@ -512,7 +660,7 @@ TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int mi result.leafNodes = std::move(octreeLeafNodes); result.newDataRequests = std::move(dataRequestUpdate.newDataRequests); - result.keepDataRequests = std::move(dataRequestUpdate.keepDataRequests); + result.replacingRequests = std::move(dataRequestUpdate.replacingRequests); result.cancelDataRequests = std::move(dataRequestUpdate.cancelDataRequests); return result; diff --git a/task/tracker.h b/task/tracker.h index ec5d341..787580b 100644 --- a/task/tracker.h +++ b/task/tracker.h @@ -16,12 +16,14 @@ class PGInstance; constexpr size_t numCachedOctreeNodes = 64 * 1024; -class OctreeNodeAllocator { -public: +class OctreeNodeAllocator +{ +public: static OctreeNodePtr alloc(const vm::ivec2 &min, int lod); }; -class OctreeContext { +class OctreeContext +{ public: std::unordered_map> nodeMap; @@ -31,20 +33,27 @@ class OctreeContext { // -class DataRequest { +class DataRequest +{ public: + DataRequest(const OctreeNodePtr &octreeNode) : node(octreeNode) + { + // nothing + } + OctreeNodePtr node; - + std::vector getBuffer() const; }; typedef std::shared_ptr DataRequestPtr; -class DataRequestUpdate { +class DataRequestUpdate +{ public: std::unordered_map dataRequests; std::vector newDataRequests; - std::vector keepDataRequests; + std::vector replacingRequests; std::vector cancelDataRequests; std::vector getBuffer() const; @@ -52,13 +61,14 @@ class DataRequestUpdate { extern std::atomic nextTrackerId; -class TrackerUpdate { +class TrackerUpdate +{ public: PGInstance *inst; std::vector leafNodes; std::vector newDataRequests; - std::vector keepDataRequests; + std::vector replacingRequests; std::vector cancelDataRequests; uint8_t *getBuffer() const; @@ -70,17 +80,15 @@ bool containsPoint(const vm::ivec2 &min, const int lod, const vm::ivec2 &p); bool containsPoint(const vm::vec2 &min, const int lod, const vm::vec2 &p); bool containsPoint(const OctreeNode &node, const vm::ivec2 &p); bool containsNode(const OctreeNode &node, const OctreeNode &other); -bool equalsNode(const OctreeNode &node, const OctreeNode &other); -bool equalsNodeLod(const OctreeNode &node, const OctreeNode &other); +bool equalsNodeMinLod(const OctreeNode &node, const OctreeNode &other); // bool intersectsNode(const OctreeNode &node, const OctreeNode &other); bool chunksIntersect(const vm::ivec2 &min1, const int lod1, const vm::ivec2 &min2, const int lod2); void constructSeedTree( - OctreeContext &octreeContext, - const std::vector &maxLodChunkPositions, - const int maxLod, - const std::vector> &lodSplits -); + OctreeContext &octreeContext, + const std::vector &maxLodChunkPositions, + const int maxLod, + const std::vector> &lodSplits); // std::vector constructOctreeForSeed(const vm::ivec2 &maxLodCenter, const int maxLod, const std::vector> &lodSplits); std::unordered_map>::iterator findNodeIterAtPoint(OctreeContext &octreeContext, const vm::ivec2 &position); @@ -113,10 +121,11 @@ OctreeNodePtr getMaxLodNode(const std::vector &newLeafNodes, cons // -class Tracker { +class Tracker +{ public: PGInstance *inst; - + // vm::ivec2 lastCoord; std::unordered_map dataRequests; // int lastEpoch; @@ -130,9 +139,8 @@ class Tracker { void sortNodes(std::vector &nodes); DataRequestUpdate updateDataRequests( - const std::unordered_map &dataRequests, - const std::vector &leafNodes - ); + const std::unordered_map &dataRequests, + const std::vector &leafNodes); TrackerUpdate update(PGInstance *inst, const vm::vec3 &position, int minLod, int maxLod, int lod1Range); }; From 3c8f482fb59775215f43b77c783e4d5730c01855 Mon Sep 17 00:00:00 2001 From: aryasalehi Date: Tue, 10 Jan 2023 21:02:54 +0330 Subject: [PATCH 4/4] handle replacing nodes --- bin/pg.wasm | Bin 299816 -> 299879 bytes compile.sh | 2 +- task/octree.h | 8 +- task/tracker.cc | 335 +++++++++++++++++++++++++++++------------------- 4 files changed, 206 insertions(+), 139 deletions(-) diff --git a/bin/pg.wasm b/bin/pg.wasm index fc975546499152c31c1a404a31ddee3d1b2e84c1..e741fdd2ddf3e7cbb0ee42a8b5c0fa44203a42e5 100644 GIT binary patch delta 19128 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ƟTzT>XU5F;C|tBu$NfRCUOpH_UG0HAI!&*|0u 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 diff --git a/compile.sh b/compile.sh index 3bbf249..c8dcfff 100644 --- a/compile.sh +++ b/compile.sh @@ -6,7 +6,7 @@ echo 'building...' NUM_THREADS=8 -emcc -D NUM_THREADS=$NUM_THREADS -sNO_EXIT_RUNTIME=1 -s TOTAL_MEMORY=100MB -pthread -sPTHREAD_POOL_SIZE=$NUM_THREADS -sPTHREAD_POOL_SIZE_STRICT=$NUM_THREADS -s ALLOW_MEMORY_GROWTH=0 -sLLD_REPORT_UNDEFINED -O3 \ +emcc -std=c++20 -D NUM_THREADS=$NUM_THREADS -sNO_EXIT_RUNTIME=1 -s TOTAL_MEMORY=100MB -pthread -sPTHREAD_POOL_SIZE=$NUM_THREADS -sPTHREAD_POOL_SIZE_STRICT=$NUM_THREADS -s ALLOW_MEMORY_GROWTH=0 -sLLD_REPORT_UNDEFINED -O3 \ binding.cc \ procgen.cc \ instance.cc \ diff --git a/task/octree.h b/task/octree.h index a4bfb5c..32118b2 100644 --- a/task/octree.h +++ b/task/octree.h @@ -29,9 +29,9 @@ uint64_t hashOctreeMin(const vm::ivec3 &min); uint64_t hashOctreeMinLod(const vm::ivec2 &min, int lod); uint64_t hashOctreeMinLod(const vm::ivec3 &min, int lod); -enum class REPLACING : int +enum class REPLACING_SIZE : int { - NON, + SAME, BIGGER, SMALLER, }; @@ -41,7 +41,7 @@ class OctreeNodeSpec { vm::ivec2 min; int lod; int lodArray[2]; - int replacing = (int)REPLACING::NON; + REPLACING_SIZE replacing = REPLACING_SIZE::SAME; }; class OctreeNode : public OctreeNodeSpec { @@ -49,7 +49,7 @@ class OctreeNode : public OctreeNodeSpec { OctreeNode(const vm::ivec2 &min, const int &lod) : OctreeNodeSpec{min, lod, {0, 0}} {} - OctreeNode(const vm::ivec2 &min, const int &lod, const int &replacing) : + OctreeNode(const vm::ivec2 &min, const int &lod, const REPLACING_SIZE &replacing) : OctreeNodeSpec{min, lod, {0, 0}, replacing} {} int getPriority() const { diff --git a/task/tracker.cc b/task/tracker.cc index c161fc0..c4cf121 100644 --- a/task/tracker.cc +++ b/task/tracker.cc @@ -40,7 +40,7 @@ void serializeDataRequests(const std::vector &datas, uint8_t *pt std::memcpy(ptr + index, data->node->lodArray, sizeof(int[2])); index += sizeof(int[2]); - *((int *)(ptr + index)) = data->node->replacing; + *((int *)(ptr + index)) = (int)data->node->replacing; index += sizeof(int); } } @@ -50,7 +50,8 @@ uint8_t *TrackerUpdate::getBuffer() const // compute size size_t size = 0; - constexpr size_t octreeNodeSize = sizeof(vm::ivec2) + sizeof(int) + sizeof(int[2]); + constexpr size_t leafNodeSize = sizeof(vm::ivec2) + sizeof(int) + sizeof(int[2]); + constexpr size_t octreeNodeSize = sizeof(vm::ivec2) + sizeof(int) + sizeof(int[2]) + sizeof(int); size += sizeof(int32_t); // numLeafNodes size += octreeNodeSize * leafNodes.size(); @@ -139,7 +140,7 @@ OctreeNodePtr OctreeContext::alloc(const vm::ivec2 &min, int lod) node->min = min; node->lod = lod; - uint64_t hash = hashOctreeMinLod(min, lod); + const uint64_t hash = hashOctreeMinLod(min, lod); nodeMap[hash] = node; } return node; @@ -160,7 +161,7 @@ std::unordered_map>::iterator getNodeIter( { auto &nodeMap = octreeContext.nodeMap; - uint64_t hash = hashOctreeMinLod(min, lod); + const uint64_t hash = hashOctreeMinLod(min, lod); auto iter = nodeMap.find(hash); return iter; } @@ -183,7 +184,7 @@ OctreeNodePtr createNode(OctreeContext &octreeContext, const vm::ivec2 &min, int auto &nodeMap = octreeContext.nodeMap; auto node = OctreeNodeAllocator::alloc(min, lod); - uint64_t hash = hashOctreeMinLod(min, lod); + const uint64_t hash = hashOctreeMinLod(min, lod); nodeMap[hash] = node; return node; } @@ -231,7 +232,7 @@ bool removeNode(OctreeContext &octreeContext, OctreeNodePtr node) { auto &nodeMap = octreeContext.nodeMap; - uint64_t hash = hashOctreeMinLod(node->min, node->lod); + const uint64_t hash = hashOctreeMinLod(node->min, node->lod); auto iter = nodeMap.find(hash); if (iter != nodeMap.end()) { @@ -469,6 +470,193 @@ void Tracker::sortNodes(std::vector &nodes) sort(nodes, worldPosition, frustum); } +template +void addReplacingNode(std::unordered_map &replacingNodes, const vm::ivec2 &min, const int &lod) +{ + const OctreeNode node(min, lod, r); + const uint64_t hash = hashOctreeMinLod(min, lod); + replacingNodes.emplace(hash, node); +} + +DataRequestPtr createNewDataRequest(DataRequestUpdate &dataRequestUpdate, const OctreeNodePtr &node, const bool &isReplacing) +{ + const uint64_t hash = hashOctreeMinLod(node->min, node->lod); + DataRequestPtr dataRequest = std::make_shared(node); + dataRequestUpdate.dataRequests[hash] = dataRequest; + if (isReplacing) + { + dataRequestUpdate.replacingRequests.push_back(dataRequest); + } + return dataRequest; +} + +void addNewDataRequest(DataRequestUpdate &dataRequestUpdate, const DataRequestPtr &dataRequest, const bool &isReplacing) +{ + // replacing nodes won't get added right away, they get added once the data is ready (handled in Javascript) + if (!isReplacing) + { + dataRequestUpdate.newDataRequests.push_back(dataRequest); + } +} + +void injectReplacingInfo(OctreeNodePtr &node, const auto &replacingNodeIter, const bool &isReplacing) +{ + // if node is replacing, inject replacing info + if (isReplacing) + { + const OctreeNode *nodeInfo = &replacingNodeIter->second; + node->replacing = nodeInfo->replacing; + } +} + +template +void handleReplacingRequest(DataRequestUpdate &dataRequestUpdate, std::unordered_map &replacingNodes, const OctreeNode &oldNode, const OctreeNode &newNode) +{ + switch (r) + { + case REPLACING_SIZE::SAME: + { + // replacing chunk, same size + const vm::ivec2 min = newNode.min; + const int lod = newNode.lod; + + addReplacingNode(replacingNodes, min, lod); + break; + } + case REPLACING_SIZE::SMALLER: + { + // new chunk is bigger than the old chunk + /* ........... ........... + . - . - . . . + ........... -> . + . + . - . - . . . + ........... ........... */ + + const vm::ivec2 min = newNode.min; + const int lod = newNode.lod; + + addReplacingNode(replacingNodes, min, lod); + break; + } + case REPLACING_SIZE::BIGGER: + { + // old chunk is bigger than the new chunk + + /* ........... ........... + . . . + . + . + . - . -> ........... + . . . + . + . + ........... ........... */ + + const int DIMENSION = 2; + + for (int y = 0; y < DIMENSION; y++) + { + for (int x = 0; x < DIMENSION; x++) + { + const vm::ivec2 min = newNode.min + vm::ivec2{x, y} * newNode.lod; + const int lod = newNode.lod; + + addReplacingNode(replacingNodes, min, lod); + } + } + break; + } + default: + std::cerr << "unknown replacing type" << std::endl; + break; + } +} + +void eraseDataRequest(DataRequestUpdate &dataRequestUpdate, auto &iter) +{ + // forget the data request + auto currentIter = iter; + auto nextIter = iter; + nextIter++; + dataRequestUpdate.dataRequests.erase(currentIter); + iter = nextIter; +} + +template +void cancelDataRequest(DataRequestUpdate &dataRequestUpdate, const DataRequestPtr &oldDataRequest, auto &iter) +{ + if (!isReplacing) + { + dataRequestUpdate.cancelDataRequests.push_back(oldDataRequest); + } + eraseDataRequest(dataRequestUpdate, iter); +} + +void handleMatchingLodNodes(DataRequestUpdate &dataRequestUpdate, + std::unordered_map &replacingNodes, + const OctreeNode &oldNode, + const OctreeNode &newNode, + auto &iter) +{ + if (equalsLodArray(newNode, oldNode)) + { + // keep the data request + iter++; + } + else + { + // replacing due to lod array change + handleReplacingRequest(dataRequestUpdate, replacingNodes, oldNode, newNode); + } +} + +void handleUnbalancedLodNodes(DataRequestUpdate &dataRequestUpdate, + std::unordered_map &replacingNodes, + const OctreeNode &oldNode, + const OctreeNode &newNode, + auto &iter) +{ + const float LOD_BALANCE = 1.f; + const float lodRatio = (float)newNode.lod / (float)oldNode.lod; + + if (lodRatio > LOD_BALANCE) + { + // replacing smaller chunk + handleReplacingRequest(dataRequestUpdate, replacingNodes, oldNode, newNode); + } + else + { + // replacing bigger chunk + handleReplacingRequest(dataRequestUpdate, replacingNodes, oldNode, newNode); + } +} +void handleMatchingMinNodes(DataRequestUpdate &dataRequestUpdate, + std::unordered_map &replacingNodes, + const OctreeNode &oldNode, + const OctreeNode &newNode, + auto &iter) +{ + if (equalsLod(newNode, oldNode)) + { + handleMatchingLodNodes(dataRequestUpdate, replacingNodes, oldNode, newNode, iter); + } + else + { + handleUnbalancedLodNodes(dataRequestUpdate, replacingNodes, oldNode, newNode, iter); + } +} + +void createDataRequestFromLeafNode(OctreeNodePtr &node, DataRequestUpdate &dataRequestUpdate, std::unordered_map &replacingNodes) +{ + const uint64_t hash = hashOctreeMinLod(node->min, node->lod); + auto dataRequestIter = dataRequestUpdate.dataRequests.find(hash); + if (dataRequestIter == dataRequestUpdate.dataRequests.end()) + { + auto foundReplacingNode = replacingNodes.find(hash); + bool isReplacing = foundReplacingNode != replacingNodes.end(); + + injectReplacingInfo(node, foundReplacingNode, isReplacing); + const DataRequestPtr dataRequest = createNewDataRequest(dataRequestUpdate, node, isReplacing); + addNewDataRequest(dataRequestUpdate, dataRequest, isReplacing); + } +} + DataRequestUpdate Tracker::updateDataRequests( const std::unordered_map &dataRequests, const std::vector &leafNodes) @@ -476,32 +664,7 @@ DataRequestUpdate Tracker::updateDataRequests( DataRequestUpdate dataRequestUpdate; dataRequestUpdate.dataRequests = dataRequests; - std::vector replacingNodes; - - // util lambda functions - auto createNewDataRequest = [&](const OctreeNodePtr &node, const uint64_t &hash) -> DataRequestPtr - { - DataRequestPtr dataRequest = std::make_shared(node); - dataRequestUpdate.dataRequests[hash] = dataRequest; - return dataRequest; - }; - auto cancelDataRequest = [](DataRequestUpdate &dataRequestUpdate, const DataRequestPtr &oldDataRequest, auto &iter) - { - dataRequestUpdate.cancelDataRequests.push_back(oldDataRequest); - // forget the data request - auto currentIter = iter; - auto nextIter = iter; - nextIter++; - dataRequestUpdate.dataRequests.erase(currentIter); - iter = nextIter; - }; - auto addReplacingRequest = [&](const OctreeNodePtr &node) - { - uint64_t hash = hashOctreeMinLod(node->min, node->lod); - replacingNodes.push_back(hash); - const DataRequestPtr dataRequest = createNewDataRequest(node, hash); - dataRequestUpdate.replacingRequests.push_back(dataRequest); - }; + std::unordered_map replacingNodes; // cancel old data requests, and add replacing data requests for (auto iter = dataRequestUpdate.dataRequests.begin(); iter != dataRequestUpdate.dataRequests.end();) @@ -522,117 +685,19 @@ DataRequestUpdate Tracker::updateDataRequests( const OctreeNode newNode = **matchingMinLeafNodeIter; const OctreeNode oldNode = *oldDataRequest->node; - if (equalsLod(newNode, oldNode)) - { - if (equalsLodArray(newNode, oldNode)) - { - // keep the data request - iter++; - } - else - { - cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); - } - } - else - { - cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); - - const float LOD_BALANCE = 1.f; - const float lodRatio = (float)newNode.lod / (float)oldNode.lod; - - if (lodRatio > LOD_BALANCE) - { - // new chunk is bigger than the old chunk - /* ........... ........... - . - . - . . . - ........... -> . + . - . - . - . . . - ........... ........... */ - - const vm::ivec2 min = newNode.min; - const int lod = newNode.lod; - const OctreeNodePtr node = std::make_shared(min, lod, (int)REPLACING::SMALLER); - - addReplacingRequest(node); - - // std::cout << "-4 -> +1 = " << lodRatio << std::endl; - - // in every chunk, we have an addition set, and a removal set - // const additionSet = [newNode]; - // const removalSet = [oldNode1, oldNode2, oldNode3, oldNode4]; - // the new node is responsible for removal of the old nodes - - // replaceFunc -> if 1 is ready -> (removeNodes() + addNode()) - - // in every chunk, we have an addition count, and a removal count - // when the addition count reaches its limit we add the chunk - // when the removal count reaches its limit we remove the chunk - - // we have the Min so we can use that to get the replaced nodes set - // we need to wait for the new chunk to get "Ready" and then we can remove the old ones - } - else - { - // old chunk is bigger than the new chunk - - /* ........... ........... - . . . + . + . - . - . -> ........... - . . . + . + . - ........... ........... */ - - const int DIMENSION = 2; - - for (int y = 0; y < DIMENSION; y++) - { - for (int x = 0; x < DIMENSION; x++) - { - const vm::ivec2 min = newNode.min + vm::ivec2{x, y} * newNode.lod; - const int lod = newNode.lod; - const OctreeNodePtr node = std::make_shared(min, lod, (int)REPLACING::BIGGER); - - addReplacingRequest(node); - } - } - - // std::cout << "-1 -> +4 = " << lodRatio << std::endl; - - // the new nodes are responsible for the removal of the old node - - // replaceFunc -> if 4 ready -> (removeNode() + addNodes()) - - // store the four replacing chunks in the removal function of the bigger one, - // when removal is called four times add the set, remove the old one - // in JS once the four chunks are ready, kill the one big chunk - - // const vm::ivec2 testMin = vm::ivec2{newNode.min.x, newNode.min.y} + newNode.lod; - // const vm::ivec2 rootMin = chunkMinForPosition(testMin, oldNode.lod); - // const vm::ivec2 baseMin = oldNode.min; - } - } + cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); + handleMatchingMinNodes(dataRequestUpdate, replacingNodes, oldNode, newNode, iter); } else { - cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); + cancelDataRequest(dataRequestUpdate, oldDataRequest, iter); } } // add new data requests for (auto node : leafNodes) { - uint64_t hash = hashOctreeMinLod(node->min, node->lod); - auto dataRequestIter = dataRequestUpdate.dataRequests.find(hash); - if (dataRequestIter == dataRequestUpdate.dataRequests.end()) - { - const DataRequestPtr dataRequest = createNewDataRequest(node, hash); - const bool isReplacing = std::find(replacingNodes.begin(), replacingNodes.end(), hash) != replacingNodes.end(); - // replacing nodes won't get added right away, they get added once the data is ready (handled in Javascript) - if (!isReplacing) - { - dataRequestUpdate.newDataRequests.push_back(dataRequest); - } - } + createDataRequestFromLeafNode(node, dataRequestUpdate, replacingNodes); } return dataRequestUpdate; @@ -645,11 +710,13 @@ TrackerUpdate Tracker::update(PGInstance *inst, const vm::vec3 &position, int mi // new octrees const int chunkSize = this->inst->heightfieldGenerator.getChunkSize(); vm::ivec2 currentCoord = getCurrentCoord(position, chunkSize); // in chunk space + std::vector octreeLeafNodes = constructOctreeForLeaf( currentCoord, lod1Range, minLod, maxLod); + sortNodes(octreeLeafNodes); DataRequestUpdate dataRequestUpdate = updateDataRequests(this->dataRequests, octreeLeafNodes);