@banou/ripple 0.0.21 → 0.0.23

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Banou
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,212 +1,127 @@
1
- # Ripple, the torrent app that respect your privacy
1
+ # Ripple
2
+
3
+ Download and stream torrents in your browser. Ripple runs a real BitTorrent engine
4
+ ([libtorrent](https://www.libtorrent.org), compiled to WebAssembly) in the page, reaches peers
5
+ through the [FKN](https://fkn.app) relay, and plays a video while it downloads. There is nothing to
6
+ install and no Ripple server.
7
+
8
+ - Live at [torrent.fkn.app](https://torrent.fkn.app), and inside FKN at
9
+ [fkn.app/app/npm:@banou/ripple](https://fkn.app/app/npm:@banou/ripple)
10
+ - Published on npm as [`@banou/ripple`](https://www.npmjs.com/package/@banou/ripple)
11
+
12
+ ## Features
13
+
14
+ - **Add a magnet or a `.torrent`.** Paste it, drop it, or open it from your system once Ripple is
15
+ installed as an app, which then opens `magnet:` links and `.torrent` files.
16
+ - **Watch while it downloads**, with subtitles, a choice of audio track and a Normalize volume
17
+ switch.
18
+ - **Pick the files you want** before the download starts.
19
+ - **Keep files in the browser or in a folder on your disk**, and save one file, or a zip of
20
+ several.
21
+ - **Create a torrent** from files or a folder (v1, v2 or hybrid, private with a source tag, web
22
+ seeds) and seed it straight from those files.
23
+ - **Your library on every device.** Signed in to FKN, your list and its thumbnails sync, encrypted
24
+ in your browser before they leave it.
25
+ - **Share links** that open the player or a download page, which other sites can embed.
26
+ - **One engine for all your tabs.** One tab runs it and the others use it.
27
+ - **Speed limits** for everything or per torrent, and the peers, trackers, files and all-time share
28
+ ratio of each torrent.
29
+ - **No Ripple account and no analytics.**
30
+
31
+ ## How it is built
32
+
33
+ - **UI**: React 19, routed with React Router 7 and styled with Emotion, in `src/router` and
34
+ `src/components`.
35
+ - **Engine**: [`libtorrent-wasm`](https://www.npmjs.com/package/libtorrent-wasm) in a Web Worker
36
+ (`src/torrent/worker.ts`), driven from the page by `src/torrent/client.ts`. One tab holds it
37
+ under a Web Lock and the others reach it over a BroadcastChannel (`engine-election.ts`,
38
+ `engine-share.ts`).
39
+ - **Network**: `@fkn/lib/net` and `@fkn/lib/dgram`, carried through the FKN relay (`relayWorker`
40
+ bridges the worker). Inbound peers reach a port the relay reserves.
41
+ - **Storage**: OPFS, or a folder you grant (`src/torrent/hybrid-storage.ts`). The list, resume data
42
+ and thumbnails are in IndexedDB.
43
+ - **Player**: [`@banou/media-player`](https://www.npmjs.com/package/@banou/media-player) at
44
+ `/watch` (`src/router/embed.tsx`), with libav-wasm and jassub.
45
+ - **Sync**: `src/torrent/use-cloud-backup.ts` and `src/torrent/thumbnail-sync.ts`, under `ripple/`
46
+ in the FKN account's storage.
47
+
48
+ ## Development
49
+
50
+ Use Node 24 (`.node-version` names 24.21.0).
2
51
 
3
- THE app that allows you to download torrents and stream video files from the safety of your browser!
4
-
5
- ## Embedding
6
-
7
- `/watch` and `/download` are the pages another site puts in an iframe. Both take a magnet and the
8
- same query; the path chooses which one renders. `/watch` plays the file, `/download` delivers it.
9
-
10
- | param | value | meaning |
11
- | --- | --- | --- |
12
- | `m` | the packed magnet, base64url | what Ripple writes today |
13
- | `magnet` | base64 of the magnet URI | the original form, read forever |
14
- | `fileIndex` | a file index | the file `/watch` plays; the fallback `/download` uses |
15
- | `files` | `all`, `3`, `0-4`, `0,2,5` | what `/download` delivers |
16
- | `f` | a packed file list | optional preview, `/download` only |
17
-
18
- One of `m` or `magnet` is required. `m` wins if both are present.
19
-
20
- There is no `mode` parameter. It used to choose the page and is now neither written nor read, so a
21
- link still carrying one gets the page its PATH names and the parameter is ignored.
22
-
23
- ### The two magnet forms
24
-
25
- `magnet=<base64 of the magnet URI>` is the original, and it is **permanent**. Every link ever handed
26
- out with it keeps working, and an embedder that finds it easier to write can keep writing it. Nothing
27
- about it has changed.
28
-
29
- `m=` is the same torrent packed smaller: the infohash as raw bytes rather than 40 hex characters, and
30
- the rest of the query deflated against a fixed table of the announce URLs that public magnets
31
- overwhelmingly share. It is base64url, so a query string carries it without escaping anything. Across
32
- a corpus covering every magnet form Ripple accepts, the median link is **69% shorter**; a five-tracker
33
- release goes from a 549-character URL to 148. A magnet using only private trackers has nothing to
34
- match against and still comes out around 42% shorter, on the strength of the packed infohash alone.
35
-
36
- Ripple writes whichever of the two is shorter, which is almost always `m`. The digit is a version:
37
- the table it compresses against can never be edited, so if it ever needs to change the parameter
38
- becomes `m2` and `m` keeps decoding the way it always did.
39
-
40
- ### Parameter order
41
-
42
- Order never matters when READING a link. When writing one, Ripple puts the plainest parts first:
43
-
44
- ```
45
- /watch?fileIndex=3&m=AQAIraWnphg6rh4J2DHfZ0jVZglaEAMWq8GZeSWpORSmTXxFBwA
46
- /download?files=2&m=AQAIraWnphg6rh4J2DHfZ0jVZglaEAMWq8GZeSWpORSmTXxFBwA
47
- /download?m=AQAIraWnphg6rh4J2DHfZ0jVZglaEAMWq8GZeSWpORSmTXxFBwA&f=AWNSC87MK0nN0YdQ
52
+ ```sh
53
+ npm ci
54
+ npm run dev # http://localhost:4560
55
+ npm run build # the site and the npm package, into build/
56
+ npm test # unit tests (vitest, node)
57
+ npm run test:browser # component tests in Chrome
58
+ npm run typecheck
59
+ npm run lint # vp lint
48
60
  ```
49
61
 
50
- The path, then which files, then the packed torrent, then `f`. The torrent used to lead, from when
51
- it was the only thing in the link; now that everything around it is base64url or an index, leading
52
- with it buried the one part a person can read behind forty characters of noise. A URL is read from
53
- the left and truncated from the right, so `f`, the longest parameter and the one a reader cares
54
- least about, goes last.
55
-
56
- ### `f`, the file list
57
-
58
- A magnet names a torrent and nothing else, so a download link normally opens on "Reading the torrent
59
- from the network" for as long as metadata takes. `f` closes that gap by carrying the file list the
60
- sender already had, and the page shows it immediately, marked **from the link**.
62
+ The Playwright suites build first, then drive the built site in Chrome:
61
63
 
62
- It is a preview and Ripple treats it as one. It never decides what gets downloaded: the button stays
63
- disabled until real metadata arrives, the download itself is resolved against that metadata, and the
64
- per-file buttons are not rendered at all while the list is only the link's claim. A link that
65
- describes a torrent inaccurately therefore costs a reader a wrong line on screen for a few seconds,
66
- and can never cost them the wrong file on disk.
64
+ | command | what it covers |
65
+ | --- | --- |
66
+ | `npm run test:e2e:local` | the app, needing nothing but the browser (and ffmpeg) |
67
+ | `npm run test:e2e:machine` | live figures keep their width, which depends on the machine's fonts |
68
+ | `npm run test:e2e:swarm` | the engine against real public swarms |
69
+ | `npm run test:e2e:rig` | the whole chain against a local swarm, see [tests/swarm-rig](./tests/swarm-rig/README.md) |
67
70
 
68
- Ripple writes it only on `/download`, only when it has the list, and only when it fits: a
69
- 12-episode season costs about 172 characters and a 48-file season about 416. Past a budget it is
70
- left off entirely rather than pushing the link past what a chat message will carry. Absent, `f`
71
- changes nothing, so a link without it behaves exactly as it always has.
71
+ The swarm and rig suites need a headful Chrome, because headless Chromium stalls the engine at
72
+ 0 B/s. Run them under `xvfb-run -a -s "-screen 0 1280x720x24"` so no window opens.
72
73
 
73
- Putting the whole `.torrent` in the URL instead does not work, and the reason is arithmetic rather
74
- than encoding: piece hashes are around 94% of a torrent and are 20 bytes of SHA1 per piece, so they
75
- are incompressible. A 12-episode season is a 28,512-character URL and a 40 GB remux is 68,676. The
76
- file list is the part that is both small and worth having.
74
+ A push to `main` deploys [torrent.fkn.app](https://torrent.fkn.app) (Cloudflare Pages), and
75
+ publishes to npm when `package.json` names a version the registry does not have yet
76
+ (`.github/workflows/publish-lib.yml`). Each published version is signed for FKN with `fkn-sign`.
77
77
 
78
- ### `/watch`
79
-
80
- Plays `fileIndex` (0 if absent) in the media player, with the filename, peer count and transfer
81
- rates drawn over the video.
82
-
83
- The mode used to be a parameter, and for a while Ripple wrote `mode=watch` out in full so that a
84
- link said what it did rather than being told apart by an absence. The path says it for free and in
85
- the part of a URL that is read first, so the parameter is gone from both halves and a link still
86
- carrying one gets the page its path names.
78
+ ## Embedding
87
79
 
88
- **This route was `/embed` until 2026-09-09 and the old path is gone rather than redirected.** A link
89
- written against it 404s to the SPA shell; rewrite it as `/watch` with the query untouched.
80
+ `/watch` and `/download` are the pages another site puts in an iframe. Both take a magnet and the
81
+ same query; the path chooses which one renders. `/watch` plays a file, `/download` delivers files.
90
82
 
91
- ### `/download`
83
+ | param | value | meaning |
84
+ | --- | --- | --- |
85
+ | `magnet` | base64 of the magnet URI | the form to write; permanent |
86
+ | `m` | the packed magnet, base64url | what Ripple's own share links write |
87
+ | `fileIndex` | a file index | the file `/watch` plays (0 if absent); the fallback `/download` uses |
88
+ | `files` | `all`, `3`, `0-4`, `0,2,5` | what `/download` delivers |
92
89
 
93
- A download page: the release name, the size of the selection, and one button. One file is delivered
94
- as that file; anything more is delivered as a single `.zip`, written straight through to the
95
- browser's own downloader without ever being held in memory.
90
+ One of `magnet` or `m` is required, and `m` is read first when both are present. `magnet=` is the
91
+ original form and every link written with it keeps working. `m=` is the same torrent packed into a
92
+ much shorter link.
96
93
 
97
94
  ```
98
- /download?magnet=<base64> the whole torrent, as a zip
99
- /download?magnet=<base64>&files=3 just file 3
100
- /download?magnet=<base64>&files=0-4 files 0 to 4 inclusive, as a zip
101
- /download?magnet=<base64>&files=0,2,5 those three, as a zip
102
- /download?magnet=<base64>&fileIndex=3 same as files=3, so a watch URL becomes a download by
103
- swapping /watch for /download and nothing else
95
+ /watch?magnet=<base64>&fileIndex=3 plays file 3
96
+ /download?magnet=<base64> the whole torrent
97
+ /download?magnet=<base64>&files=3 just file 3
98
+ /download?magnet=<base64>&files=0-4 files 0 to 4 inclusive, as a zip
99
+ /download?magnet=<base64>&files=0,2,5 those three, as a zip
100
+ /download?magnet=<base64>&fileIndex=3 same as files=3
104
101
  ```
105
102
 
106
- `files` outranks `fileIndex`. Indices the torrent does not have are dropped rather than clamped, and
107
- a selection that resolves to nothing says so instead of quietly downloading the whole torrent.
108
-
109
- ### What an embedder has to grant
103
+ One file is delivered as that file, and more than one as a single `.zip`. `files` outranks
104
+ `fileIndex`. Indices the torrent does not have are dropped, and a selection that resolves to
105
+ nothing says so instead of downloading the whole torrent.
110
106
 
111
- **The frame needs `allow-downloads` if it is sandboxed at all.** Sandbox flags on a nested browsing
112
- context are the union of the parent's set and the child's, so a flag the embedder withheld cannot be
113
- restored from inside, and Chrome then refuses the download *silently*: the navigation is dropped, no
114
- event fires and nothing throws. There is no `downloads` feature in Permissions-Policy, so `allow=`
115
- is not a lever here; the `sandbox` attribute is the only one.
107
+ **A sandboxed frame needs `allow-downloads`**, or the browser drops the download without an error.
108
+ Leaving out `sandbox` works too.
116
109
 
117
110
  ```html
118
111
  <iframe src="https://torrent.fkn.app/download?magnet=..."
119
112
  sandbox="allow-scripts allow-same-origin allow-downloads"></iframe>
120
113
  ```
121
114
 
122
- Omitting `sandbox` entirely works too. When the page detects it is framed by another origin it
123
- offers a link to open itself top-level, which is the way out if the embedder cannot grant the flag.
124
-
125
- Two other consequences of being framed, both handled: Chrome refuses `showSaveFilePicker` in a
126
- cross-origin frame, so the page does not ask for one, and delivery goes through the service worker
127
- instead.
115
+ Why each part works the way it does is in [docs/embedding.md](./docs/embedding.md).
128
116
 
129
- ## Tests
130
-
131
- | command | what it covers | cost |
132
- | --- | --- | --- |
133
- | `npm test` | pure logic in node | ~1s |
134
- | `npm run test:browser` | components in real Chrome | ~2s |
135
- | `npx tsc --noEmit` | types | ~1s |
136
- | `npx vp lint` | oxlint, type aware | ~1s |
137
- | `npm run test:download` | the download page against a real torrent, end to end | ~30s |
138
- | `npm run test:e2e` | the engine against real swarms | minutes, headful |
139
- | `npm run test:e2e:rig` | the whole chain against a local swarm, see below | ~90s, headful under Xvfb |
117
+ ## Privacy
140
118
 
141
- The playwright suites run headful on purpose: headless Chromium stalls the engine at a flat 0 B/s in
142
- every topology, which makes anything torrent-shaped unmeasurable rather than merely slow.
119
+ Ripple needs no account and runs no analytics. Your list and your files stay in your browser, or in
120
+ a folder you choose. Signed in to FKN, your list and its thumbnails sync to your FKN account,
121
+ encrypted in your browser first. Peers see the FKN relay's address, not yours. The
122
+ [privacy page](https://torrent.fkn.app/privacy) lists what Ripple keeps
123
+ (`src/router/privacy.tsx`).
143
124
 
144
- ### The swarm rig
145
-
146
- `e2e:rig` downloads a torrent that exists only on this machine. The seeders are transmission daemons
147
- on `127.0.0.2` and up, the relay is a local webvpn build, and the broker is a local fkn-client web
148
- build, so the only source of a byte is the fleet the magnet names. The public swarm cannot give that:
149
- byte-identical code measured 14.7 s to 73.4 s to first frame there.
150
-
151
- | piece | where | port |
152
- | --- | --- | --- |
153
- | broker (fkn-client `web`, development build) | `http://localhost:5234/api` | 5234 |
154
- | relay (webvpn release build) | WebTransport, HTTP, WebSocket on `127.0.0.1` | 5433, 5434, 5443 |
155
- | ripple (`build/`, served) | `http://localhost:5460` | 5460 |
156
- | seeders (transmission 4) | `127.0.0.2:52600` and up, rpc `9400` and up | |
157
-
158
- None of it overlaps fkn/local's rig (1234, 3000, 4433, 4560, 8443), so the two run side by side. The
159
- ports live in `tests/swarm-rig/topology.json`.
160
-
161
- It needs three checkouts, and an fkn-client worktree of its own, because the rig rewrites that
162
- checkout's `.env.local` files and build output:
163
-
164
- ```sh
165
- git -C ~/dev/horionsoftware/fkn-client worktree add --detach ~/dev/fkn-client-rig origin/main
166
- (cd ~/dev/horionsoftware/webvpn && cargo build --release)
167
-
168
- export RIPPLE_RIG_FKN_CLIENT=~/dev/fkn-client-rig
169
- export RIPPLE_RIG_WEBVPN=~/dev/horionsoftware/webvpn
170
- export RIPPLE_RIG_LOCAL=~/dev/horionsoftware/local
171
- export RIPPLE_CHROME=$(command -v google-chrome-stable)
172
- export RIG_TRANSMISSION=$(nix build --no-link --print-out-paths 'nixpkgs#transmission_4')
173
-
174
- nix shell nixpkgs#xvfb-run -c env -u WAYLAND_DISPLAY -u NIXOS_OZONE_WL \
175
- xvfb-run -a -s "-screen 0 1280x720x24" npm run test:e2e:rig
176
- ```
125
+ ## License
177
126
 
178
- `test:e2e:rig` runs three steps:
179
-
180
- 1. `scripts/rig-prepare.mjs` builds `@fkn/lib` with `VITE_WEB_ORIGIN=http://localhost:5234` and the
181
- web app as the broker, then checks what each build baked in. It refuses a main worktree.
182
- 2. `npm run build`, which sees `RIPPLE_RIG_FKN_CLIENT` and resolves `@fkn/lib` to that local build
183
- (the published lib has `https://fkn.app` baked in, and no setting of ripple's can move it). The
184
- build warns when it does this. Afterwards `build/` points at the rig's broker, so rebuild without
185
- the variable before serving it for anything else.
186
- 3. `playwright.rig.config.ts` starts the relay (the environment `byo.sh webvpn --export` prints, moved
187
- to the rig's ports, with a fresh certificate and `FREE_RATE_BYTES_PER_SEC` at 1 GiB/s), the broker
188
- and ripple, then runs `tests/swarm-rig.spec.ts`.
189
-
190
- The spec has three tests, run in order:
191
-
192
- - **Configuration.** The relay answers. The RUNNING relay's environment allows private targets and
193
- carries the raised rate. `/api` serves the broker's own document, not the SPA fallback.
194
- - **The swarm arm.** It makes a 60 s 720p fixture with ffmpeg (no private flag, which would stop
195
- seeders serving metadata to a magnet). It starts N seeders with staggered adds and opens `/watch`
196
- for the magnet in a fresh regular profile. It then asserts that the engine held the whole file,
197
- that OPFS holds it piece for piece and by SHA-256, that a frame was painted, and that the seeders
198
- uploaded at least the file. It prints time to first byte, first frame and completion from the add.
199
- - **The control.** The same fleet comes up and goes down, and the same visit runs for 30 s. It must
200
- see 0 bytes in the engine and in OPFS, and the swarm arm's own assertion must FAIL on it.
201
-
202
- The seeders run under a shell that kills them when the test process is gone, so a run killed
203
- outright leaves nothing on their addresses. Without that shell, all four outlived a SIGKILL.
204
-
205
- Knobs: `RIPPLE_RIG_SEEDERS` (default 4), `RIPPLE_RIG_BUDGET_MS` (swarm arm, 120000),
206
- `RIPPLE_RIG_CONTROL_MS` (30000), `RIPPLE_RIG_STATE` (fixture and seeder state, default
207
- `$TMPDIR/ripple-swarm-rig`). The config refuses to start when `WAYLAND_DISPLAY` or `NIXOS_OZONE_WL`
208
- is set, because the Nix Chrome wrapper then opens a real window even under `xvfb-run`.
209
-
210
- The engine's DHT is on, and it announces the infohash through the relay. So the control can see a
211
- stray peer (1 peer in two of three runs, 0 bytes each time). This is why the seeders' own upload
212
- count is part of the claim.
127
+ MIT, see [LICENSE](./LICENSE).
@@ -3,4 +3,4 @@ var e=(()=>{var e=import.meta.url;return(async function(t={}){var n,r=t,i,a,o=ne
3
3
  `,Math.max(n,r))+1;t=t.slice(i),e&8&&V(`emscripten_log with EM_LOG_C_STACK no longer has any effect`);var a=t.split(`
4
4
  `);t=``;var o=/* @__PURE__ */ RegExp(`\\s*(.*?)@(.*?):([0-9]+):([0-9]+)`),s=/* @__PURE__ */ RegExp(`\\s*at (.*?) \\((.*):(.*):(.*)\\)`);for(var c of a){var l=``,u=``,d=0,f=0,p=s.exec(c);if(p?.length==5)l=p[1],u=p[2],d=p[3],f=p[4];else if(p=o.exec(c),p?.length>=4)l=p[1],u=p[2],d=p[3],f=p[4]|0;else{t+=c+`
5
5
  `;continue}e&24&&(e&64&&(u=u.substring(u.replace(/\\/g,`/`).lastIndexOf(`/`)+1)),t+=` at ${l} (${u}:${d}:${f})\n`)}return t=t.replace(/\s+$/,``),t},On=(e,t)=>{e&24&&(t=t.replace(/\s+$/,``),t+=(t.length>0?`
6
- `:``)+Dn(e)),e&1?e&4?console.error(t):e&2?console.warn(t):e&512?console.info(t):e&256?console.debug(t):console.log(t):e&6?x(t):te(t)},kn=(e,t,n)=>{On(e,Pe(Tn(t,n)))},An=()=>2147483648,jn=e=>{var t=S.buffer,n=(e-t.byteLength+65535)/65536|0;try{return S.grow(n),me(),1}catch(n){x(`growMemory: Attempted to grow heap from ${t.byteLength} bytes to ${e} bytes, but got error: ${n}`)}},Mn=e=>{var t=E.length;e>>>=0,w(e>t);var n=An();if(e>n)return x(`Cannot enlarge memory, requested ${e} bytes, but the limit is ${n} bytes!`),!1;for(var r=1;r<=4;r*=2){var i=t*(1+.2/r);i=Math.min(i,e+100663296);var a=Math.min(n,vt(Math.max(e,i),65536));if(jn(a))return!0}return x(`Failed to grow the heap from ${t} bytes to ${a} bytes, not enough memory!`),!1},Nn={},Pn=()=>p||`./this.program`,Fn=()=>{if(!Fn.strings){var e={USER:`web_user`,LOGNAME:`web_user`,PATH:`/`,PWD:`/`,HOME:`/home/web_user`,LANG:(typeof navigator==`object`&&navigator.languages&&navigator.languages[0]||`C`).replace(`-`,`_`)+`.UTF-8`,_:Pn()};for(var t in Nn)Nn[t]===void 0?delete e[t]:e[t]=Nn[t];var n=[];for(var t in e)n.push(`${t}=${e[t]}`);Fn.strings=n}return Fn.strings},In=(e,t)=>{for(var n=0;n<e.length;++n)w(e.charCodeAt(n)===(e.charCodeAt(n)&255)),T[t++]=e.charCodeAt(n);T[t]=0},Ln=(e,t)=>{var n=0;return Fn().forEach((r,i)=>{var a=t+n;A[e+i*4>>2]=a,In(r,a),n+=r.length+1}),0},Rn=(e,t)=>{var n=Fn();A[e>>2]=n.length;var r=0;return n.forEach(e=>r+=e.length+1),A[t>>2]=r,0};function zn(e){return G.closeFd(e),0}function Bn(e){if(G.fds.has(e))return zn(e);try{let t=Y.getStreamFromFD(e);return J.close(t),0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var Vn=(e,t,n,r)=>{for(var i=0,a=0;a<n;a++){var o=A[t>>2],s=A[t+4>>2];t+=8;var c=J.read(e,T,o,s,r);if(c<0)return-1;if(i+=c,c<s)break;r!==void 0&&(r+=c)}return i};function Hn(e,t,n,r,i,a){var o=kt(r,i);try{if(isNaN(o))return 61;var s=Vn(Y.getStreamFromFD(e),t,n,o);return A[a>>2]=s,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var Un=(e,t,n,r)=>{for(var i=0,a=0;a<n;a++){var o=A[t>>2],s=A[t+4>>2];t+=8;var c=J.write(e,T,o,s,r);if(c<0)return-1;if(i+=c,c<s)break;r!==void 0&&(r+=c)}return i};function Wn(e,t,n,r,i,a){var o=kt(r,i);try{if(isNaN(o))return 61;var s=Un(Y.getStreamFromFD(e),t,n,o);return A[a>>2]=s,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}function Gn(e,t,n,r){try{var i=Vn(Y.getStreamFromFD(e),t,n);return A[r>>2]=i,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}function Kn(e,t,n,r,i){var a=kt(t,n);try{if(isNaN(a))return 61;var o=Y.getStreamFromFD(e);return J.llseek(o,a,r),R=[o.position>>>0,(L=o.position,+Math.abs(L)>=1?L>0?Math.floor(L/4294967296)>>>0:~~+Math.ceil((L-+(~~L>>>0))/4294967296)>>>0:0)],k[i>>2]=R[0],k[i+4>>2]=R[1],o.getdents&&a===0&&r===0&&(o.getdents=null),0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}function qn(e,t,n,r){try{var i=Un(Y.getStreamFromFD(e),t,n);return A[r>>2]=i,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var Jn=e=>{for(var t=e.split(`.`),n=0;n<4;n++){var r=Number(t[n]);if(isNaN(r))return null;t[n]=r}return(t[0]|t[1]<<8|t[2]<<16|t[3]<<24)>>>0},Yn=e=>parseInt(e),Xn=e=>{var t,n,r,i,a=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i,o=[];if(!a.test(e))return null;if(e===`::`)return[0,0,0,0,0,0,0,0];for(e=e.startsWith(`::`)?e.replace(`::`,`Z:`):e.replace(`::`,`:Z:`),e.indexOf(`.`)>0?(e=e.replace(/* @__PURE__ */ RegExp(`[.]`,`g`),`:`),t=e.split(`:`),t[t.length-4]=Yn(t[t.length-4])+Yn(t[t.length-3])*256,t[t.length-3]=Yn(t[t.length-2])+Yn(t[t.length-1])*256,t=t.slice(0,t.length-2)):t=e.split(`:`),r=0,i=0,n=0;n<t.length;n++)if(typeof t[n]==`string`){if(t[n]===`Z`){for(i=0;i<8-t.length+1;i++)o[n+i]=0;r=i-1}else o[n+r]=Er(parseInt(t[n],16))}else o[n+r]=t[n];return[o[1]<<16|o[0],o[3]<<16|o[2],o[5]<<16|o[4],o[7]<<16|o[6]]},Zn={address_map:{id:1,addrs:{},names:{}},lookup_name(e){var t=Jn(e);if(t!==null||(t=Xn(e),t!==null))return e;var n;if(Zn.address_map.addrs[e])n=Zn.address_map.addrs[e];else{var r=Zn.address_map.id++;w(r<65535,`exceeded max address mappings of 65535`),n=`172.29.`+(r&255)+`.`+(r&65280),Zn.address_map.names[n]=e,Zn.address_map.addrs[e]=n}return n},lookup_addr(e){return Zn.address_map.names[e]?Zn.address_map.names[e]:null}},Qn=e=>(e&255)+`.`+(e>>8&255)+`.`+(e>>16&255)+`.`+(e>>24&255),$n=e=>{var t=``,n=0,r=0,i=0,a=0,o=0,s=0,c=[e[0]&65535,e[0]>>16,e[1]&65535,e[1]>>16,e[2]&65535,e[2]>>16,e[3]&65535,e[3]>>16],l=!0,u=``;for(s=0;s<5;s++)if(c[s]!==0){l=!1;break}if(l){if(u=Qn(c[6]|c[7]<<16),c[5]===-1)return t=`::ffff:`,t+=u,t;if(c[5]===0)return t=`::`,u===`0.0.0.0`&&(u=``),u===`0.0.0.1`&&(u=`1`),t+=u,t}for(n=0;n<8;n++)c[n]===0&&(n-i>1&&(o=0),i=n,o++),o>r&&(r=o,a=n-r+1);for(n=0;n<8;n++){if(r>1&&c[n]===0&&n>=a&&n<a+r){n===a&&(t+=`:`,a===0&&(t+=`:`));continue}t+=Number(Tr(c[n]&65535)).toString(16),t+=n<7?`:`:``}return t},er=(e,t,n,r,i)=>{switch(t){case 2:n=Jn(n),_t(e,16),i&&(k[i>>2]=16),D[e>>1]=t,k[e+4>>2]=n,D[e+2>>1]=Er(r);break;case 10:n=Xn(n),_t(e,28),i&&(k[i>>2]=28),k[e>>2]=t,k[e+8>>2]=n[0],k[e+12>>2]=n[1],k[e+16>>2]=n[2],k[e+20>>2]=n[3],D[e+2>>1]=Er(r);break;default:return 5}return 0},tr=(e,t,n,r)=>{var i=0,a=0,o=0,s=0,c=0,l=0,u;function d(e,t,n,r,i,a){var o,s=e===10?28:16,c,l;return i=e===10?$n(i):Qn(i),o=Or(s),l=er(o,e,i,a),w(!l),c=Or(32),k[c+4>>2]=e,k[c+8>>2]=t,k[c+12>>2]=n,A[c+24>>2]=r,A[c+20>>2]=o,e===10?k[c+16>>2]=28:k[c+16>>2]=16,k[c+28>>2]=0,c}if(n&&(o=k[n>>2],s=k[n+4>>2],c=k[n+8>>2],l=k[n+12>>2]),c&&!l&&(l=c===2?17:6),!c&&l&&(c=l===17?2:1),l===0&&(l=6),c===0&&(c=1),!e&&!t)return-2;if(o&-1088||n!==0&&k[n>>2]&2&&!e)return-1;if(o&32)return-2;if(c!==0&&c!==1&&c!==2)return-7;if(s!==0&&s!==2&&s!==10)return-6;if(t&&(t=H(t),a=parseInt(t,10),isNaN(a)))return o&1024?-2:-8;if(!e)return s===0&&(s=2),o&1||(i=s===2?Cr(2130706433):[0,0,0,Cr(1)]),u=d(s,c,l,null,i,a),A[r>>2]=u,0;if(e=H(e),i=Jn(e),i!==null){if(s===0||s===2)s=2;else if(s===10&&o&8)i=[0,0,Cr(65535),i],s=10;else return-2}else if(i=Xn(e),i!==null){if(s===0||s===10)s=10;else return-2}return i==null?o&4?-2:(e=Zn.lookup_name(e),i=Jn(e),s===0?s=2:s===10&&(i=[0,0,Cr(65535),i]),u=d(s,c,l,null,i,a),A[r>>2]=u,0):(u=d(s,c,l,e,i,a),A[r>>2]=u,0)};function nr(e,t,n){if(!G.storage||!G.storage.check){r._lt_disk_complete_status(t,n,0,0),G.scheduleTick();return}Promise.resolve(G.storage.check(e)).then(e=>{r._lt_disk_complete_status(t,n,e|0,0),G.scheduleTick()}).catch(e=>{r._lt_disk_complete_status(t,n,0,e.errno||G.err.IO),G.scheduleTick()})}var rr=function(e,t,n,i){let a=e=>{r._lt_disk_complete_delete(t,n,e||0),G.scheduleTick()};if(!G.storage||!G.storage.deleteFiles){a(0);return}Promise.resolve(G.storage.deleteFiles(e,i)).then(()=>a(0),e=>a(e.errno||G.err.IO))},ir=function(e,t,n,i){let a=H(i),o=(e,i)=>{let o=_r(a);r._lt_disk_complete_move(t,n,o,i,e||0),Dr(o),G.scheduleTick()};if(!G.storage||!G.storage.move){o(G.err.NOSYS,1);return}Promise.resolve(G.storage.move(e,a)).then(()=>o(0,0),e=>o(e.errno||G.err.IO,1))};function ar(e,t,n,r){if(!G.storage)return;let i=H(t),a=H(n,r),o=[];try{o=JSON.parse(a)}catch{}Promise.resolve(G.storage.onNewStorage(e,i,o)).catch(e=>console.error(`[fkn] onNewStorage error`,e))}function or(e,t,n,i,a,o,s){G.stats.diskRead++;let c=a+o*4294967296;if(!G.storage){let e=Or(s);E.fill(0,e,e+s),r._lt_disk_complete_read(t,n,e,s,0);return}let l=e=>{let i=Or(e.length);E.set(e,i),r._lt_disk_complete_read(t,n,i,e.length,0)},u=e=>{console.error(`[fkn] disk read error`,e),r._lt_disk_complete_read(t,n,0,0,e.errno||G.err.IO),G.scheduleTick()},d;try{d=G.storage.read(e,i,c,s)}catch(e){u(e);return}d&&typeof d.then==`function`?d.then(l,u).then(()=>G.scheduleTick()):l(d)}var sr=function(e,t,n){let i=()=>{r._lt_disk_complete_simple(t,n),G.scheduleTick()};if(!G.storage||!G.storage.release){i();return}Promise.resolve(G.storage.release(e)).then(i,i)},cr=function(e){G.storage&&Promise.resolve(G.storage.onRemoveStorage(e)).catch(e=>console.error(`[fkn] onRemoveStorage error`,e))},lr=function(e,t,n,i,a){let o=H(a),s=e=>{let i=_r(o);r._lt_disk_complete_rename(t,n,i,e||0),Dr(i),G.scheduleTick()};if(!G.storage||!G.storage.rename){s(G.err.NOSYS);return}Promise.resolve(G.storage.rename(e,i,o)).then(()=>s(0),e=>s(e.errno||G.err.IO))},ur=function(e,t,n){let i=()=>{r._lt_disk_complete_simple(t,n),G.scheduleTick()};if(!G.storage||!G.storage.stop){i();return}Promise.resolve(G.storage.stop(e)).then(i,i)};function dr(e,t,n,i,a,o,s,c){G.stats.diskWrite++;let l=a+o*4294967296;if(!G.storage){r._lt_disk_complete_write(t,n,0);return}let u=E.slice(s,s+c),d=e=>{r._lt_disk_complete_write(t,n,e?.errno||G.err.IO),G.scheduleTick()},f;try{f=G.storage.write(e,i,l,u)}catch(e){d(e);return}f&&typeof f.then==`function`?f.then(()=>{r._lt_disk_complete_write(t,n,0),G.scheduleTick()},d):r._lt_disk_complete_write(t,n,0)}var fr=function(e,t){G.initialized||G.init(),G.stats.dnsReq++;let n=H(e),i=t?6:4,a=e=>{G.stats.dnsDone++;let t=_r(n),i=_r(e||``);r._lt_dns_complete(t,i),Dr(t),Dr(i),G.scheduleTick()},o=G.host&&G.host.dnsLookup;if(o){Promise.resolve(o(n,{family:i})).then(e=>{if(!e)return a(``);a((Array.isArray(e)?e:[e]).map(e=>e.address).join(`,`))}).catch(()=>a(``));return}let s=t?`AAAA`:`A`;fetch(`https://1.1.1.1/dns-query?name=`+encodeURIComponent(n)+`&type=`+s,{headers:{Accept:`application/dns-json`}}).then(e=>e.ok?e.json():null).then(e=>{if(!e)return a(``);let n=t?28:1,r=(e.Answer||[]).filter(e=>e.type===n).map(e=>e.data);a(r.join(`,`))}).catch(()=>a(``))},pr=e=>e;function mr(e,t){try{return lt(E.subarray(e,e+t)),0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var hr=[],gr,Z=e=>{var t=hr[e];return t||(e>=hr.length&&(hr.length=e+1),hr[e]=t=gr.get(e)),w(gr.get(e)==t,`JavaScript-side Wasm function table mirror is out of date!`),t},_r=e=>{var t=ft(e)+1,n=Or(t);return n&&jt(e,n,t),n};r.incrementExceptionRefcount=e=>Lr(e),r.decrementExceptionRefcount=e=>Ir(e);var vr=e=>Pr(e),yr=e=>{var t=B(),n=vr(4),r=vr(4);Rr(e,n,r);var i=A[n>>2],a=A[r>>2],o=H(i);Dr(i);var s;return a&&(s=H(a),Dr(a)),z(t),[o,s]},br=e=>yr(e);r.getExceptionMessage=br,G.fds=/* @__PURE__ */ new Map,G.freeFds=[],J.createPreloadedFile=wt,J.staticInit();function xr(){P(`ENVIRONMENT`),P(`GL_MAX_TEXTURE_IMAGE_UNITS`),P(`SDL_canPlayWithWebAudio`),P(`SDL_numSimultaneouslyQueuedBuffers`),P(`INITIAL_MEMORY`),P(`wasmMemory`),P(`arguments`),P(`buffer`),P(`canvas`),P(`doNotCaptureKeyboard`),P(`dynamicLibraries`),P(`elementPointerLock`),P(`extraStackTrace`),P(`forcedAspectRatio`),P(`instantiateWasm`),P(`keyboardListeningElement`),P(`freePreloadedMediaOnUse`),P(`loadSplitModule`),P(`locateFile`),P(`logReadFiles`),P(`mainScriptUrlOrBlob`),P(`mem`),P(`monitorRunDependencies`),P(`noExitRuntime`),P(`noInitialRun`),P(`onAbort`),P(`onCustomMessage`),P(`onExit`),P(`onFree`),P(`onFullScreen`),P(`onMalloc`),P(`onRealloc`),P(`onRuntimeInitialized`),P(`postMainLoop`),P(`postRun`),P(`preInit`),P(`preMainLoop`),P(`preRun`),P(`preinitializedWebGLContext`),P(`preloadPlugins`),P(`setStatus`),P(`statusMessage`),P(`stderr`),P(`stdin`),P(`stdout`),P(`thisProgram`),P(`wasm`),P(`websocket`),P(`fetchSettings`)}var Sr={__assert_fail:Fe,__cxa_begin_catch:Le,__cxa_current_primary_exception:Re,__cxa_end_catch:ze,__cxa_find_matching_catch_2:We,__cxa_find_matching_catch_3:Ge,__cxa_find_matching_catch_4:Ke,__cxa_find_matching_catch_5:qe,__cxa_rethrow:Je,__cxa_rethrow_primary_exception:Ye,__cxa_throw:Xe,__cxa_uncaught_exceptions:Ze,__resumeException:Ve,__syscall__newselect:$e,__syscall_accept4:tt,__syscall_bind:rt,__syscall_connect:at,__syscall_fcntl64:st,__syscall_fstat64:Ot,__syscall_ftruncate64:At,__syscall_getcwd:Mt,__syscall_getpeername:Pt,__syscall_getsockname:It,__syscall_getsockopt:Rt,__syscall_ioctl:zt,__syscall_listen:Vt,__syscall_lstat64:Ht,__syscall_mkdirat:Ut,__syscall_newfstatat:Wt,__syscall_openat:Kt,__syscall_pipe:qt,__syscall_poll:Yt,__syscall_recvfrom:Qt,__syscall_renameat:$t,__syscall_rmdir:en,__syscall_sendmsg:rn,__syscall_sendto:an,__syscall_socket:sn,__syscall_stat64:cn,__syscall_unlinkat:ln,_abort_js:un,_emscripten_throw_longjmp:dn,_tzset_js:fn,clock_time_get:_n,emscripten_date_now:mn,emscripten_err:vn,emscripten_log:kn,emscripten_resize_heap:Mn,environ_get:Ln,environ_sizes_get:Rn,fd_close:Bn,fd_pread:Hn,fd_pwrite:Wn,fd_read:Gn,fd_seek:Kn,fd_write:qn,getaddrinfo:tr,invoke_diii:zi,invoke_fiii:Ri,invoke_i:Ci,invoke_ii:gi,invoke_iii:xi,invoke_iiii:Si,invoke_iiiii:yi,invoke_iiiiii:Di,invoke_iiiiiii:Oi,invoke_iiiiiiii:wi,invoke_iiiiiiiii:Fi,invoke_iiiiiiiiii:Ni,invoke_iiiiiiiiiii:Pi,invoke_iiiiiiiiiiii:Ii,invoke_iiiiiiiiiiiii:Li,invoke_iiiij:Wi,invoke_iiijii:Zi,invoke_iij:Ui,invoke_iiji:na,invoke_iijii:aa,invoke_ij:ia,invoke_j:Hi,invoke_ji:Yi,invoke_jii:Gi,invoke_jiiii:pa,invoke_jiiiii:ra,invoke_jiij:Vi,invoke_v:Ti,invoke_vi:hi,invoke_vii:vi,invoke_viii:_i,invoke_viiii:mi,invoke_viiiii:bi,invoke_viiiiii:Ei,invoke_viiiiiii:ki,invoke_viiiiiiii:ji,invoke_viiiiiiiii:Ai,invoke_viiiiiiiiii:Mi,invoke_viiiiiiiiiiiiiii:Bi,invoke_viiiij:ea,invoke_viiiijiii:Qi,invoke_viiiijiijii:ca,invoke_viiiji:Xi,invoke_viiijiiiii:qi,invoke_viiijj:la,invoke_viiji:ua,invoke_viijiiiiii:Ji,invoke_viijji:ta,invoke_vij:Ki,invoke_viji:$i,invoke_vijii:sa,invoke_vijiji:da,invoke_vijijii:fa,invoke_vijj:oa,js_disk_check:nr,js_disk_delete:rr,js_disk_move:ir,js_disk_new_storage:ar,js_disk_read:or,js_disk_release:sr,js_disk_remove_storage:cr,js_disk_rename:lr,js_disk_stop:ur,js_disk_write:dr,js_resolver_async:fr,llvm_eh_typeid_for:pr,random_get:mr},Q=await je(),Cr=I(`htonl`,1),wr=I(`strerror`,1),Tr=I(`ntohs`,1),Er=I(`htons`,1),Dr=r._free=I(`free`,1),Or=r._malloc=I(`malloc`,1);r._lt_dns_complete=I(`lt_dns_complete`,2),r._lt_set_log=I(`lt_set_log`,1),r._lt_set_utp_receive_buffer=I(`lt_set_utp_receive_buffer`,1),r._lt_set_dht=I(`lt_set_dht`,1),r._lt_session_set_rate_limits=I(`lt_session_set_rate_limits`,3),r._lt_set_listen_port=I(`lt_set_listen_port`,1),r._lt_session_create=I(`lt_session_create`,0),r._lt_session_destroy=I(`lt_session_destroy`,0),r._lt_diag_tick_count=I(`lt_diag_tick_count`,0),r._lt_diag_total_handlers=I(`lt_diag_total_handlers`,0),r._lt_diag_open_tcp=I(`lt_diag_open_tcp`,0),r._lt_diag_listen_full=I(`lt_diag_listen_full`,0),r._lt_diag_open_udp=I(`lt_diag_open_udp`,0),r._lt_diag_force_reopen=I(`lt_diag_force_reopen`,0),r._lt_diag_parse_interfaces=I(`lt_diag_parse_interfaces`,1),r._lt_session_tick=I(`lt_session_tick`,0),r._lt_session_next_timer_ms=I(`lt_session_next_timer_ms`,1),r._lt_session_pump_alerts=I(`lt_session_pump_alerts`,0),r._lt_alerts_size=I(`lt_alerts_size`,0),r._lt_alerts_data=I(`lt_alerts_data`,0),r._lt_alerts_clear=I(`lt_alerts_clear`,0),r._lt_session_add_magnet=I(`lt_session_add_magnet`,2),r._lt_session_add_torrent_file=I(`lt_session_add_torrent_file`,3),r._lt_session_remove_torrent=I(`lt_session_remove_torrent`,1),r._lt_session_remove_torrent_ex=I(`lt_session_remove_torrent_ex`,2),r._lt_torrent_pause=I(`lt_torrent_pause`,1),r._lt_torrent_resume=I(`lt_torrent_resume`,1),r._lt_torrent_force_recheck=I(`lt_torrent_force_recheck`,1),r._lt_torrent_save_resume_data=I(`lt_torrent_save_resume_data`,1),r._lt_session_add_torrent_with_resume=I(`lt_session_add_torrent_with_resume`,3),r._lt_torrent_post_status=I(`lt_torrent_post_status`,1),r._lt_torrent_status=I(`lt_torrent_status`,2),r._lt_torrent_post_peers=I(`lt_torrent_post_peers`,1),r._lt_torrent_post_trackers=I(`lt_torrent_post_trackers`,1),r._lt_torrent_infohash=I(`lt_torrent_infohash`,2),r._lt_torrent_infohash_v2=I(`lt_torrent_infohash_v2`,2),r._lt_torrent_set_sequential=I(`lt_torrent_set_sequential`,2),r._lt_torrent_set_flags=I(`lt_torrent_set_flags`,3),r._lt_torrent_force_reannounce=I(`lt_torrent_force_reannounce`,1),r._lt_torrent_queue_position=I(`lt_torrent_queue_position`,2),r._lt_torrent_set_upload_limit=I(`lt_torrent_set_upload_limit`,2),r._lt_torrent_set_download_limit=I(`lt_torrent_set_download_limit`,2),r._lt_torrent_read_piece=I(`lt_torrent_read_piece`,2),r._lt_torrent_set_piece_deadline=I(`lt_torrent_set_piece_deadline`,4),r._lt_torrent_clear_piece_deadlines=I(`lt_torrent_clear_piece_deadlines`,1),r._lt_torrent_reset_piece_deadline=I(`lt_torrent_reset_piece_deadline`,2),r._lt_torrent_prioritize_pieces=I(`lt_torrent_prioritize_pieces`,3),r._lt_torrent_prioritize_piece_list=I(`lt_torrent_prioritize_piece_list`,4),r._lt_torrent_prioritize_files=I(`lt_torrent_prioritize_files`,3),r._lt_torrent_cancel_piece_requests=I(`lt_torrent_cancel_piece_requests`,2),r._lt_torrent_set_file_priority=I(`lt_torrent_set_file_priority`,3),r._lt_disk_complete_read=I(`lt_disk_complete_read`,5),r._lt_disk_complete_write=I(`lt_disk_complete_write`,3),r._lt_disk_complete_simple=I(`lt_disk_complete_simple`,2),r._lt_disk_complete_status=I(`lt_disk_complete_status`,4),r._lt_disk_complete_move=I(`lt_disk_complete_move`,5),r._lt_disk_complete_delete=I(`lt_disk_complete_delete`,3),r._lt_disk_complete_rename=I(`lt_disk_complete_rename`,4);var kr=I(`fflush`,1),$=I(`setThrew`,2),Ar=I(`_emscripten_tempret_set`,1),jr=Q.emscripten_stack_init;Q.emscripten_stack_get_free,Q.emscripten_stack_get_base;var Mr=Q.emscripten_stack_get_end,Nr=Q._emscripten_stack_restore,Pr=Q._emscripten_stack_alloc,Fr=Q.emscripten_stack_get_current,Ir=I(`__cxa_decrement_exception_refcount`,1),Lr=I(`__cxa_increment_exception_refcount`,1),Rr=I(`__get_exception_message`,3),zr=I(`__cxa_can_catch`,3),Br=I(`__cxa_get_exception_ptr`,1),Vr=r.dynCall_jiij=I(`dynCall_jiij`,5),Hr=r.dynCall_j=I(`dynCall_j`,1),Ur=r.dynCall_iij=I(`dynCall_iij`,4),Wr=r.dynCall_vijj=I(`dynCall_vijj`,6),Gr=r.dynCall_iiiij=I(`dynCall_iiiij`,6),Kr=r.dynCall_vij=I(`dynCall_vij`,4),qr=r.dynCall_jii=I(`dynCall_jii`,3),Jr=r.dynCall_viiijiiiii=I(`dynCall_viiijiiiii`,11),Yr=r.dynCall_viijiiiiii=I(`dynCall_viijiiiiii`,11),Xr=r.dynCall_ji=I(`dynCall_ji`,2),Zr=r.dynCall_iiijii=I(`dynCall_iiijii`,7),Qr=r.dynCall_viiiijiii=I(`dynCall_viiiijiii`,10),$r=r.dynCall_viji=I(`dynCall_viji`,5),ei=r.dynCall_viiiij=I(`dynCall_viiiij`,7),ti=r.dynCall_viijji=I(`dynCall_viijji`,8),ni=r.dynCall_iiji=I(`dynCall_iiji`,5),ri=r.dynCall_jiiiii=I(`dynCall_jiiiii`,6),ii=r.dynCall_viiiji=I(`dynCall_viiiji`,7),ai=r.dynCall_ij=I(`dynCall_ij`,3),oi=r.dynCall_iijii=I(`dynCall_iijii`,6),si=r.dynCall_vijii=I(`dynCall_vijii`,6),ci=r.dynCall_viiiijiijii=I(`dynCall_viiiijiijii`,13),li=r.dynCall_viiijj=I(`dynCall_viiijj`,8),ui=r.dynCall_viiji=I(`dynCall_viiji`,6),di=r.dynCall_vijiji=I(`dynCall_vijiji`,8),fi=r.dynCall_vijijii=I(`dynCall_vijijii`,9);r.dynCall_jiji=I(`dynCall_jiji`,5),r.dynCall_viijii=I(`dynCall_viijii`,7);var pi=r.dynCall_jiiii=I(`dynCall_jiiii`,5);r.dynCall_iiiiij=I(`dynCall_iiiiij`,7),r.dynCall_iiiiijj=I(`dynCall_iiiiijj`,9),r.dynCall_iiiiiijj=I(`dynCall_iiiiiijj`,10);function mi(e,t,n,r,i){var a=B();try{Z(e)(t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function hi(e,t){var n=B();try{Z(e)(t)}catch(e){if(z(n),!(e instanceof N))throw e;$(1,0)}}function gi(e,t){var n=B();try{return Z(e)(t)}catch(e){if(z(n),!(e instanceof N))throw e;$(1,0)}}function _i(e,t,n,r){var i=B();try{Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function vi(e,t,n){var r=B();try{Z(e)(t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function yi(e,t,n,r,i){var a=B();try{return Z(e)(t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function bi(e,t,n,r,i,a){var o=B();try{Z(e)(t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function xi(e,t,n){var r=B();try{return Z(e)(t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function Si(e,t,n,r){var i=B();try{return Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function Ci(e){var t=B();try{return Z(e)()}catch(e){if(z(t),!(e instanceof N))throw e;$(1,0)}}function wi(e,t,n,r,i,a,o,s){var c=B();try{return Z(e)(t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function Ti(e){var t=B();try{Z(e)()}catch(e){if(z(t),!(e instanceof N))throw e;$(1,0)}}function Ei(e,t,n,r,i,a,o){var s=B();try{Z(e)(t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function Di(e,t,n,r,i,a){var o=B();try{return Z(e)(t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function Oi(e,t,n,r,i,a,o){var s=B();try{return Z(e)(t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function ki(e,t,n,r,i,a,o,s){var c=B();try{Z(e)(t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function Ai(e,t,n,r,i,a,o,s,c,l){var u=B();try{Z(e)(t,n,r,i,a,o,s,c,l)}catch(e){if(z(u),!(e instanceof N))throw e;$(1,0)}}function ji(e,t,n,r,i,a,o,s,c){var l=B();try{Z(e)(t,n,r,i,a,o,s,c)}catch(e){if(z(l),!(e instanceof N))throw e;$(1,0)}}function Mi(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{Z(e)(t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Ni(e,t,n,r,i,a,o,s,c,l){var u=B();try{return Z(e)(t,n,r,i,a,o,s,c,l)}catch(e){if(z(u),!(e instanceof N))throw e;$(1,0)}}function Pi(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{return Z(e)(t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Fi(e,t,n,r,i,a,o,s,c){var l=B();try{return Z(e)(t,n,r,i,a,o,s,c)}catch(e){if(z(l),!(e instanceof N))throw e;$(1,0)}}function Ii(e,t,n,r,i,a,o,s,c,l,u,d){var f=B();try{return Z(e)(t,n,r,i,a,o,s,c,l,u,d)}catch(e){if(z(f),!(e instanceof N))throw e;$(1,0)}}function Li(e,t,n,r,i,a,o,s,c,l,u,d,f){var p=B();try{return Z(e)(t,n,r,i,a,o,s,c,l,u,d,f)}catch(e){if(z(p),!(e instanceof N))throw e;$(1,0)}}function Ri(e,t,n,r){var i=B();try{return Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function zi(e,t,n,r){var i=B();try{return Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function Bi(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){var g=B();try{Z(e)(t,n,r,i,a,o,s,c,l,u,d,f,p,m,h)}catch(e){if(z(g),!(e instanceof N))throw e;$(1,0)}}function Vi(e,t,n,r,i){var a=B();try{return Vr(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function Hi(e){var t=B();try{return Hr(e)}catch(e){if(z(t),!(e instanceof N))throw e;$(1,0)}}function Ui(e,t,n,r){var i=B();try{return Ur(e,t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function Wi(e,t,n,r,i,a){var o=B();try{return Gr(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function Gi(e,t,n){var r=B();try{return qr(e,t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function Ki(e,t,n,r){var i=B();try{Kr(e,t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function qi(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{Jr(e,t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Ji(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{Yr(e,t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Yi(e,t){var n=B();try{return Xr(e,t)}catch(e){if(z(n),!(e instanceof N))throw e;$(1,0)}}function Xi(e,t,n,r,i,a,o){var s=B();try{ii(e,t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function Zi(e,t,n,r,i,a,o){var s=B();try{return Zr(e,t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function Qi(e,t,n,r,i,a,o,s,c,l){var u=B();try{Qr(e,t,n,r,i,a,o,s,c,l)}catch(e){if(z(u),!(e instanceof N))throw e;$(1,0)}}function $i(e,t,n,r,i){var a=B();try{$r(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function ea(e,t,n,r,i,a,o){var s=B();try{ei(e,t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function ta(e,t,n,r,i,a,o,s){var c=B();try{ti(e,t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function na(e,t,n,r,i){var a=B();try{return ni(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function ra(e,t,n,r,i,a){var o=B();try{return ri(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function ia(e,t,n){var r=B();try{return ai(e,t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function aa(e,t,n,r,i,a){var o=B();try{return oi(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function oa(e,t,n,r,i,a){var o=B();try{Wr(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function sa(e,t,n,r,i,a){var o=B();try{si(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function ca(e,t,n,r,i,a,o,s,c,l,u,d,f){var p=B();try{ci(e,t,n,r,i,a,o,s,c,l,u,d,f)}catch(e){if(z(p),!(e instanceof N))throw e;$(1,0)}}function la(e,t,n,r,i,a,o,s){var c=B();try{li(e,t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function ua(e,t,n,r,i,a){var o=B();try{ui(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function da(e,t,n,r,i,a,o,s){var c=B();try{di(e,t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function fa(e,t,n,r,i,a,o,s,c){var l=B();try{fi(e,t,n,r,i,a,o,s,c)}catch(e){if(z(l),!(e instanceof N))throw e;$(1,0)}}function pa(e,t,n,r,i){var a=B();try{return pi(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}r.UTF8ToString=H,r.lengthBytesUTF8=ft,r.stringToNewUTF8=_r,(/* @__PURE__ */ `writeI53ToI64.writeI53ToI64Clamped.writeI53ToI64Signaling.writeI53ToU64Clamped.writeI53ToU64Signaling.readI53FromI64.readI53FromU64.getTempRet0.exitJS.readSockaddr.readEmAsmArgs.listenOnce.autoResumeAudioContext.dynCallLegacy.getDynCaller.dynCall.handleException.keepRuntimeAlive.runtimeKeepalivePush.runtimeKeepalivePop.callUserCallback.maybeExit.asmjsMangle.HandleAllocator.getNativeTypeSize.addOnPreRun.addOnInit.addOnPostCtor.addOnPreMain.addOnExit.addOnPostRun.STACK_SIZE.STACK_ALIGN.POINTER_SIZE.ASSERTIONS.getCFunc.ccall.cwrap.uleb128Encode.sigToWasmTypes.generateFuncType.convertJsFunctionToWasm.getEmptyTableSlot.updateTableMap.getFunctionAddress.addFunction.removeFunction.intArrayToString.AsciiToString.UTF16ToString.stringToUTF16.lengthBytesUTF16.UTF32ToString.stringToUTF32.lengthBytesUTF32.stringToUTF8OnStack.writeArrayToMemory.registerKeyEventCallback.maybeCStringToJsString.findEventTarget.getBoundingClientRect.fillMouseEventData.registerMouseEventCallback.registerWheelEventCallback.registerUiEventCallback.registerFocusEventCallback.fillDeviceOrientationEventData.registerDeviceOrientationEventCallback.fillDeviceMotionEventData.registerDeviceMotionEventCallback.screenOrientation.fillOrientationChangeEventData.registerOrientationChangeEventCallback.fillFullscreenChangeEventData.registerFullscreenChangeEventCallback.JSEvents_requestFullscreen.JSEvents_resizeCanvasForFullscreen.registerRestoreOldStyle.hideEverythingExceptGivenElement.restoreHiddenElements.setLetterbox.softFullscreenResizeWebGLRenderTarget.doRequestFullscreen.fillPointerlockChangeEventData.registerPointerlockChangeEventCallback.registerPointerlockErrorEventCallback.requestPointerLock.fillVisibilityChangeEventData.registerVisibilityChangeEventCallback.registerTouchEventCallback.fillGamepadEventData.registerGamepadEventCallback.registerBeforeUnloadEventCallback.fillBatteryEventData.battery.registerBatteryEventCallback.setCanvasElementSize.getCanvasElementSize.convertPCtoSourceLocation.wasiRightsToMuslOFlags.wasiOFlagsToMuslOFlags.safeSetTimeout.setImmediateWrapped.safeRequestAnimationFrame.clearImmediateWrapped.registerPostMainLoop.registerPreMainLoop.getPromise.makePromise.idsToPromises.makePromiseCallback.Browser_asyncPrepareDataCounter.isLeapYear.ydayFromDate.arraySum.addDays.getSocketFromFD.getSocketAddress.FS_unlink.FS_mkdirTree._setNetworkCallback.heapObjectForWebGLType.toTypedArrayIndex.webgl_enable_ANGLE_instanced_arrays.webgl_enable_OES_vertex_array_object.webgl_enable_WEBGL_draw_buffers.webgl_enable_WEBGL_multi_draw.webgl_enable_EXT_polygon_offset_clamp.webgl_enable_EXT_clip_control.webgl_enable_WEBGL_polygon_mode.emscriptenWebGLGet.computeUnpackAlignedImageSize.colorChannelsInGlTextureFormat.emscriptenWebGLGetTexPixelData.emscriptenWebGLGetUniform.webglGetUniformLocation.webglPrepareUniformLocationsBeforeFirstUse.webglGetLeftBracePos.emscriptenWebGLGetVertexAttrib.__glGetActiveAttribOrUniform.writeGLArray.registerWebGlEventCallback.runAndAbortIfError.ALLOC_NORMAL.ALLOC_STACK.allocate.writeStringToMemory.writeAsciiToMemory.setErrNo.demangle.stackTrace.FKN_setsockopt.FKN_resolve`.split(`.`)).forEach(fe),(/* @__PURE__ */ `run.addRunDependency.removeRunDependency.out.err.callMain.abort.wasmMemory.wasmExports.writeStackCookie.checkStackCookie.convertI32PairToI53.convertI32PairToI53Checked.convertU32PairToI53.stackSave.stackRestore.stackAlloc.setTempRet0.ptrToString.zeroMemory.getHeapMax.growMemory.ENV.ERRNO_CODES.strError.inetPton4.inetNtop4.inetPton6.inetNtop6.writeSockaddr.DNS.Protocols.Sockets.timers.warnOnce.emscriptenLog.readEmAsmArgsArray.jstoi_q.jstoi_s.getExecutableName.asyncLoad.alignMemory.mmapAlloc.wasmTable.noExitRuntime.freeTableIndexes.functionsInTableMap.reallyNegative.unSign.strLen.reSign.formatString.setValue.getValue.PATH.PATH_FS.UTF8Decoder.UTF8ArrayToString.stringToUTF8Array.stringToUTF8.intArrayFromString.stringToAscii.UTF16Decoder.JSEvents.specialHTMLTargets.findCanvasEventTarget.currentFullscreenStrategy.restoreOldWindowedStyle.jsStackTrace.getCallstack.UNWIND_CACHE.ExitStatus.getEnvStrings.checkWasiClock.doReadv.doWritev.initRandomFill.randomFill.emSetImmediate.emClearImmediate_deps.emClearImmediate.promiseMap.uncaughtExceptionCount.exceptionLast.exceptionCaught.ExceptionInfo.findMatchingCatch.getExceptionMessageCommon.incrementExceptionRefcount.decrementExceptionRefcount.getExceptionMessage.Browser.getPreloadedImageData__data.wget.MONTH_DAYS_REGULAR.MONTH_DAYS_LEAP.MONTH_DAYS_REGULAR_CUMULATIVE.MONTH_DAYS_LEAP_CUMULATIVE.SYSCALLS.preloadPlugins.FS_createPreloadedFile.FS_modeStringToFlags.FS_getMode.FS_stdin_getChar_buffer.FS_stdin_getChar.FS_createPath.FS_createDevice.FS_readFile.FS.FS_createDataFile.FS_createLazyFile.MEMFS.TTY.PIPEFS.SOCKFS.tempFixedLengthArray.miniTempWebGLFloatBuffers.miniTempWebGLIntBuffers.GL.AL.GLUT.EGL.GLEW.IDBStore.SDL.SDL_gfx.allocateUTF8.allocateUTF8OnStack.print.printErr.FKN.FKN_socket.FKN_connect.FKN_bind.FKN_listen.FKN_accept.FKN_recv.FKN_recvfrom.FKN_send.FKN_sendto.FKN_close.FKN_getsockname.FKN_getpeername.FKN_getsockopt.FKN_fcntl.FKN_poll`.split(`.`)).forEach(pe);var ma;function ha(){jr(),M()}function ga(){if(_e>0){ve=ga;return}if(ha(),_e>0){ve=ga;return}function e(){w(!ma),ma=!0,r.calledRun=!0,!C&&(he(),i(r),w(!r._main,`compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]`),ge())}e(),ae()}ga(),n=o;for(let e of Object.keys(r))e in t||Object.defineProperty(t,e,{configurable:!0,get(){F(`Access to module property ('${e}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`)}});return n})})();(()=>{var t=e;e=function(e){if(new.target)throw Error("Module() should not be called with `new Module()`");return t(e)}})();var t=e;export{t as default};
6
+ `:``)+Dn(e)),e&1?e&4?console.error(t):e&2?console.warn(t):e&512?console.info(t):e&256?console.debug(t):console.log(t):e&6?x(t):te(t)},kn=(e,t,n)=>{On(e,Pe(Tn(t,n)))},An=()=>2147483648,jn=e=>{var t=S.buffer,n=(e-t.byteLength+65535)/65536|0;try{return S.grow(n),me(),1}catch(n){x(`growMemory: Attempted to grow heap from ${t.byteLength} bytes to ${e} bytes, but got error: ${n}`)}},Mn=e=>{var t=E.length;e>>>=0,w(e>t);var n=An();if(e>n)return x(`Cannot enlarge memory, requested ${e} bytes, but the limit is ${n} bytes!`),!1;for(var r=1;r<=4;r*=2){var i=t*(1+.2/r);i=Math.min(i,e+100663296);var a=Math.min(n,vt(Math.max(e,i),65536));if(jn(a))return!0}return x(`Failed to grow the heap from ${t} bytes to ${a} bytes, not enough memory!`),!1},Nn={},Pn=()=>p||`./this.program`,Fn=()=>{if(!Fn.strings){var e={USER:`web_user`,LOGNAME:`web_user`,PATH:`/`,PWD:`/`,HOME:`/home/web_user`,LANG:(typeof navigator==`object`&&navigator.languages&&navigator.languages[0]||`C`).replace(`-`,`_`)+`.UTF-8`,_:Pn()};for(var t in Nn)Nn[t]===void 0?delete e[t]:e[t]=Nn[t];var n=[];for(var t in e)n.push(`${t}=${e[t]}`);Fn.strings=n}return Fn.strings},In=(e,t)=>{for(var n=0;n<e.length;++n)w(e.charCodeAt(n)===(e.charCodeAt(n)&255)),T[t++]=e.charCodeAt(n);T[t]=0},Ln=(e,t)=>{var n=0;return Fn().forEach((r,i)=>{var a=t+n;A[e+i*4>>2]=a,In(r,a),n+=r.length+1}),0},Rn=(e,t)=>{var n=Fn();A[e>>2]=n.length;var r=0;return n.forEach(e=>r+=e.length+1),A[t>>2]=r,0};function zn(e){return G.closeFd(e),0}function Bn(e){if(G.fds.has(e))return zn(e);try{let t=Y.getStreamFromFD(e);return J.close(t),0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var Vn=(e,t,n,r)=>{for(var i=0,a=0;a<n;a++){var o=A[t>>2],s=A[t+4>>2];t+=8;var c=J.read(e,T,o,s,r);if(c<0)return-1;if(i+=c,c<s)break;r!==void 0&&(r+=c)}return i};function Hn(e,t,n,r,i,a){var o=kt(r,i);try{if(isNaN(o))return 61;var s=Vn(Y.getStreamFromFD(e),t,n,o);return A[a>>2]=s,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var Un=(e,t,n,r)=>{for(var i=0,a=0;a<n;a++){var o=A[t>>2],s=A[t+4>>2];t+=8;var c=J.write(e,T,o,s,r);if(c<0)return-1;if(i+=c,c<s)break;r!==void 0&&(r+=c)}return i};function Wn(e,t,n,r,i,a){var o=kt(r,i);try{if(isNaN(o))return 61;var s=Un(Y.getStreamFromFD(e),t,n,o);return A[a>>2]=s,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}function Gn(e,t,n,r){try{var i=Vn(Y.getStreamFromFD(e),t,n);return A[r>>2]=i,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}function Kn(e,t,n,r,i){var a=kt(t,n);try{if(isNaN(a))return 61;var o=Y.getStreamFromFD(e);return J.llseek(o,a,r),R=[o.position>>>0,(L=o.position,+Math.abs(L)>=1?L>0?Math.floor(L/4294967296)>>>0:~~+Math.ceil((L-+(~~L>>>0))/4294967296)>>>0:0)],k[i>>2]=R[0],k[i+4>>2]=R[1],o.getdents&&a===0&&r===0&&(o.getdents=null),0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}function qn(e,t,n,r){try{var i=Un(Y.getStreamFromFD(e),t,n);return A[r>>2]=i,0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var Jn=e=>{for(var t=e.split(`.`),n=0;n<4;n++){var r=Number(t[n]);if(isNaN(r))return null;t[n]=r}return(t[0]|t[1]<<8|t[2]<<16|t[3]<<24)>>>0},Yn=e=>parseInt(e),Xn=e=>{var t,n,r,i,a=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i,o=[];if(!a.test(e))return null;if(e===`::`)return[0,0,0,0,0,0,0,0];for(e=e.startsWith(`::`)?e.replace(`::`,`Z:`):e.replace(`::`,`:Z:`),e.indexOf(`.`)>0?(e=e.replace(/* @__PURE__ */ RegExp(`[.]`,`g`),`:`),t=e.split(`:`),t[t.length-4]=Yn(t[t.length-4])+Yn(t[t.length-3])*256,t[t.length-3]=Yn(t[t.length-2])+Yn(t[t.length-1])*256,t=t.slice(0,t.length-2)):t=e.split(`:`),r=0,i=0,n=0;n<t.length;n++)if(typeof t[n]==`string`){if(t[n]===`Z`){for(i=0;i<8-t.length+1;i++)o[n+i]=0;r=i-1}else o[n+r]=Er(parseInt(t[n],16))}else o[n+r]=t[n];return[o[1]<<16|o[0],o[3]<<16|o[2],o[5]<<16|o[4],o[7]<<16|o[6]]},Zn={address_map:{id:1,addrs:{},names:{}},lookup_name(e){var t=Jn(e);if(t!==null||(t=Xn(e),t!==null))return e;var n;if(Zn.address_map.addrs[e])n=Zn.address_map.addrs[e];else{var r=Zn.address_map.id++;w(r<65535,`exceeded max address mappings of 65535`),n=`172.29.`+(r&255)+`.`+(r&65280),Zn.address_map.names[n]=e,Zn.address_map.addrs[e]=n}return n},lookup_addr(e){return Zn.address_map.names[e]?Zn.address_map.names[e]:null}},Qn=e=>(e&255)+`.`+(e>>8&255)+`.`+(e>>16&255)+`.`+(e>>24&255),$n=e=>{var t=``,n=0,r=0,i=0,a=0,o=0,s=0,c=[e[0]&65535,e[0]>>16,e[1]&65535,e[1]>>16,e[2]&65535,e[2]>>16,e[3]&65535,e[3]>>16],l=!0,u=``;for(s=0;s<5;s++)if(c[s]!==0){l=!1;break}if(l){if(u=Qn(c[6]|c[7]<<16),c[5]===-1)return t=`::ffff:`,t+=u,t;if(c[5]===0)return t=`::`,u===`0.0.0.0`&&(u=``),u===`0.0.0.1`&&(u=`1`),t+=u,t}for(n=0;n<8;n++)c[n]===0&&(n-i>1&&(o=0),i=n,o++),o>r&&(r=o,a=n-r+1);for(n=0;n<8;n++){if(r>1&&c[n]===0&&n>=a&&n<a+r){n===a&&(t+=`:`,a===0&&(t+=`:`));continue}t+=Number(Tr(c[n]&65535)).toString(16),t+=n<7?`:`:``}return t},er=(e,t,n,r,i)=>{switch(t){case 2:n=Jn(n),_t(e,16),i&&(k[i>>2]=16),D[e>>1]=t,k[e+4>>2]=n,D[e+2>>1]=Er(r);break;case 10:n=Xn(n),_t(e,28),i&&(k[i>>2]=28),k[e>>2]=t,k[e+8>>2]=n[0],k[e+12>>2]=n[1],k[e+16>>2]=n[2],k[e+20>>2]=n[3],D[e+2>>1]=Er(r);break;default:return 5}return 0},tr=(e,t,n,r)=>{var i=0,a=0,o=0,s=0,c=0,l=0,u;function d(e,t,n,r,i,a){var o,s=e===10?28:16,c,l;return i=e===10?$n(i):Qn(i),o=Or(s),l=er(o,e,i,a),w(!l),c=Or(32),k[c+4>>2]=e,k[c+8>>2]=t,k[c+12>>2]=n,A[c+24>>2]=r,A[c+20>>2]=o,e===10?k[c+16>>2]=28:k[c+16>>2]=16,k[c+28>>2]=0,c}if(n&&(o=k[n>>2],s=k[n+4>>2],c=k[n+8>>2],l=k[n+12>>2]),c&&!l&&(l=c===2?17:6),!c&&l&&(c=l===17?2:1),l===0&&(l=6),c===0&&(c=1),!e&&!t)return-2;if(o&-1088||n!==0&&k[n>>2]&2&&!e)return-1;if(o&32)return-2;if(c!==0&&c!==1&&c!==2)return-7;if(s!==0&&s!==2&&s!==10)return-6;if(t&&(t=H(t),a=parseInt(t,10),isNaN(a)))return o&1024?-2:-8;if(!e)return s===0&&(s=2),o&1||(i=s===2?Cr(2130706433):[0,0,0,Cr(1)]),u=d(s,c,l,null,i,a),A[r>>2]=u,0;if(e=H(e),i=Jn(e),i!==null){if(s===0||s===2)s=2;else if(s===10&&o&8)i=[0,0,Cr(65535),i],s=10;else return-2}else if(i=Xn(e),i!==null){if(s===0||s===10)s=10;else return-2}return i==null?o&4?-2:(e=Zn.lookup_name(e),i=Jn(e),s===0?s=2:s===10&&(i=[0,0,Cr(65535),i]),u=d(s,c,l,null,i,a),A[r>>2]=u,0):(u=d(s,c,l,e,i,a),A[r>>2]=u,0)};function nr(e,t,n){if(!G.storage||!G.storage.check){r._lt_disk_complete_status(t,n,0,0),G.scheduleTick();return}Promise.resolve(G.storage.check(e)).then(e=>{r._lt_disk_complete_status(t,n,e|0,0),G.scheduleTick()}).catch(e=>{r._lt_disk_complete_status(t,n,0,e.errno||G.err.IO),G.scheduleTick()})}var rr=function(e,t,n,i){let a=e=>{r._lt_disk_complete_delete(t,n,e||0),G.scheduleTick()};if(!G.storage||!G.storage.deleteFiles){a(0);return}Promise.resolve(G.storage.deleteFiles(e,i)).then(()=>a(0),e=>a(e.errno||G.err.IO))},ir=function(e,t,n,i){let a=H(i),o=(e,i)=>{let o=_r(a);r._lt_disk_complete_move(t,n,o,i,e||0),Dr(o),G.scheduleTick()};if(!G.storage||!G.storage.move){o(G.err.NOSYS,1);return}Promise.resolve(G.storage.move(e,a)).then(()=>o(0,0),e=>o(e.errno||G.err.IO,1))};function ar(e,t,n,r){if(!G.storage)return;let i=H(t),a=H(n,r),o=[];try{o=JSON.parse(a)}catch{}Promise.resolve(G.storage.onNewStorage(e,i,o)).catch(e=>console.error(`[fkn] onNewStorage error`,e))}function or(e,t,n,i,a,o,s){G.stats.diskRead++;let c=(a>>>0)+o*4294967296;if(!G.storage){let e=Or(s);E.fill(0,e,e+s),r._lt_disk_complete_read(t,n,e,s,0);return}let l=e=>{let i=Or(e.length);E.set(e,i),r._lt_disk_complete_read(t,n,i,e.length,0)},u=e=>{console.error(`[fkn] disk read error`,e),r._lt_disk_complete_read(t,n,0,0,e.errno||G.err.IO),G.scheduleTick()},d;try{d=G.storage.read(e,i,c,s)}catch(e){u(e);return}d&&typeof d.then==`function`?d.then(l,u).then(()=>G.scheduleTick()):l(d)}var sr=function(e,t,n){let i=()=>{r._lt_disk_complete_simple(t,n),G.scheduleTick()};if(!G.storage||!G.storage.release){i();return}Promise.resolve(G.storage.release(e)).then(i,i)},cr=function(e){G.storage&&Promise.resolve(G.storage.onRemoveStorage(e)).catch(e=>console.error(`[fkn] onRemoveStorage error`,e))},lr=function(e,t,n,i,a){let o=H(a),s=e=>{let i=_r(o);r._lt_disk_complete_rename(t,n,i,e||0),Dr(i),G.scheduleTick()};if(!G.storage||!G.storage.rename){s(G.err.NOSYS);return}Promise.resolve(G.storage.rename(e,i,o)).then(()=>s(0),e=>s(e.errno||G.err.IO))},ur=function(e,t,n){let i=()=>{r._lt_disk_complete_simple(t,n),G.scheduleTick()};if(!G.storage||!G.storage.stop){i();return}Promise.resolve(G.storage.stop(e)).then(i,i)};function dr(e,t,n,i,a,o,s,c){G.stats.diskWrite++;let l=(a>>>0)+o*4294967296;if(!G.storage){r._lt_disk_complete_write(t,n,0);return}let u=E.slice(s,s+c),d=e=>{r._lt_disk_complete_write(t,n,e?.errno||G.err.IO),G.scheduleTick()},f;try{f=G.storage.write(e,i,l,u)}catch(e){d(e);return}f&&typeof f.then==`function`?f.then(()=>{r._lt_disk_complete_write(t,n,0),G.scheduleTick()},d):r._lt_disk_complete_write(t,n,0)}var fr=function(e,t){G.initialized||G.init(),G.stats.dnsReq++;let n=H(e),i=t?6:4,a=e=>{G.stats.dnsDone++;let t=_r(n),i=_r(e||``);r._lt_dns_complete(t,i),Dr(t),Dr(i),G.scheduleTick()},o=G.host&&G.host.dnsLookup;if(o){Promise.resolve(o(n,{family:i})).then(e=>{if(!e)return a(``);a((Array.isArray(e)?e:[e]).map(e=>e.address).join(`,`))}).catch(()=>a(``));return}let s=t?`AAAA`:`A`;fetch(`https://1.1.1.1/dns-query?name=`+encodeURIComponent(n)+`&type=`+s,{headers:{Accept:`application/dns-json`}}).then(e=>e.ok?e.json():null).then(e=>{if(!e)return a(``);let n=t?28:1,r=(e.Answer||[]).filter(e=>e.type===n).map(e=>e.data);a(r.join(`,`))}).catch(()=>a(``))},pr=e=>e;function mr(e,t){try{return lt(E.subarray(e,e+t)),0}catch(e){if(J===void 0||e.name!==`ErrnoError`)throw e;return e.errno}}var hr=[],gr,Z=e=>{var t=hr[e];return t||(e>=hr.length&&(hr.length=e+1),hr[e]=t=gr.get(e)),w(gr.get(e)==t,`JavaScript-side Wasm function table mirror is out of date!`),t},_r=e=>{var t=ft(e)+1,n=Or(t);return n&&jt(e,n,t),n};r.incrementExceptionRefcount=e=>Lr(e),r.decrementExceptionRefcount=e=>Ir(e);var vr=e=>Pr(e),yr=e=>{var t=B(),n=vr(4),r=vr(4);Rr(e,n,r);var i=A[n>>2],a=A[r>>2],o=H(i);Dr(i);var s;return a&&(s=H(a),Dr(a)),z(t),[o,s]},br=e=>yr(e);r.getExceptionMessage=br,G.fds=/* @__PURE__ */ new Map,G.freeFds=[],J.createPreloadedFile=wt,J.staticInit();function xr(){P(`ENVIRONMENT`),P(`GL_MAX_TEXTURE_IMAGE_UNITS`),P(`SDL_canPlayWithWebAudio`),P(`SDL_numSimultaneouslyQueuedBuffers`),P(`INITIAL_MEMORY`),P(`wasmMemory`),P(`arguments`),P(`buffer`),P(`canvas`),P(`doNotCaptureKeyboard`),P(`dynamicLibraries`),P(`elementPointerLock`),P(`extraStackTrace`),P(`forcedAspectRatio`),P(`instantiateWasm`),P(`keyboardListeningElement`),P(`freePreloadedMediaOnUse`),P(`loadSplitModule`),P(`locateFile`),P(`logReadFiles`),P(`mainScriptUrlOrBlob`),P(`mem`),P(`monitorRunDependencies`),P(`noExitRuntime`),P(`noInitialRun`),P(`onAbort`),P(`onCustomMessage`),P(`onExit`),P(`onFree`),P(`onFullScreen`),P(`onMalloc`),P(`onRealloc`),P(`onRuntimeInitialized`),P(`postMainLoop`),P(`postRun`),P(`preInit`),P(`preMainLoop`),P(`preRun`),P(`preinitializedWebGLContext`),P(`preloadPlugins`),P(`setStatus`),P(`statusMessage`),P(`stderr`),P(`stdin`),P(`stdout`),P(`thisProgram`),P(`wasm`),P(`websocket`),P(`fetchSettings`)}var Sr={__assert_fail:Fe,__cxa_begin_catch:Le,__cxa_current_primary_exception:Re,__cxa_end_catch:ze,__cxa_find_matching_catch_2:We,__cxa_find_matching_catch_3:Ge,__cxa_find_matching_catch_4:Ke,__cxa_find_matching_catch_5:qe,__cxa_rethrow:Je,__cxa_rethrow_primary_exception:Ye,__cxa_throw:Xe,__cxa_uncaught_exceptions:Ze,__resumeException:Ve,__syscall__newselect:$e,__syscall_accept4:tt,__syscall_bind:rt,__syscall_connect:at,__syscall_fcntl64:st,__syscall_fstat64:Ot,__syscall_ftruncate64:At,__syscall_getcwd:Mt,__syscall_getpeername:Pt,__syscall_getsockname:It,__syscall_getsockopt:Rt,__syscall_ioctl:zt,__syscall_listen:Vt,__syscall_lstat64:Ht,__syscall_mkdirat:Ut,__syscall_newfstatat:Wt,__syscall_openat:Kt,__syscall_pipe:qt,__syscall_poll:Yt,__syscall_recvfrom:Qt,__syscall_renameat:$t,__syscall_rmdir:en,__syscall_sendmsg:rn,__syscall_sendto:an,__syscall_socket:sn,__syscall_stat64:cn,__syscall_unlinkat:ln,_abort_js:un,_emscripten_throw_longjmp:dn,_tzset_js:fn,clock_time_get:_n,emscripten_date_now:mn,emscripten_err:vn,emscripten_log:kn,emscripten_resize_heap:Mn,environ_get:Ln,environ_sizes_get:Rn,fd_close:Bn,fd_pread:Hn,fd_pwrite:Wn,fd_read:Gn,fd_seek:Kn,fd_write:qn,getaddrinfo:tr,invoke_diii:zi,invoke_fiii:Ri,invoke_i:Ci,invoke_ii:gi,invoke_iii:xi,invoke_iiii:Si,invoke_iiiii:yi,invoke_iiiiii:Di,invoke_iiiiiii:Oi,invoke_iiiiiiii:wi,invoke_iiiiiiiii:Fi,invoke_iiiiiiiiii:Ni,invoke_iiiiiiiiiii:Pi,invoke_iiiiiiiiiiii:Ii,invoke_iiiiiiiiiiiii:Li,invoke_iiiij:Wi,invoke_iiijii:Zi,invoke_iij:Ui,invoke_iiji:na,invoke_iijii:aa,invoke_ij:ia,invoke_j:Hi,invoke_ji:Yi,invoke_jii:Gi,invoke_jiiii:pa,invoke_jiiiii:ra,invoke_jiij:Vi,invoke_v:Ti,invoke_vi:hi,invoke_vii:vi,invoke_viii:_i,invoke_viiii:mi,invoke_viiiii:bi,invoke_viiiiii:Ei,invoke_viiiiiii:ki,invoke_viiiiiiii:ji,invoke_viiiiiiiii:Ai,invoke_viiiiiiiiii:Mi,invoke_viiiiiiiiiiiiiii:Bi,invoke_viiiij:ea,invoke_viiiijiii:Qi,invoke_viiiijiijii:ca,invoke_viiiji:Xi,invoke_viiijiiiii:qi,invoke_viiijj:la,invoke_viiji:ua,invoke_viijiiiiii:Ji,invoke_viijji:ta,invoke_vij:Ki,invoke_viji:$i,invoke_vijii:sa,invoke_vijiji:da,invoke_vijijii:fa,invoke_vijj:oa,js_disk_check:nr,js_disk_delete:rr,js_disk_move:ir,js_disk_new_storage:ar,js_disk_read:or,js_disk_release:sr,js_disk_remove_storage:cr,js_disk_rename:lr,js_disk_stop:ur,js_disk_write:dr,js_resolver_async:fr,llvm_eh_typeid_for:pr,random_get:mr},Q=await je(),Cr=I(`htonl`,1),wr=I(`strerror`,1),Tr=I(`ntohs`,1),Er=I(`htons`,1),Dr=r._free=I(`free`,1),Or=r._malloc=I(`malloc`,1);r._lt_dns_complete=I(`lt_dns_complete`,2),r._lt_set_log=I(`lt_set_log`,1),r._lt_set_utp_receive_buffer=I(`lt_set_utp_receive_buffer`,1),r._lt_set_dht=I(`lt_set_dht`,1),r._lt_session_set_rate_limits=I(`lt_session_set_rate_limits`,3),r._lt_set_listen_port=I(`lt_set_listen_port`,1),r._lt_session_create=I(`lt_session_create`,0),r._lt_session_destroy=I(`lt_session_destroy`,0),r._lt_diag_tick_count=I(`lt_diag_tick_count`,0),r._lt_diag_total_handlers=I(`lt_diag_total_handlers`,0),r._lt_diag_open_tcp=I(`lt_diag_open_tcp`,0),r._lt_diag_listen_full=I(`lt_diag_listen_full`,0),r._lt_diag_open_udp=I(`lt_diag_open_udp`,0),r._lt_diag_force_reopen=I(`lt_diag_force_reopen`,0),r._lt_diag_parse_interfaces=I(`lt_diag_parse_interfaces`,1),r._lt_session_tick=I(`lt_session_tick`,0),r._lt_session_next_timer_ms=I(`lt_session_next_timer_ms`,1),r._lt_session_pump_alerts=I(`lt_session_pump_alerts`,0),r._lt_alerts_size=I(`lt_alerts_size`,0),r._lt_alerts_data=I(`lt_alerts_data`,0),r._lt_alerts_clear=I(`lt_alerts_clear`,0),r._lt_session_add_magnet=I(`lt_session_add_magnet`,2),r._lt_session_add_torrent_file=I(`lt_session_add_torrent_file`,3),r._lt_session_remove_torrent=I(`lt_session_remove_torrent`,1),r._lt_session_remove_torrent_ex=I(`lt_session_remove_torrent_ex`,2),r._lt_torrent_pause=I(`lt_torrent_pause`,1),r._lt_torrent_resume=I(`lt_torrent_resume`,1),r._lt_torrent_force_recheck=I(`lt_torrent_force_recheck`,1),r._lt_torrent_save_resume_data=I(`lt_torrent_save_resume_data`,1),r._lt_session_add_torrent_with_resume=I(`lt_session_add_torrent_with_resume`,3),r._lt_torrent_post_status=I(`lt_torrent_post_status`,1),r._lt_torrent_status=I(`lt_torrent_status`,2),r._lt_torrent_post_peers=I(`lt_torrent_post_peers`,1),r._lt_torrent_post_trackers=I(`lt_torrent_post_trackers`,1),r._lt_torrent_infohash=I(`lt_torrent_infohash`,2),r._lt_torrent_infohash_v2=I(`lt_torrent_infohash_v2`,2),r._lt_torrent_set_sequential=I(`lt_torrent_set_sequential`,2),r._lt_torrent_set_flags=I(`lt_torrent_set_flags`,3),r._lt_torrent_force_reannounce=I(`lt_torrent_force_reannounce`,1),r._lt_torrent_queue_position=I(`lt_torrent_queue_position`,2),r._lt_torrent_set_upload_limit=I(`lt_torrent_set_upload_limit`,2),r._lt_torrent_set_download_limit=I(`lt_torrent_set_download_limit`,2),r._lt_torrent_read_piece=I(`lt_torrent_read_piece`,2),r._lt_torrent_set_piece_deadline=I(`lt_torrent_set_piece_deadline`,4),r._lt_torrent_clear_piece_deadlines=I(`lt_torrent_clear_piece_deadlines`,1),r._lt_torrent_reset_piece_deadline=I(`lt_torrent_reset_piece_deadline`,2),r._lt_torrent_prioritize_pieces=I(`lt_torrent_prioritize_pieces`,3),r._lt_torrent_prioritize_piece_list=I(`lt_torrent_prioritize_piece_list`,4),r._lt_torrent_prioritize_files=I(`lt_torrent_prioritize_files`,3),r._lt_torrent_cancel_piece_requests=I(`lt_torrent_cancel_piece_requests`,2),r._lt_torrent_set_file_priority=I(`lt_torrent_set_file_priority`,3),r._lt_disk_complete_read=I(`lt_disk_complete_read`,5),r._lt_disk_complete_write=I(`lt_disk_complete_write`,3),r._lt_disk_complete_simple=I(`lt_disk_complete_simple`,2),r._lt_disk_complete_status=I(`lt_disk_complete_status`,4),r._lt_disk_complete_move=I(`lt_disk_complete_move`,5),r._lt_disk_complete_delete=I(`lt_disk_complete_delete`,3),r._lt_disk_complete_rename=I(`lt_disk_complete_rename`,4);var kr=I(`fflush`,1),$=I(`setThrew`,2),Ar=I(`_emscripten_tempret_set`,1),jr=Q.emscripten_stack_init;Q.emscripten_stack_get_free,Q.emscripten_stack_get_base;var Mr=Q.emscripten_stack_get_end,Nr=Q._emscripten_stack_restore,Pr=Q._emscripten_stack_alloc,Fr=Q.emscripten_stack_get_current,Ir=I(`__cxa_decrement_exception_refcount`,1),Lr=I(`__cxa_increment_exception_refcount`,1),Rr=I(`__get_exception_message`,3),zr=I(`__cxa_can_catch`,3),Br=I(`__cxa_get_exception_ptr`,1),Vr=r.dynCall_jiij=I(`dynCall_jiij`,5),Hr=r.dynCall_j=I(`dynCall_j`,1),Ur=r.dynCall_iij=I(`dynCall_iij`,4),Wr=r.dynCall_vijj=I(`dynCall_vijj`,6),Gr=r.dynCall_iiiij=I(`dynCall_iiiij`,6),Kr=r.dynCall_vij=I(`dynCall_vij`,4),qr=r.dynCall_jii=I(`dynCall_jii`,3),Jr=r.dynCall_viiijiiiii=I(`dynCall_viiijiiiii`,11),Yr=r.dynCall_viijiiiiii=I(`dynCall_viijiiiiii`,11),Xr=r.dynCall_ji=I(`dynCall_ji`,2),Zr=r.dynCall_iiijii=I(`dynCall_iiijii`,7),Qr=r.dynCall_viiiijiii=I(`dynCall_viiiijiii`,10),$r=r.dynCall_viji=I(`dynCall_viji`,5),ei=r.dynCall_viiiij=I(`dynCall_viiiij`,7),ti=r.dynCall_viijji=I(`dynCall_viijji`,8),ni=r.dynCall_iiji=I(`dynCall_iiji`,5),ri=r.dynCall_jiiiii=I(`dynCall_jiiiii`,6),ii=r.dynCall_viiiji=I(`dynCall_viiiji`,7),ai=r.dynCall_ij=I(`dynCall_ij`,3),oi=r.dynCall_iijii=I(`dynCall_iijii`,6),si=r.dynCall_vijii=I(`dynCall_vijii`,6),ci=r.dynCall_viiiijiijii=I(`dynCall_viiiijiijii`,13),li=r.dynCall_viiijj=I(`dynCall_viiijj`,8),ui=r.dynCall_viiji=I(`dynCall_viiji`,6),di=r.dynCall_vijiji=I(`dynCall_vijiji`,8),fi=r.dynCall_vijijii=I(`dynCall_vijijii`,9);r.dynCall_jiji=I(`dynCall_jiji`,5),r.dynCall_viijii=I(`dynCall_viijii`,7);var pi=r.dynCall_jiiii=I(`dynCall_jiiii`,5);r.dynCall_iiiiij=I(`dynCall_iiiiij`,7),r.dynCall_iiiiijj=I(`dynCall_iiiiijj`,9),r.dynCall_iiiiiijj=I(`dynCall_iiiiiijj`,10);function mi(e,t,n,r,i){var a=B();try{Z(e)(t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function hi(e,t){var n=B();try{Z(e)(t)}catch(e){if(z(n),!(e instanceof N))throw e;$(1,0)}}function gi(e,t){var n=B();try{return Z(e)(t)}catch(e){if(z(n),!(e instanceof N))throw e;$(1,0)}}function _i(e,t,n,r){var i=B();try{Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function vi(e,t,n){var r=B();try{Z(e)(t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function yi(e,t,n,r,i){var a=B();try{return Z(e)(t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function bi(e,t,n,r,i,a){var o=B();try{Z(e)(t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function xi(e,t,n){var r=B();try{return Z(e)(t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function Si(e,t,n,r){var i=B();try{return Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function Ci(e){var t=B();try{return Z(e)()}catch(e){if(z(t),!(e instanceof N))throw e;$(1,0)}}function wi(e,t,n,r,i,a,o,s){var c=B();try{return Z(e)(t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function Ti(e){var t=B();try{Z(e)()}catch(e){if(z(t),!(e instanceof N))throw e;$(1,0)}}function Ei(e,t,n,r,i,a,o){var s=B();try{Z(e)(t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function Di(e,t,n,r,i,a){var o=B();try{return Z(e)(t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function Oi(e,t,n,r,i,a,o){var s=B();try{return Z(e)(t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function ki(e,t,n,r,i,a,o,s){var c=B();try{Z(e)(t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function Ai(e,t,n,r,i,a,o,s,c,l){var u=B();try{Z(e)(t,n,r,i,a,o,s,c,l)}catch(e){if(z(u),!(e instanceof N))throw e;$(1,0)}}function ji(e,t,n,r,i,a,o,s,c){var l=B();try{Z(e)(t,n,r,i,a,o,s,c)}catch(e){if(z(l),!(e instanceof N))throw e;$(1,0)}}function Mi(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{Z(e)(t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Ni(e,t,n,r,i,a,o,s,c,l){var u=B();try{return Z(e)(t,n,r,i,a,o,s,c,l)}catch(e){if(z(u),!(e instanceof N))throw e;$(1,0)}}function Pi(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{return Z(e)(t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Fi(e,t,n,r,i,a,o,s,c){var l=B();try{return Z(e)(t,n,r,i,a,o,s,c)}catch(e){if(z(l),!(e instanceof N))throw e;$(1,0)}}function Ii(e,t,n,r,i,a,o,s,c,l,u,d){var f=B();try{return Z(e)(t,n,r,i,a,o,s,c,l,u,d)}catch(e){if(z(f),!(e instanceof N))throw e;$(1,0)}}function Li(e,t,n,r,i,a,o,s,c,l,u,d,f){var p=B();try{return Z(e)(t,n,r,i,a,o,s,c,l,u,d,f)}catch(e){if(z(p),!(e instanceof N))throw e;$(1,0)}}function Ri(e,t,n,r){var i=B();try{return Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function zi(e,t,n,r){var i=B();try{return Z(e)(t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function Bi(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){var g=B();try{Z(e)(t,n,r,i,a,o,s,c,l,u,d,f,p,m,h)}catch(e){if(z(g),!(e instanceof N))throw e;$(1,0)}}function Vi(e,t,n,r,i){var a=B();try{return Vr(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function Hi(e){var t=B();try{return Hr(e)}catch(e){if(z(t),!(e instanceof N))throw e;$(1,0)}}function Ui(e,t,n,r){var i=B();try{return Ur(e,t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function Wi(e,t,n,r,i,a){var o=B();try{return Gr(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function Gi(e,t,n){var r=B();try{return qr(e,t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function Ki(e,t,n,r){var i=B();try{Kr(e,t,n,r)}catch(e){if(z(i),!(e instanceof N))throw e;$(1,0)}}function qi(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{Jr(e,t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Ji(e,t,n,r,i,a,o,s,c,l,u){var d=B();try{Yr(e,t,n,r,i,a,o,s,c,l,u)}catch(e){if(z(d),!(e instanceof N))throw e;$(1,0)}}function Yi(e,t){var n=B();try{return Xr(e,t)}catch(e){if(z(n),!(e instanceof N))throw e;$(1,0)}}function Xi(e,t,n,r,i,a,o){var s=B();try{ii(e,t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function Zi(e,t,n,r,i,a,o){var s=B();try{return Zr(e,t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function Qi(e,t,n,r,i,a,o,s,c,l){var u=B();try{Qr(e,t,n,r,i,a,o,s,c,l)}catch(e){if(z(u),!(e instanceof N))throw e;$(1,0)}}function $i(e,t,n,r,i){var a=B();try{$r(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function ea(e,t,n,r,i,a,o){var s=B();try{ei(e,t,n,r,i,a,o)}catch(e){if(z(s),!(e instanceof N))throw e;$(1,0)}}function ta(e,t,n,r,i,a,o,s){var c=B();try{ti(e,t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function na(e,t,n,r,i){var a=B();try{return ni(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}function ra(e,t,n,r,i,a){var o=B();try{return ri(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function ia(e,t,n){var r=B();try{return ai(e,t,n)}catch(e){if(z(r),!(e instanceof N))throw e;$(1,0)}}function aa(e,t,n,r,i,a){var o=B();try{return oi(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function oa(e,t,n,r,i,a){var o=B();try{Wr(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function sa(e,t,n,r,i,a){var o=B();try{si(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function ca(e,t,n,r,i,a,o,s,c,l,u,d,f){var p=B();try{ci(e,t,n,r,i,a,o,s,c,l,u,d,f)}catch(e){if(z(p),!(e instanceof N))throw e;$(1,0)}}function la(e,t,n,r,i,a,o,s){var c=B();try{li(e,t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function ua(e,t,n,r,i,a){var o=B();try{ui(e,t,n,r,i,a)}catch(e){if(z(o),!(e instanceof N))throw e;$(1,0)}}function da(e,t,n,r,i,a,o,s){var c=B();try{di(e,t,n,r,i,a,o,s)}catch(e){if(z(c),!(e instanceof N))throw e;$(1,0)}}function fa(e,t,n,r,i,a,o,s,c){var l=B();try{fi(e,t,n,r,i,a,o,s,c)}catch(e){if(z(l),!(e instanceof N))throw e;$(1,0)}}function pa(e,t,n,r,i){var a=B();try{return pi(e,t,n,r,i)}catch(e){if(z(a),!(e instanceof N))throw e;$(1,0)}}r.UTF8ToString=H,r.lengthBytesUTF8=ft,r.stringToNewUTF8=_r,(/* @__PURE__ */ `writeI53ToI64.writeI53ToI64Clamped.writeI53ToI64Signaling.writeI53ToU64Clamped.writeI53ToU64Signaling.readI53FromI64.readI53FromU64.getTempRet0.exitJS.readSockaddr.readEmAsmArgs.listenOnce.autoResumeAudioContext.dynCallLegacy.getDynCaller.dynCall.handleException.keepRuntimeAlive.runtimeKeepalivePush.runtimeKeepalivePop.callUserCallback.maybeExit.asmjsMangle.HandleAllocator.getNativeTypeSize.addOnPreRun.addOnInit.addOnPostCtor.addOnPreMain.addOnExit.addOnPostRun.STACK_SIZE.STACK_ALIGN.POINTER_SIZE.ASSERTIONS.getCFunc.ccall.cwrap.uleb128Encode.sigToWasmTypes.generateFuncType.convertJsFunctionToWasm.getEmptyTableSlot.updateTableMap.getFunctionAddress.addFunction.removeFunction.intArrayToString.AsciiToString.UTF16ToString.stringToUTF16.lengthBytesUTF16.UTF32ToString.stringToUTF32.lengthBytesUTF32.stringToUTF8OnStack.writeArrayToMemory.registerKeyEventCallback.maybeCStringToJsString.findEventTarget.getBoundingClientRect.fillMouseEventData.registerMouseEventCallback.registerWheelEventCallback.registerUiEventCallback.registerFocusEventCallback.fillDeviceOrientationEventData.registerDeviceOrientationEventCallback.fillDeviceMotionEventData.registerDeviceMotionEventCallback.screenOrientation.fillOrientationChangeEventData.registerOrientationChangeEventCallback.fillFullscreenChangeEventData.registerFullscreenChangeEventCallback.JSEvents_requestFullscreen.JSEvents_resizeCanvasForFullscreen.registerRestoreOldStyle.hideEverythingExceptGivenElement.restoreHiddenElements.setLetterbox.softFullscreenResizeWebGLRenderTarget.doRequestFullscreen.fillPointerlockChangeEventData.registerPointerlockChangeEventCallback.registerPointerlockErrorEventCallback.requestPointerLock.fillVisibilityChangeEventData.registerVisibilityChangeEventCallback.registerTouchEventCallback.fillGamepadEventData.registerGamepadEventCallback.registerBeforeUnloadEventCallback.fillBatteryEventData.battery.registerBatteryEventCallback.setCanvasElementSize.getCanvasElementSize.convertPCtoSourceLocation.wasiRightsToMuslOFlags.wasiOFlagsToMuslOFlags.safeSetTimeout.setImmediateWrapped.safeRequestAnimationFrame.clearImmediateWrapped.registerPostMainLoop.registerPreMainLoop.getPromise.makePromise.idsToPromises.makePromiseCallback.Browser_asyncPrepareDataCounter.isLeapYear.ydayFromDate.arraySum.addDays.getSocketFromFD.getSocketAddress.FS_unlink.FS_mkdirTree._setNetworkCallback.heapObjectForWebGLType.toTypedArrayIndex.webgl_enable_ANGLE_instanced_arrays.webgl_enable_OES_vertex_array_object.webgl_enable_WEBGL_draw_buffers.webgl_enable_WEBGL_multi_draw.webgl_enable_EXT_polygon_offset_clamp.webgl_enable_EXT_clip_control.webgl_enable_WEBGL_polygon_mode.emscriptenWebGLGet.computeUnpackAlignedImageSize.colorChannelsInGlTextureFormat.emscriptenWebGLGetTexPixelData.emscriptenWebGLGetUniform.webglGetUniformLocation.webglPrepareUniformLocationsBeforeFirstUse.webglGetLeftBracePos.emscriptenWebGLGetVertexAttrib.__glGetActiveAttribOrUniform.writeGLArray.registerWebGlEventCallback.runAndAbortIfError.ALLOC_NORMAL.ALLOC_STACK.allocate.writeStringToMemory.writeAsciiToMemory.setErrNo.demangle.stackTrace.FKN_setsockopt.FKN_resolve`.split(`.`)).forEach(fe),(/* @__PURE__ */ `run.addRunDependency.removeRunDependency.out.err.callMain.abort.wasmMemory.wasmExports.writeStackCookie.checkStackCookie.convertI32PairToI53.convertI32PairToI53Checked.convertU32PairToI53.stackSave.stackRestore.stackAlloc.setTempRet0.ptrToString.zeroMemory.getHeapMax.growMemory.ENV.ERRNO_CODES.strError.inetPton4.inetNtop4.inetPton6.inetNtop6.writeSockaddr.DNS.Protocols.Sockets.timers.warnOnce.emscriptenLog.readEmAsmArgsArray.jstoi_q.jstoi_s.getExecutableName.asyncLoad.alignMemory.mmapAlloc.wasmTable.noExitRuntime.freeTableIndexes.functionsInTableMap.reallyNegative.unSign.strLen.reSign.formatString.setValue.getValue.PATH.PATH_FS.UTF8Decoder.UTF8ArrayToString.stringToUTF8Array.stringToUTF8.intArrayFromString.stringToAscii.UTF16Decoder.JSEvents.specialHTMLTargets.findCanvasEventTarget.currentFullscreenStrategy.restoreOldWindowedStyle.jsStackTrace.getCallstack.UNWIND_CACHE.ExitStatus.getEnvStrings.checkWasiClock.doReadv.doWritev.initRandomFill.randomFill.emSetImmediate.emClearImmediate_deps.emClearImmediate.promiseMap.uncaughtExceptionCount.exceptionLast.exceptionCaught.ExceptionInfo.findMatchingCatch.getExceptionMessageCommon.incrementExceptionRefcount.decrementExceptionRefcount.getExceptionMessage.Browser.getPreloadedImageData__data.wget.MONTH_DAYS_REGULAR.MONTH_DAYS_LEAP.MONTH_DAYS_REGULAR_CUMULATIVE.MONTH_DAYS_LEAP_CUMULATIVE.SYSCALLS.preloadPlugins.FS_createPreloadedFile.FS_modeStringToFlags.FS_getMode.FS_stdin_getChar_buffer.FS_stdin_getChar.FS_createPath.FS_createDevice.FS_readFile.FS.FS_createDataFile.FS_createLazyFile.MEMFS.TTY.PIPEFS.SOCKFS.tempFixedLengthArray.miniTempWebGLFloatBuffers.miniTempWebGLIntBuffers.GL.AL.GLUT.EGL.GLEW.IDBStore.SDL.SDL_gfx.allocateUTF8.allocateUTF8OnStack.print.printErr.FKN.FKN_socket.FKN_connect.FKN_bind.FKN_listen.FKN_accept.FKN_recv.FKN_recvfrom.FKN_send.FKN_sendto.FKN_close.FKN_getsockname.FKN_getpeername.FKN_getsockopt.FKN_fcntl.FKN_poll`.split(`.`)).forEach(pe);var ma;function ha(){jr(),M()}function ga(){if(_e>0){ve=ga;return}if(ha(),_e>0){ve=ga;return}function e(){w(!ma),ma=!0,r.calledRun=!0,!C&&(he(),i(r),w(!r._main,`compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]`),ge())}e(),ae()}ga(),n=o;for(let e of Object.keys(r))e in t||Object.defineProperty(t,e,{configurable:!0,get(){F(`Access to module property ('${e}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`)}});return n})})();(()=>{var t=e;e=function(e){if(new.target)throw Error("Module() should not be called with `new Module()`");return t(e)}})();var t=e;export{t as default};