nano-pow 5.2.0 → 5.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/package.json +6 -4
- package/dist/bin/cli.js.map +0 -7
- package/dist/bin/server.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/utils/index.js.map +0 -7
package/dist/index.js
CHANGED
|
@@ -633,7 +633,7 @@ var worker = async (compute) => {
|
|
|
633
633
|
} catch (err) {
|
|
634
634
|
if (typeof err === "object" && err != null) {
|
|
635
635
|
const e = err;
|
|
636
|
-
if (e.message === "
|
|
636
|
+
if (typeof e.message === "string" && e.message.includes("divide by zero")) {
|
|
637
637
|
result2 = "";
|
|
638
638
|
} else {
|
|
639
639
|
result2 = e.message;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nano-pow",
|
|
3
|
-
"version": "5.2.
|
|
3
|
+
"version": "5.2.2",
|
|
4
4
|
"description": "Proof-of-work generation and validation with WebGPU/WebGL/WASM for Nano cryptocurrency.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nemo",
|
|
@@ -26,9 +26,11 @@
|
|
|
26
26
|
"url": "nano:nano_1zosoqs47yt47bnfg7sdf46kj7asn58b7uzm9ek95jw7ccatq37898u1zoso"
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"/
|
|
29
|
+
"dist/**/*.js",
|
|
30
|
+
"dist/**/*.d.ts",
|
|
31
|
+
"dist/bin/*.sh",
|
|
32
|
+
"docs/",
|
|
33
|
+
"LICENSES/",
|
|
32
34
|
"AUTHORS.md",
|
|
33
35
|
"package.json.license"
|
|
34
36
|
],
|
package/dist/bin/cli.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/bin/cli.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { WorkErrorResponse, WorkGenerateResponse, WorkValidateResponse } from 'nano-pow'\nimport { Logger, isHex32, isHex8, stats } from 'nano-pow/utils'\nimport { Serializable, spawn } from 'node:child_process'\nimport { getRandomValues } from 'node:crypto'\nimport { createInterface } from 'node:readline/promises'\n\nprocess.title = 'NanoPow CLI'\nconst logger = new Logger()\n\ndelete process.env.NANO_POW_DEBUG\ndelete process.env.NANO_POW_EFFORT\ndelete process.env.NANO_POW_PORT\n\nconst hashes: string[] = []\nconst stdinErrors: string[] = []\n\nif (!process.stdin.isTTY) {\n\tconst stdin = createInterface({\n\t\tinput: process.stdin\n\t})\n\tlet i = 0\n\tfor await (const line of stdin) {\n\t\ti++\n\t\tif (isHex32(line)) {\n\t\t\thashes.push(line)\n\t\t} else {\n\t\t\tstdinErrors.push(`Skipping invalid stdin input line ${i}`)\n\t\t}\n\t}\n}\n\nconst args = process.argv.slice(2)\nif ((hashes.length === 0 && args.length === 0) || (args.some(v => v === '--help' || v === '-h'))) {\n\tconsole.log(`Usage: nano-pow [OPTION]... BLOCKHASH...\nGenerate work for BLOCKHASH, or multiple work values for BLOCKHASH(es)\nBLOCKHASH is a 64-character hexadecimal string. Multiple blockhashes must be separated by whitespace or line breaks.\nPrints the result as a Javascript object to standard output as soon as it is calculated.\nIf using --batch, results are printed only after all BLOCKHASH(es) have be processed.\nIf using --validate, results will also include validity properties.\n\n -b, --batch process all data before returning final results as array\n -d, --difficulty <value> override the minimum difficulty value\n -e, --effort <value> increase demand on GPU processing\n -v, --validate <value> check an existing work value instead of searching for one\n\n -h, --help show this dialog\n --debug enable additional logging output\n --benchmark <value> generate work for specified number of random hashes\n --score <value> used with --benchmark to run specified number of times and calculate work-per-second\n\nIf validating a nonce, it must be a 16-character hexadecimal value.\nEffort must be a decimal number between 1-32.\nDifficulty must be a hexadecimal string between 0-FFFFFFFFFFFFFFFF.\n\nReport bugs: <bug-nano-pow@codecow.com>\nFull documentation: <https://www.npmjs.com/package/nano-pow>\n`)\n\tprocess.exit(0)\n}\n\nconst inArgs: string[] = []\nlet isParsingHash: boolean = true\nwhile (isParsingHash) {\n\tif (!isHex32(args[args.length - 1])) break\n\ttry {\n\t\tinArgs.unshift(args.pop() as string)\n\t} catch {\n\t\tisParsingHash = false\n\t}\n}\nhashes.push(...inArgs)\n\nlet isBatch = false\nlet isBenchmark = false\nlet runs = 1\nconst body: Record<string, any> = {\n\taction: 'work_generate'\n}\n\nfor (let i = 0; i < args.length; i++) {\n\tswitch (args[i]) {\n\t\tcase ('--batch'):\n\t\tcase ('-b'): {\n\t\t\tisBatch = true\n\t\t\tbreak\n\t\t}\n\t\tcase ('--benchmark'): {\n\t\t\tconst b = args[i + 1]\n\t\t\tif (b == null) throw new Error('Missing argument for benchmark')\n\t\t\tconst count = +b\n\t\t\tif (count < 1) throw new Error('Invalid benchmark count')\n\t\t\tgenerateHashes(count)\n\t\t\tisBenchmark = true\n\t\t\tbreak\n\t\t}\n\t\tcase ('--debug'): {\n\t\t\tlogger.isEnabled = true\n\t\t\tprocess.env.NANO_POW_DEBUG = 'true'\n\t\t\tbreak\n\t\t}\n\t\tcase ('--difficulty'):\n\t\tcase ('-d'): {\n\t\t\tconst d = args[i + 1]\n\t\t\tif (d == null) throw new Error('Missing argument for difficulty')\n\t\t\tif (!isHex8(d)) throw new Error('Invalid argument for difficulty')\n\t\t\tbody.difficulty = d\n\t\t\tbreak\n\t\t}\n\t\tcase ('--effort'):\n\t\tcase ('-e'): {\n\t\t\tconst e = args[i + 1]\n\t\t\tif (e == null) throw new Error('Missing argument for effort')\n\t\t\tif (parseInt(e) < 1 || parseInt(e) > 32) throw new Error('Invalid effort')\n\t\t\tprocess.env.NANO_POW_EFFORT = e\n\t\t\tbreak\n\t\t}\n\t\tcase ('--score'): {\n\t\t\tconst s = args[i + 1]\n\t\t\tif (s == null) throw new Error('Missing argument for score')\n\t\t\tconst count = +s\n\t\t\tif (count < 1) throw new Error('Invalid score runs count')\n\t\t\truns = count\n\t\t\tbreak\n\t\t}\n\t\tcase ('--validate'):\n\t\tcase ('-v'): {\n\t\t\tconst v = args[i + 1]\n\t\t\tif (v == null) throw new Error('Missing argument for work validation')\n\t\t\tif (!isHex8(v)) throw new Error('Invalid argument for work validation')\n\t\t\tif (hashes.length !== 1) throw new Error('Validate accepts exactly one hash')\n\t\t\tbody.action = 'work_validate'\n\t\t\tbody.work = v\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nif (hashes.length === 0) {\n\tconsole.error('Invalid block hash input')\n\tprocess.exit(1)\n}\n\nlogger.log('CLI args: ', ...args)\nfor (const stdinErr of stdinErrors) {\n\tlogger.log(stdinErr)\n}\n\n// Initialize server\nlogger.log('launching server')\n\nconst server = spawn(\n\tprocess.execPath,\n\t[new URL(import.meta.resolve('./server.js')).pathname],\n\t{ stdio: ['pipe', 'pipe', 'pipe', 'ipc'] }\n)\n\nserver.once('error', err => {\n\tlogger.log(err)\n\tprocess.exit(1)\n})\n\nserver.on('message', async (msg: Serializable): Promise<void> => {\n\tif (typeof msg === 'object' && msg != null\n\t\t&& 'type' in msg && typeof msg.type === 'string'\n\t\t&& 'data' in msg && typeof msg.data === 'string'\n\t) {\n\t\tif (msg.type === 'console') {\n\t\t\tlogger.log(msg.data)\n\t\t}\n\t\tif (msg.type === 'listening') {\n\t\t\tif (msg.data === 'ipc') {\n\t\t\t\tlogger.log(`CLI connected to server over IPC`)\n\t\t\t\ttry {\n\t\t\t\t\tif (isBenchmark) {\n\t\t\t\t\t\tif (runs > 1) {\n\t\t\t\t\t\t\tawait score()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait benchmark()\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait execute()\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tlogger.log(`Error executing ${body.action}`)\n\t\t\t\t} finally {\n\t\t\t\t\tserver.kill()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlogger.log('CLI server failed to connect over IPC')\n\t\t\t}\n\t\t}\n\t} else {\n\t\tlogger.log('received invalid message from server', msg)\n\t}\n})\n\nserver.on('close', code => {\n\tlogger.log(`Server closed with exit code ${code}`)\n\tprocess.exit(code)\n})\n\nasync function benchmark () {\n\tconsole.log('Running benchmark...')\n\tlet start = 0, end = 0\n\tconst times: number[] = []\n\tfor (const hash of hashes) {\n\t\tconst kill = setTimeout(() => {\n\t\t\tthrow new Error('cli execution timed out')\n\t\t}, 60_000)\n\t\tbody.hash = hash\n\t\ttry {\n\t\t\tstart = performance.now()\n\t\t\tawait request(body)\n\t\t\tend = performance.now()\n\t\t\ttimes.push(end - start)\n\t\t} catch (err) {\n\t\t\tlogger.log(err)\n\t\t} finally {\n\t\t\tclearTimeout(kill)\n\t\t}\n\t}\n\tconsole.log(stats(times))\n\treturn stats(times)\n}\n\nasync function execute (): Promise<void> {\n\tconst results: (WorkErrorResponse | WorkGenerateResponse | WorkValidateResponse)[] = []\n\tfor (const hash of hashes) {\n\t\tconst kill = setTimeout(() => {\n\t\t\tthrow new Error('cli execution timed out')\n\t\t}, 60_000)\n\t\tbody.hash = hash\n\t\ttry {\n\t\t\tconst result = await request(body)\n\t\t\tisBatch ? results.push(result) : console.log(result)\n\t\t} catch (err) {\n\t\t\tlogger.log(err)\n\t\t} finally {\n\t\t\tclearTimeout(kill)\n\t\t}\n\t}\n\tif (isBatch) console.log(results)\n}\n\nfunction generateHashes (count: number) {\n\tconst random = new Uint8Array(32)\n\twhile (hashes.length < count) {\n\t\tgetRandomValues(random)\n\t\thashes.push(Buffer.from(random).toString('hex'))\n\t}\n}\n\nasync function request (body: Record<string, any>): Promise<WorkGenerateResponse | WorkValidateResponse | WorkErrorResponse> {\n\treturn new Promise((resolve, reject): void => {\n\t\tconst listener = async (msg: Serializable): Promise<void> => {\n\t\t\tif (typeof msg === 'object' && msg != null\n\t\t\t\t&& 'type' in msg && typeof msg.type === 'string'\n\t\t\t\t&& 'data' in msg && typeof msg.data === 'string'\n\t\t\t) {\n\t\t\t\tif (msg.type === 'ipc') {\n\t\t\t\t\tresolve(JSON.parse(msg.data))\n\t\t\t\t\tserver.off('message', listener)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tserver.on('message', listener)\n\t\tserver.send({ type: 'ipc', data: JSON.stringify(body) }, cb => cb ? reject(cb) : logger.log('cli ipc request to server'))\n\t})\n}\n\nasync function score (): Promise<void> {\n\tconsole.log('Calculating work per second...')\n\tconst rates: number[] = []\n\tfor (let i = 0; i < runs; i++) {\n\t\ttry {\n\t\t\tconst result = await benchmark()\n\t\t\tlogger.log(result)\n\t\t\tif (result != null) rates.push(result.truncatedRate)\n\t\t\tconst count = hashes.length\n\t\t\thashes.splice(0, hashes.length)\n\t\t\tgenerateHashes(count)\n\t\t} catch (err) {\n\t\t\tlogger.log(err)\n\t\t}\n\t}\n\tconsole.log(stats(rates)?.truncatedHarmonic, 'wps')\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["body"]
|
|
7
|
-
}
|
package/dist/bin/server.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/bin/server.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { WorkErrorResponse, WorkGenerateResponse, WorkValidateResponse } from 'nano-pow'\nimport { Logger, isHex32, isHex8 } from 'nano-pow/utils'\nimport { Serializable } from 'node:child_process'\nimport { hash } from 'node:crypto'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport * as http from 'node:http'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { launch } from 'puppeteer'\n\n/**\n* Used to define NanoPow server configuration.\n*\n* @param {boolean} DEBUG - Enables additional log output\n* @param {number} EFFORT - Defines dispatch size per compute pass\n* @param {number} PORT - TCP port on which to listen for requests\n*/\ntype NanoPowServerConfig = {\n\t[key: string]: boolean | number\n\tDEBUG: boolean\n\tEFFORT: number\n\tPORT: number\n}\n\nprocess.title = 'NanoPow Server'\nawait writeFile(`${homedir()}/.nano-pow/server.pid`, `${process.pid}\\n`)\nconst logger = new Logger()\n\nconst MAX_CONNECTIONS = 1024\nconst MAX_HEADER_COUNT = 32\nconst MAX_IDLE_TIME = 30_000\nconst MAX_REQUEST_COUNT = 10\nconst MAX_REQUEST_SIZE = 256\nconst MAX_REQUEST_TIME = 60_000\n\nconst CONFIG: NanoPowServerConfig = {\n\tDEBUG: false,\n\tEFFORT: 4,\n\tPORT: 5040\n}\n\nconst configPatterns = {\n\tDEBUG: {\n\t\tr: /^[ \\t]*debug[ \\t]*(true|false)[ \\t]*(#.*)?$/i,\n\t\tv: (b: string) => ['1', 'true', 'yes'].includes(b)\n\t},\n\tEFFORT: {\n\t\tr: /^[ \\t]*effort[ \\t]*(\\d{1,2})[ \\t]*(#.*)?$/i,\n\t\tv: (n: string) => +n\n\t},\n\tPORT: {\n\t\tr: /^[ \\t]*port[ \\t]*(\\d{1,5})[ \\t]*(#.*)?$/i,\n\t\tv: (n: string) => +n\n\t}\n} as const\n\n/**\n* Loads the server configuration, preferring environment variables over the\n* config file in the `.nano-pow` directory, and falling back to default values\n* if no values are provided. Port will load initially, but changing it while the\n* server is running will require a server restart to take effect.\n*/\nasync function loadConfig (): Promise<void> {\n\tlet configFile = ''\n\ttry {\n\t\tconfigFile = await readFile(join(homedir(), '.nano-pow', 'config'), 'utf-8')\n\t} catch { }\n\tif (configFile.length > 0) {\n\t\tfor (const line of configFile.split('\\n')) {\n\t\t\tfor (const [k, { r, v }] of Object.entries(configPatterns)) {\n\t\t\t\tconst m = r.exec(line)\n\t\t\t\tif (m) CONFIG[k] = v(m[1])\n\t\t\t}\n\t\t}\n\t}\n\n\tCONFIG.DEBUG = ['1', 'true', 'yes'].includes(process.env.NANO_POW_DEBUG ?? '') || CONFIG.DEBUG\n\tCONFIG.EFFORT = +(process.env.NANO_POW_EFFORT ?? '') || CONFIG.EFFORT\n\tCONFIG.PORT = process.send ? 0 : +(process.env.NANO_POW_PORT ?? '') || CONFIG.PORT\n\tlogger.isEnabled = CONFIG.DEBUG\n\tif (configFile.length === 0) LOG: logger.log('config file not found')\n\tLOG: logger.log(`config set: ${JSON.stringify(CONFIG)}`)\n}\n\nawait loadConfig()\n\n// Initialize puppeteer\nLOG: logger.log('starting work server')\nconst NanoPow = await readFile(new URL('../index.js', import.meta.url), 'utf-8')\nLOG: logger.log('launching puppeteer browser')\nconst browser = await launch({\n\thandleSIGHUP: false,\n\thandleSIGINT: false,\n\thandleSIGTERM: false,\n\theadless: true,\n\targs: [\n\t\t'--disable-vulkan-surface',\n\t\t'--enable-features=Vulkan,DefaultANGLEVulkan,VulkanFromANGLE',\n\t\t'--enable-gpu',\n\t\t'--enable-unsafe-webgpu'\n\t]\n})\nLOG: logger.log('creating puppeteer page')\nconst page = await browser.newPage()\n\nconst src = `${NanoPow};window.NanoPow=NanoPow;`\nconst enc = `sha256-${hash('sha256', src, 'base64')}`\nconst body = `\n\t<!DOCTYPE html>\n\t<link rel=\"icon\" href=\"data:,\">\n\t<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; base-uri 'none'; form-action 'none'; script-src '${enc}' 'wasm-unsafe-eval'; worker-src blob: https://nanopow.invalid;\">\n\t<script type=\"module\">${src}</script>\n`\n\nLOG: logger.log('setting puppeteer request interception')\nawait page.setRequestInterception(true)\npage.on('request', req => {\n\tif (req.isInterceptResolutionHandled()) return\n\tif (req.url() === 'https://nanopow.invalid/') {\n\t\treq.respond({ status: 200, contentType: 'text/html', body })\n\t} else {\n\t\treq.continue()\n\t}\n})\npage.on('console', msg => logger.log(msg.text()))\nLOG: logger.log('navigating to https://nanopow.invalid/ to be intercepted')\nawait page.goto('https://nanopow.invalid/')\n\nLOG: logger.log('loading NanoPow handle')\nlet NanoPowHandle = await page.waitForFunction(async () => {\n\tawait window.navigator.gpu.requestAdapter()\n\treturn window.NanoPow\n})\n\nLOG: logger.log('puppeteer initialized')\n\n// Track requests by IP address, and let them fall off over time\nconst requests = new Map<string, { time: number, tokens: number }>()\n\nsetInterval(() => {\n\tconst now = Date.now()\n\tfor (const [ip, { time }] of requests) {\n\t\tif (time < now - MAX_REQUEST_TIME) {\n\t\t\trequests.delete(ip)\n\t\t}\n\t}\n}, MAX_REQUEST_TIME)\n\nasync function work (data: unknown): Promise<string> {\n\tlet resBody = 'request failed'\n\tif (data == null || typeof data !== 'object') {\n\t\tLOG: logger.log('Failed to parse request')\n\t\tthrow new Error(resBody)\n\t}\n\tif (Object.getPrototypeOf(data) !== Object.prototype) {\n\t\tLOG: logger.log('Data corrupted.')\n\t\tthrow new Error(resBody)\n\t}\n\tconst dataParsed = data as Record<string, unknown>\n\n\tlet { action, hash, work, difficulty } = dataParsed\n\tif (action !== 'work_generate' && action !== 'work_validate') {\n\t\tLOG: logger.log('Action must be work_generate or work_validate.')\n\t\tthrow new Error(resBody)\n\t}\n\tresBody = `${action} failed`\n\n\tif (!isHex32(hash)) {\n\t\tLOG: logger.log('Hash must be hex char(64)')\n\t\tthrow new Error(resBody)\n\t}\n\tif (difficulty !== undefined && !isHex8(difficulty)) {\n\t\tLOG: logger.log('Difficulty must be hex char(16).')\n\t\tthrow new Error(resBody)\n\t}\n\tif (action === 'work_validate') {\n\t\tif (!isHex8(work)) {\n\t\t\tLOG: logger.log('Work must be hex char(16).')\n\t\t\tthrow new Error(resBody)\n\t\t}\n\t} else {\n\t\tfunction f (n: any): asserts n is string { if (false) throw new Error() }\n\t\tf(work)\n\t}\n\n\tconst options = {\n\t\tapi: 'webgpu',\n\t\tdebug: CONFIG.DEBUG,\n\t\teffort: CONFIG.EFFORT,\n\t\tdifficulty\n\t}\n\ttry {\n\t\tconst result = (action === 'work_validate')\n\t\t\t? await page.evaluate((n, w, h, o): Promise<WorkValidateResponse | WorkErrorResponse> => {\n\t\t\t\tif (n == null) throw new Error('NanoPow not found')\n\t\t\t\treturn n.work_validate(w, h, o)\n\t\t\t}, NanoPowHandle, work, hash, options)\n\t\t\t: await page.evaluate((n, h, o): Promise<WorkGenerateResponse | WorkErrorResponse> => {\n\t\t\t\tif (n == null) throw new Error('NanoPow not found')\n\t\t\t\treturn n.work_generate(h, o)\n\t\t\t}, NanoPowHandle, hash, options)\n\t\tresBody = JSON.stringify(result)\n\t\treturn resBody\n\t} catch (err) {\n\t\tLOG: logger.log(err)\n\t\tthrow new Error(resBody)\n\t}\n}\n\nfunction get (res: http.ServerResponse): void {\n\tres\n\t\t.writeHead(200, { 'Content-Type': 'text/plain' })\n\t\t.end(`Usage: Send POST request to server URL to generate or validate Nano proof-of-work\n\nGenerate work for a HASH with an optional DIFFICULTY:\n curl -d '{ \"action\": \"work_generate\", \"hash\": HASH, \"difficulty\": DIFFICULTY }' nanopow.example.com\n\nValidate WORK previously calculated for a HASH with an optional DIFFICULTY:\n curl -d '{ \"action\": \"work_validate\", \"work\": WORK, \"hash\": HASH, \"difficulty\": DIFFICULTY }' nanopow.example.com\n\nHASH is a big-endian 64-character hexadecimal string.\nWORK is little-endian 16-character hexadecimal string.\nDIFFICULTY is an optional 16-character hexadecimal string (default: FFFFFFF800000000)\n\nString variables must be enclosed in double-quotes to be valid JSON.\n\nReport bugs: <bug-nano-pow@codecow.com>\nFull documentation: <https://www.npmjs.com/package/nano-pow>\n`)\n}\n\nasync function post (res: http.ServerResponse, reqData: Buffer[]): Promise<void> {\n\tconst resHeaders: http.OutgoingHttpHeaders = { 'Content-Type': 'application/json' }\n\tlet resStatusCode = 500\n\tlet resBody = 'request failed'\n\n\ttry {\n\t\tresBody = await work(JSON.parse(Buffer.concat(reqData).toString()))\n\t\tresStatusCode = 200\n\t} catch (err: any) {\n\t\tresBody = err.message\n\t\tresStatusCode = 400\n\t} finally {\n\t\tres.writeHead(resStatusCode, resHeaders).end(resBody)\n\t}\n}\n\n/**\n* Parses headers to retrieve true client IP address.\n*\n* @param {IncomingMessage} req - Client request to parse\n* @returns IP address from headers or socket or undefined\n*/\nfunction getIp (req: http.IncomingMessage): string | undefined {\n\tconst xff = req.headers['x-forwarded-for']\n\tconst ip = (typeof xff === 'string')\n\t\t? xff.split(',')[0].trim().replace(/^::ffff:/, '')\n\t\t: req.socket.remoteAddress\n\treturn ip\n}\n\n/**\n* Checks if IP address has requested too much work recently. Ignores IPC and\n* local clients which are used by the CLI.\n*\n* @param ip - Client IP address, possibly local\n* @returns True if IP is out of time-limited tokens and should be throttled\n*/\nfunction isRateLimited (ip: string): boolean {\n\tif (ip === '127.0.0.1' || ip === '::1' || process.send) {\n\t\treturn false\n\t}\n\tconst client = requests.get(ip)\n\tif (client && client.tokens-- <= 0) {\n\t\tLOG: logger.log(`==== Potential Abuse: ${ip} ====`)\n\t\treturn true\n\t}\n\tif (Date.now() - MAX_REQUEST_TIME > (client?.time ?? 0)) {\n\t\trequests.set(ip, { tokens: MAX_REQUEST_COUNT, time: Date.now() })\n\t}\n\treturn false\n}\n\n/**\n* Starts server listening on configured port. If spawned by IPC, sends a message\n* to the parent process with the port number assigned by the operating system.\n*/\nfunction listen (): void {\n\tif (process.channel) {\n\t\tprocess.on('message', async (msg: Serializable) => {\n\t\t\tif (typeof msg === 'object' && msg != null\n\t\t\t\t&& 'type' in msg && typeof msg.type === 'string'\n\t\t\t\t&& 'data' in msg && typeof msg.data === 'string'\n\t\t\t) {\n\t\t\t\tif (msg.type === 'ipc') {\n\t\t\t\t\tconst data = JSON.parse(msg.data)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await work(data)\n\t\t\t\t\t\tprocess.send?.({ type: 'ipc', data: result })\n\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\tprocess.send?.({ type: 'ipc', data: err.stack })\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\tLOG: logger.log(`server listening on ipc`)\n\t\tprocess.send?.({ type: 'listening', data: 'ipc' })\n\t} else {\n\t\tserver.listen(CONFIG.PORT, '127.0.0.1', () => {\n\t\t\tconst address = server.address()\n\t\t\tif (address == null) {\n\t\t\t\tLOG: logger.log(`server closed`)\n\t\t\t} else if (typeof address === 'string') {\n\t\t\t\tLOG: logger.log(`server listening on ${address}`)\n\t\t\t\tprocess.send?.({ type: 'listening', data: address })\n\t\t\t} else {\n\t\t\t\tCONFIG.PORT = address.port\n\t\t\t\tLOG: logger.log(`server listening on port ${address.port}`)\n\t\t\t\tprocess.send?.({ type: 'listening', data: address.port })\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n* Reads streaming data from an inbound client request.\n*\n* @param {IncomingMessage} req - Client request for which to process data\n* @returns Buffer array of final data\n*/\nasync function readIncomingMessage (req: http.IncomingMessage): Promise<Buffer[]> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst contentLength = +(req.headers['content-length'] ?? 0)\n\t\tif (contentLength === 0 || contentLength > MAX_REQUEST_SIZE) {\n\t\t\treject(new Error('Content Too Large', { cause: { code: 413 } }))\n\t\t}\n\t\tconst kill = setTimeout(() => {\n\t\t\treject(new Error('Request Timeout', { cause: { code: 408 } }))\n\t\t}, MAX_IDLE_TIME)\n\t\tconst reqData: Buffer[] = []\n\t\tlet reqSize = 0\n\t\treq.on('data', chunk => {\n\t\t\treqSize += chunk.byteLength\n\t\t\tif (reqSize > MAX_REQUEST_SIZE) {\n\t\t\t\treject(new Error('Content Too Large', { cause: { code: 413 } }))\n\t\t\t}\n\t\t\treqData.push(chunk)\n\t\t})\n\t\treq.on('end', () => {\n\t\t\tclearTimeout(kill)\n\t\t\tresolve(reqData)\n\t\t})\n\t\treq.once('error', reject)\n\t})\n}\n\n/**\n* Creates server and configures POST data aggregation and GET response call.\n*/\nconst server = http.createServer(async (req, res) => {\n\tconst ip = getIp(req)\n\tif (!ip) return res.writeHead(401).end('Unauthorized')\n\tif (isRateLimited(ip)) return res.writeHead(429).end('Too Many Requests')\n\tif (req.method === 'POST') {\n\t\ttry {\n\t\t\tconst reqData = await readIncomingMessage(req)\n\t\t\tpost(res, reqData)\n\t\t} catch (err: any) {\n\t\t\treq.socket.destroy()\n\t\t\treturn res.writeHead(err.cause?.code ?? 500).end(err.message ?? 'Internal Server Error')\n\t\t}\n\t} else if (req.method === 'GET') {\n\t\tget(res)\n\t} else if (req.method === 'HEAD') {\n\t\treturn res.writeHead(200, { 'Content-Type': 'text/plain' }).end()\n\t} else if (['CONNECT', 'DELETE', 'OPTIONS', 'PATCH', 'PUT', 'TRACE'].includes(req.method ?? '')) {\n\t\treturn res.writeHead(405, { 'Allow': 'GET, HEAD, POST' }).end('Method Not Allowed')\n\t} else {\n\t\treturn res.writeHead(501).end('Not Implemented')\n\t}\n})\n\nserver.headersTimeout = MAX_IDLE_TIME\nserver.keepAliveTimeout = MAX_IDLE_TIME\nserver.maxConnections = MAX_CONNECTIONS\nserver.maxHeadersCount = MAX_HEADER_COUNT\n\nserver.on('connection', s => {\n\ts.setTimeout(MAX_IDLE_TIME, () => s.destroy())\n})\n\nserver.on('error', serverErr => {\n\tLOG: logger.log('server error', serverErr)\n\ttry {\n\t\tshutdown()\n\t} catch (shutdownErr) {\n\t\tLOG: logger.log('server failed to shut down', shutdownErr)\n\t\tprocess.exit(1)\n\t}\n})\n\n/**\n* Shuts down server gracefully when process is terminated or forcefully if it\n* does not respond within 10 seconds.\n*/\nfunction shutdown (): void {\n\tLOG: logger.log('shutdown signal received')\n\tconst kill = setTimeout((): never => {\n\t\tLOG: logger.log('server unresponsive, forcefully stopped')\n\t\tprocess.exit(1)\n\t}, 10_000)\n\tserver.close(async (): Promise<never> => {\n\t\tawait browser.close()\n\t\tclearTimeout(kill)\n\t\tLOG: logger.log('server stopped')\n\t\tprocess.exit(0)\n\t})\n}\n\nprocess.on('SIGINT', shutdown)\nprocess.on('SIGTERM', shutdown)\n\nprocess.on('SIGHUP', async () => {\n\tLOG: logger.log('reloading configuration')\n\tserver.close(async () => {\n\t\tawait loadConfig()\n\t\tawait page.reload()\n\t\tNanoPowHandle = await page.waitForFunction(() => {\n\t\t\treturn window.NanoPow\n\t\t})\n\t\tlisten()\n\t})\n})\n\nlisten()\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["hash", "work", "f"]
|
|
7
|
-
}
|
package/dist/index.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/api-support/wasm.ts", "../src/utils/api-support/webgl.ts", "../src/utils/api-support/webgpu.ts", "../src/utils/api-support/index.ts", "../src/utils/bigint.ts", "../src/utils/cache.ts", "../src/utils/logger.ts", "../src/utils/queue.ts", "../src/utils/index.ts", "../src/lib/config/index.ts", "../src/lib/validate/index.ts", "../src/lib/generate/cpu/index.ts", "../src/lib/generate/wasm/worker.ts", "../src/lib/generate/wasm/index.ts", "../src/lib/generate/webgl/shaders/downsample.frag", "../src/lib/generate/webgl/shaders/draw.frag", "../src/lib/generate/webgl/shaders/quad.vert", "../src/lib/generate/webgl/shaders/index.ts", "../src/lib/generate/webgl/index.ts", "../src/lib/generate/webgpu/shaders/compute.wgsl", "../src/lib/generate/webgpu/index.ts", "../src/lib/generate/index.ts", "../src/lib/index.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nconst wasm = { isSupported: false }\nObject.defineProperty(wasm, 'isSupported', {\n\tget: async function () {\n\t\tlet isWasmSupported = false\n\t\ttry {\n\t\t\t// (func (result v128) (v128.const i32x4 0 0 0 0))\n\t\t\tconst wasmBuffer = new Uint8Array([\n\t\t\t\t0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, // WASM magic header and version\n\t\t\t\t0x01, 0x04, // Type section, 4 byte descriptor\n\t\t\t\t0x01, 0x60, 0x00, 0x00, // 1 type, type function, 0 params, 0 returns\n\t\t\t\t0x03, 0x02, // Function section, 2 byte descriptor\n\t\t\t\t0x01, 0x00, // 1 function, ID 0\n\t\t\t\t0x0a, 0x17, // Code section, 23 bytes\n\t\t\t\t0x01, 0x15, // 1 function body, 21 bytes\n\t\t\t\t0x00, // 0 local variables\n\t\t\t\t0xfd, 0x0c, // v128.const\n\t\t\t\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // assign i64x2 values\n\t\t\t\t0x1a, 0x0b // Drop result, end function\n\t\t\t])\n\t\t\tconst module = await WebAssembly.compile(wasmBuffer)\n\t\t\tconst instance = await WebAssembly.instantiate(module)\n\t\t\tisWasmSupported = (instance instanceof WebAssembly.Instance)\n\t\t} catch (err: any) {\n\t\t\tconsole.warn('WASM is not supported in this environment.\\n', err.message ?? err)\n\t\t\tisWasmSupported = false\n\t\t} finally {\n\t\t\tdelete this.isSupported\n\t\t\tthis.isSupported = isWasmSupported\n\t\t\treturn this.isSupported\n\t\t}\n\t}\n})\n\nexport { wasm }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nconst webgl = { isSupported: false }\nObject.defineProperty(webgl, 'isSupported', {\n\tget: async function () {\n\t\tlet isWebglSupported = false\n\t\ttry {\n\t\t\tconst gl = new OffscreenCanvas(0, 0)?.getContext?.('webgl2')\n\t\t\tisWebglSupported = (gl instanceof WebGL2RenderingContext && !gl.isContextLost())\n\t\t} catch (err) {\n\t\t\tconsole.warn('WebGL is not supported in this environment.\\n', err)\n\t\t\tisWebglSupported = false\n\t\t} finally {\n\t\t\tdelete this.isSupported\n\t\t\tthis.isSupported = isWebglSupported\n\t\t\treturn this.isSupported\n\t\t}\n\t}\n})\n\nexport { webgl }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nconst webgpu = { isSupported: false }\nObject.defineProperty(webgpu, 'isSupported', {\n\tget: async function () {\n\t\tlet isWebgpuSupported = false\n\t\ttry {\n\t\t\tconst adapter = await navigator?.gpu?.requestAdapter?.()\n\t\t\tconst device = await adapter?.requestDevice?.()\n\t\t\tisWebgpuSupported = (adapter instanceof GPUAdapter && device instanceof GPUDevice)\n\t\t} catch (err) {\n\t\t\tconsole.warn('WebGPU is not supported in this environment.\\n', err)\n\t\t\tisWebgpuSupported = false\n\t\t} finally {\n\t\t\tdelete this.isSupported\n\t\t\tthis.isSupported = isWebgpuSupported\n\t\t\treturn this.isSupported\n\t\t}\n\t}\n})\n\nexport { webgpu }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { wasm } from './wasm'\nimport { webgl } from './webgl'\nimport { webgpu } from './webgpu'\n\nexport const ApiSupport = { cpu: { isSupported: true }, wasm, webgl, webgpu }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { isHexN } from '#utils'\n\nexport function big (value: bigint | boolean | number | string | unknown): bigint {\n\tswitch (typeof value) {\n\t\tcase 'bigint':\n\t\tcase 'boolean':\n\t\tcase 'number': {\n\t\t\treturn BigInt(value)\n\t\t}\n\t\tcase 'string': {\n\t\t\tconst v = value.trim().replace(/^0[Xx]/, '').replace(/[Nn]$/, '')\n\t\t\tif (!isHexN(v, null)) throw TypeError('invalid hex string', { cause: value })\n\t\t\treturn BigInt(`0x${v}`)\n\t\t}\n\t\tdefault: {\n\t\t\tthrow TypeError(`can't convert value to BigInt`)\n\t\t}\n\t}\n}\n\nexport function bigHex (int: bigint, length: number = 0): string {\n\treturn int.toString(16).padStart(length, '0')\n}\n\nexport function bigToU32 (int: bigint, length: number): Uint32Array<ArrayBuffer> {\n\tconst u32 = new Uint32Array(length)\n\tbigintToUintArray(u32, int)\n\treturn u32\n}\n\nexport function bigToU64 (int: bigint, length: number): BigUint64Array<ArrayBuffer> {\n\tconst u64 = new BigUint64Array(length)\n\tbigintToUintArray(u64, int)\n\treturn u64\n}\n\nfunction bigintToUintArray (out: Uint32Array<ArrayBuffer> | BigUint64Array<ArrayBuffer>, int: bigint): void {\n\tif (int < 0n) int = ~(int - 1n)\n\tconst bits = out instanceof BigUint64Array ? 64n : 32n\n\tconst mask = (1n << bits) - 1n\n\tfor (let i = out.length - 1; i >= 0 && int > 0n; i--) {\n\t\tconst v = int & mask\n\t\tout[i] = bits === 64n ? v : Number(v)\n\t\tint >>= bits\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { WorkGenerateResponse } from 'nano-pow'\n\nconst STORAGE_KEY = 'NanoPowCache'\n\nconst storage = globalThis.localStorage ?? {\n\trecords: new Map<string, string>(),\n\tgetItem (key: string): string | null {\n\t\treturn this.records.get(key)\n\t},\n\tremoveItem (key: string): void {\n\t\tthis.records.delete(key)\n\t},\n\tsetItem (key: string, item: string): void {\n\t\tthis.storage.set(key, item)\n\t}\n}\n\nfunction eq (a: unknown, b: bigint): boolean {\n\treturn typeof a === 'string'\n\t\t&& /^([a-f0-9]{2})+$/i.test(a)\n\t\t&& BigInt(`0x${a}`) === b\n}\n\nexport const Cache = {\n\tclear (): void {\n\t\tstorage.removeItem(STORAGE_KEY)\n\t},\n\tdelete (hash: unknown): void {\n\t\tconst item = storage.getItem(STORAGE_KEY)\n\t\tif (item == null) return\n\t\tconst cache = JSON.parse(item) as WorkGenerateResponse[]\n\t\tfor (let i = 0; i < cache.length; i++) {\n\t\t\tif (cache[i].hash === hash) {\n\t\t\t\tcache.splice(i, 1)\n\t\t\t}\n\t\t}\n\t\tstorage.setItem(STORAGE_KEY, JSON.stringify(cache))\n\t},\n\tsearch (hash: unknown, difficulty: bigint): WorkGenerateResponse | null {\n\t\tconst item = storage.getItem(STORAGE_KEY)\n\t\tif (item == null) return null\n\t\tconst cache: WorkGenerateResponse[] = JSON.parse(item)\n\t\tconst match = cache.find(c => c.hash === hash && eq(c.difficulty, difficulty))\n\t\treturn match ?? null\n\t},\n\tstore (result: WorkGenerateResponse): WorkGenerateResponse {\n\t\tconst item = storage.getItem(STORAGE_KEY) ?? '[]'\n\t\tconst cache: WorkGenerateResponse[] = JSON.parse(item)\n\t\tif (cache.push(result) > 1000) cache.shift()\n\t\tstorage.setItem(STORAGE_KEY, JSON.stringify(cache))\n\t\treturn result\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\n/**\n * Override console logging to provide an informative prefix for each entry and\n * to only output when debug mode is enabled.\n */\nexport class Logger {\n\tisEnabled: boolean = false\n\tgroups: Record<string, boolean> = {}\n\n\tgroupStart (name: string): void {\n\t\tif (this.isEnabled) {\n\t\t\tconsole.groupCollapsed(name)\n\t\t\tthis.groups[name] = true\n\t\t}\n\t}\n\n\tgroupEnd (name: string): void {\n\t\tif (this.groups[name]) {\n\t\t\tconsole.groupEnd()\n\t\t\tdelete this.groups[name]\n\t\t}\n\t}\n\n\tlog (...args: any[]): void {\n\t\tif (this.isEnabled) {\n\t\t\tconst datetime = new Date(Date.now()).toLocaleString(Intl.DateTimeFormat().resolvedOptions().locale ?? 'en-US', { hour12: false, dateStyle: 'medium', timeStyle: 'medium' })\n\t\t\tfor (let i = 0; i < args.length; i++) {\n\t\t\t\tif (typeof args[i] === 'string') {\n\t\t\t\t\targs[i] = args[i].replace(datetime, '').trimStart()\n\t\t\t\t}\n\t\t\t\tif (args[i] instanceof Error) {\n\t\t\t\t\tif ('stack' in args[i]) {\n\t\t\t\t\t\targs.splice(i + 1, 0, args[i].stack)\n\t\t\t\t\t} else if ('message' in args[i]) {\n\t\t\t\t\t\targs.splice(i + 1, 0, args[i].message)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst entry = `${datetime} ${globalThis.process?.title ?? 'NanoPow'}[${globalThis.process?.pid ?? 'browser'}]:`\n\t\t\tconsole.log(entry, ...args)\n\t\t\tglobalThis.process?.send?.({ type: 'console', data: `${entry} ${args}` })\n\t\t}\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\n/**\n * Serially executes asynchronous functions.\n */\nexport class Queue {\n\t#isIdle: boolean\n\t#queue: any[]\n\n\tconstructor () {\n\t\tthis.#isIdle = true\n\t\tthis.#queue = []\n\t}\n\n\t#process = (): void => {\n\t\tconst { task, resolve, reject, args } = this.#queue.shift() ?? {}\n\t\tthis.#isIdle = !task\n\t\ttask?.(...args).then(resolve).catch(reject).finally(this.#process)\n\t}\n\n\tasync add (task: unknown, ...args: any[]): Promise<any> {\n\t\tif (typeof task !== 'function') throw new TypeError('task is not a function')\n\t\treturn new Promise((resolve, reject): void => {\n\t\t\tthis.#queue.push({ task, resolve, reject, args })\n\t\t\tif (this.#isIdle) this.#process()\n\t\t})\n\t}\n\n\tasync prioritize (task: unknown, ...args: any[]): Promise<any> {\n\t\tif (typeof task !== 'function') throw new TypeError('task is not a function')\n\t\treturn new Promise((resolve, reject): void => {\n\t\t\tif (typeof task !== 'function') reject('task is not a function')\n\t\t\tthis.#queue.unshift({ task, resolve, reject, args })\n\t\t\tif (this.#isIdle) this.#process()\n\t\t})\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nexport * from './api-support'\nexport * from './bigint'\nexport * from './cache'\nexport * from './logger'\nexport * from './queue'\n\nexport const SEND = 0xfffffff800000000n as const\nexport const RECEIVE = 0xfffffe0000000000n as const\nexport const MAX_HASH = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn as const\n\ntype Averages = {\n\tcount: number,\n\ttotal: number,\n\trate: number,\n\tmin: number,\n\tmax: number,\n\tmedian: number,\n\tarithmetic: number,\n\tgeometric: number,\n\tharmonic: number,\n\ttruncatedCount: number,\n\ttruncatedTotal: number,\n\ttruncatedRate: number,\n\ttruncatedMin: number,\n\ttruncatedMax: number,\n\ttruncatedArithmetic: number,\n\ttruncatedGeometric: number,\n\ttruncatedHarmonic: number,\n}\n\n/**\n* Checks if value is a string representing an N-byte hexadecimal number.\n*\n* @param {unknown} value - String to check. Be sure to trim whitespace, hex '0x' prefix, and bigint 'n' suffix.\n* @param {(number|null)} byteLength - Number of bytes the string should represent, or 'null' for any number greater than zero.\n* @returns True if value is a 2N-character hexadecimal string, else false.\n*/\nexport function isHexN (value: unknown, byteLength: number | null): value is string {\n\tif (typeof value !== 'string') return false\n\tconst length = byteLength === null ? '+' : `{${byteLength << 1}}`\n\tconst r = new RegExp(`^[0-9a-f]${length}$`, 'i')\n\treturn r.test(value)\n}\n\n/**\n* Checks if value is a string representing an 8-byte hexadecimal number.\n*\n* @param {unknown} value - Value to check.\n* @returns True if value is a 16-character hexadecimal string, else false.\n*/\nexport function isHex8 (value: unknown): value is string {\n\treturn isHexN(value, 8)\n}\n\n/**\n* Checks if value is a string representing a 32-byte hexadecimal number.\n*\n* @param {unknown} value - Value to check.\n* @returns True if value is a 64-character hex string, else false.\n*/\nexport function isHex32 (value: unknown): value is string {\n\treturn isHexN(value, 32)\n}\n\n/**\n* Computes various types of averages for a set of numbers.\n*\n* @param {number[]} times - List of numbers, often timing durations.\n* @returns Object with averaged values for the specified list.\n*/\nexport function stats (times: number[]): Averages | null {\n\tif (times == null || times.length === 0) return null\n\n\tconst count = times.length\n\tconst truncatedStart = Math.floor(count * 0.1)\n\tconst truncatedEnd = count - truncatedStart\n\tconst truncatedCount = truncatedEnd - truncatedStart\n\tlet min = Number.MAX_SAFE_INTEGER\n\tlet logarithms, max, median, reciprocals, total\n\tlogarithms = max = median = reciprocals = total = 0\n\n\tlet truncatedMin = Number.MAX_SAFE_INTEGER\n\tlet truncatedLogarithms, truncatedMax, truncatedReciprocals, truncatedTotal\n\ttruncatedLogarithms = truncatedMax = truncatedReciprocals = truncatedTotal = 0\n\n\ttimes.sort((a, b) => a - b)\n\tfor (let i = 0; i < count; i++) {\n\t\tconst time = times[i]\n\t\ttotal += time\n\t\tlogarithms += Math.log(time)\n\t\treciprocals += 1 / time\n\t\tmin = Math.min(min, time)\n\t\tmax = Math.max(max, time)\n\t\tif (i === Math.floor((count - 1) / 2)) median = time\n\t\tif (i === Math.floor(count / 2) && count % 2 === 0) median = (median + time) / 2\n\t}\n\tfor (let i = truncatedStart; i < truncatedEnd; i++) {\n\t\tconst time = times[i]\n\t\ttruncatedTotal += time\n\t\ttruncatedLogarithms += Math.log(time)\n\t\ttruncatedReciprocals += 1 / time\n\t\ttruncatedMin = Math.min(truncatedMin, time)\n\t\ttruncatedMax = Math.max(truncatedMax, time)\n\t}\n\treturn {\n\t\tcount,\n\t\ttotal,\n\t\trate: 1000 * count / total,\n\t\tmin,\n\t\tmax,\n\t\tmedian,\n\t\tarithmetic: total / count,\n\t\tgeometric: Math.exp(logarithms / count),\n\t\tharmonic: count / reciprocals,\n\t\ttruncatedCount,\n\t\ttruncatedTotal,\n\t\ttruncatedRate: 1000 * truncatedCount / truncatedTotal,\n\t\ttruncatedMin,\n\t\ttruncatedMax,\n\t\ttruncatedArithmetic: truncatedTotal / truncatedCount,\n\t\ttruncatedGeometric: Math.exp(truncatedLogarithms / truncatedCount),\n\t\ttruncatedHarmonic: truncatedCount / truncatedReciprocals,\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { ApiSupport, big, bigHex, SEND } from '#utils'\n\ntype ApiSupportedTypes = keyof typeof ApiSupport\n\n/**\n * Input for configuring NanoPow. Must be validated prior to usage, so types are\n * `unknown`, but JSDoc indicates expected data types.\n *\n * @param {string} [api=cpu] - Specifies how work is generated. Default: cpu\n * @param {boolean} [debug=false] - Enables additional debug logging to the console. Default: false\n * @param {(bigint|string)} [difficulty=0xFFFFFFF800000000] - Minimum value result of `BLAKE2b(nonce||blockhash)`. Default: 0xFFFFFFF800000000\n * @param {number} [effort=0x4] - GPU load when generating work. Larger values are not necessarily better since they can quickly overwhelm the GPU. Default: 0x4\n */\nexport type NanoPowOptions = {\n\tapi?: unknown\n\tdebug?: unknown\n\tdifficulty?: unknown\n\teffort?: unknown\n}\n\nclass NanoPowConfigConstructor implements NanoPowOptions {\n\tstatic #isInternal: boolean = false\n\tstatic get isInternal (): boolean { return this.#isInternal }\n\tapi: ApiSupportedTypes\n\tdebug: boolean\n\tdifficulty: bigint\n\teffort: number\n\n\ttoJSON () {\n\t\treturn {\n\t\t\tapi: this.api,\n\t\t\tdebug: this.debug,\n\t\t\tdifficulty: bigHex(this.difficulty, 16),\n\t\t\teffort: this.effort\n\t\t}\n\t}\n\n\tconstructor (api: ApiSupportedTypes, debug: boolean, difficulty: bigint, effort: number) {\n\t\tif (!(this.constructor as typeof NanoPowConfigConstructor).isInternal) {\n\t\t\tthrow new TypeError(`NanoPowConfig cannot be constructed with 'new'.`)\n\t\t}\n\t\tthis.api = api\n\t\tthis.debug = debug\n\t\tthis.difficulty = difficulty\n\t\tthis.effort = effort\n\t}\n\n\tstatic async create (options: { api: unknown, debug: unknown, difficulty: unknown, effort: unknown } | unknown): Promise<NanoPowConfigConstructor> {\n\t\tconst input = options as Record<keyof NanoPowOptions, unknown>\n\n\t\tconst api = await this.#getValidApi(input)\n\t\tconst debug = this.#getValidDebug(input)\n\t\tconst difficulty = this.#getValidDifficulty(input)\n\t\tconst effort = this.#getValidEffort(input)\n\n\t\tthis.#isInternal = true\n\t\tconst config = new this(api, debug, difficulty, effort)\n\t\tthis.#isInternal = false\n\t\treturn config\n\t}\n\n\t// Check platform support for default API setting\n\tstatic async #getDefaultApi (): Promise<ApiSupportedTypes> {\n\t\tif (await ApiSupport.webgpu.isSupported) return 'webgpu'\n\t\tif (await ApiSupport.webgl.isSupported) return 'webgl'\n\t\tif (await ApiSupport.wasm.isSupported) return 'wasm'\n\t\treturn 'cpu'\n\t}\n\n\t// Assign API if valid value passed\n\tstatic async #getValidApi (input: Record<string, unknown>): Promise<ApiSupportedTypes> {\n\t\tif (input != null && input.api != null) {\n\t\t\tif (typeof input.api === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tinput.api = input.api.toLowerCase()\n\t\t\t\t} catch {\n\t\t\t\t\tinput.api = null\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (input.api !== 'cpu'\n\t\t\t\t&& input.api !== 'wasm'\n\t\t\t\t&& input.api !== 'webgl'\n\t\t\t\t&& input.api !== 'webgpu'\n\t\t\t) {\n\t\t\t\tthrow new Error(`Invalid API ${input.api}`)\n\t\t\t}\n\t\t\tif (!(ApiSupport[input.api].isSupported)) {\n\t\t\t\tthrow new Error(`${input.api} is not supported`)\n\t\t\t}\n\t\t\treturn input.api\n\t\t}\n\t\treturn this.#getDefaultApi()\n\t}\n\n\t// Assign debug if valid value passed\n\tstatic #getValidDebug (input: Record<string, unknown>): boolean {\n\t\tif (input != null && input.debug != null) {\n\t\t\tif (typeof input.debug === 'bigint' || typeof input.debug === 'number') {\n\t\t\t\tinput.debug = input.debug.toString()\n\t\t\t}\n\t\t\tif (typeof input.debug === 'string') {\n\t\t\t\tinput.debug = ['1', 'true', 'y', 'yes'].includes(input.debug.toLowerCase())\n\t\t\t}\n\t\t\tif (typeof input.debug !== 'boolean') {\n\t\t\t\tthrow new Error(`Invalid debug ${input.debug}`)\n\t\t\t}\n\t\t\treturn input.debug\n\t\t}\n\t\treturn false\n\t}\n\n\t// Assign difficulty if valid value passed\n\tstatic #getValidDifficulty (input: Record<string, unknown>): bigint {\n\t\tif (input != null && input.difficulty != null) {\n\t\t\tif (typeof input.difficulty === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tinput.difficulty = big(input.difficulty)\n\t\t\t\t} catch { }\n\t\t\t}\n\t\t\tif (typeof input.difficulty !== 'bigint') {\n\t\t\t\tthrow new Error(`Invalid difficulty ${input.difficulty}`)\n\t\t\t}\n\t\t\tif (input.difficulty < 0n || input.difficulty > SEND) {\n\t\t\t\tthrow new Error(`Invalid difficulty ${bigHex(input.difficulty, 16)}`)\n\t\t\t}\n\t\t\treturn input.difficulty\n\t\t}\n\t\treturn SEND\n\t}\n\n\t// Assign effort if valid value passed\n\tstatic #getValidEffort (input: Record<string, unknown>): number {\n\t\tif (input != null && input.effort != null) {\n\t\t\tif (typeof input.effort !== 'number') {\n\t\t\t\tthrow new Error(`Invalid effort (${typeof input.effort})${input.effort}`)\n\t\t\t}\n\t\t\tif (input.effort < 0x1 || input.effort > 0x20) {\n\t\t\t\tthrow new Error(`Invalid effort ${input.effort}`)\n\t\t\t}\n\t\t\treturn input.effort\n\t\t}\n\t\treturn 0x4\n\t}\n}\n\n/**\n * Validated NanoPowOptions object used to guarantee values and types.\n * Attempting to call using `new` with throw a TypeError.\n *\n * @param {string} api - Specifies how work is generated. Default: best available\n * @param {boolean} debug - Enables additional debug logging to the console. Default: false\n * @param {bigint} difficulty - Minimum value result of `BLAKE2b(nonce||blockhash)`. Default: 0xFFFFFFF800000000\n * @param {number} effort - GPU load when generating work. Larger values are not necessarily better since they can quickly overwhelm the GPU. Default: 0x4\n */\nexport const NanoPowConfig = (options: any): Promise<NanoPowConfigConstructor> => {\n\ttry {\n\t\treturn NanoPowConfigConstructor.create(options)\n\t} catch (err) {\n\t\tthrow new Error('Error constructing NanoPowConfig', { cause: err })\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { Logger, RECEIVE, SEND, bigHex, bigToU64 } from '#utils'\nimport { WorkValidateResponse } from 'nano-pow'\n\nconst logger = new Logger()\n\nconst blake2b_IV: readonly bigint[] = Object.freeze([\n\t0x6a09e667f3bcc908n,\n\t0xbb67ae8584caa73bn,\n\t0x3c6ef372fe94f82bn,\n\t0xa54ff53a5f1d36f1n,\n\t0x510e527fade682d1n,\n\t0x9b05688c2b3e6c1fn,\n\t0x1f83d9abfb41bd6bn,\n\t0x5be0cd19137e2179n\n])\n\nconst blake2b_sigma: readonly (readonly number[])[] = Object.freeze([\n\tObject.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),\n\tObject.freeze([14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3]),\n\tObject.freeze([11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4]),\n\tObject.freeze([7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8]),\n\tObject.freeze([9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13]),\n\tObject.freeze([2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9]),\n\tObject.freeze([12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11]),\n\tObject.freeze([13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10]),\n\tObject.freeze([6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5]),\n\tObject.freeze([10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0]),\n\tObject.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),\n\tObject.freeze([14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3])\n])\n\nconst blake2b_param = 0x01010008n\n\n// Initialize CPU\nconst v: BigUint64Array<ArrayBuffer> = new BigUint64Array(16)\nconst m: BigUint64Array<ArrayBuffer> = new BigUint64Array(16)\nconst mView: DataView = new DataView(m.buffer)\nlet result: bigint = 0n\n\nfunction G (a: number, b: number, c: number, d: number, x: number, y: number): void {\n\tv[a] += v[b] + m[x]\n\tv[d] ^= v[a]\n\tv[d] = (v[d] >> 32n) | (v[d] << 32n)\n\tv[c] += v[d]\n\tv[b] ^= v[c]\n\tv[b] = (v[b] >> 24n) | (v[b] << 40n)\n\tv[a] += v[b] + m[y]\n\tv[d] ^= v[a]\n\tv[d] = (v[d] >> 16n) | (v[d] << 48n)\n\tv[c] += v[d]\n\tv[b] ^= v[c]\n\tv[b] = (v[b] >> 63n) | (v[b] << 1n)\n}\n\nfunction ROUND (i: number): void {\n\tconst s = blake2b_sigma[i]\n\tG(0, 4, 8, 12, s[0], s[1])\n\tG(1, 5, 9, 13, s[2], s[3])\n\tG(2, 6, 10, 14, s[4], s[5])\n\tG(3, 7, 11, 15, s[6], s[7])\n\tG(0, 5, 10, 15, s[8], s[9])\n\tG(1, 6, 11, 12, s[10], s[11])\n\tG(2, 7, 8, 13, s[12], s[13])\n\tG(3, 4, 9, 14, s[14], s[15])\n}\n\nfunction init (seed: bigint, hash: BigUint64Array): void {\n\t// Reset buffers before each calculation\n\tresult = 0n\n\tfor (let i = 0; i < 8; i++) {\n\t\tv[i] = blake2b_IV[i]\n\t\tv[i + 8] = blake2b_IV[i]\n\t}\n\tv[0] ^= blake2b_param // depth = 1; fanout = 1; outlen = 8\n\tv[12] ^= 40n // Output length\n\tv[14] = ~v[14] // Compression\n\n\t// Set up input buffers\n\tmView.setBigUint64(0, seed, true)\n\tfor (let i = 0; i < 4; i++) {\n\t\tmView.setBigUint64(8 * (i + 1), hash[i])\n\t}\n}\n\nfunction blake2b (work: bigint, hash: bigint): void {\n\tinit(work, bigToU64(hash, 4))\n\tfor (let i = 0; i < 12; i++) {\n\t\tROUND(i)\n\t}\n\tresult = (blake2b_IV[0] ^ 0x01010008n ^ v[0] ^ v[8])\n}\n\nfunction log (work: bigint, hash: bigint, difficulty: bigint): void {\n\tLOG: logger.groupStart('NanoPow CPU work_validate')\n\tLOG: logger.log('NanoPow CPU work_validate', 'work', bigHex(work, 16))\n\tLOG: logger.log('NanoPow CPU work_validate', 'hash', bigHex(hash, 64))\n\tLOG: logger.log('NanoPow CPU work_validate', 'difficulty', bigHex(difficulty, 16))\n\tLOG: logger.log('NanoPow CPU work_validate', 'result', bigHex(result, 16))\n\tLOG: logger.groupEnd('NanoPow CPU work_validate')\n}\n\nfunction validate (work: bigint, hash: bigint, difficulty: bigint, debug: boolean): WorkValidateResponse {\n\tlogger.isEnabled = debug\n\tblake2b(work, hash)\n\tlog(work, hash, difficulty)\n\treturn {\n\t\thash: bigHex(hash, 64),\n\t\twork: bigHex(work, 16),\n\t\tdifficulty: bigHex(result, 16),\n\t\tvalid: (result >= difficulty) ? '1' : '0',\n\t\tvalid_all: (result >= SEND) ? '1' : '0',\n\t\tvalid_receive: (result >= RECEIVE) ? '1' : '0'\n\t}\n}\n\nexport { validate as NanoPowValidate }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { NanoPowValidate } from '#lib/validate'\nimport { Logger } from '#utils'\nimport { WorkGenerateResponse } from 'nano-pow'\n\nconst logger = new Logger()\n\nexport async function generate (hash: bigint, difficulty: bigint, debug: boolean): Promise<WorkGenerateResponse> {\n\tlogger.isEnabled = debug\n\tLOG: logger.groupStart('NanoPow CPU work_generate')\n\treturn new Promise((resolve, reject) => {\n\t\tconst check = () => {\n\t\t\ttry {\n\t\t\t\tconst seed = new BigUint64Array(1)\n\t\t\t\tLOG: logger.log('check 0x8000 nonces')\n\t\t\t\tlet result = NanoPowValidate(crypto.getRandomValues(seed)[0], hash, difficulty, false)\n\t\t\t\tfor (let i = 0; i < 0x8000; i++) {\n\t\t\t\t\tif (result.valid === '1') break\n\t\t\t\t\tresult = NanoPowValidate(crypto.getRandomValues(seed)[0], hash, difficulty, false)\n\t\t\t\t}\n\t\t\t\tif (result.valid === '1') {\n\t\t\t\t\tLOG: logger.groupEnd('NanoPow CPU work_generate')\n\t\t\t\t\tresolve({\n\t\t\t\t\t\thash: result.hash,\n\t\t\t\t\t\twork: result.work,\n\t\t\t\t\t\tdifficulty: result.difficulty\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\trequestAnimationFrame(check)\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\treject(err)\n\t\t\t}\n\t\t}\n\t\tcheck()\n\t})\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\n//@ts-expect-error\nimport compute from './asm/build/compute.wasm'\ntype Main = (w: bigint, h0: bigint, h1: bigint, h2: bigint, h3: bigint, d: bigint) => bigint\n\nconst worker = async (compute: number[]): Promise<void> => {\n\tlet isReady = false\n\tlet wasm\n\tlet module\n\tlet instance\n\tlet main: Main\n\n\tasync function setup (): Promise<void> {\n\t\ttry {\n\t\t\twasm = Uint8Array.from(compute)\n\t\t\tmodule = await WebAssembly.compile(wasm)\n\t\t\tinstance = await WebAssembly.instantiate(module, {\n\t\t\t\tenv: {\n\t\t\t\t\tabort: (message: any, fileName: any, lineNumber: any, columnNumber: any) => {\n\t\t\t\t\t\tconsole.error('Wasm abort:', message, fileName, lineNumber, columnNumber)\n\t\t\t\t\t\tthrow new Error(`Wasm abort: ${message}`)\n\t\t\t\t\t},\n\t\t\t\t\tmemory: new WebAssembly.Memory({ initial: 256, maximum: 1024 })\n\t\t\t\t}\n\t\t\t})\n\t\t\tmain = instance.exports.main as Main\n\t\t\tisReady = true\n\t\t} catch (err) {\n\t\t\tthrow new Error('Error instantiating WebAssembly', { cause: err })\n\t\t}\n\t}\n\n\tasync function handleMessage (msg: any): Promise<void> {\n\t\tif (msg?.data?.url !== self.location.href) return\n\t\tlet result: any = null\n\t\ttry {\n\t\t\tconst { data } = msg\n\t\t\tif (!isReady) await setup()\n\t\t\tconst hashArray = new BigUint64Array(4)\n\t\t\tconst hashView = new DataView(hashArray.buffer)\n\n\t\t\tif (data.start) {\n\t\t\t\tresult = 'started'\n\t\t\t} else if (data.stop) {\n\t\t\t\tremoveEventListener('message', handleMessage)\n\t\t\t\tresult = 'stopped'\n\t\t\t} else {\n\t\t\t\tconst seed = BigInt(`0x${data.seed}`)\n\t\t\t\tconst difficulty = BigInt(`0x${data.difficulty}`)\n\t\t\t\tfor (let i = 0; i < data.hash.length; i += 16) {\n\t\t\t\t\tconst u64 = data.hash.slice(i, i + 16)\n\t\t\t\t\thashView.setBigUint64(i / 2, BigInt(`0x${u64}`))\n\t\t\t\t}\n\t\t\t\tconst work = main(seed, hashArray[0], hashArray[1], hashArray[2], hashArray[3], difficulty)\n\t\t\t\tif (typeof work !== 'bigint') {\n\t\t\t\t\tthrow new TypeError('Invalid work from WASM')\n\t\t\t\t}\n\t\t\t\tconst workArray = new BigUint64Array(1)\n\t\t\t\tconst workView = new DataView(workArray.buffer)\n\t\t\t\tworkView.setBigUint64(0, work, true)\n\t\t\t\tresult = workArray[0].toString(16).padStart(16, '0')\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tif (typeof err === 'object' && err != null) {\n\t\t\t\tconst e = err as Record<string, unknown>\n\t\t\t\tif (e.message === 'integer divide by zero') {\n\t\t\t\t\tresult = ''\n\t\t\t\t} else {\n\t\t\t\t\tresult = e.message\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult = JSON.stringify(err)\n\t\t\t}\n\t\t} finally {\n\t\t\tif (result != null) {\n\t\t\t\tpostMessage({ result, url: self.location.href })\n\t\t\t}\n\t\t\taddEventListener('message', handleMessage)\n\t\t}\n\t}\n\n\taddEventListener('message', handleMessage)\n}\n\nexport const NanoPowWasmWorker = `\n\t;await (${worker})([${compute}])\n`\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { NanoPowValidate } from '#lib/validate'\nimport { Logger, big, bigHex } from '#utils'\nimport { WorkGenerateResponse } from 'nano-pow'\nimport { NanoPowWasmWorker } from './worker.js'\n\nconst logger = new Logger()\n\n// Initialize CPU\nlet isReady: boolean = false\nlet data: Record<string, string> = {}\nlet v: BigUint64Array = new BigUint64Array(16)\nlet m: BigUint64Array = new BigUint64Array(16)\nlet workers: Worker[] = []\nlet url: string\n\nfunction setup (): void {\n\ttry {\n\t\turl = URL.createObjectURL(new Blob([NanoPowWasmWorker], { type: 'text/javascript' }))\n\t\tworkers = []\n\t\tLOG: logger.log(`NanoPow CPU initialized.`)\n\t\tisReady = true\n\t} catch (err) {\n\t\tisReady = false\n\t\tthrow new Error('NanoPow CPU initialization failed.', { cause: err })\n\t}\n}\n\nfunction reset (): void {\n\tconsole.warn(`NanoPow CPU encountered an error. Reinitializing...`)\n\tisReady = false\n\tfor (const w of workers) w.terminate()\n\tworkers = []\n\tm?.fill(0n)\n\tv?.fill(0n)\n}\n\nasync function init (hash: bigint, difficulty: bigint, effort: number): Promise<void> {\n\tdata.hash = bigHex(hash, 64)\n\tdata.difficulty = bigHex(difficulty, 16)\n\n\tfor (let i = workers.length; i < effort; i++) {\n\t\tworkers.push(new Worker(url, { type: 'module' }))\n\t}\n\twhile (workers.length - effort > 0) {\n\t\tworkers.pop()?.terminate()\n\t}\n\ttry {\n\t\tawait workersStarted()\n\t\tLOG: logger.log('Workers ready')\n\t} catch (err: any) {\n\t\tthrow new Error('Error loading workers')\n\t}\n}\n\nasync function workersStarted () {\n\treturn new Promise(async (ready, fail): Promise<void> => {\n\t\tconst resolutions = []\n\t\tfor (const w of workers) {\n\t\t\tresolutions.push(new Promise((resolve, reject): void => {\n\t\t\t\tw.onerror = reject\n\t\t\t\tw.onmessage = (msg) => {\n\t\t\t\t\tconst { data } = msg\n\t\t\t\t\tif (data.url === url) {\n\t\t\t\t\t\tdata.result === 'started' ? resolve(data) : reject(data)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tw.postMessage({ start: true, url })\n\t\t\t}))\n\t\t}\n\t\tPromise.all(resolutions).then(ready).catch(fail)\n\t})\n}\n\nasync function dispatch (): Promise<bigint> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst seed = crypto.getRandomValues(new BigUint64Array(workers.length))\n\t\tconst attempts = []\n\t\tfor (let i = 0; i < workers.length; i++) {\n\t\t\tdata.seed = bigHex(seed[i], 16)\n\t\t\tattempts.push(new Promise((found, err) => {\n\t\t\t\tconst w = workers[i]\n\t\t\t\tw.onerror = err\n\t\t\t\tw.onmessage = (msg) => {\n\t\t\t\t\tconst { data } = msg\n\t\t\t\t\tif (data.url === url) {\n\t\t\t\t\t\tLOG: logger.log(`received result ${typeof data.result} \"${data.result}\" from worker ${i}`)\n\t\t\t\t\t\tfound(data.result)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tLOG: logger.log(`sending data to worker ${i}`, { ...data, url })\n\t\t\t\tw.postMessage({ ...data, url })\n\t\t\t}))\n\t\t}\n\t\tPromise.all(attempts)\n\t\t\t.then(results => {\n\t\t\t\tconst result = results.find(r => typeof r === 'string' && r !== '')\n\t\t\t\tresolve(result ? big(result) : dispatch())\n\t\t\t})\n\t\t\t.catch(err => reject(err))\n\t})\n}\n\nasync function workersStopped (): Promise<boolean> {\n\treturn new Promise(stopped => {\n\t\ttry {\n\t\t\tconst attempts = []\n\t\t\tfor (let i = 0; i < workers.length; i++) {\n\t\t\t\tattempts.push(new Promise((resolve, reject) => {\n\t\t\t\t\tconst w = workers[i]\n\t\t\t\t\tw.onerror = reject\n\t\t\t\t\tw.onmessage = (msg) => {\n\t\t\t\t\t\tconst { data } = msg\n\t\t\t\t\t\tif (data.url === url) {\n\t\t\t\t\t\t\tdata.result === 'stopped' ? resolve(true) : reject(i)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tw.postMessage({ stop: true, url })\n\t\t\t\t}))\n\t\t\t}\n\t\t\tPromise.allSettled(attempts).then(results => {\n\t\t\t\tfor (const result of results) {\n\t\t\t\t\tif (result.status === 'rejected') {\n\t\t\t\t\t\tconst i = result.reason\n\t\t\t\t\t\tworkers[i].terminate()\n\t\t\t\t\t\tworkers.splice(i)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstopped(true)\n\t\t\t})\n\t\t} catch {\n\t\t\tstopped(false)\n\t\t}\n\t})\n}\n\n/**\n* Nano proof-of-work using WebAssembly.\n*/\nexport async function generate (hash: bigint, difficulty: bigint, effort: number, debug: boolean): Promise<WorkGenerateResponse> {\n\tlogger.isEnabled = debug\n\tLOG: logger.groupStart('NanoPow WASM work_generate')\n\tLOG: logger.log('generating')\n\tif (isReady === false) setup()\n\tawait init(hash, difficulty, effort)\n\n\tlet work = 0n\n\tlet result = ''\n\ttry {\n\t\twork = await dispatch()\n\t\tresult = (await NanoPowValidate(work, hash, difficulty, debug)).difficulty\n\t} catch (err) {\n\t\tLOG: logger.log(err)\n\t} finally {\n\t\tconst isStopped = await workersStopped()\n\t\tif (isStopped) {\n\t\t\tLOG: logger.log('workers stopped')\n\t\t} else {\n\t\t\treset()\n\t\t\tLOG: logger.log('workers reset')\n\t\t}\n\t\tLOG: logger.groupEnd('NanoPow WASM work_generate')\n\t}\n\n\treturn {\n\t\thash: bigHex(hash, 64),\n\t\twork: bigHex(work, 16),\n\t\tdifficulty: result\n\t}\n}\n\n", "export default `#version 300 es\n#pragma vscode_glsllint_stage: frag\n//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nprecision highp int;out uvec4 nonce;uniform highp usampler2D src;void main(){nonce=uvec4(0u);vec2 inputSize=vec2(textureSize(src,0));vec2 texel=vec2(1.0)/inputSize;vec2 blockCoord=(floor(gl_FragCoord.xy)*2.0+vec2(0.5))/inputSize;uvec4 pixel=texture(src,blockCoord);nonce=pixel.x==0u?nonce:pixel;pixel=texture(src,blockCoord+vec2(texel.x,0.0));nonce=pixel.x==0u?nonce:pixel;pixel=texture(src,blockCoord+vec2(0.0,texel.y));nonce=pixel.x==0u?nonce:pixel;pixel=texture(src,blockCoord+vec2(texel.x,texel.y));nonce=pixel.x==0u?nonce:pixel;}`", "export default `#version 300 es\n#pragma vscode_glsllint_stage: frag\n//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-FileContributor: Ben Green <ben@latenightsketches.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later AND MIT\nlayout(std140)uniform INPUT{uint hash[8];uvec2 difficulty;uvec2 seed;};out uvec4 work;void main(){work=uvec4(0u);uvec2 m0=seed ^ uvec2(gl_FragCoord);uvec2 m1=uvec2(hash[0u],hash[1u]);uvec2 m2=uvec2(hash[2u],hash[3u]);uvec2 m3=uvec2(hash[4u],hash[5u]);uvec2 m4=uvec2(hash[6u],hash[7u]);uvec2 v0=uvec2(0xf3bcc908u,0x6a09e667u);uvec2 v8=uvec2(0xf3bcc908u,0x6a09e667u);uvec2 v1=uvec2(0x84caa73bu,0xbb67ae85u);uvec2 v9=uvec2(0x84caa73bu,0xbb67ae85u);uvec2 v2=uvec2(0xfe94f82bu,0x3c6ef372u);uvec2 v10=uvec2(0xfe94f82bu,0x3c6ef372u);uvec2 v3=uvec2(0x5f1d36f1u,0xa54ff53au);uvec2 v11=uvec2(0x5f1d36f1u,0xa54ff53au);uvec2 v4=uvec2(0xade682d1u,0x510e527fu);uvec2 v12=uvec2(0xade682d1u,0x510e527fu);uvec2 v5=uvec2(0x2b3e6c1fu,0x9b05688cu);uvec2 v13=uvec2(0x2b3e6c1fu,0x9b05688cu);uvec2 v6=uvec2(0xfb41bd6bu,0x1f83d9abu);uvec2 v14=uvec2(0xfb41bd6bu,0x1f83d9abu);uvec2 v7=uvec2(0x137e2179u,0x5be0cd19u);uvec2 v15=uvec2(0x137e2179u,0x5be0cd19u);v0 ^=uvec2(0x01010008u,0x0u);v12 ^=uvec2(0x28u,0x0u);v14 ^=uvec2(~0x0u);v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m0;v0.y+=uint(v0.x<m0.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m1;v0.y+=uint(v0.x<m1.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m2;v1.y+=uint(v1.x<m2.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m3;v1.y+=uint(v1.x<m3.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m4;v2.y+=uint(v2.x<m4.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m4;v1.y+=uint(v1.x<m4.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m1;v0.y+=uint(v0.x<m1.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v1+=m0;v1.y+=uint(v1.x<m0.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v1+=m2;v1.y+=uint(v1.x<m2.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v3+=m3;v3.y+=uint(v3.x<m3.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m0;v1.y+=uint(v1.x<m0.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m2;v2.y+=uint(v2.x<m2.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v1+=m3;v1.y+=uint(v1.x<m3.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v2+=m1;v2.y+=uint(v2.x<m1.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v3+=m4;v3.y+=uint(v3.x<m4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m3;v1.y+=uint(v1.x<m3.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m1;v1.y+=uint(v1.x<m1.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m2;v0.y+=uint(v0.x<m2.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v2+=m4;v2.y+=uint(v2.x<m4.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v2+=m0;v2.y+=uint(v2.x<m0.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m0;v0.y+=uint(v0.x<m0.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m2;v2.y+=uint(v2.x<m2.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m4;v2.y+=uint(v2.x<m4.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m1;v0.y+=uint(v0.x<m1.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v3+=m3;v3.y+=uint(v3.x<m3.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m2;v0.y+=uint(v0.x<m2.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m0;v2.y+=uint(v2.x<m0.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v3+=m3;v3.y+=uint(v3.x<m3.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m4;v0.y+=uint(v0.x<m4.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v3+=m1;v3.y+=uint(v3.x<m1.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m1;v1.y+=uint(v1.x<m1.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v3+=m4;v3.y+=uint(v3.x<m4.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m0;v0.y+=uint(v0.x<m0.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v1+=m3;v1.y+=uint(v1.x<m3.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v2+=m2;v2.y+=uint(v2.x<m2.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m1;v2.y+=uint(v2.x<m1.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v3+=m3;v3.y+=uint(v3.x<m3.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m0;v0.y+=uint(v0.x<m0.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v1+=m4;v1.y+=uint(v1.x<m4.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v3+=m2;v3.y+=uint(v3.x<m2.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m3;v2.y+=uint(v2.x<m3.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v3+=m0;v3.y+=uint(v3.x<m0.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m2;v0.y+=uint(v0.x<m2.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v2+=m1;v2.y+=uint(v2.x<m1.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v2+=m4;v2.y+=uint(v2.x<m4.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m2;v0.y+=uint(v0.x<m2.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m4;v1.y+=uint(v1.x<m4.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v3+=m1;v3.y+=uint(v3.x<m1.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v2+=m3;v2.y+=uint(v2.x<m3.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v3+=m0;v3.y+=uint(v3.x<m0.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m0;v0.y+=uint(v0.x<m0.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m1;v0.y+=uint(v0.x<m1.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m2;v1.y+=uint(v1.x<m2.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m3;v1.y+=uint(v1.x<m3.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m4;v2.y+=uint(v2.x<m4.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m4;v1.y+=uint(v1.x<m4.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m1;v0.y+=uint(v0.x<m1.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));uvec2 result=uvec2(0xf3bcc908u,0x6a09e667u)^ uvec2(0x01010008u,0x0u)^ v0 ^ v8;if(result.y>difficulty.y||(result.y==difficulty.y&&result.x>=difficulty.x)){work=uvec4(m0,result);}if(work.x==0u){discard;}}`", "export default `#version 300 es\n#pragma vscode_glsllint_stage: vert\n//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-FileContributor: Ben Green <ben@latenightsketches.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later AND MIT\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nlayout(location=0)in vec4 position;void main(){gl_Position=position;}`", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { default as downsampleSource } from './downsample.frag'\nimport { default as drawSource } from './draw.frag'\nimport { default as quadSource } from './quad.vert'\n\nexport { downsampleSource, drawSource, quadSource }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-FileContributor: Ben Green <ben@latenightsketches.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later AND MIT\n\nimport { bigHex, bigToU32, Logger } from '#utils'\nimport { WorkGenerateResponse } from 'nano-pow'\nimport { downsampleSource, drawSource, quadSource } from './shaders'\n\n/**\n* Used to create WebGL framebuffer objects.\n*\n* @param {WebGLTexture} texture - Defines storage size\n* @param {WebGLFramebuffer} framebuffer - Holds texture data\n* @param {size} size - 2D lengths of texture\n*/\ntype FBO = {\n\ttexture: WebGLTexture\n\tframebuffer: WebGLFramebuffer\n\tsize: {\n\t\tx: number\n\t\ty: number\n\t}\n}\n\nconst logger = new Logger()\n\n// Vertex positions for fullscreen quad.\nconst positions: Float32Array = new Float32Array([\n\t-1, -1, 1, -1, 1, 1, -1, 1\n])\n// Host-side buffers\nconst inputArray: Uint32Array = new Uint32Array(36)\nconst inputView: DataView = new DataView(inputArray.buffer)\nconst inputHashView: DataView = new DataView(inputArray.buffer, 0, 128)\nconst inputDifficultyView: DataView = new DataView(inputArray.buffer, 128, 8)\nconst inputSeedView: DataView = new DataView(inputArray.buffer, 136, 8)\nconst resultArray: BigUint64Array = new BigUint64Array(2)\nconst resultView: DataView = new DataView(resultArray.buffer)\n\n// GPU variables\nlet canvas: OffscreenCanvas\nlet gl: WebGL2RenderingContext\nlet drawProgram: WebGLProgram | null\nlet downsampleProgram: WebGLProgram | null\nlet vertexShader: WebGLShader | null\nlet drawShader: WebGLShader | null\nlet downsampleShader: WebGLShader | null\nlet positionBuffer: WebGLBuffer | null\nlet queries: WebGLQuery[]\nlet drawFbos: FBO[]\nlet downsampleFbos: FBO[]\nlet downsampleSrcLocation: WebGLUniformLocation | null\nlet inputBuffer: WebGLBuffer | null\nlet pixels: Uint32Array\n\n// Process variables\nlet isContextLost = 0\nlet isReady: boolean = false\nlet drawEffort: number = 0x10\nlet raf: number = 0\n\n// Create persistent resizable canvas and get WebGL2 context\nfunction createCanvas (size: number): void {\n\tLOG: logger.groupStart('NanoPow WebGL createCanvas')\n\tif (canvas == null) {\n\t\tcanvas = new OffscreenCanvas(0, 0)\n\t\tcanvas.addEventListener('webglcontextlost', ev => {\n\t\t\t// Set up 10s timeout to prevent long-running restoration\n\t\t\tisContextLost = window.setTimeout(() => {\n\t\t\t\tthrow new Error('NanoPow could not restore WebGL context.')\n\t\t\t}, 10_000)\n\t\t\tev.preventDefault()\n\t\t\tLOG: logger.log('NanoPow WebGL createCanvas', 'WebGL context lost. Waiting for it to be restored...')\n\t\t})\n\t\tcanvas.addEventListener('webglcontextrestored', ev => {\n\t\t\twindow.clearTimeout(isContextLost)\n\t\t\tisContextLost = 0\n\t\t\tLOG: logger.log('NanoPow WebGL createCanvas', 'WebGL context restored. Reinitializing...')\n\t\t})\n\t}\n\n\tconst context: WebGL2RenderingContext | null = canvas.getContext('webgl2', {\n\t\talpha: false,\n\t\tantialias: false,\n\t\tdepth: false,\n\t\tfailIfMajorPerformanceCaveat: true,\n\t\tpowerPreference: 'default',\n\t\tpremultipliedAlpha: false,\n\t\tstencil: false\n\t})\n\tif (context == null) throw new Error('WebGL 2 is required')\n\tgl = context\n\n\tconst MAX_VIEWPORT_DIMS = gl.getParameter(gl.MAX_VIEWPORT_DIMS) ?? [0x1000, 0x1000]\n\tLOG: logger.log('NanoPow WebGL createCanvas', 'requested size', size)\n\tLOG: logger.log('NanoPow WebGL createCanvas', 'MAX_VIEWPORT_DIMS', MAX_VIEWPORT_DIMS)\n\tsize = Math.min(size, ...MAX_VIEWPORT_DIMS)\n\tsize = (size >>> 8) << 8\n\tcanvas.height = canvas.width = size\n\tLOG: logger.log('NanoPow WebGL createCanvas', 'canvas size', canvas.height, canvas.width)\n\tLOG: logger.log('NanoPow WebGL createCanvas', 'drawingBuffer size', gl.drawingBufferHeight, gl.drawingBufferWidth)\n\tif (canvas.height !== gl.drawingBufferHeight\n\t\t|| canvas.width !== gl.drawingBufferWidth\n\t) {\n\t\tsize = ((gl.drawingBufferHeight < gl.drawingBufferWidth ? gl.drawingBufferHeight : gl.drawingBufferWidth) >>> 8) << 8\n\t\tcanvas.height = canvas.width = size\n\t}\n\tLOG: logger.log('NanoPow WebGL createCanvas', 'final size', size)\n\tLOG: logger.groupEnd('NanoPow WebGL createCanvas')\n}\n\nfunction compile (): void {\n\ttry {\n\t\t// Create drawing program\n\t\tdrawProgram = gl.createProgram()\n\t\tif (drawProgram == null) throw new Error('Failed to create shader program')\n\n\t\tvertexShader = gl.createShader(gl.VERTEX_SHADER)\n\t\tif (vertexShader == null) throw new Error('Failed to create vertex shader')\n\t\tgl.shaderSource(vertexShader, quadSource)\n\t\tgl.compileShader(vertexShader)\n\t\tif (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS))\n\t\t\tthrow new Error(gl.getShaderInfoLog(vertexShader) ?? `Failed to compile vertex shader`)\n\n\t\tdrawShader = gl.createShader(gl.FRAGMENT_SHADER)\n\t\tif (drawShader == null) throw new Error('Failed to create fragment shader')\n\t\tgl.shaderSource(drawShader, drawSource)\n\t\tgl.compileShader(drawShader)\n\t\tif (!gl.getShaderParameter(drawShader, gl.COMPILE_STATUS))\n\t\t\tthrow new Error(gl.getShaderInfoLog(drawShader) ?? `Failed to compile fragment shader`)\n\n\t\tgl.attachShader(drawProgram, vertexShader)\n\t\tgl.attachShader(drawProgram, drawShader)\n\t\tgl.linkProgram(drawProgram)\n\t\tif (!gl.getProgramParameter(drawProgram, gl.LINK_STATUS))\n\t\t\tthrow new Error(gl.getProgramInfoLog(drawProgram) ?? `Failed to link program`)\n\n\t\t// Create downsampling program\n\t\tdownsampleProgram = gl.createProgram()\n\t\tif (downsampleProgram == null) throw new Error('Failed to create downsample program')\n\n\t\tdownsampleShader = gl.createShader(gl.FRAGMENT_SHADER)\n\t\tif (downsampleShader == null) throw new Error('Failed to create downsample shader')\n\t\tgl.shaderSource(downsampleShader, downsampleSource)\n\t\tgl.compileShader(downsampleShader)\n\t\tif (!gl.getShaderParameter(downsampleShader, gl.COMPILE_STATUS))\n\t\t\tthrow new Error(gl.getShaderInfoLog(downsampleShader) ?? `Failed to compile downsample shader`)\n\n\t\tgl.attachShader(downsampleProgram, vertexShader)\n\t\tgl.attachShader(downsampleProgram, downsampleShader)\n\t\tgl.linkProgram(downsampleProgram)\n\t\tif (!gl.getProgramParameter(downsampleProgram, gl.LINK_STATUS))\n\t\t\tthrow new Error(gl.getProgramInfoLog(downsampleProgram) ?? `Failed to link program`)\n\n\t\t// Construct fullscreen quad for rendering\n\t\tgl.useProgram(drawProgram)\n\t\tconst triangleArray = gl.createVertexArray()\n\t\tgl.bindVertexArray(triangleArray)\n\n\t\tpositionBuffer = gl.createBuffer()\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\n\t\tgl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW)\n\t\tgl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0)\n\t\tgl.enableVertexAttribArray(0)\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n\t\t// Create textures, framebuffers, and queries for drawing\n\t\tdrawFbos = []\n\t\tqueries = []\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst texture = gl.createTexture()\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, texture)\n\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, gl.drawingBufferWidth, gl.drawingBufferHeight, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null)\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n\n\t\t\tconst framebuffer = gl.createFramebuffer()\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer)\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)\n\t\t\tif (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE)\n\t\t\t\tthrow new Error(`Failed to create drawing framebuffer`)\n\t\t\tdrawFbos.push({ texture, framebuffer, size: { x: gl.drawingBufferWidth, y: gl.drawingBufferHeight } })\n\t\t\tqueries.push(gl.createQuery())\n\t\t}\n\n\t\t// Create textures, framebuffers, and uniform location for downsampling\n\t\tdownsampleFbos = []\n\t\tfor (let i = 1; i <= 8; i++) {\n\t\t\tconst width = gl.drawingBufferWidth / (2 ** i)\n\t\t\tconst height = gl.drawingBufferHeight / (2 ** i)\n\n\t\t\tconst texture = gl.createTexture()\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, texture)\n\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, width, height, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null)\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n\n\t\t\tconst framebuffer = gl.createFramebuffer()\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer)\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)\n\t\t\tif (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE)\n\t\t\t\tthrow new Error(`Failed to create downsampling framebuffer ${i}`)\n\t\t\tdownsampleFbos.push({ texture, framebuffer, size: { x: width, y: height } })\n\t\t}\n\t\tdownsampleSrcLocation = gl.getUniformLocation(downsampleProgram, 'src')\n\t\tgl.bindTexture(gl.TEXTURE_2D, null)\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\n\t\tconst finalFbo = downsampleFbos.slice(-1)[0]\n\n\t\t// Input buffers must align to multiple of 16\n\t\tinputBuffer = gl.createBuffer()\n\t\tgl.bindBuffer(gl.UNIFORM_BUFFER, inputBuffer)\n\t\tgl.bufferData(gl.UNIFORM_BUFFER, 160, gl.DYNAMIC_DRAW)\n\t\tgl.bindBufferBase(gl.UNIFORM_BUFFER, 0, inputBuffer)\n\t\tgl.uniformBlockBinding(drawProgram, gl.getUniformBlockIndex(drawProgram, 'INPUT'), 0)\n\t\tgl.bindBuffer(gl.UNIFORM_BUFFER, null)\n\n\t\t// Finalize configuration\n\t\tpixels = new Uint32Array(finalFbo.size.x * finalFbo.size.y * 4)\n\t\tisReady = true\n\t\tLOG: logger.log(`NanoPow WebGL initialized at ${gl.drawingBufferWidth}x${gl.drawingBufferHeight}. Maximum nonces checked per frame: ${gl.drawingBufferWidth * gl.drawingBufferHeight}`)\n\t} catch (err) {\n\t\tthrow new Error('WebGL compilation failed.', { cause: err })\n\t}\n}\n\n/**\n* Constructs canvas & WebGL2 context, compiles shaders, and initializes buffers.\n*/\nfunction setup (effort: number): void {\n\ttry {\n\t\treset()\n\t\tdrawEffort = effort\n\t\tcreateCanvas(drawEffort << 8)\n\t\tcompile()\n\t} catch (err) {\n\t\treset()\n\t\tthrow new Error('WebGL setup failed.', { cause: err })\n\t}\n}\n\n/**\n* On effort change or WebGL context loss, clears all program variables.\n*/\nfunction reset (): void {\n\tisReady = false\n\tcancelAnimationFrame(raf)\n\traf = 0\n\tgl?.deleteBuffer(inputBuffer)\n\tinputBuffer = null\n\tfor (const fbo of downsampleFbos ?? []) {\n\t\tgl?.deleteFramebuffer(fbo.framebuffer)\n\t\tgl?.deleteTexture(fbo.texture)\n\t}\n\tdownsampleFbos = []\n\tgl?.deleteShader(downsampleShader)\n\tdownsampleShader = null\n\tgl?.deleteProgram(downsampleProgram)\n\tdownsampleProgram = null\n\tfor (const fbo of drawFbos ?? []) {\n\t\tgl?.deleteFramebuffer(fbo?.framebuffer ?? null)\n\t\tgl?.deleteTexture(fbo?.texture ?? null)\n\t}\n\tdrawFbos = []\n\tfor (const query of queries ?? []) {\n\t\tgl?.deleteQuery(query)\n\t}\n\tqueries = []\n\tgl?.deleteBuffer(positionBuffer)\n\tpositionBuffer = null\n\tgl?.deleteShader(drawShader)\n\tdrawShader = null\n\tgl?.deleteShader(vertexShader)\n\tvertexShader = null\n\tgl?.deleteProgram(drawProgram)\n\tdrawProgram = null\n\tLOG: logger.log('reset done')\n}\n\nfunction init (hash: Uint32Array, difficulty: bigint): void {\n\tif (gl == null) {\n\t\tthrow new Error('WebGL 2 is required')\n\t}\n\n\t// Clear any previous results\n\tfor (const drawFbo of drawFbos) {\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, drawFbo.framebuffer)\n\t\tgl.clearBufferuiv(gl.COLOR, 0, [0, 0, 0, 0])\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\t}\n\tpixels.fill(0)\n\tresultArray.fill(0n)\n\tinputArray.fill(0)\n\n\t// Set up INPUT which must be 16 bytes per 32-bit value due to array alignment\n\tfor (let i = 0; i < 8; i++) {\n\t\tinputHashView.setUint32(i * 16, hash[i])\n\t}\n\tinputDifficultyView.setBigUint64(0, difficulty, true)\n\tLOG: logger.log('INPUT', inputArray.buffer.slice(0))\n\tgl.bindBuffer(gl.UNIFORM_BUFFER, inputBuffer)\n\tgl.bufferSubData(gl.UNIFORM_BUFFER, 0, inputView)\n\tgl.bindBuffer(gl.UNIFORM_BUFFER, null)\n\n\t// Set GPU to draw mode\n\tgl.useProgram(drawProgram)\n}\n\nfunction draw (seed: bigint, drawFbo: FBO, query: WebGLQuery): void {\n\tif (gl == null) throw new Error('WebGL 2 is required to draw')\n\tif (drawFbo == null) throw new Error('FBO is required to draw')\n\tif (query == null) throw new Error('Query is required to draw')\n\tLOG: logger.log(bigHex(seed, 16))\n\n\t// Upload work seed buffer\n\tinputSeedView.setBigUint64(0, seed, true)\n\tLOG: logger.log('INPUT', inputView.buffer.slice(0))\n\tgl.bindBuffer(gl.UNIFORM_BUFFER, inputBuffer)\n\tgl.bufferSubData(gl.UNIFORM_BUFFER, 136, inputSeedView)\n\tgl.bindBuffer(gl.UNIFORM_BUFFER, null)\n\n\t// Draw full canvas\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, drawFbo.framebuffer)\n\tgl.viewport(0, 0, drawFbo.size.x, drawFbo.size.y)\n\tgl.beginQuery(gl.ANY_SAMPLES_PASSED_CONSERVATIVE, query)\n\tgl.drawArrays(gl.TRIANGLES, 0, 4)\n\tgl.endQuery(gl.ANY_SAMPLES_PASSED_CONSERVATIVE)\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, null)\n}\n\nasync function check (query: WebGLQuery): Promise<boolean> {\n\treturn new Promise((resolve, reject) => {\n\t\tfunction check () {\n\t\t\ttry {\n\t\t\t\tif (gl == null) throw new Error('WebGL 2 is required to check query results')\n\t\t\t\tif (query == null) throw new Error('Query is required to check query results')\n\t\t\t\tif (isContextLost) throw new Error('WebGL 2 context must be restored to check query results')\n\t\t\t\tif (gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE)) {\n\t\t\t\t\tresolve(!!(gl.getQueryParameter(query, gl.QUERY_RESULT)))\n\t\t\t\t} else {\n\t\t\t\t\t// Query result not yet available, check again in the next frame\n\t\t\t\t\traf = requestAnimationFrame(check)\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tclearTimeout(raf)\n\t\t\t\traf = 0\n\t\t\t\treject(err)\n\t\t\t}\n\t\t}\n\t\tcheck()\n\t})\n}\n\n/**\n* When a result is found by the `gl.query`, downsamples the texture to speed\n* up the subsequent `readPixels` call, reads the pixels into the work buffer,\n* checks every 4th pixel for the 'found' byte, converts the subsequent two\n* pixels with the nonce byte values to a hex string, and returns the result.\n*\n* @returns Nonce as an 8-byte (16-char) hexadecimal string\n*/\nfunction read (drawFbo: FBO): { work: bigint, difficulty: bigint } {\n\tif (gl == null) throw new Error('WebGL 2 is required to read pixels')\n\tif (drawFbo == null) throw new Error('Source FBO is required to downsample')\n\n\t// Set GPU to downsample mode\n\tgl.useProgram(downsampleProgram)\n\n\t// Progressively reduce framebuffer size by half for each FBO\n\tlet source = drawFbo\n\tgl.activeTexture(gl.TEXTURE0)\n\tgl.uniform1i(downsampleSrcLocation, 0)\n\tfor (const fbo of downsampleFbos) {\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fbo.framebuffer)\n\t\tgl.bindTexture(gl.TEXTURE_2D, source.texture)\n\t\tgl.viewport(0, 0, fbo.size.x, fbo.size.y)\n\t\tgl.drawArrays(gl.TRIANGLES, 0, 4)\n\t\tsource = fbo\n\t}\n\n\t// Read downsampled result\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, source.framebuffer)\n\tgl.readPixels(0, 0, source.size.x, source.size.y, gl.RGBA_INTEGER, gl.UNSIGNED_INT, pixels)\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\n\t// Loop pixels to find one with values\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tif (pixels[i] || pixels[i + 1] || pixels[i + 2] || pixels[i + 3]) {\n\t\t\tLOG: logger.log(`rgba(${pixels[i]}, ${pixels[i + 1]}, ${pixels[i + 2]}, ${pixels[i + 3]})`)\n\t\t\tresultView.setUint32(0, pixels[i], true)\n\t\t\tresultView.setUint32(4, pixels[i + 1], true)\n\t\t\tresultView.setUint32(8, pixels[i + 2], true)\n\t\t\tresultView.setUint32(12, pixels[i + 3], true)\n\t\t\treturn {\n\t\t\t\twork: resultView.getBigUint64(0, true),\n\t\t\t\tdifficulty: resultView.getBigUint64(8, true)\n\t\t\t}\n\t\t}\n\t}\n\tLOG: logger.log(`pixels[${pixels.length}]`, pixels)\n\tthrow new Error('Query reported result but nonce value not found')\n}\n\n/**\n* Nano proof-of-work using WebGL 2.0.\n*/\nexport async function generate (hash: bigint, difficulty: bigint, effort: number, debug: boolean): Promise<WorkGenerateResponse> {\n\tlogger.isEnabled = debug\n\t// Set up 60s timeout to prevent long-running calls\n\tlet timeout = false\n\tconst kill = setTimeout(() => {\n\t\ttimeout = true\n\t\tLOG: logger.log('timed out')\n\t}, 60_000)\n\tLOG: logger.groupStart('NanoPow WebGL work_generate')\n\tLOG: logger.log(`generate('${bigHex(hash, 16)}', '${bigHex(difficulty, 16)}', ${effort}, ${debug})`)\n\n\t// Start drawing to calculate one nonce per pixel\n\tconst seed = new BigUint64Array(4)\n\tlet found = false\n\tlet result: Record<string, bigint> = {}\n\tlet isFirstRetry = false\n\ttry {\n\t\tdo {\n\t\t\ttry {\n\t\t\t\tif (isReady === false || effort !== drawEffort || isFirstRetry) {\n\t\t\t\t\tsetup(effort)\n\t\t\t\t}\n\t\t\t\tinit(bigToU32(hash, 8), difficulty)\n\t\t\t\tcrypto.getRandomValues(seed)\n\t\t\t\tLOG: logger.log('drawing frame 0')\n\t\t\t\tdraw(seed[0], drawFbos[0], queries[0])\n\t\t\t\tdraw(seed[1], drawFbos[1], queries[1])\n\t\t\t\tdraw(seed[2], drawFbos[2], queries[2])\n\t\t\t\tlet drawIndex = 3\n\t\t\t\tdo {\n\t\t\t\t\tif (drawIndex === 0) crypto.getRandomValues(seed)\n\t\t\t\t\tdraw(seed[drawIndex], drawFbos[drawIndex], queries[drawIndex])\n\t\t\t\t\tdrawIndex = (drawIndex + 1) % 4\n\t\t\t\t\tfound = await check(queries[drawIndex])\n\t\t\t\t} while (!found && !timeout)\n\t\t\t\tif (found) result = read(drawFbos[drawIndex])\n\t\t\t\tisFirstRetry = false\n\t\t\t} catch (err) {\n\t\t\t\tisFirstRetry = !isFirstRetry\n\t\t\t\tLOG: logger.log(err)\n\t\t\t\tif (!isFirstRetry) {\n\t\t\t\t\tthrow new Error('failed to restore context', { cause: err })\n\t\t\t\t}\n\t\t\t\twhile (isContextLost) await new Promise(r => setTimeout(r, 100))\n\t\t\t}\n\t\t} while (isFirstRetry)\n\t} finally {\n\t\tclearTimeout(kill)\n\t\tcancelAnimationFrame(raf)\n\t\traf = 0\n\t\tLOG: logger.groupEnd('NanoPow WebGL work_generate')\n\t\tif (!found) throw new Error(timeout ? 'timed out' : 'work not found for unknown reason')\n\t}\n\n\treturn {\n\t\thash: bigHex(hash, 64),\n\t\twork: bigHex(result.work, 16),\n\t\tdifficulty: bigHex(result.difficulty, 16)\n\t}\n}\n", "export default `//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\nstruct INPUT{hash:array<vec4<u32>,2>,difficulty:vec2<u32>,seed:vec2<u32>};@group(0)@binding(0)var<uniform> input:INPUT;struct OUTPUT{found:atomic<u32>,work:vec2<u32>,difficulty:vec2<u32>};@group(0)@binding(1)var<storage,read_write>output:OUTPUT;var<workgroup> found:bool;var<workgroup> m1:vec2<u32>;var<workgroup> m2:vec2<u32>;var<workgroup> m3:vec2<u32>;var<workgroup> m4:vec2<u32>;var<workgroup> d:vec2<u32>;var<workgroup> seed:vec2<u32>;@compute @workgroup_size(64)fn main(@builtin(global_invocation_id)global_id:vec3<u32>,@builtin(local_invocation_id)local_id:vec3<u32>){if(local_id.x==0u){found=atomicLoad(&output.found)!=0u;seed=input.seed;m1=input.hash[0u].xy;m2=input.hash[0u].zw;m3=input.hash[1u].xy;m4=input.hash[1u].zw;d=input.difficulty;}workgroupBarrier();if(found){return;}let m0:vec2<u32>=seed ^ global_id.xy;var v0=vec2<u32>(0xf3bcc908u,0x6a09e667u);var v8=vec2<u32>(0xf3bcc908u,0x6a09e667u);var v1=vec2<u32>(0x84caa73bu,0xbb67ae85u);var v9=vec2<u32>(0x84caa73bu,0xbb67ae85u);var v2=vec2<u32>(0xfe94f82bu,0x3c6ef372u);var v10=vec2<u32>(0xfe94f82bu,0x3c6ef372u);var v3=vec2<u32>(0x5f1d36f1u,0xa54ff53au);var v11=vec2<u32>(0x5f1d36f1u,0xa54ff53au);var v4=vec2<u32>(0xade682d1u,0x510e527fu);var v12=vec2<u32>(0xade682d1u,0x510e527fu);var v5=vec2<u32>(0x2b3e6c1fu,0x9b05688cu);var v13=vec2<u32>(0x2b3e6c1fu,0x9b05688cu);var v6=vec2<u32>(0xfb41bd6bu,0x1f83d9abu);var v14=vec2<u32>(0xfb41bd6bu,0x1f83d9abu);var v7=vec2<u32>(0x137e2179u,0x5be0cd19u);var v15=vec2<u32>(0x137e2179u,0x5be0cd19u);v0 ^=vec2<u32>(0x01010008u,0x0u);v12 ^=vec2<u32>(0x28u,0x0u);v14 ^=vec2<u32>(~0x0u);v0+=v4;v0.y+=u32(v0.x<v4.x);v0+=m0;v0.y+=u32(v0.x<m0.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v0+=m1;v0.y+=u32(v0.x<m1.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m2;v1.y+=u32(v1.x<m2.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m3;v1.y+=u32(v1.x<m3.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m4;v2.y+=u32(v2.x<m4.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m4;v1.y+=u32(v1.x<m4.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m1;v0.y+=u32(v0.x<m1.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v1+=m0;v1.y+=u32(v1.x<m0.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v1+=m2;v1.y+=u32(v1.x<m2.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v3+=m3;v3.y+=u32(v3.x<m3.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m0;v1.y+=u32(v1.x<m0.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m2;v2.y+=u32(v2.x<m2.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v1+=m3;v1.y+=u32(v1.x<m3.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v2+=m1;v2.y+=u32(v2.x<m1.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v3+=m4;v3.y+=u32(v3.x<m4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m3;v1.y+=u32(v1.x<m3.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m1;v1.y+=u32(v1.x<m1.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m2;v0.y+=u32(v0.x<m2.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v2+=m4;v2.y+=u32(v2.x<m4.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v2+=m0;v2.y+=u32(v2.x<m0.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v0+=m0;v0.y+=u32(v0.x<m0.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m2;v2.y+=u32(v2.x<m2.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m4;v2.y+=u32(v2.x<m4.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m1;v0.y+=u32(v0.x<m1.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v3+=m3;v3.y+=u32(v3.x<m3.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v0+=m2;v0.y+=u32(v0.x<m2.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m0;v2.y+=u32(v2.x<m0.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v3+=m3;v3.y+=u32(v3.x<m3.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m4;v0.y+=u32(v0.x<m4.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v3+=m1;v3.y+=u32(v3.x<m1.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m1;v1.y+=u32(v1.x<m1.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v3+=m4;v3.y+=u32(v3.x<m4.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m0;v0.y+=u32(v0.x<m0.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v1+=m3;v1.y+=u32(v1.x<m3.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v2+=m2;v2.y+=u32(v2.x<m2.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m1;v2.y+=u32(v2.x<m1.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v3+=m3;v3.y+=u32(v3.x<m3.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m0;v0.y+=u32(v0.x<m0.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v1+=m4;v1.y+=u32(v1.x<m4.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v3+=m2;v3.y+=u32(v3.x<m2.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m3;v2.y+=u32(v2.x<m3.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v3+=m0;v3.y+=u32(v3.x<m0.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m2;v0.y+=u32(v0.x<m2.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v2+=m1;v2.y+=u32(v2.x<m1.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v2+=m4;v2.y+=u32(v2.x<m4.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v0+=m2;v0.y+=u32(v0.x<m2.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m4;v1.y+=u32(v1.x<m4.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v3+=m1;v3.y+=u32(v3.x<m1.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v2+=m3;v2.y+=u32(v2.x<m3.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v3+=m0;v3.y+=u32(v3.x<m0.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v0+=m0;v0.y+=u32(v0.x<m0.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v0+=m1;v0.y+=u32(v0.x<m1.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m2;v1.y+=u32(v1.x<m2.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m3;v1.y+=u32(v1.x<m3.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v2+=m4;v2.y+=u32(v2.x<m4.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v1+=v6;v1.y+=u32(v1.x<v6.x);v12 ^=v1;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v11+=v12;v11.y+=u32(v11.x<v12.x);v6 ^=v11;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v3+=v4;v3.y+=u32(v3.x<v4.x);v14 ^=v3;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v9+=v14;v9.y+=u32(v9.x<v14.x);v4 ^=v9;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(24u))|(v4<<vec2<u32>(8u)).yx;v0+=v4;v0.y+=u32(v0.x<v4.x);v12 ^=v0;v12=(v12>>vec2<u32>(16u))|(v12<<vec2<u32>(16u)).yx;v8+=v12;v8.y+=u32(v8.x<v12.x);v4 ^=v8;v4=(v4>>vec2<u32>(31u)).yx|(v4<<vec2<u32>(1u));v1+=v5;v1.y+=u32(v1.x<v5.x);v1+=m4;v1.y+=u32(v1.x<m4.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v1+=v5;v1.y+=u32(v1.x<v5.x);v13 ^=v1;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v9+=v13;v9.y+=u32(v9.x<v13.x);v5 ^=v9;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(24u))|(v6<<vec2<u32>(8u)).yx;v2+=v6;v2.y+=u32(v2.x<v6.x);v14 ^=v2;v14=(v14>>vec2<u32>(16u))|(v14<<vec2<u32>(16u)).yx;v10+=v14;v10.y+=u32(v10.x<v14.x);v6 ^=v10;v6=(v6>>vec2<u32>(31u)).yx|(v6<<vec2<u32>(1u));v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v3+=v7;v3.y+=u32(v3.x<v7.x);v15 ^=v3;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v11+=v15;v11.y+=u32(v11.x<v15.x);v7 ^=v11;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));v0+=v5;v0.y+=u32(v0.x<v5.x);v0+=m1;v0.y+=u32(v0.x<m1.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(24u))|(v5<<vec2<u32>(8u)).yx;v0+=v5;v0.y+=u32(v0.x<v5.x);v15 ^=v0;v15=(v15>>vec2<u32>(16u))|(v15<<vec2<u32>(16u)).yx;v10+=v15;v10.y+=u32(v10.x<v15.x);v5 ^=v10;v5=(v5>>vec2<u32>(31u)).yx|(v5<<vec2<u32>(1u));v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(24u))|(v7<<vec2<u32>(8u)).yx;v2+=v7;v2.y+=u32(v2.x<v7.x);v13 ^=v2;v13=(v13>>vec2<u32>(16u))|(v13<<vec2<u32>(16u)).yx;v8+=v13;v8.y+=u32(v8.x<v13.x);v7 ^=v8;v7=(v7>>vec2<u32>(31u)).yx|(v7<<vec2<u32>(1u));let result=vec2<u32>(0xf3bcc908u,0x6a09e667u)^ vec2<u32>(0x01010008u,0x0u)^ v0 ^ v8;if(result.y>input.difficulty.y||(result.y==input.difficulty.y&&result.x>=input.difficulty.x)){loop{let swap=atomicCompareExchangeWeak(&output.found,0u,1u);if(swap.exchanged){output.work=m0;output.difficulty=result;break;}if(swap.old_value!=0u){break;}}return;}}`", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { Logger, Queue, bigHex, bigToU64 } from '#utils'\nimport { WorkGenerateResponse } from 'nano-pow'\nimport { default as NanoPowGpuComputeShader } from './shaders/compute.wgsl'\n\ntype NanoPowDeviceStatus = 'Idle' | 'Starting' | 'Unsupported' | 'Ready' | 'Restoring' | 'Crashed'\n\nconst logger = new Logger()\nconst q = new Queue()\n\n// Initialize host buffers\nconst hashData: BigUint64Array = new BigUint64Array(4)\nconst bufferReset: BigUint64Array<ArrayBuffer> = new BigUint64Array(4)\nconst inputData: BigUint64Array<ArrayBuffer> = new BigUint64Array(6)\nconst inputDataView: DataView<ArrayBuffer> = new DataView(inputData.buffer)\nconst resultViews: DataView[] = []\n\n// Initialize process variables\nlet isContextLost: number = 0\nlet status: NanoPowDeviceStatus = 'Idle'\n\n// Declare WebGPU variables\nlet device: GPUDevice\nlet bindGroupLayout: GPUBindGroupLayout | null\nlet bindGroups: (GPUBindGroup | null)[]\nlet pipeline: GPUComputePipeline\nlet inputBuffers: GPUBuffer[]\nlet outputBuffers: GPUBuffer[]\nlet resultBuffers: GPUBuffer[]\n\n// Initialize WebGPU\nasync function start (): Promise<void> {\n\tif (status === 'Idle') {\n\t\tLOG: logger.log('starting')\n\t\tstatus = 'Starting'\n\t\tawait getDevice()\n\t\ttry {\n\t\t\tawait compile()\n\t\t\tLOG: logger.log('ready')\n\t\t\tstatus = 'Ready'\n\t\t} catch (err) {\n\t\t\tstatus = 'Crashed'\n\t\t\tLOG: logger.log(err)\n\t\t\tthrow new Error('failed to compile', { cause: err })\n\t\t}\n\t}\n}\n\n// Request device and adapter\nasync function getDevice () {\n\tif (navigator.gpu == null) {\n\t\tstatus = 'Unsupported'\n\t\tthrow new Error('WebGPU is not supported in this browser.')\n\t}\n\tconst adapter = await navigator.gpu.requestAdapter()\n\tif (adapter == null) {\n\t\tstatus = 'Unsupported'\n\t\tthrow new Error('gpu adapter refused by browser')\n\t}\n\tdevice = await adapter.requestDevice()\n\tif (!(device instanceof GPUDevice)) {\n\t\tthrow new Error('failed to get device from gpu adapter')\n\t}\n\tdevice.lost?.then(async (deviceLostInfo) => {\n\t\tLOG: logger.log('device lost', deviceLostInfo)\n\t\t// Set up 30s timeout to prevent long-running calls\n\t\tisContextLost = window.setTimeout(() => {\n\t\t\tthrow new Error('failed to restore device', { cause: deviceLostInfo })\n\t\t}, 30_000)\n\t\tif (status !== 'Restoring') await q.prioritize(restore)\n\t})\n}\n\n// Compile and cache shader prior to actual dispatch\nasync function compile () {\n\t// Create buffers for writing GPU calculations and reading from Javascript\n\tinputBuffers = [\n\t\tdevice.createBuffer({\n\t\t\tlabel: 'INPUT_0',\n\t\t\tsize: 48,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t}),\n\t\tdevice.createBuffer({\n\t\t\tlabel: 'INPUT_1',\n\t\t\tsize: 48,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t})\n\t]\n\toutputBuffers = [\n\t\tdevice.createBuffer({\n\t\t\tlabel: 'OUTPUT_0',\n\t\t\tsize: 32,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n\t\t}),\n\t\tdevice.createBuffer({\n\t\t\tlabel: 'OUTPUT_1',\n\t\t\tsize: 32,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n\t\t})\n\t]\n\tresultBuffers = [\n\t\tdevice.createBuffer({\n\t\t\tlabel: 'RESULT',\n\t\t\tsize: 32,\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t\t}), device.createBuffer({\n\t\t\tlabel: 'RESULT',\n\t\t\tsize: 32,\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t\t})\n\t]\n\t// Create binding group data structure to use later once INPUT is known\n\tbindGroupLayout = device.createBindGroupLayout({\n\t\tentries: [\n\t\t\t{ binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'uniform' }, },\n\t\t\t{ binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'storage' }, },\n\t\t],\n\t})\n\t// Bind INPUT read and GPU write buffers\n\tbindGroups = [\n\t\tdevice.createBindGroup({\n\t\t\tlayout: bindGroupLayout,\n\t\t\tentries: [\n\t\t\t\t{ binding: 0, resource: { buffer: inputBuffers[0] }, },\n\t\t\t\t{ binding: 1, resource: { buffer: outputBuffers[0] }, },\n\t\t\t],\n\t\t}),\n\t\tdevice.createBindGroup({\n\t\t\tlayout: bindGroupLayout,\n\t\t\tentries: [\n\t\t\t\t{ binding: 0, resource: { buffer: inputBuffers[1] }, },\n\t\t\t\t{ binding: 1, resource: { buffer: outputBuffers[1] }, },\n\t\t\t],\n\t\t})\n\t]\n\t// Create pipeline to connect compute shader to binding layout\n\tpipeline = device.createComputePipeline({\n\t\tlayout: device.createPipelineLayout({\n\t\t\tbindGroupLayouts: [bindGroupLayout]\n\t\t}),\n\t\tcompute: {\n\t\t\tentryPoint: 'main',\n\t\t\tmodule: device.createShaderModule({\n\t\t\t\tcode: NanoPowGpuComputeShader\n\t\t\t})\n\t\t}\n\t})\n\tconst cmd = device.createCommandEncoder()\n\tcmd.beginComputePass().end()\n\tdevice.queue.submit([cmd.finish()])\n\tawait device.queue.onSubmittedWorkDone()\n}\n\nasync function restore (): Promise<void> {\n\tLOG: logger.log('restoring')\n\ttry {\n\t\tstatus = 'Restoring'\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\ttry { resultBuffers[i]?.unmap() } catch { }\n\t\t\tresultBuffers[i]?.destroy()\n\t\t\toutputBuffers[i]?.destroy()\n\t\t\tinputBuffers[i]?.destroy()\n\t\t\tbindGroups[i] = null\n\t\t}\n\t\tbindGroupLayout = null\n\t\tawait getDevice()\n\t\tawait compile()\n\t\twindow.clearTimeout(isContextLost)\n\t\tisContextLost = 0\n\t\tLOG: logger.log('ready')\n\t\tstatus = 'Ready'\n\t} catch (err) {\n\t\tstatus = 'Crashed'\n\t\tthrow new Error('failed to restore device', { cause: err })\n\t}\n}\n\nasync function init (hash: bigint, difficulty: bigint): Promise<void> {\n\tLOG: logger.log('variables initializing')\n\ttry {\n\t\t// Save hash data for normal usage and potential recovery efforts\n\t\thashData.set(bigToU64(hash, 4))\n\n\t\t// Write data that will not change per dispatch to uniform buffer object\n\t\t// Note: u64 size is 8, but total alignment must be multiple of 16\n\t\tinputData.fill(0n)\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tinputDataView.setBigUint64(i * 8, hashData[i])\n\t\t}\n\t\tinputDataView.setBigUint64(32, difficulty, true)\n\t\tdevice.queue.writeBuffer(inputBuffers[0], 0, inputDataView)\n\t\tdevice.queue.writeBuffer(inputBuffers[1], 0, inputDataView)\n\n\t\t// Reset OUTPUT properties to 0u before each calculation\n\t\tdevice.queue.writeBuffer(outputBuffers[0], 0, bufferReset)\n\t\tdevice.queue.writeBuffer(outputBuffers[1], 0, bufferReset)\n\t} catch (err) {\n\t\tLOG: logger.log(err)\n\t\tthrow new Error('failed to initialize', { cause: err })\n\t}\n}\n\nasync function dispatch (dispatchIndex: number, seed: bigint, effort: number): Promise<void> {\n\tLOG: logger.log('dispatching compute pass')\n\ttry {\n\t\tLOG: logger.log('seed', bigHex(seed, 16))\n\n\t\t// Copy seed into INPUT buffer\n\t\tinputDataView.setBigUint64(40, seed, true)\n\t\tLOG: logger.log('INPUT', inputDataView)\n\t\tdevice.queue.writeBuffer(inputBuffers[dispatchIndex], 40, inputDataView, 40)\n\n\t\t// Create command encoder to issue commands to GPU and initiate computation\n\t\tconst commandEncoder = device.createCommandEncoder()\n\t\tconst passEncoder = commandEncoder.beginComputePass()\n\n\t\t// Issue commands and end compute pass structure\n\t\tpassEncoder.setPipeline(pipeline)\n\t\tpassEncoder.setBindGroup(0, bindGroups[dispatchIndex])\n\t\tpassEncoder.dispatchWorkgroups(effort * 0x100, effort * 0x100)\n\t\tpassEncoder.end()\n\n\t\t// Copy 8-byte result, 8-byte nonce, and 4-byte found flag from GPU to CPU\n\t\t// for reading\n\t\tcommandEncoder.copyBufferToBuffer(outputBuffers[dispatchIndex], 0, resultBuffers[dispatchIndex], 0, 32)\n\n\t\t// End computation by passing array of command buffers to command queue for execution\n\t\tdevice.queue.submit([commandEncoder.finish()])\n\t} catch (err) {\n\t\tLOG: logger.log(err)\n\t\tthrow new Error('failed to dispatch compute pass', { cause: err })\n\t}\n}\n\nasync function check (dispatchIndex: number): Promise<boolean> {\n\tLOG: logger.log('checking results from compute pass')\n\ttry {\n\t\tawait resultBuffers[dispatchIndex].mapAsync(GPUMapMode.READ)\n\t\tresultViews[dispatchIndex] = new DataView(resultBuffers[dispatchIndex].getMappedRange().slice(0))\n\t\tresultBuffers[dispatchIndex].unmap()\n\t\tLOG: logger.log('OUTPUT', resultViews[dispatchIndex])\n\t\tif (resultViews[dispatchIndex] == null) throw new Error('failed to get data from resultBuffer.')\n\t\treturn !!resultViews[dispatchIndex].getUint32(0, true)\n\n\t} catch (err) {\n\t\tLOG: logger.log(err)\n\t\tthrow new Error('failed to read results from compute pass', { cause: err })\n\t}\n}\n\n/**\n* Map CPU buffer to GPU, read results to static result object, and unmap.\n*/\nfunction read (dispatchIndex: number): { work: bigint, difficulty: bigint } {\n\tLOG: logger.log('reading results from compute pass')\n\ttry {\n\t\tif (resultViews[dispatchIndex] == null) throw new Error('failed to get data from result view')\n\t\treturn {\n\t\t\twork: resultViews[dispatchIndex].getBigUint64(8, true),\n\t\t\tdifficulty: resultViews[dispatchIndex].getBigUint64(16, true)\n\t\t}\n\t} catch (err) {\n\t\tLOG: logger.log(err)\n\t\tthrow new Error('failed to read results from compute pass', { cause: err })\n\t}\n}\n\n/**\n * Nano proof-of-work using WebGPU.\n */\nexport async function generate (hash: bigint, difficulty: bigint, effort: number, debug: boolean): Promise<WorkGenerateResponse> {\n\tlogger.isEnabled = debug\n\t// Set up 60s timeout to prevent long-running calls\n\tlet timeout = false\n\tconst kill = setTimeout(() => {\n\t\ttimeout = true\n\t\tthrow new Error('timed out')\n\t}, 60_000)\n\tLOG: logger.groupStart('NanoPow WebGPU work_generate')\n\tLOG: logger.log('generating')\n\tconst seed = new BigUint64Array(2)\n\tlet found = false\n\tlet result: Record<string, bigint> = {}\n\tlet isFirstRetry = false\n\ttry {\n\t\tdo {\n\t\t\ttry {\n\t\t\t\t// Start device and initialize variables\n\t\t\t\tif (status === 'Idle' || isFirstRetry) {\n\t\t\t\t\tawait q.add(start)\n\t\t\t\t\tif (status !== 'Ready') {\n\t\t\t\t\t\tthrow new Error('failed to start')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait q.add(init, hash, difficulty)\n\t\t\t\t// Dispatch initial workgroups and set index\n\t\t\t\tawait dispatch(0, crypto.getRandomValues(seed)[0], effort)\n\t\t\t\tlet dispatchIndex = 1\n\t\t\t\t// Loop attempts until valid work found\n\t\t\t\tdo {\n\t\t\t\t\tif (dispatchIndex === 0) crypto.getRandomValues(seed)\n\t\t\t\t\tawait dispatch(dispatchIndex, seed[dispatchIndex], effort)\n\t\t\t\t\tdispatchIndex ^= 1\n\t\t\t\t\tfound = await check(dispatchIndex)\n\t\t\t\t} while (!found && !timeout)\n\t\t\t\tawait device.queue.onSubmittedWorkDone()\n\t\t\t\tif (found) result = read(dispatchIndex)\n\t\t\t\tisFirstRetry = false\n\t\t\t} catch (err: any) {\n\t\t\t\tif (status === 'Unsupported') {\n\t\t\t\t\tthrow new Error(err.message, { cause: err })\n\t\t\t\t}\n\t\t\t\t// Only retry once here, allow errors to propagate out to the consumer\n\t\t\t\tisFirstRetry = !isFirstRetry\n\t\t\t\tLOG: logger.log(err)\n\t\t\t\tif (!isFirstRetry) {\n\t\t\t\t\tthrow new Error('failed to restore device', { cause: err })\n\t\t\t\t}\n\t\t\t\twhile (isContextLost) await new Promise(r => setTimeout(r, 100))\n\t\t\t}\n\t\t} while (isFirstRetry)\n\t} finally {\n\t\tclearTimeout(kill)\n\t\tLOG: logger.groupEnd('NanoPow WebGPU work_generate')\n\t\tif (!found && timeout) throw new Error('timed out')\n\t}\n\n\treturn {\n\t\thash: bigHex(hash, 64),\n\t\twork: bigHex(result.work, 16),\n\t\tdifficulty: bigHex(result.difficulty, 16)\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nexport { generate as NanoPowCpu } from './cpu'\nexport { generate as NanoPowWasm } from './wasm'\nexport { generate as NanoPowWebgl } from './webgl'\nexport { generate as NanoPowWebgpu } from './webgpu'\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { NanoPowConfig } from '#lib/config'\nimport { NanoPowCpu, NanoPowWasm, NanoPowWebgl, NanoPowWebgpu } from '#lib/generate'\nimport { NanoPowValidate } from '#lib/validate'\nimport { big, Cache, Logger, MAX_HASH, Queue } from '#utils'\nimport { WorkErrorResponse, WorkGenerateResponse, WorkValidateResponse } from 'nano-pow'\n\nconst logger = new Logger()\nconst q = new Queue()\n\nexport async function generate (blockhash: unknown, options?: unknown): Promise<WorkGenerateResponse | WorkErrorResponse> {\n\tconst { api, debug, difficulty, effort } = await NanoPowConfig(options)\n\tconst hash = big(blockhash)\n\tif (hash < 0 || hash > MAX_HASH) throw RangeError('invalid block hash', { cause: blockhash })\n\tLOG: logger.isEnabled = debug\n\tconst cached = Cache.search(hash, difficulty)\n\tif (cached) {\n\t\tLOG: logger.log('found work in cache')\n\t\tconst { valid } = NanoPowValidate(big(cached.work), big(cached.hash), difficulty, debug)\n\t\tif (valid === '1') {\n\t\t\treturn cached\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tCache.delete(hash)\n\t\t\t} catch (err) {\n\t\t\t\tLOG: logger.log('error deleting invalid work from cache, continuing with generate', err)\n\t\t\t}\n\t\t}\n\t}\n\treturn q.add(async (): Promise<WorkGenerateResponse | WorkErrorResponse> => {\n\t\ttry {\n\t\t\tswitch (api) {\n\t\t\t\tcase 'webgpu': {\n\t\t\t\t\treturn Cache.store(await NanoPowWebgpu(hash, difficulty, effort, debug))\n\t\t\t\t}\n\t\t\t\tcase 'webgl': {\n\t\t\t\t\treturn Cache.store(await NanoPowWebgl(hash, difficulty, effort, debug))\n\t\t\t\t}\n\t\t\t\tcase 'wasm': {\n\t\t\t\t\treturn Cache.store(await NanoPowWasm(hash, difficulty, effort, debug))\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\treturn Cache.store(await NanoPowCpu(hash, difficulty, debug))\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn { error: typeof e === 'string' ? e : (e?.message ?? '') }\n\t\t}\n\t})\n}\n\nexport async function validate (work: unknown, blockhash: unknown, options?: unknown): Promise<WorkValidateResponse | WorkErrorResponse> {\n\ttry {\n\t\tconst hash = big(blockhash)\n\t\tif (hash < 0 || hash > MAX_HASH) throw RangeError('invalid block hash', { cause: blockhash })\n\t\tconst { debug, difficulty } = await NanoPowConfig(options)\n\t\tconst result = await NanoPowValidate(big(work), hash, difficulty, debug)\n\t\treturn result\n\t} catch (e: any) {\n\t\treturn { error: (typeof e === 'string' ? e : (e?.message ?? '')) }\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { NanoPowOptions } from '#lib/config'\nimport { generate, validate } from './lib'\n\ndeclare global {\n\tinterface Window {\n\t\tNanoPow: {\n\t\t\twork_generate: typeof work_generate\n\t\t\twork_validate: typeof work_validate\n\t\t}\n\t}\n}\n\n/**\n * Provide consumer with error information in response to request.\n *\n * @param {string} error - Informative message about error.\n */\nexport type WorkErrorResponse = {\n\terror: string\n}\n\n/**\n * Structure of response to `work_generate` call.\n *\n * @param {string} hash - Hash from generate request\n * @param {string} work - Valid proof-of-work nonce generated for input hash\n * @param {string} difficulty - BLAKE2b output which met or exceeded specified minimum threshold\n */\nexport type WorkGenerateResponse = {\n\thash: string\n\twork: string\n\tdifficulty: string\n}\n\n/**\n * Structure of response to `work_validate` call.\n *\n * @param {string} hash - Hash from validate request\n * @param {string} work - Nonce from validate request\n * @param {string} difficulty - BLAKE2b output of `work` + `hash` which is compared to specified minimum threshold to determine validity\n * @param {string} valid_all - 1 for true if nonce is valid for send blocks, else 0 for false\n * @param {string} valid_receive - 1 for true if nonce is valid for receive blocks, else 0 for false\n * @param {string} [valid] - Excluded if optional difficulty was not included in the request. 1 for true if nonce is valid for requested difficulty, else 0 for false\n */\nexport type WorkValidateResponse = {\n\thash: string\n\twork: string\n\tdifficulty: string\n\tvalid_all: '0' | '1'\n\tvalid_receive: '0' | '1'\n\tvalid?: '0' | '1'\n}\n\n/**\n * Finds a nonce that satisfies the Nano proof-of-work requirements.\n *\n * @param {bigint | string} hash - Hexadecimal hash of previous block, or public key for new accounts\n * @param {object} [options] - Used to configure execution\n * @param {string} [options.api] - Specifies how work is generated. Default: best available\n * @param {boolean} [options.debug=false] - Enables additional debug logging to the console. Default: false\n * @param {number} [options.effort=0x4] - GPU load when generating work. Larger values are not necessarily better since they can quickly overwhelm the GPU. Default: 0x4\n * @param {bigint} [options.difficulty=0xfffffff800000000] - Minimum value result of `BLAKE2b(nonce||blockhash)`. Default: 0xFFFFFFF800000000\n */\nexport async function work_generate (hash: bigint | string, options: NanoPowOptions): Promise<WorkGenerateResponse | WorkErrorResponse> {\n\treturn generate(hash, options)\n}\n\n/**\n * Validates that a nonce satisfies Nano proof-of-work requirements.\n *\n * @param {(bigint|string)} work - Value to validate against hash and difficulty\n * @param {(bigint|string)} hash - Hash of previous block, or public key for new accounts\n * @param {object} [options] - Used to configure execution\n * @param {boolean} [options.debug=false] - Enables additional debug logging to the console. Default: false\n * @param {bigint} [options.difficulty=0xfffffff800000000] - Minimum value result of `BLAKE2b(nonce||blockhash)`. Default: 0xFFFFFFF800000000\n */\nexport async function work_validate (work: bigint | string, hash: bigint | string, options: NanoPowOptions): Promise<WorkValidateResponse | WorkErrorResponse> {\n\treturn validate(work, hash, options)\n}\n\nexport const NanoPow = { work_generate, work_validate }\nexport default NanoPow\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["gl", "device", "v", "result", "logger", "check", "result", "isReady", "wasm", "setup", "result", "data", "logger", "v", "m", "init", "data", "result", "generate", "logger", "isReady", "setup", "reset", "init", "check", "generate", "result", "compute_default", "logger", "isContextLost", "compile", "compute_default", "init", "dispatch", "check", "read", "generate", "result", "logger", "q", "generate", "validate", "result", "generate", "validate"]
|
|
7
|
-
}
|
package/dist/utils/index.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/api-support/wasm.ts", "../../src/utils/api-support/webgl.ts", "../../src/utils/api-support/webgpu.ts", "../../src/utils/api-support/index.ts", "../../src/utils/bigint.ts", "../../src/utils/cache.ts", "../../src/utils/logger.ts", "../../src/utils/queue.ts", "../../src/utils/index.ts"],
|
|
4
|
-
"sourcesContent": ["//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nconst wasm = { isSupported: false }\nObject.defineProperty(wasm, 'isSupported', {\n\tget: async function () {\n\t\tlet isWasmSupported = false\n\t\ttry {\n\t\t\t// (func (result v128) (v128.const i32x4 0 0 0 0))\n\t\t\tconst wasmBuffer = new Uint8Array([\n\t\t\t\t0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, // WASM magic header and version\n\t\t\t\t0x01, 0x04, // Type section, 4 byte descriptor\n\t\t\t\t0x01, 0x60, 0x00, 0x00, // 1 type, type function, 0 params, 0 returns\n\t\t\t\t0x03, 0x02, // Function section, 2 byte descriptor\n\t\t\t\t0x01, 0x00, // 1 function, ID 0\n\t\t\t\t0x0a, 0x17, // Code section, 23 bytes\n\t\t\t\t0x01, 0x15, // 1 function body, 21 bytes\n\t\t\t\t0x00, // 0 local variables\n\t\t\t\t0xfd, 0x0c, // v128.const\n\t\t\t\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // assign i64x2 values\n\t\t\t\t0x1a, 0x0b // Drop result, end function\n\t\t\t])\n\t\t\tconst module = await WebAssembly.compile(wasmBuffer)\n\t\t\tconst instance = await WebAssembly.instantiate(module)\n\t\t\tisWasmSupported = (instance instanceof WebAssembly.Instance)\n\t\t} catch (err: any) {\n\t\t\tconsole.warn('WASM is not supported in this environment.\\n', err.message ?? err)\n\t\t\tisWasmSupported = false\n\t\t} finally {\n\t\t\tdelete this.isSupported\n\t\t\tthis.isSupported = isWasmSupported\n\t\t\treturn this.isSupported\n\t\t}\n\t}\n})\n\nexport { wasm }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nconst webgl = { isSupported: false }\nObject.defineProperty(webgl, 'isSupported', {\n\tget: async function () {\n\t\tlet isWebglSupported = false\n\t\ttry {\n\t\t\tconst gl = new OffscreenCanvas(0, 0)?.getContext?.('webgl2')\n\t\t\tisWebglSupported = (gl instanceof WebGL2RenderingContext && !gl.isContextLost())\n\t\t} catch (err) {\n\t\t\tconsole.warn('WebGL is not supported in this environment.\\n', err)\n\t\t\tisWebglSupported = false\n\t\t} finally {\n\t\t\tdelete this.isSupported\n\t\t\tthis.isSupported = isWebglSupported\n\t\t\treturn this.isSupported\n\t\t}\n\t}\n})\n\nexport { webgl }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nconst webgpu = { isSupported: false }\nObject.defineProperty(webgpu, 'isSupported', {\n\tget: async function () {\n\t\tlet isWebgpuSupported = false\n\t\ttry {\n\t\t\tconst adapter = await navigator?.gpu?.requestAdapter?.()\n\t\t\tconst device = await adapter?.requestDevice?.()\n\t\t\tisWebgpuSupported = (adapter instanceof GPUAdapter && device instanceof GPUDevice)\n\t\t} catch (err) {\n\t\t\tconsole.warn('WebGPU is not supported in this environment.\\n', err)\n\t\t\tisWebgpuSupported = false\n\t\t} finally {\n\t\t\tdelete this.isSupported\n\t\t\tthis.isSupported = isWebgpuSupported\n\t\t\treturn this.isSupported\n\t\t}\n\t}\n})\n\nexport { webgpu }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { wasm } from './wasm'\nimport { webgl } from './webgl'\nimport { webgpu } from './webgpu'\n\nexport const ApiSupport = { cpu: { isSupported: true }, wasm, webgl, webgpu }\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { isHexN } from '#utils'\n\nexport function big (value: bigint | boolean | number | string | unknown): bigint {\n\tswitch (typeof value) {\n\t\tcase 'bigint':\n\t\tcase 'boolean':\n\t\tcase 'number': {\n\t\t\treturn BigInt(value)\n\t\t}\n\t\tcase 'string': {\n\t\t\tconst v = value.trim().replace(/^0[Xx]/, '').replace(/[Nn]$/, '')\n\t\t\tif (!isHexN(v, null)) throw TypeError('invalid hex string', { cause: value })\n\t\t\treturn BigInt(`0x${v}`)\n\t\t}\n\t\tdefault: {\n\t\t\tthrow TypeError(`can't convert value to BigInt`)\n\t\t}\n\t}\n}\n\nexport function bigHex (int: bigint, length: number = 0): string {\n\treturn int.toString(16).padStart(length, '0')\n}\n\nexport function bigToU32 (int: bigint, length: number): Uint32Array<ArrayBuffer> {\n\tconst u32 = new Uint32Array(length)\n\tbigintToUintArray(u32, int)\n\treturn u32\n}\n\nexport function bigToU64 (int: bigint, length: number): BigUint64Array<ArrayBuffer> {\n\tconst u64 = new BigUint64Array(length)\n\tbigintToUintArray(u64, int)\n\treturn u64\n}\n\nfunction bigintToUintArray (out: Uint32Array<ArrayBuffer> | BigUint64Array<ArrayBuffer>, int: bigint): void {\n\tif (int < 0n) int = ~(int - 1n)\n\tconst bits = out instanceof BigUint64Array ? 64n : 32n\n\tconst mask = (1n << bits) - 1n\n\tfor (let i = out.length - 1; i >= 0 && int > 0n; i--) {\n\t\tconst v = int & mask\n\t\tout[i] = bits === 64n ? v : Number(v)\n\t\tint >>= bits\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nimport { WorkGenerateResponse } from 'nano-pow'\n\nconst STORAGE_KEY = 'NanoPowCache'\n\nconst storage = globalThis.localStorage ?? {\n\trecords: new Map<string, string>(),\n\tgetItem (key: string): string | null {\n\t\treturn this.records.get(key)\n\t},\n\tremoveItem (key: string): void {\n\t\tthis.records.delete(key)\n\t},\n\tsetItem (key: string, item: string): void {\n\t\tthis.storage.set(key, item)\n\t}\n}\n\nfunction eq (a: unknown, b: bigint): boolean {\n\treturn typeof a === 'string'\n\t\t&& /^([a-f0-9]{2})+$/i.test(a)\n\t\t&& BigInt(`0x${a}`) === b\n}\n\nexport const Cache = {\n\tclear (): void {\n\t\tstorage.removeItem(STORAGE_KEY)\n\t},\n\tdelete (hash: unknown): void {\n\t\tconst item = storage.getItem(STORAGE_KEY)\n\t\tif (item == null) return\n\t\tconst cache = JSON.parse(item) as WorkGenerateResponse[]\n\t\tfor (let i = 0; i < cache.length; i++) {\n\t\t\tif (cache[i].hash === hash) {\n\t\t\t\tcache.splice(i, 1)\n\t\t\t}\n\t\t}\n\t\tstorage.setItem(STORAGE_KEY, JSON.stringify(cache))\n\t},\n\tsearch (hash: unknown, difficulty: bigint): WorkGenerateResponse | null {\n\t\tconst item = storage.getItem(STORAGE_KEY)\n\t\tif (item == null) return null\n\t\tconst cache: WorkGenerateResponse[] = JSON.parse(item)\n\t\tconst match = cache.find(c => c.hash === hash && eq(c.difficulty, difficulty))\n\t\treturn match ?? null\n\t},\n\tstore (result: WorkGenerateResponse): WorkGenerateResponse {\n\t\tconst item = storage.getItem(STORAGE_KEY) ?? '[]'\n\t\tconst cache: WorkGenerateResponse[] = JSON.parse(item)\n\t\tif (cache.push(result) > 1000) cache.shift()\n\t\tstorage.setItem(STORAGE_KEY, JSON.stringify(cache))\n\t\treturn result\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\n/**\n * Override console logging to provide an informative prefix for each entry and\n * to only output when debug mode is enabled.\n */\nexport class Logger {\n\tisEnabled: boolean = false\n\tgroups: Record<string, boolean> = {}\n\n\tgroupStart (name: string): void {\n\t\tif (this.isEnabled) {\n\t\t\tconsole.groupCollapsed(name)\n\t\t\tthis.groups[name] = true\n\t\t}\n\t}\n\n\tgroupEnd (name: string): void {\n\t\tif (this.groups[name]) {\n\t\t\tconsole.groupEnd()\n\t\t\tdelete this.groups[name]\n\t\t}\n\t}\n\n\tlog (...args: any[]): void {\n\t\tif (this.isEnabled) {\n\t\t\tconst datetime = new Date(Date.now()).toLocaleString(Intl.DateTimeFormat().resolvedOptions().locale ?? 'en-US', { hour12: false, dateStyle: 'medium', timeStyle: 'medium' })\n\t\t\tfor (let i = 0; i < args.length; i++) {\n\t\t\t\tif (typeof args[i] === 'string') {\n\t\t\t\t\targs[i] = args[i].replace(datetime, '').trimStart()\n\t\t\t\t}\n\t\t\t\tif (args[i] instanceof Error) {\n\t\t\t\t\tif ('stack' in args[i]) {\n\t\t\t\t\t\targs.splice(i + 1, 0, args[i].stack)\n\t\t\t\t\t} else if ('message' in args[i]) {\n\t\t\t\t\t\targs.splice(i + 1, 0, args[i].message)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst entry = `${datetime} ${globalThis.process?.title ?? 'NanoPow'}[${globalThis.process?.pid ?? 'browser'}]:`\n\t\t\tconsole.log(entry, ...args)\n\t\t\tglobalThis.process?.send?.({ type: 'console', data: `${entry} ${args}` })\n\t\t}\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\n/**\n * Serially executes asynchronous functions.\n */\nexport class Queue {\n\t#isIdle: boolean\n\t#queue: any[]\n\n\tconstructor () {\n\t\tthis.#isIdle = true\n\t\tthis.#queue = []\n\t}\n\n\t#process = (): void => {\n\t\tconst { task, resolve, reject, args } = this.#queue.shift() ?? {}\n\t\tthis.#isIdle = !task\n\t\ttask?.(...args).then(resolve).catch(reject).finally(this.#process)\n\t}\n\n\tasync add (task: unknown, ...args: any[]): Promise<any> {\n\t\tif (typeof task !== 'function') throw new TypeError('task is not a function')\n\t\treturn new Promise((resolve, reject): void => {\n\t\t\tthis.#queue.push({ task, resolve, reject, args })\n\t\t\tif (this.#isIdle) this.#process()\n\t\t})\n\t}\n\n\tasync prioritize (task: unknown, ...args: any[]): Promise<any> {\n\t\tif (typeof task !== 'function') throw new TypeError('task is not a function')\n\t\treturn new Promise((resolve, reject): void => {\n\t\t\tif (typeof task !== 'function') reject('task is not a function')\n\t\t\tthis.#queue.unshift({ task, resolve, reject, args })\n\t\t\tif (this.#isIdle) this.#process()\n\t\t})\n\t}\n}\n", "//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\n//! SPDX-License-Identifier: GPL-3.0-or-later\n\nexport * from './api-support'\nexport * from './bigint'\nexport * from './cache'\nexport * from './logger'\nexport * from './queue'\n\nexport const SEND = 0xfffffff800000000n as const\nexport const RECEIVE = 0xfffffe0000000000n as const\nexport const MAX_HASH = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn as const\n\ntype Averages = {\n\tcount: number,\n\ttotal: number,\n\trate: number,\n\tmin: number,\n\tmax: number,\n\tmedian: number,\n\tarithmetic: number,\n\tgeometric: number,\n\tharmonic: number,\n\ttruncatedCount: number,\n\ttruncatedTotal: number,\n\ttruncatedRate: number,\n\ttruncatedMin: number,\n\ttruncatedMax: number,\n\ttruncatedArithmetic: number,\n\ttruncatedGeometric: number,\n\ttruncatedHarmonic: number,\n}\n\n/**\n* Checks if value is a string representing an N-byte hexadecimal number.\n*\n* @param {unknown} value - String to check. Be sure to trim whitespace, hex '0x' prefix, and bigint 'n' suffix.\n* @param {(number|null)} byteLength - Number of bytes the string should represent, or 'null' for any number greater than zero.\n* @returns True if value is a 2N-character hexadecimal string, else false.\n*/\nexport function isHexN (value: unknown, byteLength: number | null): value is string {\n\tif (typeof value !== 'string') return false\n\tconst length = byteLength === null ? '+' : `{${byteLength << 1}}`\n\tconst r = new RegExp(`^[0-9a-f]${length}$`, 'i')\n\treturn r.test(value)\n}\n\n/**\n* Checks if value is a string representing an 8-byte hexadecimal number.\n*\n* @param {unknown} value - Value to check.\n* @returns True if value is a 16-character hexadecimal string, else false.\n*/\nexport function isHex8 (value: unknown): value is string {\n\treturn isHexN(value, 8)\n}\n\n/**\n* Checks if value is a string representing a 32-byte hexadecimal number.\n*\n* @param {unknown} value - Value to check.\n* @returns True if value is a 64-character hex string, else false.\n*/\nexport function isHex32 (value: unknown): value is string {\n\treturn isHexN(value, 32)\n}\n\n/**\n* Computes various types of averages for a set of numbers.\n*\n* @param {number[]} times - List of numbers, often timing durations.\n* @returns Object with averaged values for the specified list.\n*/\nexport function stats (times: number[]): Averages | null {\n\tif (times == null || times.length === 0) return null\n\n\tconst count = times.length\n\tconst truncatedStart = Math.floor(count * 0.1)\n\tconst truncatedEnd = count - truncatedStart\n\tconst truncatedCount = truncatedEnd - truncatedStart\n\tlet min = Number.MAX_SAFE_INTEGER\n\tlet logarithms, max, median, reciprocals, total\n\tlogarithms = max = median = reciprocals = total = 0\n\n\tlet truncatedMin = Number.MAX_SAFE_INTEGER\n\tlet truncatedLogarithms, truncatedMax, truncatedReciprocals, truncatedTotal\n\ttruncatedLogarithms = truncatedMax = truncatedReciprocals = truncatedTotal = 0\n\n\ttimes.sort((a, b) => a - b)\n\tfor (let i = 0; i < count; i++) {\n\t\tconst time = times[i]\n\t\ttotal += time\n\t\tlogarithms += Math.log(time)\n\t\treciprocals += 1 / time\n\t\tmin = Math.min(min, time)\n\t\tmax = Math.max(max, time)\n\t\tif (i === Math.floor((count - 1) / 2)) median = time\n\t\tif (i === Math.floor(count / 2) && count % 2 === 0) median = (median + time) / 2\n\t}\n\tfor (let i = truncatedStart; i < truncatedEnd; i++) {\n\t\tconst time = times[i]\n\t\ttruncatedTotal += time\n\t\ttruncatedLogarithms += Math.log(time)\n\t\ttruncatedReciprocals += 1 / time\n\t\ttruncatedMin = Math.min(truncatedMin, time)\n\t\ttruncatedMax = Math.max(truncatedMax, time)\n\t}\n\treturn {\n\t\tcount,\n\t\ttotal,\n\t\trate: 1000 * count / total,\n\t\tmin,\n\t\tmax,\n\t\tmedian,\n\t\tarithmetic: total / count,\n\t\tgeometric: Math.exp(logarithms / count),\n\t\tharmonic: count / reciprocals,\n\t\ttruncatedCount,\n\t\ttruncatedTotal,\n\t\ttruncatedRate: 1000 * truncatedCount / truncatedTotal,\n\t\ttruncatedMin,\n\t\ttruncatedMax,\n\t\ttruncatedArithmetic: truncatedTotal / truncatedCount,\n\t\ttruncatedGeometric: Math.exp(truncatedLogarithms / truncatedCount),\n\t\ttruncatedHarmonic: truncatedCount / truncatedReciprocals,\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|