aboutsummaryrefslogtreecommitdiff
path: root/src/talks
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-11-22 15:34:30 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2025-11-22 15:42:12 +0100
commita4d6defa1722d52bf0f5bb2f3abf1443c4b6509c (patch)
treefc6bda84afeca68fe84d2e56119db107e2c509f1 /src/talks
parente855546ab1df31131b906d6cabed91409daf922d (diff)
downloadsebastiano.tronto.net-a4d6defa1722d52bf0f5bb2f3abf1443c4b6509c.tar.gz
sebastiano.tronto.net-a4d6defa1722d52bf0f5bb2f3abf1443c4b6509c.zip
Added talk
Diffstat (limited to 'src/talks')
-rw-r--r--src/talks/talks.md5
-rw-r--r--src/talks/wasm/examples.zipbin0 -> 84459 bytes
-rw-r--r--src/talks/wasm/examples/1-hello-world/hello.c6
-rw-r--r--src/talks/wasm/examples/1-hello-world/index.html.raw200
-rw-r--r--src/talks/wasm/examples/1-hello-world/index.js1677
-rwxr-xr-xsrc/talks/wasm/examples/1-hello-world/index.wasmbin0 -> 15129 bytes
-rw-r--r--src/talks/wasm/examples/2-sum/index.html.raw16
-rw-r--r--src/talks/wasm/examples/2-sum/mime.txt1
-rw-r--r--src/talks/wasm/examples/2-sum/script.js14
-rw-r--r--src/talks/wasm/examples/2-sum/sum_library.c3
-rw-r--r--src/talks/wasm/examples/2-sum/sum_library.mjs1531
-rwxr-xr-xsrc/talks/wasm/examples/2-sum/sum_library.wasmbin0 -> 1116 bytes
-rw-r--r--src/talks/wasm/examples/3-primes/index.html.raw18
-rw-r--r--src/talks/wasm/examples/3-primes/mime.txt1
-rw-r--r--src/talks/wasm/examples/3-primes/primes.c15
-rw-r--r--src/talks/wasm/examples/3-primes/primes.mjs2
-rwxr-xr-xsrc/talks/wasm/examples/3-primes/primes.wasmbin0 -> 155 bytes
-rw-r--r--src/talks/wasm/examples/3-primes/script.js38
-rw-r--r--src/talks/wasm/examples/4-primes-sieve/index.html.raw18
-rw-r--r--src/talks/wasm/examples/4-primes-sieve/mime.txt1
-rw-r--r--src/talks/wasm/examples/4-primes-sieve/primes.c23
-rw-r--r--src/talks/wasm/examples/4-primes-sieve/primes.mjs2
-rwxr-xr-xsrc/talks/wasm/examples/4-primes-sieve/primes.wasmbin0 -> 7203 bytes
-rw-r--r--src/talks/wasm/examples/4-primes-sieve/script.js38
-rw-r--r--src/talks/wasm/examples/5-matrix-multiplication/index.html.raw17
-rw-r--r--src/talks/wasm/examples/5-matrix-multiplication/mime.txt1
-rw-r--r--src/talks/wasm/examples/5-matrix-multiplication/mm.c116
-rw-r--r--src/talks/wasm/examples/5-matrix-multiplication/mm.mjs2
-rwxr-xr-xsrc/talks/wasm/examples/5-matrix-multiplication/mm.wasmbin0 -> 80310 bytes
-rw-r--r--src/talks/wasm/examples/5-matrix-multiplication/script.js142
-rw-r--r--src/talks/wasm/images/beer.jpgbin0 -> 508889 bytes
-rw-r--r--src/talks/wasm/images/cpp-in-the-web.pngbin0 -> 102616 bytes
-rw-r--r--src/talks/wasm/images/cpp-logo.pngbin0 -> 16020 bytes
-rw-r--r--src/talks/wasm/images/cpp-logo.svg17
-rw-r--r--src/talks/wasm/images/emscripten-logo-full.pngbin0 -> 38844 bytes
-rw-r--r--src/talks/wasm/images/fast.jpgbin0 -> 65580 bytes
-rw-r--r--src/talks/wasm/images/meme.pngbin0 -> 281971 bytes
-rw-r--r--src/talks/wasm/images/meme2.jpgbin0 -> 31260 bytes
-rw-r--r--src/talks/wasm/images/pencil.jpgbin0 -> 61592 bytes
-rw-r--r--src/talks/wasm/images/sum.jpgbin0 -> 65486 bytes
-rw-r--r--src/talks/wasm/images/wasm-logo.pngbin0 -> 27191 bytes
-rw-r--r--src/talks/wasm/index.html.raw456
42 files changed, 4360 insertions, 0 deletions
diff --git a/src/talks/talks.md b/src/talks/talks.md
index 595f49a..118e42c 100644
--- a/src/talks/talks.md
+++ b/src/talks/talks.md
@@ -113,6 +113,11 @@
113 113
114## Software 114## Software
115 115
116* *WebAssembly and Emscripten*.
117 ALTEN Advanced Software Evening, December 2025.
118 [Slides: [html, 1.7Mb](./wasm);
119 Examples: [zip, 83Kb](./wasm/examples.zip)]
120
116* *L'importanza del software libero nella ricerca (ITA)*. 121* *L'importanza del software libero nella ricerca (ITA)*.
117 Linux day in Feltre, October 2019. 122 Linux day in Feltre, October 2019.
118 [Slides: [pdf, 804Kb](linuxday2019.pdf); 123 [Slides: [pdf, 804Kb](linuxday2019.pdf);
diff --git a/src/talks/wasm/examples.zip b/src/talks/wasm/examples.zip
new file mode 100644
index 0000000..e068afb
--- /dev/null
+++ b/src/talks/wasm/examples.zip
Binary files differ
diff --git a/src/talks/wasm/examples/1-hello-world/hello.c b/src/talks/wasm/examples/1-hello-world/hello.c
new file mode 100644
index 0000000..ef66efb
--- /dev/null
+++ b/src/talks/wasm/examples/1-hello-world/hello.c
@@ -0,0 +1,6 @@
1#include <stdio.h>
2
3int main() {
4 printf("Hello, World!\n");
5 return 0;
6}
diff --git a/src/talks/wasm/examples/1-hello-world/index.html.raw b/src/talks/wasm/examples/1-hello-world/index.html.raw
new file mode 100644
index 0000000..be9fac6
--- /dev/null
+++ b/src/talks/wasm/examples/1-hello-world/index.html.raw
@@ -0,0 +1,200 @@
1<!doctype html>
2<html lang="en-us">
3 <head>
4 <meta charset="utf-8">
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6 <title>Emscripten-Generated Code</title>
7 <style>body {
8 font-family: arial;
9 margin: 0;
10 padding: none;
11}
12
13.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; }
14div.emscripten { text-align: center; }
15div.emscripten_border { border: 1px solid black; }
16/* the canvas *must not* have any border or padding, or mouse coords will be wrong */
17canvas.emscripten { border: 0px none; background-color: black; }
18
19#emscripten_logo {
20 display: inline-block;
21 margin: 0;
22 padding: 6px;
23 width: 265px;
24}
25
26.spinner {
27 height: 30px;
28 width: 30px;
29 margin: 0;
30 margin-top: 20px;
31 margin-left: 20px;
32 display: inline-block;
33 vertical-align: top;
34
35 -webkit-animation: rotation .8s linear infinite;
36 -moz-animation: rotation .8s linear infinite;
37 -o-animation: rotation .8s linear infinite;
38 animation: rotation 0.8s linear infinite;
39
40 border-left: 5px solid rgb(235, 235, 235);
41 border-right: 5px solid rgb(235, 235, 235);
42 border-bottom: 5px solid rgb(235, 235, 235);
43 border-top: 5px solid rgb(120, 120, 120);
44
45 border-radius: 100%;
46 background-color: rgb(189, 215, 46);
47}
48
49@-webkit-keyframes rotation {
50 from {-webkit-transform: rotate(0deg);}
51 to {-webkit-transform: rotate(360deg);}
52}
53@-moz-keyframes rotation {
54 from {-moz-transform: rotate(0deg);}
55 to {-moz-transform: rotate(360deg);}
56}
57@-o-keyframes rotation {
58 from {-o-transform: rotate(0deg);}
59 to {-o-transform: rotate(360deg);}
60}
61@keyframes rotation {
62 from {transform: rotate(0deg);}
63 to {transform: rotate(360deg);}
64}
65
66#status {
67 display: inline-block;
68 vertical-align: top;
69 margin-top: 30px;
70 margin-left: 20px;
71 font-weight: bold;
72 color: rgb(120, 120, 120);
73}
74
75#progress {
76 height: 20px;
77 width: 300px;
78}
79
80#controls {
81 display: inline-block;
82 float: right;
83 vertical-align: top;
84 margin-top: 30px;
85 margin-right: 20px;
86}
87
88#output {
89 width: 100%;
90 height: 200px;
91 margin: 0 auto;
92 margin-top: 10px;
93 border-left: 0px;
94 border-right: 0px;
95 padding-left: 0px;
96 padding-right: 0px;
97 display: block;
98 background-color: black;
99 color: white;
100 font-family: 'Lucida Console', Monaco, monospace;
101 outline: none;
102}
103</style>
104 </head>
105 <body>
106 <a href="http://emscripten.org"><img id="emscripten_logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAABiCAMAAABXhUXrAAAC+lBMVEUAAAAwMDDh4eE5OTc4Nzn29vY5OTk3Nzf19fW72TP29vb29vbj4+M6Ozbu7u5ITDfj4+Pr6+vr6+tcZTb19fXi4uJTWjamwjTt7e3r6+vv7+9QVja21zStzDRteTZsdzdlcDW11DPv7+/19fXr6+tkbTqy0jSvzzW41zN8jDXD4DD29vaNozV/kDXx8fHi4uL29vaqxzTv7+9uejfI5TDi4uLh4eHs7OyGlje10zT29vb6+vr29vb19fW10TLy8vLz8/OnwTOMojWuxzTl5eWUqzXj4+Pw8PCguTSBlDX19fXl5eWftTXk5OTj4+P29vadtDR3hjXi4uL19fXj4+N6izZpdjWivDN7izWMoTXF4jCZszWiuzSpxDOQozSxzDGszDrp6eni4uL19fUjIyMbGxsQEBAfHx8nJyf///8XFxf29vcTExP19fQMDAy00zT9/f0CAgK31DO51TL5+fn6+/qy0jX8/Pv7/fnj4+MICAi81zG+1jD6+/bq7tvl6tbx8u3j6NTp6en09fHs8N5paWnr79z4+vPz8/Pl5eUxMTHn7Nm/2C/o7d3c5NEsLCzf5dPi4uJ8fHzi5tOvzzTy9exiYmI1NTXa4M7v7+/y9ubm69jp7OPh59bx8fH2+u/w+eg/Pz/u8ek5OTnn6t9FRUW+3TPj59uz1Ta22DXu7u7s7ufj6ddMTExcXFyeuCvx9ene3t7Q1MPCwsKis0DU2szn7cbr6+uXl5d2dnZRUVHv9ebX19e1tbWjo6OdnZ1xcXGpvyZVVVW6urqmqZzOzs7Gxsa9z4OcvCTs8eTu8t+QkJC52zXD3jDb29u+vr6GhobS0tLk77OwsLDI2I2Kiop/f3+30TCnp6eqqqrCx7iivSza3sy6va7Kysq/2Dm61CuCgoKtra3X54+yzyrU1NSZtTC10yvC21KQpifv9cuEhISYsyfp8sHL4Gypxi3Kz77X4bfd66Olt1fO2qmrrqDAzJO4x32zuaLe6rG0ym3M1ZV+lyimqppoJhxDAAAAY3RSTlMABHoRDPYIGHP+unWwIgQuuxUwVsSFRc8PHAc69t9MO2XjCvIlJPDq7mDxrKpuV+bi10Uu/fLNUETWh3jq0cBr3LyagDqymzzGmJKNZdqpnZN7ZmG2g3WykIPewJ6ncZP49X4lcShzAAApYUlEQVR42uyaS2gTURRA3zDjjE8dB01N1CSTjJqvjRgTMPETTesnFdEEqa1aP5CViIzMQBRGrUWJghGEuPG7EHlmVNCFuHHl0pLZiJCFCwVdGPGDH3ThxjsxiaKtGj/UQg8tk5eZdwv3cO+7DEXfMmfh+DVzJ7TE3EXLFkxBY/xzZs2buzy7O9sau+Fn3NL1C9AY/5TpG5Zmf59xbfMmozH+GQvbsn/I3KlojH/D5EXjsn/Mkg1ojH/BlLnZv8KimWiMv2+nLfuXWDN2AP11Zk3IfmHXruzuloAdX9cPGnEia00YVIOJAS6aQqOWyet3f5Fz+OK5Syda49zF3V8JWoZGmk4DkGgWmQhRWERjaPSy4VhTzrFz508WiwMtUSwWr139Imj2ajTCxOKFgpHiGGTiSewvFIIuFo1WZizJNrhaPDnQf/b4wZY4frZ/oHj5UNNP20iPB5QYLBgr63pYzgalJDBotLK+aefcyWL/cZCTP/Lr5POmof5i8WrzNcJ4NMKYejq4esFw8YIR5ketnqnN4rl0cuDscXAzePszZ35G7am7oAgqaKB4tVE/86ejkSUQ3W+EGtOAa/N+I8WP2ua2qHHunDvZb9oZvDF4qxWenbkxaPrpL15s+JmGfoTHBXCIFQMihyhkEgl0bt++zQWLWCcQgw+MSxThxOBqawSw4rbOzgCHEBVxASxyuQMRytzs7uyEvVQtdgjieEKGVrA09IhBjazkPGJoWwSCxCwWC+xFHjcg/v/z3JTldTuHoHYOHhw8c+vD25st8fZ9/jYU0NmBa8fqodqmoB+QCALWWCIYjSYiph9u+2ajUNBIcBOLeqJagfSxFBKjweBmDwxeBc1IwzqWiELSowkBeTbD/kSkA/Z3UohOw2bNCG6DZ9DazYamGfGwpqnWhh5wpaVDcRjgNosoEo0aUQiL1kaBPva/97MgW+cynDsHj9z+WK0+f3CnBa5XqzdfnzkC9VM8t6s+/y1Ew8MkNFXz9ziIpqrGVkiiJ05UgjGBZYAK2OBuD0dRW+GKRYpP+zQSotHaoKYRrKkkTbk2wy1b0oDnMzCYGbXvtSBU0loDHjAMAkvJztRTvwkedGrmX9PinCvpgLBWsJ10aH4r87/rmbWoWTw1O++r119VHj3a/6s8qlSe3KlWX5/JnzgO5VP3swoNDxVJYlXBRJJUVfXbEQu68Eq3O4VVkuIoC1Gxjac8friLAwwlSNhpZ2JBFTszG21YS/CMK6yqihZWVOKmt2IVt7s7VJUEqIhfBW+9vSkNQjRmNQqeUDEOOzW4iAzdB38mxLAogEk7/9/rmdHWmAuKZw/mz7yuXn/yqPDr7N8Pv5VX1Zv9g0egfK7W9Syf/gM9TB9WVEeX1eJTFWJBAUPBHQLHiQ5VlVyU6AcRPLsWFKokw6AQIb0cncCq18LxSYyTPEPbQF2vRSJBi0gUyDIdwqbKNFbwFivPWSUV9zSGATqhKljKWC02uLuJZt1EwX0cBRH9Fu6/HxhWzK/rOT9w/OBg/u3zJ5DwoXj4Fd86qtypfrgB7a3Z3a5M/VF3S0LVZHhItqmHTkLmrRzD0GGs+kXKE1dVr522YVlRSC/LJbBkZcWggldaLT2wIUOznE/FKUEIdGeEHtjstnZLCg4LnBPiujmaFeIqac7VvKQofjfPMV3gpYNGdigxqM4AwaAV/e/Mq4/Vh+Hkyd++VX1VGbqHPX3W5MXT73rfk+dvBwfzxweO1F2fnoeGh3Yq2GbnWHqrIhOLHdJnE2iKYmy64rewTBIrDlF06Fu8CuliRbMHURkiK2GneUCthEc9DigZjmZomncqitfmJzqW3FzMoWAzEhIkhWyk63oEhwwiQFY3kUEPRSdVxStAAY6G4kHLZmdrHCr2H8zffgfFM7SexzubvPn+ZKpcv/nitqmn/vLuwo9Ga86rlFfyDLQdRXFYrQ5ZScIKMWFVgVMGtRNFD3QRvDEMEug+3WHhqLQuy2VC/LZuAXIawzLpolmKZSN+RVYIwb52C88EsFyuvStwYQW7mcZcDYuaq17Qswk+QBUpYq14wORQTJ+zYuG8BVNnoP+A8U09Z82x7XplGD3Pdu75zM5nD7+/XXnw4B50t/6GnmM/mg1cei27iPPJstMOevTaQRHxyzgFnjaV5VzahsPWFJwkLp+e4ml2K+jZ0tVtEXga0h4qy+VMLbcuhyz72ns3woFD175uNytimy77LQ09a3XZay4oiKGHYFegLMvplD5c8SxY1DYuazJ//bxZaKSZOK6uZwD0nLl/vaIN3duO7qzbOfDy0fB68g0969DwBHS53M1QcM1BFdkluZQEPZDdXLmLY83rKaej3MX3lfRUOlfeyLFUn57TMxz0M4alkCnQ4W7o0W1C/XszQDsUj8cpl5yNmZlKl0APBfYlOSdboYl6fHLOB08OWTwr5kI+mrSN+P+3fKUn/1nPUEBv27PXZM/Ox4+076npyX+lZxIaFshuTl9ppyPxklzeSHNJPeezIwTLks/KUSjmyOVykH9ukw4fdJsd0pgp5+SwRRDE2guE9nLJZ2fM3NPOklzqFQR7qJM2dZfCohCIl2AX35ire2DV4aE8STlXgmmbotgeiAvKOHb4XtJk8WTUEiOi55H2Yue+GtDahtKjPLgO1fOLejogPSUpIUHuU3CSh8qQt+7uOCy7eUifxwtWzEwGTD3l3tpp4i/lct64pJMOio7ZSrkdIdEDodi0GSse9+t+gYqYXr2SXvLBdvETsebzm0QQxXEI7K6i69ouArqgSAUOYgWNv6g/KrGpVeNvGw0aTTwIIUaCLuiBSxMl4oGYEBs9SIzR7JpwMB70oMZo4kE5mWg9WZNq4EIP/Qt8M7OWtizbEOz67YEZ5s3s9H14M28GlKyMBuO0HDq3A70Mo7GMZ1BxQC14+i7O1eVw+3z0x1MrJTGdTK4GdDrEE5WLxbSMfOSCjzBtCgCfSkWSnUOciUaJHWoaYoy2Crjejy5njPQGpyxJklxxRuhDTyVUfHrUAA3c3gqqVWS/jTYPVBBYKRJFLDnifeaClN7vr0jpIqykHEYiSMW0Uy149sDsm/gcNLQr/fFMxLNI15OwtHWKxxySJPvwfr/PNcAzyPdsxOWUnaEBNwu7DLSfdYGACrfb5VobYcgqxgfsoVB0yM2aDtmxQhvMiBt3KhoK2QOnBMZMswGf5LMPC3bov4PD7oc10+U6xu93AsCAgMc3cH4SPC2v7hOZZFJMKOWHx+f/tnnVstmCNxYKz1U11TMYT7K+uAq1n03tY23g8a5NS1GO43kbi+iAixkBbo+hRrxHe20gWObMHLxyxI20meFsAseg046XE0AcWEBns4kVbAL0RbsKw7t5gWUF6Cco0WHiYAyG5YfdPMdAD5xPpH1uleBRfqx0Tbz94e3bDyMZBdCWdQZtOSzWJoX1xFPLkeApTV4dR1rcCZ7VzqIUwYdKE3YX8IEyqeGq0Qxl8DYpgBsVI1yDd2ncFSwa76MGVCZFGlk2RsMygcAGX1q0CB4yd3Hk65NRUPmNSMLn/sF5L5WblLBu6/rHeO7c+tQCT3Xieg4p++BLHWlqvBM87grggV0GPG1QZMSatvhbU39XsZ7du1FsbiXCjzu0wbsGUrm02s4TJrHz8mYhj/DkH3/MkOv3jfMcUPtU8Ly8260bnp/1TI7wyYDipclqJ3hQvnzBv2OzQX95ffJanwR5h1raZsV+Tb6KjRLFviUTODm4vU17VLVfcI5s8eiFp1p7kM1NK4vodICHPu/z+30+P2zdesu4HbJuSfYPcSrBsy6Il7a77wsKnsK9Z9eIq1do3/n3N8EBpFsNC4LnitraJmIwJSQVOqArbeDZvJoH2Zj/gMcoHIsETvOs2rMH8Yk0+WM0r6hwb0TBc1h766GUjALp7/eRt5cuFJ7UHI2N1+MZkFgq5Uq53EQ11aw28BiNjURAbxlpE8tC9qf2ydiGHRF/EcvnR/Ff7N1lBc9ybQ9exHp2A+l+gmTjNw4uDJ50qhnPBNYUopMFOp3gIYB0J9N4NI1TEm08RLHPcWWhOql56LGQ4Pn6pFwuv/8hEjx3j+uEB1T9hTQJdMSpsVTHeOAY5+lywFFO08bj6PKsmtXJgTqpjQamYAttLZ7V5fBonRPBArpvwotb5vfjgkLn0WuRLFQ34Pq99US6KWx1uRwrFGKPlT7Png/OmQL5ZzQnAaO2i6eBqHYrWxKnUtXO8Czr7g1bgtQ1iqJ2Wg+cWNRCS47s2klRPf3r93STfbv3gDXYQ1FBS3iTY+aJcF/vAcuuHgpsg/3WI329gytnbtqDe45Y+kkrNC5a0jetWY/qQQa7iJsT3y4VMJ3896Syj7y0zJwaTIQiE4GTjWdlNwke8Q/zZvPaRBCGcS+CVBAUD9ajeitIEUTQFj2Igh48+BfI7jI7HYODzHTpwUsh2uxlaZCUeIiEJaCBjYQFTZakCQnJwUI+FKNeKn7UFvw4ePPmbGazs6lJNakHnx7aeed9331mf7PTNm3sFVZmpLx/togvXuHNz1zed40VMM3MTp0but5zU8wmW+/E/svHxsFza/PjnYd3Xjx+PXh6/slf4Zk8PzUjjaaZayf2nLo2HYgcvu5vXP6nmaCWZqf2c6IHzlyZlUYXXSirrpyXFIm3bAzU4StTbGvwr+F71WWa0by5XsnxpVENTJwcA8/m1vN75Nu7zdu7wDN5dloaQ9MTx/sDoanJLpxhqGcmTh45cp09DeMoRBP13KucvYjRCFW4kVINw1DLVBpbYnknhuO5f2ugNj/eu/d069OtIZp/8vlPeI7tE3B2qwuH9kxe2Wlfzs6O35xQJo2MUoJwSzaY1Fe7wSOWd3lEPOzhuXOX0Rkfz6GJkPTvNH39sPT/CMGqbrhS39J/0nDm1Gh4Pv3QnjM6Q3X/T3hOBh8domGMd9yf4kV9EaCsRgS2t8OUiMltZVC0GlavDage7qzfPIVNUzZcyet0iAXhYIhIX8rMoVHwfNp68OA7ozM2nut7e1aZV22hZjfrtWcQEx7DASG+IJhgOQXa44EIJAW7WYvDfqiIUIiXa/Wmvd5eoNBjJGY1KGXXbTabJZAT0LAQCXU7p9eZm2VMPCPCSX+AeM6W2rZdS0OKepeIrK1wOqoegZgraCFRcP01qFciUSxEeRKGC+tNe4P43/BmJ0fAs/njHqMzNh5BR8PpZieTMtlv5WYqVlpw10wWv0R95bPuXZLsvMVykrEm94tpoeUkV3TTakWoJITp4st8hbdLppxwq7ic8PkRKDVKYSdp6u6sUy41QpjQXF5cq4lDVGtHLdN149Rp/FU0oGVClluBcY05g6getZIs3crXNJduaONtPgVkQ+3KKHd457UEhwdRthS2mHPdTFaidYRZDBUDFt4gxHBFVmMp14STS2ucauLqQDxfB+LZ4s/OuHjO9OjA5ZIly0DuCgDZXF0iEt1wA15MLVCC6zGVJwFjFbtljY4OeEBxspo48tsdk7frNZT1TJV46BLFmOHGuNhnI/YyEU8pIn0V4sWW4aXM2XBDDzrJUrjOynzVCSW27wwYOUQk3DbZsEum++GlKpaGGDpKmmVhAchquKBJKBRW/J5KlCD8LJeUgWep0vC2342LQ/DM/66fH+d5eJh2xHNomgcp+cBujhqQDFqI0CIQgeQyXHqlA3+sbxBKPyQVP0Mp934NIaS04rcT8y3K0dVjMm8jBECrYYreRhUWKorcG7Vh1ZADThYIrIrrugfXYscIWJVzGoK2KkqEQBi7Fhp5FfSbS7UxiluyCJQwrFdAIOC9TI7ilwbjmf9Nn75/FIPR8Ryd4D/O43Tev2GCzxusrYkoqISyseA9B+9hvBMsk1VvfxGpA0RcFLx0pynJGaJNgK0tCMhmo5FUBI4GXJXlgJNnhOYEHjlF2g5v6TuxNVgUGUETHSwhXE3+ZkFx0vTZSoCGDUu60ndDipifbqcP/iWeR1uPdoNnP49pkYy/U5l6C0mmcXnOHyp5u/8BUzIRgYtXvOGnG255cVkGTLI3ADU2jVDURyd35dXm3s4B/9JOwRKtFScCWzeBGJclgso3hdFw0fSyhTeqrSlygKl/MpYoom/UXrdACjtQC9wsJ1xvib3XdzqgyJnheO6Poh3wiPd90zSj40lRgOIf6lVci5r+uiyTZ/lasbYFwJcuHmyr3lg2nUzGMb2h0aASou/9ou6VgOIN3kZylj/jlAOt58IhWlizxHgNI8SdcSV1oG5zotdx+CZbjIgoXHNVCj+owI+yeG/pGZxerfiNdEsUe8mptIfn0mA8jM0vys7ttZkiCuDgow+ioqA++ybom4Ii+qSgqC/+AUKzm8zuZpnALmsW6qU1po1obKGJwdqYxiBUExqrNom50ZBqDfRCaWm9QQUFUVBRvOGDZ3bO2Wyzqej59HP37MyZM+c3Zy7LBn/8/JP/LJ//KBBdjecR3GD2NfIwttM8zWVpwTxhjlVo+N4JdQz+wT8U2aiviTYdz15Kkw/y54WFeHxtpieX7NKSrTsNP2RKud/o9r5v4f0u5/GtMt7ExHMDb4zv2YztxAdZwnPGIOPttZFX0EtRBECuQJkGa/T7zRragr1Hsy9liW1lfRdKqVPY3dHNtu3ow6qPznNEjCGympmTi8/c9VPxCDi//PXxf5Xf/3r/ByD07VV4bpfJw85oA6NVOzOM8XPcrChNBotom4YahSBw6yHKBDY7Ag8f5pHb10wX4nwln8KSwYc++2izDW1x1sbdWFJsjncCqdUaYaQg1GJB05FdNNJhcoeRveRZppYTDSPSps1AdtF5pVRnKM5iVaH4XwjtYgvt5ts2bGqaOFbJaqvkt5JFPNt33xbG8y3A+evnF1fgyynrP8jsbHrzpV9/+eHzK/Hc52mcOk1aWivJLHG8K/l4AN6WNnZWy/Z368sBQEqkP0x2IzT+DgUedqzg1rvN5E7hyKuh9XXLymnU7xObezPrvhfkaFl03a4ofh6PNmDBkSDPPDx1pKFkdr2arCPMkmeZk/2NmSOIPPVFnMJ4j7bm1W2LtvwnBmHuMi7s9BRpN/8N4NmmESI0SrVb367XCCfhmbv7hinZ8/lTP88/zZ2n/7M4fHbzt2+/+/bPqXhuuF+etWHV9UTJt7mn2cij4pABva4WJdFqQ+7AiBwrSgNQAF+s0PPw9FR83GG6h6ce1QzDcE8YH/g1m5Y9I/FkvKot2LVayTxZynSYzRqqd5094KLgIEKNyg0i6xoBz46YbVns6wgqlPK+A0W+R3tGjtHpu51BnXYo3WMnUqGU5oQLJcU3mh0VuG2zHrVT3v4XPN+9/+Hs0/bT/1PSv/793Z8fTcPz8IIXu0Xf3YYczmxEDn7twO2FxCNW0cMFDordrCIVEJS6ALhfQoLKwAbn+Yh4lw4c8bJKLww6x2eN011up9CYVqYjrF3PGpqiGKkZfcZB01ElJsiyhqmAGJm2wMF7FLXWmkXjijw7LeDIKvt8vwENS2lYp+/jOSRVZc72sqleUtAuF+7E0CgU2GJWcBgo1YKOeG4J4fn4u5+9z0Gfnp2SJkJCWigJFYq//f3rXhgPfdvHG+RuackBWqwwiirYwzkIrZ6j2GfPuA02+HGE8DU3mLBwlCFFW+ARgx5NRnKDJcZ0nYEAKD7MUGNNCpe1mCuVyvnYyNbFKqhg6HQx1R2NRoenzf6F9xqGnWJdI8Xk8cP3LNbjeKDnVd/bIZxvnB2K7Am2pxcIoNEAFXi2S1W0kcAzpL7AuUFkFxg5MbBAbgF3bndfN4nn099/Lwo6E1hCMkloNr33y29vTft9j5zbeM1Ad5eZeIfYbWnk/4UI9kzV7w7OBQ0FY1i1LU+xSzyzS0LBztAiaDStdDpYYJYOlnR9PA4ju/b4LXN8rt7+KglV2UhD0zvMQ8eFMC7bTVGUluXDuUnPQOyajwzw2MmKIe+iXY78jmkE5NvMZvbWcswHWgcXnHN/tCaZ9A+OWH5A5MePyScnd24vPPPbKwIPyXRGQSy+FH/949WXwnhuwO8r8poiBHqw0O6lSpqhSDG8+UdfyCgox9JdtmxggRQqBqiA6cKSX9R4JlGpRionSceWHVVRW17TL73btrnlmVaxEpoOCGQCeTZiNCtj6S2/tJ3TUJc94vBlXIY6t2XPTHi/E18cXLRiqhZFRYPLuU/eqjl8g2sVWqTqYtomHwrhefbXjyQelOkJRHCCkn7ly/eeDeO5x7tnXyveSRT+quTFCo63USPmLcjWfkwqtNiBdI6nVNRccDmbN1Bh1AqWqLK2Y3gKaVcBo9nRthOH8V7RsGotDnhCBOyg6QmxkyUDHT3mctHCRrTYV0E8aCHT5jBwIpqsE1uU7VnxHWxCyVci4JqMPNyqzRnhvJNCA+YywypzZTSiDWQECslrJvG8+OrP0/BcNbkF6RQ/+uyn518K4XlA3NDyK0S7NObzB0xUcDpRqTbyR1x+h96iId5zKPlxdC1busfrAOsEzLUgWvYSpZV6aE/BYy9WyXTXmXzoZ4IWObK80gdozMAdp6ekFDPK+7aYZtFeHj/T4d/kjXB3objWLHhWeYs6c8JocYwo2PCWxLOxFHqp88xrr30EXxpeFlvI05QycOEp6KmP583PPns1jOcROWCbphISzVRS+wzxUUQrGxZ+bUYd3MLv+qhHZo9hKEcaqnwxy23HblNEVFoKSCZip+HSFBBG40TLFuQg8D1rzfmlecUIKP2xp1UxW9kW5FNIVLV8ZtsSRtlAeNQZe4g1aIDq2/UbQ3i+eOWj+TTJfFFkknf4LBbTthRxaXk6K11cic/6hd/87MtXwnjuEPdWoWZeAgNimJFcx/Hnasx/s8aog9iBaBLfr+cxbsbXNOCsHszp2mXiOzo/MAgWrmO+TJpeskIPu+iIUZKh5k0aFSk/FfW1PCn7tq5bNPaMlK4jZEOb7K+qVkaLNJPtZ8kFctHp0jCoLtpyXx16Y/2MhyeOAV9ZKQIfD0WRroKXabha8WGuAJ7XXg/huTYutz+qRmIYqmlokepoqDM/KilTPlRTzO+gFPkGCkxEsHp0QNV0NkxFVRVLohyzY1KYg6l4BmPTYTwNF5vZ0SWemorGTn1jDgBGJRyprY0dLKIe0mj7+nJ3VUPJ9DtJRs3xAXUm+5WDqgs06eYc/NXKY9ddhScu/qzO8tkVXTKZ5emidxUvPu1g+swX+dObq7NY+io8crqvjP2NZCq10/PFuMOs8WrdIjwXiKdLYcL3t/aWhiXEUYPqcftouRJ1hXFCkmLdK/GETE/i0a0+OdKUKxwjz40RGzM0UKd1GewmygTra44Fzl2fjpItt/qj4ZrO7LELPepMnt4C8ZSKeJrjD7un4vFkZeW5tzfTxXfm4/G4rq8U05vzOogV3ywWN0EDMr+ZTr+1mJ6XcgWemy7jMfLng6MCY44lByed6UsmPu9xyeuUwpTDSaZHMSglRT/FsPEcYoXBSUtTfSQV62u6ds/DeKAimTbRNAruSOhhw5GKvIphBmNkIeWic7GhA85TLqm7LITntLNb5+KwHGyKHVLvKoxU2LCBmwX8iUMYzx7KR2998Mbb617o4/Orb70DcU9Dtefeeus5Ha6B2jtv7+/Pk1yVPXi2I39KjPHwlLIbwyBoB7gRqGEFF3dfbBkJuDuggAJz24UF3YFLi7GNYT9Kc1B5cVclVLDHC+NZmDAdFHspT4NYbvA5eaZGvnLI2yPQ4VgAndOmXIoOOU1upoEz27lAE+pv00UDO4w++S2ZfkLKAM49eustU/C8/PILQvY+Wn9ndX1lxcMDkk7rIGk9HRcikTy3Me/Lv649azXXkOK9kQnvlzR6vKjLQVtWpYIygOVMVKSEgp2Vqzu5/uGcLO6wQVQ+NsvJfRWNqZWZKXg2SmT6LJRc9j6aMbSvmAy0hnYzBZ1m1AvTQKWYip0O3qrZbzj1x6ASKRYPNi5zVKdwmH2ODR9lVYzAgUOlF+6dikcI8NlbX19/TvJBRJIMoll5Dh7Cv8/BNVxsTsfzhLjXndME+XvK/JBZMLBoOaAerul4CqAQ4yGNV10y4OG5SJimm1CHBJvwuRU9SSGGXGSBLwFtPP/FyHQnhMc5UvFZ7BuOBzZsNr/A0dnh2P43NtQZmURw36HNYVQlXZ0Hvl7UdZmjJSI6cgioomLDyfGS/ODNN4bxvCTwvIh4IP7zJMgGswUeQQGYBaGUuJ6O515cC13CE+kwxwuXmJO+z8kXNCOkZ5YQzz6FMCoPabD+EsGGUPB+QlwrB4THbiKeHbZdodHtlhaZ5cFlbPFgYHumlzQ0pGyF8ZyZ5MiSPSOHAXlS3XIYtzlrl1wyXxPhdpZNMnjERAOMseS4TEpnutBy5tQ7Lc9fPoxRlY5NmwVVxWEgNbi3vue/4AnLc/MCiaDzAhRe3VsnPC9M4LnTu+NbUdPnc9KGDvD2MazorrZkefslSg3osAyTP/raXBqISAOqNnC8Nzqud9NhOtTQdXsNB6T5PbcPE4bP53wbGtO/OjstJSperjoHvulveAhP06TIL3hcndTYlpbqflUfNjIuAZPp56T8ruXq0Fjh4OSY56AQdamzBtrtrV4/4yaatpdcGs2/+4TnhAZo1Rm7M3dXMHte9/C89C7+bytW9955RxAiWfPEv4VH77zzzqooCkTf2puO53awLgBUXVWKYbrZSqtaymoJUJkdxwHfK/jUbUJP7PgMXzZRUYHwOmKtQYUZrQNbp152vbsTLw25vpTC50rbYluKSY25ar7aqpRiasJ1Y0MuRvaITJeSTIgdxNNCRxLCEWvG3ga/yZaaUCOZmOkaqEjUdMvD4xfxelZWEi3WJRUotTK4kI+aCVM1YYiA4WOqoYALXG4GE1g6JyOAv+6+9RKelwDPu+++JMRLCgK0vrm5SVjgCuHsfbT3FuARpV9/4/UQHin3y/Q5NwMOe2JKHvzouJejHpuZw/MOvHFnOy7R6J91jnQx/VGUcr3jXXsYMeVdOfV9o3dSi/phdWAqE30li7ItUdrtsqXO2UWWQCu1i8bXnUE7uMPP0MPsKTiiO+2MNIxa0zXHN5EjR2bcuAg2lrdmSu6kC7JOYW1w/n3GHz4p6MyCLt7EutSwFwH8dffjN4TxvPG6kJdeers4WxR8QDaL6eK6zBk4Aq2ARqQOnHv23nj5Ja/4Gy8Bni8m1x6Q+/CsUEuoU8StslwiEegK3MDi4ghvSZFIWTD9+dXdRKKysKuaFLAECEUtUVp0IMjtCFYnoYw4g7LmOGyiprs8nk2sdtQMtNt1+FeYiGExza7clDnHiclH0X3eMc1plYyDrwxygToDszM/utRwj44+N982Bc+7Ql5/942n+dN7q+8IQCtP8/S6hAKXRfgPyGqR883XXn7dK34lnhuleWe/PPYqQCOiVxOXVeo5s9tZNxDW7217rhRU1PhAGAtbk68T46yjJabgyWyMQmrTbYzxsHMjmOS7Dtsi8OZEg657wnQ8U2PqBrrQY7CYBLU+jdH5BLfEDhMHv2BaqmcSTwF+3T2JZ++NV9+V8tp6euWtVRBAsVLchL8Flr0iXAo4q2/B5auvAR0hr757xeR22x3Y9W8qCXNCEonyaKl8We0qQ5sdG26g1DG329GgYpn1gpVI7e7UOf0aKjZZwE380935vTQVhnH8IHQTIToSnJfiXeBC2IIo9EIUku1i+Q+UpZ1eFxtsjO2itVPCTuLaabQmtoOWMlhrsIWs0rbICiQwYxgqLkjoyhtvhG6CnvfsfXfOfmTO2WJ9vHB73nPe533P9zznvO+z8+PKt+RY6WrOrwp5VrEXyvAKNMRClnoYcyrLLPCzWn4eBEoUdWuNtdo+3ihtwtXA1zVnUavxPM6csigWG3lOLmkQ+hXy+LE8wYWoLyQRDW15Q7OgD+FpDumjZJgNh4JBiBuJnDwlGWugP1e/ycx9uSodTXALnPgocyWWcbBfwVjAiIjgTKPkA2t+X2DYYVfGRsixyYlrwx+HZzY85vyGXhwbBVu+FIYIa9/ZyBNLCTdWFLmwMWXJ1bjNtmMhGzGANh6CTaoP/s19UkzfPC9vKF1df7YtWPEuMuOUzNQ++mTtvZ26kIF5HLIGlJZr8VyTkkKH8kHJeOQ2vxDyhqg+ofAspkAf8gXbw2FYhqjjnZjOZr2l0QNcoOddu7D67O513Njhqw9fjWUiiIW7a8ZiASWx+zaYiAfGZN7AZloEg8xzu80a+fQyNnfv+jAWCKqD222Q8s4sSJa+nLs3KjkbmYl9ee+xm63J+9SX7O6NIm1tT8dkJ4GdCEzvqTyrLFy98uzaMHi7/jCWQRA7FJPVthST+nVj9Npc4IVjSBp6wSKvAzMjsIZkj60tQhYY2dO0JxT4PQuhFwprYNWKyLi6mWEuKp5jfTOYmI56fYQQ6BPOKaSIIvI9DIA4ZFGvd3n8B/wcF6XyiLI8refzuUSWjS+tp9Kp7U88jJcRwn1jiwGjrcAgJdaUQO8RskENi0uZVCq9LlVHU1uyM/Pi6/V0OpX5IOJSBDa2DIrVTObCEiTOOIk8aRav/TkD3pZ41l7ky84KSxup1MbrzzZIKSLZLH6ANVLr2M5aESpxQQf2hVayPo+vpOo6R/Z3/P4RX2Ji2ev1USCEwsBsCdiKg4bi9U3P7yVC4+5HaEi+O4XQDx4odMNbh6qD9p9g26/YfFhnSLziJGyzcoWK6lBRv8yo+IZR2V4pJoehESaOPeTrFKQNXInE9FSQ6kMjSGI2DKrgP6BYHG9wYiGb3YrKr7iIDDAynRCgtQMdWU1Wx6hTwoKzd6UgD+RJ/xoeYUDxul/01Adjg+BudMEXDHopRCGKUhtvHhghTCd+7vrk918hzsgU6APmmoBMSc50VM7sGSeR596KvZw6vEP8ex0ThW78bJNuGsl+9/i4K7E5sRANVsQWjAu87yB4XO4wDUy+n1HS1WOqhUBoaJIXtIPJI4og9ouFyAPJmFJfEYeg6zpZ1hfOA1bbl0i8kz7hFIMe4bcu+nY3J6bvRH35yPD+Cd/U8vTW3o+EnwYPvfNOScfg5F8XCJkmOQG2GNOlF49EIDZG5YmxCBVtf+zLoGbUx0sCCCFPhOPEKgVCSa20i7efJAZP1D81PgX6zC8vTFfAwvjmu2zC53L5Z/PKDzYyhbQZ9ZwIIy4KRFjVDCFldWKSFwRNA94vmlsuRZTOKvZFZrdzFkLAKp385V/KIuBLb2zDA9OBS4WuxAjHC3Hd4KVJD9Rx6O7CuLqDXipIhls+N6TPfIlsdjMxf2B2s+/2NudBHfJqMsDEG5kS2rubtFwyMimR5HhHtfD52iLJJOcAbQaNrcSZukXHc5EIKa3YmYfc1mBxSn+W0ZnY/fR25jPpHziL6xqoL5VBwyVlV0Jcq+vramRUfXpebuAh+qvPOVCfpvo8xvq4/Fu7mz/29t4dkD0QM+jH6txCNHhA+DI09nb36TSChFZnaGmokgEDrU3Q6gcHOlWMgtauBoNeKwBxQaPru1xRxcdyl1wNWwp5YyNDXn1DwVPlVMY+HbjCaJr6uvtJmfpMywm9ZI1je0OFdJLaB0z5+In6XVgg79Z84qDMbwX9MCrwT4koPzAYYH5Ha7Na1dvboW5ubWSqprG9Wd0B1amgvrYyxa1SKRS2MxWhysmTthTxwkzGVBfK9EtqSLGrNtwE0r7D0t6DqD63Z/1+twtwh/wHxO2GFfyhRyYkn9Q6mLrm4hCGpv5kPphJKrmbqSWdHpQfkdx6FPLDBj8wbpfbDS+cp6GDW++4zNQ3Z025C2osRbw3y1en1xKDcshouv2gQm6bhmR1PI6mVqa+ka4MR+LOs7dKXo05rOTooGJqSrMeHdnkg9eomPqmjUw1zOXTp4jT1Hr/U/VUPZGjiY74GabOUffsn6vk9Uyt6dV40BGoI/JaI1Pv9O+TwiUP4K85Kv1kNQFE01Dauo8dhjnzh13Q0cLUHrWB8wyhasQReUFX7+cdmkYpj3yJRu1pNGoOnchDOB/p0LY0M/8BF/6QShZ6mX+C+rKGT4qQjqsQE2jDO7SG/yF0YDc9dcxj2gcurmb+Ec0NTRqB5yqEd0BOqaXOUwWyPOpufj8cmn95jOjobOgzDDYdnMETfZc7VW3M/4OqZV+MtevrL66wZ4C4RY9gAAAAAElFTkSuQmCC"></a>
107
108 <div class="spinner" id='spinner'></div>
109 <div class="emscripten" id="status">Downloading...</div>
110
111 <span id='controls'>
112 <span><input type="checkbox" id="resize">Resize canvas</span>
113 <span><input type="checkbox" id="pointerLock" checked>Lock/hide mouse pointer &nbsp;&nbsp;&nbsp;</span>
114 <span><input type="button" value="Fullscreen" onclick="Module.requestFullscreen(document.getElementById('pointerLock').checked,
115 document.getElementById('resize').checked)">
116 </span>
117 </span>
118
119 <div class="emscripten">
120 <progress value="0" max="100" id="progress" hidden=1></progress>
121 </div>
122
123 <div class="emscripten_border">
124 <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
125 </div>
126 <textarea id="output" rows="8"></textarea>
127
128 <script type='text/javascript'>
129 var statusElement = document.getElementById('status');
130 var progressElement = document.getElementById('progress');
131 var spinnerElement = document.getElementById('spinner');
132 var canvasElement = document.getElementById('canvas');
133 var outputElement = document.getElementById('output');
134 if (outputElement) outputElement.value = ''; // clear browser cache
135
136 // As a default initial behavior, pop up an alert when webgl context is lost. To make your
137 // application robust, you may want to override this behavior before shipping!
138 // See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
139 canvasElement.addEventListener('webglcontextlost', (e) => {
140 alert('WebGL context lost. You will need to reload the page.');
141 e.preventDefault();
142 }, false);
143
144 var Module = {
145 print(...args) {
146 console.log(...args);
147 // These replacements are necessary if you render to raw HTML
148 //text = text.replace(/&/g, "&amp;");
149 //text = text.replace(/</g, "&lt;");
150 //text = text.replace(/>/g, "&gt;");
151 //text = text.replace('\n', '<br>', 'g');
152 if (outputElement) {
153 var text = args.join(' ');
154 outputElement.value += text + "\n";
155 outputElement.scrollTop = outputElement.scrollHeight; // focus on bottom
156 }
157 },
158 canvas: canvasElement,
159 setStatus(text) {
160 Module.setStatus.last ??= { time: Date.now(), text: '' };
161 if (text === Module.setStatus.last.text) return;
162 var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
163 var now = Date.now();
164 // if this is a progress update, skip it if too soon
165 if (m && now - Module.setStatus.last.time < 30) return;
166 Module.setStatus.last.time = now;
167 Module.setStatus.last.text = text;
168 if (m) {
169 text = m[1];
170 progressElement.value = parseInt(m[2])*100;
171 progressElement.max = parseInt(m[4])*100;
172 progressElement.hidden = false;
173 spinnerElement.hidden = false;
174 } else {
175 progressElement.value = null;
176 progressElement.max = null;
177 progressElement.hidden = true;
178 if (!text) spinnerElement.style.display = 'none';
179 }
180 statusElement.innerHTML = text;
181 },
182 totalDependencies: 0,
183 monitorRunDependencies(left) {
184 this.totalDependencies = Math.max(this.totalDependencies, left);
185 Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
186 }
187 };
188 Module.setStatus('Downloading...');
189 window.onerror = (event) => {
190 // TODO: do not warn on ok events like simulating an infinite loop or exitStatus
191 Module.setStatus('Exception thrown, see JavaScript console');
192 spinnerElement.style.display = 'none';
193 Module.setStatus = (text) => {
194 if (text) console.error('[post-exception status] ' + text);
195 };
196 };
197 </script>
198 <script async type="text/javascript" src="index.js"></script>
199 </body>
200</html>
diff --git a/src/talks/wasm/examples/1-hello-world/index.js b/src/talks/wasm/examples/1-hello-world/index.js
new file mode 100644
index 0000000..f19477a
--- /dev/null
+++ b/src/talks/wasm/examples/1-hello-world/index.js
@@ -0,0 +1,1677 @@
1// include: shell.js
2// The Module object: Our interface to the outside world. We import
3// and export values on it. There are various ways Module can be used:
4// 1. Not defined. We create it here
5// 2. A function parameter, function(moduleArg) => Promise<Module>
6// 3. pre-run appended it, var Module = {}; ..generated code..
7// 4. External script tag defines var Module.
8// We need to check if Module already exists (e.g. case 3 above).
9// Substitution will be replaced with actual code on later stage of the build,
10// this way Closure Compiler will not mangle it (e.g. case 4. above).
11// Note that if you want to run closure, and also to use Module
12// after the generated code, you will need to define var Module = {};
13// before the code. Then that object will be used in the code, and you
14// can continue to use Module afterwards as well.
15var Module = typeof Module != 'undefined' ? Module : {};
16
17// Determine the runtime environment we are in. You can customize this by
18// setting the ENVIRONMENT setting at compile time (see settings.js).
19
20// Attempt to auto-detect the environment
21var ENVIRONMENT_IS_WEB = typeof window == 'object';
22var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != 'undefined';
23// N.b. Electron.js environment is simultaneously a NODE-environment, but
24// also a web environment.
25var ENVIRONMENT_IS_NODE = typeof process == 'object' && process.versions?.node && process.type != 'renderer';
26var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
27
28// --pre-jses are emitted after the Module integration code, so that they can
29// refer to Module (if they choose; they can also define Module)
30
31
32var arguments_ = [];
33var thisProgram = './this.program';
34var quit_ = (status, toThrow) => {
35 throw toThrow;
36};
37
38// In MODULARIZE mode _scriptName needs to be captured already at the very top of the page immediately when the page is parsed, so it is generated there
39// before the page load. In non-MODULARIZE modes generate it here.
40var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
41
42if (typeof __filename != 'undefined') { // Node
43 _scriptName = __filename;
44} else
45if (ENVIRONMENT_IS_WORKER) {
46 _scriptName = self.location.href;
47}
48
49// `/` should be present at the end if `scriptDirectory` is not empty
50var scriptDirectory = '';
51function locateFile(path) {
52 if (Module['locateFile']) {
53 return Module['locateFile'](path, scriptDirectory);
54 }
55 return scriptDirectory + path;
56}
57
58// Hooks that are implemented differently in different runtime environments.
59var readAsync, readBinary;
60
61if (ENVIRONMENT_IS_NODE) {
62 const isNode = typeof process == 'object' && process.versions?.node && process.type != 'renderer';
63 if (!isNode) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
64
65 var nodeVersion = process.versions.node;
66 var numericVersion = nodeVersion.split('.').slice(0, 3);
67 numericVersion = (numericVersion[0] * 10000) + (numericVersion[1] * 100) + (numericVersion[2].split('-')[0] * 1);
68 if (numericVersion < 160000) {
69 throw new Error('This emscripten-generated code requires node v16.0.0 (detected v' + nodeVersion + ')');
70 }
71
72 // These modules will usually be used on Node.js. Load them eagerly to avoid
73 // the complexity of lazy-loading.
74 var fs = require('fs');
75
76 scriptDirectory = __dirname + '/';
77
78// include: node_shell_read.js
79readBinary = (filename) => {
80 // We need to re-wrap `file://` strings to URLs.
81 filename = isFileURI(filename) ? new URL(filename) : filename;
82 var ret = fs.readFileSync(filename);
83 assert(Buffer.isBuffer(ret));
84 return ret;
85};
86
87readAsync = async (filename, binary = true) => {
88 // See the comment in the `readBinary` function.
89 filename = isFileURI(filename) ? new URL(filename) : filename;
90 var ret = fs.readFileSync(filename, binary ? undefined : 'utf8');
91 assert(binary ? Buffer.isBuffer(ret) : typeof ret == 'string');
92 return ret;
93};
94// end include: node_shell_read.js
95 if (process.argv.length > 1) {
96 thisProgram = process.argv[1].replace(/\\/g, '/');
97 }
98
99 arguments_ = process.argv.slice(2);
100
101 // MODULARIZE will export the module in the proper place outside, we don't need to export here
102 if (typeof module != 'undefined') {
103 module['exports'] = Module;
104 }
105
106 quit_ = (status, toThrow) => {
107 process.exitCode = status;
108 throw toThrow;
109 };
110
111} else
112if (ENVIRONMENT_IS_SHELL) {
113
114 const isNode = typeof process == 'object' && process.versions?.node && process.type != 'renderer';
115 if (isNode || typeof window == 'object' || typeof WorkerGlobalScope != 'undefined') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
116
117} else
118
119// Note that this includes Node.js workers when relevant (pthreads is enabled).
120// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
121// ENVIRONMENT_IS_NODE.
122if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
123 try {
124 scriptDirectory = new URL('.', _scriptName).href; // includes trailing slash
125 } catch {
126 // Must be a `blob:` or `data:` URL (e.g. `blob:http://site.com/etc/etc`), we cannot
127 // infer anything from them.
128 }
129
130 if (!(typeof window == 'object' || typeof WorkerGlobalScope != 'undefined')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
131
132 {
133// include: web_or_worker_shell_read.js
134if (ENVIRONMENT_IS_WORKER) {
135 readBinary = (url) => {
136 var xhr = new XMLHttpRequest();
137 xhr.open('GET', url, false);
138 xhr.responseType = 'arraybuffer';
139 xhr.send(null);
140 return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
141 };
142 }
143
144 readAsync = async (url) => {
145 // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
146 // See https://github.com/github/fetch/pull/92#issuecomment-140665932
147 // Cordova or Electron apps are typically loaded from a file:// url.
148 // So use XHR on webview if URL is a file URL.
149 if (isFileURI(url)) {
150 return new Promise((resolve, reject) => {
151 var xhr = new XMLHttpRequest();
152 xhr.open('GET', url, true);
153 xhr.responseType = 'arraybuffer';
154 xhr.onload = () => {
155 if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
156 resolve(xhr.response);
157 return;
158 }
159 reject(xhr.status);
160 };
161 xhr.onerror = reject;
162 xhr.send(null);
163 });
164 }
165 var response = await fetch(url, { credentials: 'same-origin' });
166 if (response.ok) {
167 return response.arrayBuffer();
168 }
169 throw new Error(response.status + ' : ' + response.url);
170 };
171// end include: web_or_worker_shell_read.js
172 }
173} else
174{
175 throw new Error('environment detection error');
176}
177
178var out = console.log.bind(console);
179var err = console.error.bind(console);
180
181var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js';
182var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js';
183var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js';
184var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js';
185var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js';
186var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js';
187var OPFS = 'OPFS is no longer included by default; build with -lopfs.js';
188
189var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js';
190
191// perform assertions in shell.js after we set up out() and err(), as otherwise
192// if an assertion fails it cannot print the message
193
194assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.');
195
196// end include: shell.js
197
198// include: preamble.js
199// === Preamble library stuff ===
200
201// Documentation for the public APIs defined in this file must be updated in:
202// site/source/docs/api_reference/preamble.js.rst
203// A prebuilt local version of the documentation is available at:
204// site/build/text/docs/api_reference/preamble.js.txt
205// You can also build docs locally as HTML or other formats in site/
206// An online HTML version (which may be of a different version of Emscripten)
207// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
208
209var wasmBinary;
210
211if (typeof WebAssembly != 'object') {
212 err('no native wasm support detected');
213}
214
215// Wasm globals
216
217//========================================
218// Runtime essentials
219//========================================
220
221// whether we are quitting the application. no code should run after this.
222// set in exit() and abort()
223var ABORT = false;
224
225// set by exit() and abort(). Passed to 'onExit' handler.
226// NOTE: This is also used as the process return code code in shell environments
227// but only when noExitRuntime is false.
228var EXITSTATUS;
229
230// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we
231// don't define it at all in release modes. This matches the behaviour of
232// MINIMAL_RUNTIME.
233// TODO(sbc): Make this the default even without STRICT enabled.
234/** @type {function(*, string=)} */
235function assert(condition, text) {
236 if (!condition) {
237 abort('Assertion failed' + (text ? ': ' + text : ''));
238 }
239}
240
241// We used to include malloc/free by default in the past. Show a helpful error in
242// builds with assertions.
243function _malloc() {
244 abort('malloc() called but not included in the build - add `_malloc` to EXPORTED_FUNCTIONS');
245}
246function _free() {
247 // Show a helpful error since we used to include free by default in the past.
248 abort('free() called but not included in the build - add `_free` to EXPORTED_FUNCTIONS');
249}
250
251/**
252 * Indicates whether filename is delivered via file protocol (as opposed to http/https)
253 * @noinline
254 */
255var isFileURI = (filename) => filename.startsWith('file://');
256
257// include: runtime_common.js
258// include: runtime_stack_check.js
259// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
260function writeStackCookie() {
261 var max = _emscripten_stack_get_end();
262 assert((max & 3) == 0);
263 // If the stack ends at address zero we write our cookies 4 bytes into the
264 // stack. This prevents interference with SAFE_HEAP and ASAN which also
265 // monitor writes to address zero.
266 if (max == 0) {
267 max += 4;
268 }
269 // The stack grow downwards towards _emscripten_stack_get_end.
270 // We write cookies to the final two words in the stack and detect if they are
271 // ever overwritten.
272 HEAPU32[((max)>>2)] = 0x02135467;
273 HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE;
274 // Also test the global address 0 for integrity.
275 HEAPU32[((0)>>2)] = 1668509029;
276}
277
278function checkStackCookie() {
279 if (ABORT) return;
280 var max = _emscripten_stack_get_end();
281 // See writeStackCookie().
282 if (max == 0) {
283 max += 4;
284 }
285 var cookie1 = HEAPU32[((max)>>2)];
286 var cookie2 = HEAPU32[(((max)+(4))>>2)];
287 if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) {
288 abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`);
289 }
290 // Also test the global address 0 for integrity.
291 if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) {
292 abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
293 }
294}
295// end include: runtime_stack_check.js
296// include: runtime_exceptions.js
297// end include: runtime_exceptions.js
298// include: runtime_debug.js
299var runtimeDebug = true; // Switch to false at runtime to disable logging at the right times
300
301// Used by XXXXX_DEBUG settings to output debug messages.
302function dbg(...args) {
303 if (!runtimeDebug && typeof runtimeDebug != 'undefined') return;
304 // TODO(sbc): Make this configurable somehow. Its not always convenient for
305 // logging to show up as warnings.
306 console.warn(...args);
307}
308
309// Endianness check
310(() => {
311 var h16 = new Int16Array(1);
312 var h8 = new Int8Array(h16.buffer);
313 h16[0] = 0x6373;
314 if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)';
315})();
316
317function consumedModuleProp(prop) {
318 if (!Object.getOwnPropertyDescriptor(Module, prop)) {
319 Object.defineProperty(Module, prop, {
320 configurable: true,
321 set() {
322 abort(`Attempt to set \`Module.${prop}\` after it has already been processed. This can happen, for example, when code is injected via '--post-js' rather than '--pre-js'`);
323
324 }
325 });
326 }
327}
328
329function makeInvalidEarlyAccess(name) {
330 return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`);
331
332}
333
334function ignoredModuleProp(prop) {
335 if (Object.getOwnPropertyDescriptor(Module, prop)) {
336 abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`);
337 }
338}
339
340// forcing the filesystem exports a few things by default
341function isExportedByForceFilesystem(name) {
342 return name === 'FS_createPath' ||
343 name === 'FS_createDataFile' ||
344 name === 'FS_createPreloadedFile' ||
345 name === 'FS_unlink' ||
346 name === 'addRunDependency' ||
347 // The old FS has some functionality that WasmFS lacks.
348 name === 'FS_createLazyFile' ||
349 name === 'FS_createDevice' ||
350 name === 'removeRunDependency';
351}
352
353/**
354 * Intercept access to a global symbol. This enables us to give informative
355 * warnings/errors when folks attempt to use symbols they did not include in
356 * their build, or no symbols that no longer exist.
357 */
358function hookGlobalSymbolAccess(sym, func) {
359 if (typeof globalThis != 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) {
360 Object.defineProperty(globalThis, sym, {
361 configurable: true,
362 get() {
363 func();
364 return undefined;
365 }
366 });
367 }
368}
369
370function missingGlobal(sym, msg) {
371 hookGlobalSymbolAccess(sym, () => {
372 warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`);
373 });
374}
375
376missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer');
377missingGlobal('asm', 'Please use wasmExports instead');
378
379function missingLibrarySymbol(sym) {
380 hookGlobalSymbolAccess(sym, () => {
381 // Can't `abort()` here because it would break code that does runtime
382 // checks. e.g. `if (typeof SDL === 'undefined')`.
383 var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`;
384 // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in
385 // library.js, which means $name for a JS name with no prefix, or name
386 // for a JS name like _name.
387 var librarySymbol = sym;
388 if (!librarySymbol.startsWith('_')) {
389 librarySymbol = '$' + sym;
390 }
391 msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`;
392 if (isExportedByForceFilesystem(sym)) {
393 msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
394 }
395 warnOnce(msg);
396 });
397
398 // Any symbol that is not included from the JS library is also (by definition)
399 // not exported on the Module object.
400 unexportedRuntimeSymbol(sym);
401}
402
403function unexportedRuntimeSymbol(sym) {
404 if (!Object.getOwnPropertyDescriptor(Module, sym)) {
405 Object.defineProperty(Module, sym, {
406 configurable: true,
407 get() {
408 var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`;
409 if (isExportedByForceFilesystem(sym)) {
410 msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
411 }
412 abort(msg);
413 }
414 });
415 }
416}
417
418// end include: runtime_debug.js
419// Memory management
420
421var wasmMemory;
422
423var
424/** @type {!Int8Array} */
425 HEAP8,
426/** @type {!Uint8Array} */
427 HEAPU8,
428/** @type {!Int16Array} */
429 HEAP16,
430/** @type {!Uint16Array} */
431 HEAPU16,
432/** @type {!Int32Array} */
433 HEAP32,
434/** @type {!Uint32Array} */
435 HEAPU32,
436/** @type {!Float32Array} */
437 HEAPF32,
438/** @type {!Float64Array} */
439 HEAPF64;
440
441// BigInt64Array type is not correctly defined in closure
442var
443/** not-@type {!BigInt64Array} */
444 HEAP64,
445/* BigUint64Array type is not correctly defined in closure
446/** not-@type {!BigUint64Array} */
447 HEAPU64;
448
449var runtimeInitialized = false;
450
451
452
453function updateMemoryViews() {
454 var b = wasmMemory.buffer;
455 HEAP8 = new Int8Array(b);
456 HEAP16 = new Int16Array(b);
457 HEAPU8 = new Uint8Array(b);
458 HEAPU16 = new Uint16Array(b);
459 HEAP32 = new Int32Array(b);
460 HEAPU32 = new Uint32Array(b);
461 HEAPF32 = new Float32Array(b);
462 HEAPF64 = new Float64Array(b);
463 HEAP64 = new BigInt64Array(b);
464 HEAPU64 = new BigUint64Array(b);
465}
466
467// include: memoryprofiler.js
468// end include: memoryprofiler.js
469// end include: runtime_common.js
470assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined,
471 'JS engine does not provide full typed array support');
472
473function preRun() {
474 if (Module['preRun']) {
475 if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
476 while (Module['preRun'].length) {
477 addOnPreRun(Module['preRun'].shift());
478 }
479 }
480 consumedModuleProp('preRun');
481 // Begin ATPRERUNS hooks
482 callRuntimeCallbacks(onPreRuns);
483 // End ATPRERUNS hooks
484}
485
486function initRuntime() {
487 assert(!runtimeInitialized);
488 runtimeInitialized = true;
489
490 checkStackCookie();
491
492 // No ATINITS hooks
493
494 wasmExports['__wasm_call_ctors']();
495
496 // No ATPOSTCTORS hooks
497}
498
499function preMain() {
500 checkStackCookie();
501 // No ATMAINS hooks
502}
503
504function postRun() {
505 checkStackCookie();
506 // PThreads reuse the runtime from the main thread.
507
508 if (Module['postRun']) {
509 if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
510 while (Module['postRun'].length) {
511 addOnPostRun(Module['postRun'].shift());
512 }
513 }
514 consumedModuleProp('postRun');
515
516 // Begin ATPOSTRUNS hooks
517 callRuntimeCallbacks(onPostRuns);
518 // End ATPOSTRUNS hooks
519}
520
521// A counter of dependencies for calling run(). If we need to
522// do asynchronous work before running, increment this and
523// decrement it. Incrementing must happen in a place like
524// Module.preRun (used by emcc to add file preloading).
525// Note that you can add dependencies in preRun, even though
526// it happens right before run - run will be postponed until
527// the dependencies are met.
528var runDependencies = 0;
529var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
530var runDependencyTracking = {};
531var runDependencyWatcher = null;
532
533function addRunDependency(id) {
534 runDependencies++;
535
536 Module['monitorRunDependencies']?.(runDependencies);
537
538 if (id) {
539 assert(!runDependencyTracking[id]);
540 runDependencyTracking[id] = 1;
541 if (runDependencyWatcher === null && typeof setInterval != 'undefined') {
542 // Check for missing dependencies every few seconds
543 runDependencyWatcher = setInterval(() => {
544 if (ABORT) {
545 clearInterval(runDependencyWatcher);
546 runDependencyWatcher = null;
547 return;
548 }
549 var shown = false;
550 for (var dep in runDependencyTracking) {
551 if (!shown) {
552 shown = true;
553 err('still waiting on run dependencies:');
554 }
555 err(`dependency: ${dep}`);
556 }
557 if (shown) {
558 err('(end of list)');
559 }
560 }, 10000);
561 }
562 } else {
563 err('warning: run dependency added without ID');
564 }
565}
566
567function removeRunDependency(id) {
568 runDependencies--;
569
570 Module['monitorRunDependencies']?.(runDependencies);
571
572 if (id) {
573 assert(runDependencyTracking[id]);
574 delete runDependencyTracking[id];
575 } else {
576 err('warning: run dependency removed without ID');
577 }
578 if (runDependencies == 0) {
579 if (runDependencyWatcher !== null) {
580 clearInterval(runDependencyWatcher);
581 runDependencyWatcher = null;
582 }
583 if (dependenciesFulfilled) {
584 var callback = dependenciesFulfilled;
585 dependenciesFulfilled = null;
586 callback(); // can add another dependenciesFulfilled
587 }
588 }
589}
590
591/** @param {string|number=} what */
592function abort(what) {
593 Module['onAbort']?.(what);
594
595 what = 'Aborted(' + what + ')';
596 // TODO(sbc): Should we remove printing and leave it up to whoever
597 // catches the exception?
598 err(what);
599
600 ABORT = true;
601
602 // Use a wasm runtime error, because a JS error might be seen as a foreign
603 // exception, which means we'd run destructors on it. We need the error to
604 // simply make the program stop.
605 // FIXME This approach does not work in Wasm EH because it currently does not assume
606 // all RuntimeErrors are from traps; it decides whether a RuntimeError is from
607 // a trap or not based on a hidden field within the object. So at the moment
608 // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that
609 // allows this in the wasm spec.
610
611 // Suppress closure compiler warning here. Closure compiler's builtin extern
612 // definition for WebAssembly.RuntimeError claims it takes no arguments even
613 // though it can.
614 // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.
615 /** @suppress {checkTypes} */
616 var e = new WebAssembly.RuntimeError(what);
617
618 // Throw the error whether or not MODULARIZE is set because abort is used
619 // in code paths apart from instantiation where an exception is expected
620 // to be thrown when abort is called.
621 throw e;
622}
623
624// show errors on likely calls to FS when it was not included
625var FS = {
626 error() {
627 abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM');
628 },
629 init() { FS.error() },
630 createDataFile() { FS.error() },
631 createPreloadedFile() { FS.error() },
632 createLazyFile() { FS.error() },
633 open() { FS.error() },
634 mkdev() { FS.error() },
635 registerDevice() { FS.error() },
636 analyzePath() { FS.error() },
637
638 ErrnoError() { FS.error() },
639};
640
641
642function createExportWrapper(name, nargs) {
643 return (...args) => {
644 assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`);
645 var f = wasmExports[name];
646 assert(f, `exported native function \`${name}\` not found`);
647 // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled.
648 assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`);
649 return f(...args);
650 };
651}
652
653var wasmBinaryFile;
654
655function findWasmBinary() {
656 return locateFile('index.wasm');
657}
658
659function getBinarySync(file) {
660 if (file == wasmBinaryFile && wasmBinary) {
661 return new Uint8Array(wasmBinary);
662 }
663 if (readBinary) {
664 return readBinary(file);
665 }
666 throw 'both async and sync fetching of the wasm failed';
667}
668
669async function getWasmBinary(binaryFile) {
670 // If we don't have the binary yet, load it asynchronously using readAsync.
671 if (!wasmBinary) {
672 // Fetch the binary using readAsync
673 try {
674 var response = await readAsync(binaryFile);
675 return new Uint8Array(response);
676 } catch {
677 // Fall back to getBinarySync below;
678 }
679 }
680
681 // Otherwise, getBinarySync should be able to get it synchronously
682 return getBinarySync(binaryFile);
683}
684
685async function instantiateArrayBuffer(binaryFile, imports) {
686 try {
687 var binary = await getWasmBinary(binaryFile);
688 var instance = await WebAssembly.instantiate(binary, imports);
689 return instance;
690 } catch (reason) {
691 err(`failed to asynchronously prepare wasm: ${reason}`);
692
693 // Warn on some common problems.
694 if (isFileURI(wasmBinaryFile)) {
695 err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`);
696 }
697 abort(reason);
698 }
699}
700
701async function instantiateAsync(binary, binaryFile, imports) {
702 if (!binary && typeof WebAssembly.instantiateStreaming == 'function'
703 // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.
704 && !isFileURI(binaryFile)
705 // Avoid instantiateStreaming() on Node.js environment for now, as while
706 // Node.js v18.1.0 implements it, it does not have a full fetch()
707 // implementation yet.
708 //
709 // Reference:
710 // https://github.com/emscripten-core/emscripten/pull/16917
711 && !ENVIRONMENT_IS_NODE
712 ) {
713 try {
714 var response = fetch(binaryFile, { credentials: 'same-origin' });
715 var instantiationResult = await WebAssembly.instantiateStreaming(response, imports);
716 return instantiationResult;
717 } catch (reason) {
718 // We expect the most common failure cause to be a bad MIME type for the binary,
719 // in which case falling back to ArrayBuffer instantiation should work.
720 err(`wasm streaming compile failed: ${reason}`);
721 err('falling back to ArrayBuffer instantiation');
722 // fall back of instantiateArrayBuffer below
723 };
724 }
725 return instantiateArrayBuffer(binaryFile, imports);
726}
727
728function getWasmImports() {
729 // prepare imports
730 return {
731 'env': wasmImports,
732 'wasi_snapshot_preview1': wasmImports,
733 }
734}
735
736// Create the wasm instance.
737// Receives the wasm imports, returns the exports.
738async function createWasm() {
739 // Load the wasm module and create an instance of using native support in the JS engine.
740 // handle a generated wasm instance, receiving its exports and
741 // performing other necessary setup
742 /** @param {WebAssembly.Module=} module*/
743 function receiveInstance(instance, module) {
744 wasmExports = instance.exports;
745
746
747
748 wasmMemory = wasmExports['memory'];
749
750 assert(wasmMemory, 'memory not found in wasm exports');
751 updateMemoryViews();
752
753 assignWasmExports(wasmExports);
754 removeRunDependency('wasm-instantiate');
755 return wasmExports;
756 }
757 // wait for the pthread pool (if any)
758 addRunDependency('wasm-instantiate');
759
760 // Prefer streaming instantiation if available.
761 // Async compilation can be confusing when an error on the page overwrites Module
762 // (for example, if the order of elements is wrong, and the one defining Module is
763 // later), so we save Module and check it later.
764 var trueModule = Module;
765 function receiveInstantiationResult(result) {
766 // 'result' is a ResultObject object which has both the module and instance.
767 // receiveInstance() will swap in the exports (to Module.asm) so they can be called
768 assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
769 trueModule = null;
770 // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
771 // When the regression is fixed, can restore the above PTHREADS-enabled path.
772 return receiveInstance(result['instance']);
773 }
774
775 var info = getWasmImports();
776
777 // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
778 // to manually instantiate the Wasm module themselves. This allows pages to
779 // run the instantiation parallel to any other async startup actions they are
780 // performing.
781 // Also pthreads and wasm workers initialize the wasm instance through this
782 // path.
783 if (Module['instantiateWasm']) {
784 return new Promise((resolve, reject) => {
785 try {
786 Module['instantiateWasm'](info, (mod, inst) => {
787 resolve(receiveInstance(mod, inst));
788 });
789 } catch(e) {
790 err(`Module.instantiateWasm callback failed with error: ${e}`);
791 reject(e);
792 }
793 });
794 }
795
796 wasmBinaryFile ??= findWasmBinary();
797 var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
798 var exports = receiveInstantiationResult(result);
799 return exports;
800}
801
802// end include: preamble.js
803
804// Begin JS library code
805
806
807 class ExitStatus {
808 name = 'ExitStatus';
809 constructor(status) {
810 this.message = `Program terminated with exit(${status})`;
811 this.status = status;
812 }
813 }
814
815 var callRuntimeCallbacks = (callbacks) => {
816 while (callbacks.length > 0) {
817 // Pass the module as the first argument.
818 callbacks.shift()(Module);
819 }
820 };
821 var onPostRuns = [];
822 var addOnPostRun = (cb) => onPostRuns.push(cb);
823
824 var onPreRuns = [];
825 var addOnPreRun = (cb) => onPreRuns.push(cb);
826
827
828
829 /**
830 * @param {number} ptr
831 * @param {string} type
832 */
833 function getValue(ptr, type = 'i8') {
834 if (type.endsWith('*')) type = '*';
835 switch (type) {
836 case 'i1': return HEAP8[ptr];
837 case 'i8': return HEAP8[ptr];
838 case 'i16': return HEAP16[((ptr)>>1)];
839 case 'i32': return HEAP32[((ptr)>>2)];
840 case 'i64': return HEAP64[((ptr)>>3)];
841 case 'float': return HEAPF32[((ptr)>>2)];
842 case 'double': return HEAPF64[((ptr)>>3)];
843 case '*': return HEAPU32[((ptr)>>2)];
844 default: abort(`invalid type for getValue: ${type}`);
845 }
846 }
847
848 var noExitRuntime = true;
849
850 var ptrToString = (ptr) => {
851 assert(typeof ptr === 'number');
852 // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
853 ptr >>>= 0;
854 return '0x' + ptr.toString(16).padStart(8, '0');
855 };
856
857
858 /**
859 * @param {number} ptr
860 * @param {number} value
861 * @param {string} type
862 */
863 function setValue(ptr, value, type = 'i8') {
864 if (type.endsWith('*')) type = '*';
865 switch (type) {
866 case 'i1': HEAP8[ptr] = value; break;
867 case 'i8': HEAP8[ptr] = value; break;
868 case 'i16': HEAP16[((ptr)>>1)] = value; break;
869 case 'i32': HEAP32[((ptr)>>2)] = value; break;
870 case 'i64': HEAP64[((ptr)>>3)] = BigInt(value); break;
871 case 'float': HEAPF32[((ptr)>>2)] = value; break;
872 case 'double': HEAPF64[((ptr)>>3)] = value; break;
873 case '*': HEAPU32[((ptr)>>2)] = value; break;
874 default: abort(`invalid type for setValue: ${type}`);
875 }
876 }
877
878 var stackRestore = (val) => __emscripten_stack_restore(val);
879
880 var stackSave = () => _emscripten_stack_get_current();
881
882 var warnOnce = (text) => {
883 warnOnce.shown ||= {};
884 if (!warnOnce.shown[text]) {
885 warnOnce.shown[text] = 1;
886 if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text;
887 err(text);
888 }
889 };
890
891 var printCharBuffers = [null,[],[]];
892
893 var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder() : undefined;
894
895 var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => {
896 var maxIdx = idx + maxBytesToRead;
897 if (ignoreNul) return maxIdx;
898 // TextDecoder needs to know the byte length in advance, it doesn't stop on
899 // null terminator by itself.
900 // As a tiny code save trick, compare idx against maxIdx using a negation,
901 // so that maxBytesToRead=undefined/NaN means Infinity.
902 while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx;
903 return idx;
904 };
905
906 /**
907 * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given
908 * array that contains uint8 values, returns a copy of that string as a
909 * Javascript String object.
910 * heapOrArray is either a regular array, or a JavaScript typed array view.
911 * @param {number=} idx
912 * @param {number=} maxBytesToRead
913 * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character.
914 * @return {string}
915 */
916 var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => {
917
918 var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul);
919
920 // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it.
921 if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
922 return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
923 }
924 var str = '';
925 // If building with TextDecoder, we have already computed the string length
926 // above, so test loop end condition against that
927 while (idx < endPtr) {
928 // For UTF8 byte structure, see:
929 // http://en.wikipedia.org/wiki/UTF-8#Description
930 // https://www.ietf.org/rfc/rfc2279.txt
931 // https://tools.ietf.org/html/rfc3629
932 var u0 = heapOrArray[idx++];
933 if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
934 var u1 = heapOrArray[idx++] & 63;
935 if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
936 var u2 = heapOrArray[idx++] & 63;
937 if ((u0 & 0xF0) == 0xE0) {
938 u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
939 } else {
940 if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!');
941 u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);
942 }
943
944 if (u0 < 0x10000) {
945 str += String.fromCharCode(u0);
946 } else {
947 var ch = u0 - 0x10000;
948 str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
949 }
950 }
951 return str;
952 };
953 var printChar = (stream, curr) => {
954 var buffer = printCharBuffers[stream];
955 assert(buffer);
956 if (curr === 0 || curr === 10) {
957 (stream === 1 ? out : err)(UTF8ArrayToString(buffer));
958 buffer.length = 0;
959 } else {
960 buffer.push(curr);
961 }
962 };
963
964 var flush_NO_FILESYSTEM = () => {
965 // flush anything remaining in the buffers during shutdown
966 _fflush(0);
967 if (printCharBuffers[1].length) printChar(1, 10);
968 if (printCharBuffers[2].length) printChar(2, 10);
969 };
970
971
972
973 /**
974 * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the
975 * emscripten HEAP, returns a copy of that string as a Javascript String object.
976 *
977 * @param {number} ptr
978 * @param {number=} maxBytesToRead - An optional length that specifies the
979 * maximum number of bytes to read. You can omit this parameter to scan the
980 * string until the first 0 byte. If maxBytesToRead is passed, and the string
981 * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the
982 * string will cut short at that byte index.
983 * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character.
984 * @return {string}
985 */
986 var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => {
987 assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`);
988 return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : '';
989 };
990 var SYSCALLS = {
991 varargs:undefined,
992 getStr(ptr) {
993 var ret = UTF8ToString(ptr);
994 return ret;
995 },
996 };
997 var _fd_write = (fd, iov, iovcnt, pnum) => {
998 // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
999 var num = 0;
1000 for (var i = 0; i < iovcnt; i++) {
1001 var ptr = HEAPU32[((iov)>>2)];
1002 var len = HEAPU32[(((iov)+(4))>>2)];
1003 iov += 8;
1004 for (var j = 0; j < len; j++) {
1005 printChar(fd, HEAPU8[ptr+j]);
1006 }
1007 num += len;
1008 }
1009 HEAPU32[((pnum)>>2)] = num;
1010 return 0;
1011 };
1012
1013
1014 var runtimeKeepaliveCounter = 0;
1015 var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;
1016 var _proc_exit = (code) => {
1017 EXITSTATUS = code;
1018 if (!keepRuntimeAlive()) {
1019 Module['onExit']?.(code);
1020 ABORT = true;
1021 }
1022 quit_(code, new ExitStatus(code));
1023 };
1024
1025
1026 /** @param {boolean|number=} implicit */
1027 var exitJS = (status, implicit) => {
1028 EXITSTATUS = status;
1029
1030 checkUnflushedContent();
1031
1032 // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down
1033 if (keepRuntimeAlive() && !implicit) {
1034 var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;
1035 err(msg);
1036 }
1037
1038 _proc_exit(status);
1039 };
1040
1041 var handleException = (e) => {
1042 // Certain exception types we do not treat as errors since they are used for
1043 // internal control flow.
1044 // 1. ExitStatus, which is thrown by exit()
1045 // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others
1046 // that wish to return to JS event loop.
1047 if (e instanceof ExitStatus || e == 'unwind') {
1048 return EXITSTATUS;
1049 }
1050 checkStackCookie();
1051 if (e instanceof WebAssembly.RuntimeError) {
1052 if (_emscripten_stack_get_current() <= 0) {
1053 err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)');
1054 }
1055 }
1056 quit_(1, e);
1057 };
1058// End JS library code
1059
1060// include: postlibrary.js
1061// This file is included after the automatically-generated JS library code
1062// but before the wasm module is created.
1063
1064{
1065
1066 // Begin ATMODULES hooks
1067 if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime'];
1068if (Module['print']) out = Module['print'];
1069if (Module['printErr']) err = Module['printErr'];
1070if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
1071
1072Module['FS_createDataFile'] = FS.createDataFile;
1073Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
1074
1075 // End ATMODULES hooks
1076
1077 checkIncomingModuleAPI();
1078
1079 if (Module['arguments']) arguments_ = Module['arguments'];
1080 if (Module['thisProgram']) thisProgram = Module['thisProgram'];
1081
1082 // Assertions on removed incoming Module JS APIs.
1083 assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
1084 assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
1085 assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
1086 assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
1087 assert(typeof Module['read'] == 'undefined', 'Module.read option was removed');
1088 assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)');
1089 assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)');
1090 assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)');
1091 assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY');
1092 assert(typeof Module['ENVIRONMENT'] == 'undefined', 'Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)');
1093 assert(typeof Module['STACK_SIZE'] == 'undefined', 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time')
1094 // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY
1095 assert(typeof Module['wasmMemory'] == 'undefined', 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally');
1096 assert(typeof Module['INITIAL_MEMORY'] == 'undefined', 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically');
1097
1098}
1099
1100// Begin runtime exports
1101 var missingLibrarySymbols = [
1102 'writeI53ToI64',
1103 'writeI53ToI64Clamped',
1104 'writeI53ToI64Signaling',
1105 'writeI53ToU64Clamped',
1106 'writeI53ToU64Signaling',
1107 'readI53FromI64',
1108 'readI53FromU64',
1109 'convertI32PairToI53',
1110 'convertI32PairToI53Checked',
1111 'convertU32PairToI53',
1112 'bigintToI53Checked',
1113 'stackAlloc',
1114 'getTempRet0',
1115 'setTempRet0',
1116 'zeroMemory',
1117 'getHeapMax',
1118 'abortOnCannotGrowMemory',
1119 'growMemory',
1120 'withStackSave',
1121 'strError',
1122 'inetPton4',
1123 'inetNtop4',
1124 'inetPton6',
1125 'inetNtop6',
1126 'readSockaddr',
1127 'writeSockaddr',
1128 'readEmAsmArgs',
1129 'jstoi_q',
1130 'getExecutableName',
1131 'autoResumeAudioContext',
1132 'getDynCaller',
1133 'dynCall',
1134 'runtimeKeepalivePush',
1135 'runtimeKeepalivePop',
1136 'callUserCallback',
1137 'maybeExit',
1138 'asmjsMangle',
1139 'asyncLoad',
1140 'alignMemory',
1141 'mmapAlloc',
1142 'HandleAllocator',
1143 'getNativeTypeSize',
1144 'getUniqueRunDependency',
1145 'addOnInit',
1146 'addOnPostCtor',
1147 'addOnPreMain',
1148 'addOnExit',
1149 'STACK_SIZE',
1150 'STACK_ALIGN',
1151 'POINTER_SIZE',
1152 'ASSERTIONS',
1153 'ccall',
1154 'cwrap',
1155 'convertJsFunctionToWasm',
1156 'getEmptyTableSlot',
1157 'updateTableMap',
1158 'getFunctionAddress',
1159 'addFunction',
1160 'removeFunction',
1161 'stringToUTF8Array',
1162 'stringToUTF8',
1163 'lengthBytesUTF8',
1164 'intArrayFromString',
1165 'intArrayToString',
1166 'AsciiToString',
1167 'stringToAscii',
1168 'UTF16ToString',
1169 'stringToUTF16',
1170 'lengthBytesUTF16',
1171 'UTF32ToString',
1172 'stringToUTF32',
1173 'lengthBytesUTF32',
1174 'stringToNewUTF8',
1175 'stringToUTF8OnStack',
1176 'writeArrayToMemory',
1177 'registerKeyEventCallback',
1178 'maybeCStringToJsString',
1179 'findEventTarget',
1180 'getBoundingClientRect',
1181 'fillMouseEventData',
1182 'registerMouseEventCallback',
1183 'registerWheelEventCallback',
1184 'registerUiEventCallback',
1185 'registerFocusEventCallback',
1186 'fillDeviceOrientationEventData',
1187 'registerDeviceOrientationEventCallback',
1188 'fillDeviceMotionEventData',
1189 'registerDeviceMotionEventCallback',
1190 'screenOrientation',
1191 'fillOrientationChangeEventData',
1192 'registerOrientationChangeEventCallback',
1193 'fillFullscreenChangeEventData',
1194 'registerFullscreenChangeEventCallback',
1195 'JSEvents_requestFullscreen',
1196 'JSEvents_resizeCanvasForFullscreen',
1197 'registerRestoreOldStyle',
1198 'hideEverythingExceptGivenElement',
1199 'restoreHiddenElements',
1200 'setLetterbox',
1201 'softFullscreenResizeWebGLRenderTarget',
1202 'doRequestFullscreen',
1203 'fillPointerlockChangeEventData',
1204 'registerPointerlockChangeEventCallback',
1205 'registerPointerlockErrorEventCallback',
1206 'requestPointerLock',
1207 'fillVisibilityChangeEventData',
1208 'registerVisibilityChangeEventCallback',
1209 'registerTouchEventCallback',
1210 'fillGamepadEventData',
1211 'registerGamepadEventCallback',
1212 'registerBeforeUnloadEventCallback',
1213 'fillBatteryEventData',
1214 'registerBatteryEventCallback',
1215 'setCanvasElementSize',
1216 'getCanvasElementSize',
1217 'jsStackTrace',
1218 'getCallstack',
1219 'convertPCtoSourceLocation',
1220 'getEnvStrings',
1221 'checkWasiClock',
1222 'wasiRightsToMuslOFlags',
1223 'wasiOFlagsToMuslOFlags',
1224 'initRandomFill',
1225 'randomFill',
1226 'safeSetTimeout',
1227 'setImmediateWrapped',
1228 'safeRequestAnimationFrame',
1229 'clearImmediateWrapped',
1230 'registerPostMainLoop',
1231 'registerPreMainLoop',
1232 'getPromise',
1233 'makePromise',
1234 'idsToPromises',
1235 'makePromiseCallback',
1236 'ExceptionInfo',
1237 'findMatchingCatch',
1238 'Browser_asyncPrepareDataCounter',
1239 'isLeapYear',
1240 'ydayFromDate',
1241 'arraySum',
1242 'addDays',
1243 'getSocketFromFD',
1244 'getSocketAddress',
1245 'FS_createPreloadedFile',
1246 'FS_modeStringToFlags',
1247 'FS_getMode',
1248 'FS_stdin_getChar',
1249 'FS_mkdirTree',
1250 '_setNetworkCallback',
1251 'heapObjectForWebGLType',
1252 'toTypedArrayIndex',
1253 'webgl_enable_ANGLE_instanced_arrays',
1254 'webgl_enable_OES_vertex_array_object',
1255 'webgl_enable_WEBGL_draw_buffers',
1256 'webgl_enable_WEBGL_multi_draw',
1257 'webgl_enable_EXT_polygon_offset_clamp',
1258 'webgl_enable_EXT_clip_control',
1259 'webgl_enable_WEBGL_polygon_mode',
1260 'emscriptenWebGLGet',
1261 'computeUnpackAlignedImageSize',
1262 'colorChannelsInGlTextureFormat',
1263 'emscriptenWebGLGetTexPixelData',
1264 'emscriptenWebGLGetUniform',
1265 'webglGetUniformLocation',
1266 'webglPrepareUniformLocationsBeforeFirstUse',
1267 'webglGetLeftBracePos',
1268 'emscriptenWebGLGetVertexAttrib',
1269 '__glGetActiveAttribOrUniform',
1270 'writeGLArray',
1271 'registerWebGlEventCallback',
1272 'runAndAbortIfError',
1273 'ALLOC_NORMAL',
1274 'ALLOC_STACK',
1275 'allocate',
1276 'writeStringToMemory',
1277 'writeAsciiToMemory',
1278 'demangle',
1279 'stackTrace',
1280];
1281missingLibrarySymbols.forEach(missingLibrarySymbol)
1282
1283 var unexportedSymbols = [
1284 'run',
1285 'addRunDependency',
1286 'removeRunDependency',
1287 'out',
1288 'err',
1289 'callMain',
1290 'abort',
1291 'wasmMemory',
1292 'wasmExports',
1293 'HEAPF32',
1294 'HEAPF64',
1295 'HEAP8',
1296 'HEAPU8',
1297 'HEAP16',
1298 'HEAPU16',
1299 'HEAP32',
1300 'HEAPU32',
1301 'HEAP64',
1302 'HEAPU64',
1303 'writeStackCookie',
1304 'checkStackCookie',
1305 'INT53_MAX',
1306 'INT53_MIN',
1307 'stackSave',
1308 'stackRestore',
1309 'ptrToString',
1310 'exitJS',
1311 'ENV',
1312 'ERRNO_CODES',
1313 'DNS',
1314 'Protocols',
1315 'Sockets',
1316 'timers',
1317 'warnOnce',
1318 'readEmAsmArgsArray',
1319 'handleException',
1320 'keepRuntimeAlive',
1321 'wasmTable',
1322 'noExitRuntime',
1323 'addOnPreRun',
1324 'addOnPostRun',
1325 'freeTableIndexes',
1326 'functionsInTableMap',
1327 'setValue',
1328 'getValue',
1329 'PATH',
1330 'PATH_FS',
1331 'UTF8Decoder',
1332 'UTF8ArrayToString',
1333 'UTF8ToString',
1334 'UTF16Decoder',
1335 'JSEvents',
1336 'specialHTMLTargets',
1337 'findCanvasEventTarget',
1338 'currentFullscreenStrategy',
1339 'restoreOldWindowedStyle',
1340 'UNWIND_CACHE',
1341 'ExitStatus',
1342 'flush_NO_FILESYSTEM',
1343 'emSetImmediate',
1344 'emClearImmediate_deps',
1345 'emClearImmediate',
1346 'promiseMap',
1347 'uncaughtExceptionCount',
1348 'exceptionLast',
1349 'exceptionCaught',
1350 'Browser',
1351 'requestFullscreen',
1352 'requestFullScreen',
1353 'setCanvasSize',
1354 'getUserMedia',
1355 'createContext',
1356 'getPreloadedImageData__data',
1357 'wget',
1358 'MONTH_DAYS_REGULAR',
1359 'MONTH_DAYS_LEAP',
1360 'MONTH_DAYS_REGULAR_CUMULATIVE',
1361 'MONTH_DAYS_LEAP_CUMULATIVE',
1362 'SYSCALLS',
1363 'preloadPlugins',
1364 'FS_stdin_getChar_buffer',
1365 'FS_unlink',
1366 'FS_createPath',
1367 'FS_createDevice',
1368 'FS_readFile',
1369 'FS',
1370 'FS_root',
1371 'FS_mounts',
1372 'FS_devices',
1373 'FS_streams',
1374 'FS_nextInode',
1375 'FS_nameTable',
1376 'FS_currentPath',
1377 'FS_initialized',
1378 'FS_ignorePermissions',
1379 'FS_filesystems',
1380 'FS_syncFSRequests',
1381 'FS_readFiles',
1382 'FS_lookupPath',
1383 'FS_getPath',
1384 'FS_hashName',
1385 'FS_hashAddNode',
1386 'FS_hashRemoveNode',
1387 'FS_lookupNode',
1388 'FS_createNode',
1389 'FS_destroyNode',
1390 'FS_isRoot',
1391 'FS_isMountpoint',
1392 'FS_isFile',
1393 'FS_isDir',
1394 'FS_isLink',
1395 'FS_isChrdev',
1396 'FS_isBlkdev',
1397 'FS_isFIFO',
1398 'FS_isSocket',
1399 'FS_flagsToPermissionString',
1400 'FS_nodePermissions',
1401 'FS_mayLookup',
1402 'FS_mayCreate',
1403 'FS_mayDelete',
1404 'FS_mayOpen',
1405 'FS_checkOpExists',
1406 'FS_nextfd',
1407 'FS_getStreamChecked',
1408 'FS_getStream',
1409 'FS_createStream',
1410 'FS_closeStream',
1411 'FS_dupStream',
1412 'FS_doSetAttr',
1413 'FS_chrdev_stream_ops',
1414 'FS_major',
1415 'FS_minor',
1416 'FS_makedev',
1417 'FS_registerDevice',
1418 'FS_getDevice',
1419 'FS_getMounts',
1420 'FS_syncfs',
1421 'FS_mount',
1422 'FS_unmount',
1423 'FS_lookup',
1424 'FS_mknod',
1425 'FS_statfs',
1426 'FS_statfsStream',
1427 'FS_statfsNode',
1428 'FS_create',
1429 'FS_mkdir',
1430 'FS_mkdev',
1431 'FS_symlink',
1432 'FS_rename',
1433 'FS_rmdir',
1434 'FS_readdir',
1435 'FS_readlink',
1436 'FS_stat',
1437 'FS_fstat',
1438 'FS_lstat',
1439 'FS_doChmod',
1440 'FS_chmod',
1441 'FS_lchmod',
1442 'FS_fchmod',
1443 'FS_doChown',
1444 'FS_chown',
1445 'FS_lchown',
1446 'FS_fchown',
1447 'FS_doTruncate',
1448 'FS_truncate',
1449 'FS_ftruncate',
1450 'FS_utime',
1451 'FS_open',
1452 'FS_close',
1453 'FS_isClosed',
1454 'FS_llseek',
1455 'FS_read',
1456 'FS_write',
1457 'FS_mmap',
1458 'FS_msync',
1459 'FS_ioctl',
1460 'FS_writeFile',
1461 'FS_cwd',
1462 'FS_chdir',
1463 'FS_createDefaultDirectories',
1464 'FS_createDefaultDevices',
1465 'FS_createSpecialDirectories',
1466 'FS_createStandardStreams',
1467 'FS_staticInit',
1468 'FS_init',
1469 'FS_quit',
1470 'FS_findObject',
1471 'FS_analyzePath',
1472 'FS_createFile',
1473 'FS_createDataFile',
1474 'FS_forceLoadFile',
1475 'FS_createLazyFile',
1476 'FS_absolutePath',
1477 'FS_createFolder',
1478 'FS_createLink',
1479 'FS_joinPath',
1480 'FS_mmapAlloc',
1481 'FS_standardizePath',
1482 'MEMFS',
1483 'TTY',
1484 'PIPEFS',
1485 'SOCKFS',
1486 'tempFixedLengthArray',
1487 'miniTempWebGLFloatBuffers',
1488 'miniTempWebGLIntBuffers',
1489 'GL',
1490 'AL',
1491 'GLUT',
1492 'EGL',
1493 'GLEW',
1494 'IDBStore',
1495 'SDL',
1496 'SDL_gfx',
1497 'allocateUTF8',
1498 'allocateUTF8OnStack',
1499 'print',
1500 'printErr',
1501 'jstoi_s',
1502];
1503unexportedSymbols.forEach(unexportedRuntimeSymbol);
1504
1505 // End runtime exports
1506 // Begin JS library exports
1507 // End JS library exports
1508
1509// end include: postlibrary.js
1510
1511function checkIncomingModuleAPI() {
1512 ignoredModuleProp('fetchSettings');
1513}
1514
1515// Imports from the Wasm binary.
1516var _main = Module['_main'] = makeInvalidEarlyAccess('_main');
1517var _fflush = makeInvalidEarlyAccess('_fflush');
1518var _strerror = makeInvalidEarlyAccess('_strerror');
1519var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_end');
1520var _emscripten_stack_get_base = makeInvalidEarlyAccess('_emscripten_stack_get_base');
1521var _emscripten_stack_init = makeInvalidEarlyAccess('_emscripten_stack_init');
1522var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_free');
1523var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore');
1524var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc');
1525var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current');
1526
1527function assignWasmExports(wasmExports) {
1528 Module['_main'] = _main = createExportWrapper('main', 2);
1529 _fflush = createExportWrapper('fflush', 1);
1530 _strerror = createExportWrapper('strerror', 1);
1531 _emscripten_stack_get_end = wasmExports['emscripten_stack_get_end'];
1532 _emscripten_stack_get_base = wasmExports['emscripten_stack_get_base'];
1533 _emscripten_stack_init = wasmExports['emscripten_stack_init'];
1534 _emscripten_stack_get_free = wasmExports['emscripten_stack_get_free'];
1535 __emscripten_stack_restore = wasmExports['_emscripten_stack_restore'];
1536 __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'];
1537 _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'];
1538}
1539var wasmImports = {
1540 /** @export */
1541 fd_write: _fd_write
1542};
1543var wasmExports;
1544createWasm();
1545
1546
1547// include: postamble.js
1548// === Auto-generated postamble setup entry stuff ===
1549
1550var calledRun;
1551
1552function callMain() {
1553 assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])');
1554 assert(typeof onPreRuns === 'undefined' || onPreRuns.length == 0, 'cannot call main when preRun functions remain to be called');
1555
1556 var entryFunction = _main;
1557
1558 var argc = 0;
1559 var argv = 0;
1560
1561 try {
1562
1563 var ret = entryFunction(argc, argv);
1564
1565 // if we're not running an evented main loop, it's time to exit
1566 exitJS(ret, /* implicit = */ true);
1567 return ret;
1568 } catch (e) {
1569 return handleException(e);
1570 }
1571}
1572
1573function stackCheckInit() {
1574 // This is normally called automatically during __wasm_call_ctors but need to
1575 // get these values before even running any of the ctors so we call it redundantly
1576 // here.
1577 _emscripten_stack_init();
1578 // TODO(sbc): Move writeStackCookie to native to to avoid this.
1579 writeStackCookie();
1580}
1581
1582function run() {
1583
1584 if (runDependencies > 0) {
1585 dependenciesFulfilled = run;
1586 return;
1587 }
1588
1589 stackCheckInit();
1590
1591 preRun();
1592
1593 // a preRun added a dependency, run will be called later
1594 if (runDependencies > 0) {
1595 dependenciesFulfilled = run;
1596 return;
1597 }
1598
1599 function doRun() {
1600 // run may have just been called through dependencies being fulfilled just in this very frame,
1601 // or while the async setStatus time below was happening
1602 assert(!calledRun);
1603 calledRun = true;
1604 Module['calledRun'] = true;
1605
1606 if (ABORT) return;
1607
1608 initRuntime();
1609
1610 preMain();
1611
1612 Module['onRuntimeInitialized']?.();
1613 consumedModuleProp('onRuntimeInitialized');
1614
1615 var noInitialRun = Module['noInitialRun'] || false;
1616 if (!noInitialRun) callMain();
1617
1618 postRun();
1619 }
1620
1621 if (Module['setStatus']) {
1622 Module['setStatus']('Running...');
1623 setTimeout(() => {
1624 setTimeout(() => Module['setStatus'](''), 1);
1625 doRun();
1626 }, 1);
1627 } else
1628 {
1629 doRun();
1630 }
1631 checkStackCookie();
1632}
1633
1634function checkUnflushedContent() {
1635 // Compiler settings do not allow exiting the runtime, so flushing
1636 // the streams is not possible. but in ASSERTIONS mode we check
1637 // if there was something to flush, and if so tell the user they
1638 // should request that the runtime be exitable.
1639 // Normally we would not even include flush() at all, but in ASSERTIONS
1640 // builds we do so just for this check, and here we see if there is any
1641 // content to flush, that is, we check if there would have been
1642 // something a non-ASSERTIONS build would have not seen.
1643 // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
1644 // mode (which has its own special function for this; otherwise, all
1645 // the code is inside libc)
1646 var oldOut = out;
1647 var oldErr = err;
1648 var has = false;
1649 out = err = (x) => {
1650 has = true;
1651 }
1652 try { // it doesn't matter if it fails
1653 flush_NO_FILESYSTEM();
1654 } catch(e) {}
1655 out = oldOut;
1656 err = oldErr;
1657 if (has) {
1658 warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.');
1659 warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)');
1660 }
1661}
1662
1663function preInit() {
1664 if (Module['preInit']) {
1665 if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
1666 while (Module['preInit'].length > 0) {
1667 Module['preInit'].shift()();
1668 }
1669 }
1670 consumedModuleProp('preInit');
1671}
1672
1673preInit();
1674run();
1675
1676// end include: postamble.js
1677
diff --git a/src/talks/wasm/examples/1-hello-world/index.wasm b/src/talks/wasm/examples/1-hello-world/index.wasm
new file mode 100755
index 0000000..7ecb659
--- /dev/null
+++ b/src/talks/wasm/examples/1-hello-world/index.wasm
Binary files differ
diff --git a/src/talks/wasm/examples/2-sum/index.html.raw b/src/talks/wasm/examples/2-sum/index.html.raw
new file mode 100644
index 0000000..b0a7c38
--- /dev/null
+++ b/src/talks/wasm/examples/2-sum/index.html.raw
@@ -0,0 +1,16 @@
1<!doctype html>
2<html lang="en-US">
3<head>
4 <meta charset="utf-8" />
5 <meta name="viewport" content="width=device-width" />
6 <title>Sum two numbers</title>
7 <script src="./script.js" type="module" defer></script>
8</head>
9
10<body>
11 <input id="aInput" /> + <br />
12 <input id="bInput" /> <button id="goButton">=</button> <br />
13 <p id="resultText"></p>
14</body>
15
16</html>
diff --git a/src/talks/wasm/examples/2-sum/mime.txt b/src/talks/wasm/examples/2-sum/mime.txt
new file mode 100644
index 0000000..6a9a425
--- /dev/null
+++ b/src/talks/wasm/examples/2-sum/mime.txt
@@ -0,0 +1 @@
text/javascript mjs
diff --git a/src/talks/wasm/examples/2-sum/script.js b/src/talks/wasm/examples/2-sum/script.js
new file mode 100644
index 0000000..4b05824
--- /dev/null
+++ b/src/talks/wasm/examples/2-sum/script.js
@@ -0,0 +1,14 @@
1import SumLibrary from "./sum_library.mjs";
2
3var sumLibraryInstance = await SumLibrary();
4
5var aInput = document.getElementById("aInput");
6var bInput = document.getElementById("bInput");
7var button = document.getElementById("goButton");
8var resultText = document.getElementById("resultText");
9
10button.addEventListener("click", () => {
11 var a = Number(aInput.value);
12 var b = Number(bInput.value);
13 resultText.innerText = sumLibraryInstance._sum(a, b);
14});
diff --git a/src/talks/wasm/examples/2-sum/sum_library.c b/src/talks/wasm/examples/2-sum/sum_library.c
new file mode 100644
index 0000000..aba9411
--- /dev/null
+++ b/src/talks/wasm/examples/2-sum/sum_library.c
@@ -0,0 +1,3 @@
1int sum(int a, int b) {
2 return a + b;
3}
diff --git a/src/talks/wasm/examples/2-sum/sum_library.mjs b/src/talks/wasm/examples/2-sum/sum_library.mjs
new file mode 100644
index 0000000..298c30e
--- /dev/null
+++ b/src/talks/wasm/examples/2-sum/sum_library.mjs
@@ -0,0 +1,1531 @@
1// This code implements the `-sMODULARIZE` settings by taking the generated
2// JS program code (INNER_JS_CODE) and wrapping it in a factory function.
3
4// When targetting node and ES6 we use `await import ..` in the generated code
5// so the outer function needs to be marked as async.
6async function SumLibrary(moduleArg = {}) {
7 var moduleRtn;
8
9// include: shell.js
10// The Module object: Our interface to the outside world. We import
11// and export values on it. There are various ways Module can be used:
12// 1. Not defined. We create it here
13// 2. A function parameter, function(moduleArg) => Promise<Module>
14// 3. pre-run appended it, var Module = {}; ..generated code..
15// 4. External script tag defines var Module.
16// We need to check if Module already exists (e.g. case 3 above).
17// Substitution will be replaced with actual code on later stage of the build,
18// this way Closure Compiler will not mangle it (e.g. case 4. above).
19// Note that if you want to run closure, and also to use Module
20// after the generated code, you will need to define var Module = {};
21// before the code. Then that object will be used in the code, and you
22// can continue to use Module afterwards as well.
23var Module = moduleArg;
24
25// Determine the runtime environment we are in. You can customize this by
26// setting the ENVIRONMENT setting at compile time (see settings.js).
27
28// Attempt to auto-detect the environment
29var ENVIRONMENT_IS_WEB = typeof window == 'object';
30var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != 'undefined';
31// N.b. Electron.js environment is simultaneously a NODE-environment, but
32// also a web environment.
33var ENVIRONMENT_IS_NODE = typeof process == 'object' && process.versions?.node && process.type != 'renderer';
34var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
35
36if (ENVIRONMENT_IS_NODE) {
37 // When building an ES module `require` is not normally available.
38 // We need to use `createRequire()` to construct the require()` function.
39 const { createRequire } = await import('module');
40 /** @suppress{duplicate} */
41 var require = createRequire(import.meta.url);
42
43}
44
45// --pre-jses are emitted after the Module integration code, so that they can
46// refer to Module (if they choose; they can also define Module)
47
48
49var arguments_ = [];
50var thisProgram = './this.program';
51var quit_ = (status, toThrow) => {
52 throw toThrow;
53};
54
55var _scriptName = import.meta.url;
56
57// `/` should be present at the end if `scriptDirectory` is not empty
58var scriptDirectory = '';
59function locateFile(path) {
60 if (Module['locateFile']) {
61 return Module['locateFile'](path, scriptDirectory);
62 }
63 return scriptDirectory + path;
64}
65
66// Hooks that are implemented differently in different runtime environments.
67var readAsync, readBinary;
68
69if (ENVIRONMENT_IS_NODE) {
70 const isNode = typeof process == 'object' && process.versions?.node && process.type != 'renderer';
71 if (!isNode) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
72
73 var nodeVersion = process.versions.node;
74 var numericVersion = nodeVersion.split('.').slice(0, 3);
75 numericVersion = (numericVersion[0] * 10000) + (numericVersion[1] * 100) + (numericVersion[2].split('-')[0] * 1);
76 if (numericVersion < 160000) {
77 throw new Error('This emscripten-generated code requires node v16.0.0 (detected v' + nodeVersion + ')');
78 }
79
80 // These modules will usually be used on Node.js. Load them eagerly to avoid
81 // the complexity of lazy-loading.
82 var fs = require('fs');
83
84 if (_scriptName.startsWith('file:')) {
85 scriptDirectory = require('path').dirname(require('url').fileURLToPath(_scriptName)) + '/';
86 }
87
88// include: node_shell_read.js
89readBinary = (filename) => {
90 // We need to re-wrap `file://` strings to URLs.
91 filename = isFileURI(filename) ? new URL(filename) : filename;
92 var ret = fs.readFileSync(filename);
93 assert(Buffer.isBuffer(ret));
94 return ret;
95};
96
97readAsync = async (filename, binary = true) => {
98 // See the comment in the `readBinary` function.
99 filename = isFileURI(filename) ? new URL(filename) : filename;
100 var ret = fs.readFileSync(filename, binary ? undefined : 'utf8');
101 assert(binary ? Buffer.isBuffer(ret) : typeof ret == 'string');
102 return ret;
103};
104// end include: node_shell_read.js
105 if (process.argv.length > 1) {
106 thisProgram = process.argv[1].replace(/\\/g, '/');
107 }
108
109 arguments_ = process.argv.slice(2);
110
111 quit_ = (status, toThrow) => {
112 process.exitCode = status;
113 throw toThrow;
114 };
115
116} else
117if (ENVIRONMENT_IS_SHELL) {
118
119 const isNode = typeof process == 'object' && process.versions?.node && process.type != 'renderer';
120 if (isNode || typeof window == 'object' || typeof WorkerGlobalScope != 'undefined') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
121
122} else
123
124// Note that this includes Node.js workers when relevant (pthreads is enabled).
125// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
126// ENVIRONMENT_IS_NODE.
127if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
128 try {
129 scriptDirectory = new URL('.', _scriptName).href; // includes trailing slash
130 } catch {
131 // Must be a `blob:` or `data:` URL (e.g. `blob:http://site.com/etc/etc`), we cannot
132 // infer anything from them.
133 }
134
135 if (!(typeof window == 'object' || typeof WorkerGlobalScope != 'undefined')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
136
137 {
138// include: web_or_worker_shell_read.js
139if (ENVIRONMENT_IS_WORKER) {
140 readBinary = (url) => {
141 var xhr = new XMLHttpRequest();
142 xhr.open('GET', url, false);
143 xhr.responseType = 'arraybuffer';
144 xhr.send(null);
145 return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
146 };
147 }
148
149 readAsync = async (url) => {
150 // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
151 // See https://github.com/github/fetch/pull/92#issuecomment-140665932
152 // Cordova or Electron apps are typically loaded from a file:// url.
153 // So use XHR on webview if URL is a file URL.
154 if (isFileURI(url)) {
155 return new Promise((resolve, reject) => {
156 var xhr = new XMLHttpRequest();
157 xhr.open('GET', url, true);
158 xhr.responseType = 'arraybuffer';
159 xhr.onload = () => {
160 if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
161 resolve(xhr.response);
162 return;
163 }
164 reject(xhr.status);
165 };
166 xhr.onerror = reject;
167 xhr.send(null);
168 });
169 }
170 var response = await fetch(url, { credentials: 'same-origin' });
171 if (response.ok) {
172 return response.arrayBuffer();
173 }
174 throw new Error(response.status + ' : ' + response.url);
175 };
176// end include: web_or_worker_shell_read.js
177 }
178} else
179{
180 throw new Error('environment detection error');
181}
182
183var out = console.log.bind(console);
184var err = console.error.bind(console);
185
186var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js';
187var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js';
188var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js';
189var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js';
190var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js';
191var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js';
192var OPFS = 'OPFS is no longer included by default; build with -lopfs.js';
193
194var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js';
195
196// perform assertions in shell.js after we set up out() and err(), as otherwise
197// if an assertion fails it cannot print the message
198
199assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.');
200
201// end include: shell.js
202
203// include: preamble.js
204// === Preamble library stuff ===
205
206// Documentation for the public APIs defined in this file must be updated in:
207// site/source/docs/api_reference/preamble.js.rst
208// A prebuilt local version of the documentation is available at:
209// site/build/text/docs/api_reference/preamble.js.txt
210// You can also build docs locally as HTML or other formats in site/
211// An online HTML version (which may be of a different version of Emscripten)
212// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
213
214var wasmBinary;
215
216if (typeof WebAssembly != 'object') {
217 err('no native wasm support detected');
218}
219
220// Wasm globals
221
222//========================================
223// Runtime essentials
224//========================================
225
226// whether we are quitting the application. no code should run after this.
227// set in exit() and abort()
228var ABORT = false;
229
230// set by exit() and abort(). Passed to 'onExit' handler.
231// NOTE: This is also used as the process return code code in shell environments
232// but only when noExitRuntime is false.
233var EXITSTATUS;
234
235// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we
236// don't define it at all in release modes. This matches the behaviour of
237// MINIMAL_RUNTIME.
238// TODO(sbc): Make this the default even without STRICT enabled.
239/** @type {function(*, string=)} */
240function assert(condition, text) {
241 if (!condition) {
242 abort('Assertion failed' + (text ? ': ' + text : ''));
243 }
244}
245
246// We used to include malloc/free by default in the past. Show a helpful error in
247// builds with assertions.
248function _malloc() {
249 abort('malloc() called but not included in the build - add `_malloc` to EXPORTED_FUNCTIONS');
250}
251function _free() {
252 // Show a helpful error since we used to include free by default in the past.
253 abort('free() called but not included in the build - add `_free` to EXPORTED_FUNCTIONS');
254}
255
256/**
257 * Indicates whether filename is delivered via file protocol (as opposed to http/https)
258 * @noinline
259 */
260var isFileURI = (filename) => filename.startsWith('file://');
261
262// include: runtime_common.js
263// include: runtime_stack_check.js
264// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
265function writeStackCookie() {
266 var max = _emscripten_stack_get_end();
267 assert((max & 3) == 0);
268 // If the stack ends at address zero we write our cookies 4 bytes into the
269 // stack. This prevents interference with SAFE_HEAP and ASAN which also
270 // monitor writes to address zero.
271 if (max == 0) {
272 max += 4;
273 }
274 // The stack grow downwards towards _emscripten_stack_get_end.
275 // We write cookies to the final two words in the stack and detect if they are
276 // ever overwritten.
277 HEAPU32[((max)>>2)] = 0x02135467;
278 HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE;
279 // Also test the global address 0 for integrity.
280 HEAPU32[((0)>>2)] = 1668509029;
281}
282
283function checkStackCookie() {
284 if (ABORT) return;
285 var max = _emscripten_stack_get_end();
286 // See writeStackCookie().
287 if (max == 0) {
288 max += 4;
289 }
290 var cookie1 = HEAPU32[((max)>>2)];
291 var cookie2 = HEAPU32[(((max)+(4))>>2)];
292 if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) {
293 abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`);
294 }
295 // Also test the global address 0 for integrity.
296 if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) {
297 abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
298 }
299}
300// end include: runtime_stack_check.js
301// include: runtime_exceptions.js
302// end include: runtime_exceptions.js
303// include: runtime_debug.js
304var runtimeDebug = true; // Switch to false at runtime to disable logging at the right times
305
306// Used by XXXXX_DEBUG settings to output debug messages.
307function dbg(...args) {
308 if (!runtimeDebug && typeof runtimeDebug != 'undefined') return;
309 // TODO(sbc): Make this configurable somehow. Its not always convenient for
310 // logging to show up as warnings.
311 console.warn(...args);
312}
313
314// Endianness check
315(() => {
316 var h16 = new Int16Array(1);
317 var h8 = new Int8Array(h16.buffer);
318 h16[0] = 0x6373;
319 if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)';
320})();
321
322function consumedModuleProp(prop) {
323 if (!Object.getOwnPropertyDescriptor(Module, prop)) {
324 Object.defineProperty(Module, prop, {
325 configurable: true,
326 set() {
327 abort(`Attempt to set \`Module.${prop}\` after it has already been processed. This can happen, for example, when code is injected via '--post-js' rather than '--pre-js'`);
328
329 }
330 });
331 }
332}
333
334function makeInvalidEarlyAccess(name) {
335 return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`);
336
337}
338
339function ignoredModuleProp(prop) {
340 if (Object.getOwnPropertyDescriptor(Module, prop)) {
341 abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`);
342 }
343}
344
345// forcing the filesystem exports a few things by default
346function isExportedByForceFilesystem(name) {
347 return name === 'FS_createPath' ||
348 name === 'FS_createDataFile' ||
349 name === 'FS_createPreloadedFile' ||
350 name === 'FS_unlink' ||
351 name === 'addRunDependency' ||
352 // The old FS has some functionality that WasmFS lacks.
353 name === 'FS_createLazyFile' ||
354 name === 'FS_createDevice' ||
355 name === 'removeRunDependency';
356}
357
358/**
359 * Intercept access to a global symbol. This enables us to give informative
360 * warnings/errors when folks attempt to use symbols they did not include in
361 * their build, or no symbols that no longer exist.
362 */
363function hookGlobalSymbolAccess(sym, func) {
364 if (typeof globalThis != 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) {
365 Object.defineProperty(globalThis, sym, {
366 configurable: true,
367 get() {
368 func();
369 return undefined;
370 }
371 });
372 }
373}
374
375function missingGlobal(sym, msg) {
376 hookGlobalSymbolAccess(sym, () => {
377 warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`);
378 });
379}
380
381missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer');
382missingGlobal('asm', 'Please use wasmExports instead');
383
384function missingLibrarySymbol(sym) {
385 hookGlobalSymbolAccess(sym, () => {
386 // Can't `abort()` here because it would break code that does runtime
387 // checks. e.g. `if (typeof SDL === 'undefined')`.
388 var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`;
389 // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in
390 // library.js, which means $name for a JS name with no prefix, or name
391 // for a JS name like _name.
392 var librarySymbol = sym;
393 if (!librarySymbol.startsWith('_')) {
394 librarySymbol = '$' + sym;
395 }
396 msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`;
397 if (isExportedByForceFilesystem(sym)) {
398 msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
399 }
400 warnOnce(msg);
401 });
402
403 // Any symbol that is not included from the JS library is also (by definition)
404 // not exported on the Module object.
405 unexportedRuntimeSymbol(sym);
406}
407
408function unexportedRuntimeSymbol(sym) {
409 if (!Object.getOwnPropertyDescriptor(Module, sym)) {
410 Object.defineProperty(Module, sym, {
411 configurable: true,
412 get() {
413 var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`;
414 if (isExportedByForceFilesystem(sym)) {
415 msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
416 }
417 abort(msg);
418 }
419 });
420 }
421}
422
423// end include: runtime_debug.js
424var readyPromiseResolve, readyPromiseReject;
425
426// Memory management
427
428var wasmMemory;
429
430var
431/** @type {!Int8Array} */
432 HEAP8,
433/** @type {!Uint8Array} */
434 HEAPU8,
435/** @type {!Int16Array} */
436 HEAP16,
437/** @type {!Uint16Array} */
438 HEAPU16,
439/** @type {!Int32Array} */
440 HEAP32,
441/** @type {!Uint32Array} */
442 HEAPU32,
443/** @type {!Float32Array} */
444 HEAPF32,
445/** @type {!Float64Array} */
446 HEAPF64;
447
448// BigInt64Array type is not correctly defined in closure
449var
450/** not-@type {!BigInt64Array} */
451 HEAP64,
452/* BigUint64Array type is not correctly defined in closure
453/** not-@type {!BigUint64Array} */
454 HEAPU64;
455
456var runtimeInitialized = false;
457
458
459
460function updateMemoryViews() {
461 var b = wasmMemory.buffer;
462 HEAP8 = new Int8Array(b);
463 HEAP16 = new Int16Array(b);
464 HEAPU8 = new Uint8Array(b);
465 HEAPU16 = new Uint16Array(b);
466 HEAP32 = new Int32Array(b);
467 HEAPU32 = new Uint32Array(b);
468 HEAPF32 = new Float32Array(b);
469 HEAPF64 = new Float64Array(b);
470 HEAP64 = new BigInt64Array(b);
471 HEAPU64 = new BigUint64Array(b);
472}
473
474// include: memoryprofiler.js
475// end include: memoryprofiler.js
476// end include: runtime_common.js
477assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined,
478 'JS engine does not provide full typed array support');
479
480function preRun() {
481 if (Module['preRun']) {
482 if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
483 while (Module['preRun'].length) {
484 addOnPreRun(Module['preRun'].shift());
485 }
486 }
487 consumedModuleProp('preRun');
488 // Begin ATPRERUNS hooks
489 callRuntimeCallbacks(onPreRuns);
490 // End ATPRERUNS hooks
491}
492
493function initRuntime() {
494 assert(!runtimeInitialized);
495 runtimeInitialized = true;
496
497 checkStackCookie();
498
499 // No ATINITS hooks
500
501 wasmExports['__wasm_call_ctors']();
502
503 // No ATPOSTCTORS hooks
504}
505
506function postRun() {
507 checkStackCookie();
508 // PThreads reuse the runtime from the main thread.
509
510 if (Module['postRun']) {
511 if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
512 while (Module['postRun'].length) {
513 addOnPostRun(Module['postRun'].shift());
514 }
515 }
516 consumedModuleProp('postRun');
517
518 // Begin ATPOSTRUNS hooks
519 callRuntimeCallbacks(onPostRuns);
520 // End ATPOSTRUNS hooks
521}
522
523// A counter of dependencies for calling run(). If we need to
524// do asynchronous work before running, increment this and
525// decrement it. Incrementing must happen in a place like
526// Module.preRun (used by emcc to add file preloading).
527// Note that you can add dependencies in preRun, even though
528// it happens right before run - run will be postponed until
529// the dependencies are met.
530var runDependencies = 0;
531var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
532var runDependencyTracking = {};
533var runDependencyWatcher = null;
534
535function addRunDependency(id) {
536 runDependencies++;
537
538 Module['monitorRunDependencies']?.(runDependencies);
539
540 if (id) {
541 assert(!runDependencyTracking[id]);
542 runDependencyTracking[id] = 1;
543 if (runDependencyWatcher === null && typeof setInterval != 'undefined') {
544 // Check for missing dependencies every few seconds
545 runDependencyWatcher = setInterval(() => {
546 if (ABORT) {
547 clearInterval(runDependencyWatcher);
548 runDependencyWatcher = null;
549 return;
550 }
551 var shown = false;
552 for (var dep in runDependencyTracking) {
553 if (!shown) {
554 shown = true;
555 err('still waiting on run dependencies:');
556 }
557 err(`dependency: ${dep}`);
558 }
559 if (shown) {
560 err('(end of list)');
561 }
562 }, 10000);
563 }
564 } else {
565 err('warning: run dependency added without ID');
566 }
567}
568
569function removeRunDependency(id) {
570 runDependencies--;
571
572 Module['monitorRunDependencies']?.(runDependencies);
573
574 if (id) {
575 assert(runDependencyTracking[id]);
576 delete runDependencyTracking[id];
577 } else {
578 err('warning: run dependency removed without ID');
579 }
580 if (runDependencies == 0) {
581 if (runDependencyWatcher !== null) {
582 clearInterval(runDependencyWatcher);
583 runDependencyWatcher = null;
584 }
585 if (dependenciesFulfilled) {
586 var callback = dependenciesFulfilled;
587 dependenciesFulfilled = null;
588 callback(); // can add another dependenciesFulfilled
589 }
590 }
591}
592
593/** @param {string|number=} what */
594function abort(what) {
595 Module['onAbort']?.(what);
596
597 what = 'Aborted(' + what + ')';
598 // TODO(sbc): Should we remove printing and leave it up to whoever
599 // catches the exception?
600 err(what);
601
602 ABORT = true;
603
604 // Use a wasm runtime error, because a JS error might be seen as a foreign
605 // exception, which means we'd run destructors on it. We need the error to
606 // simply make the program stop.
607 // FIXME This approach does not work in Wasm EH because it currently does not assume
608 // all RuntimeErrors are from traps; it decides whether a RuntimeError is from
609 // a trap or not based on a hidden field within the object. So at the moment
610 // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that
611 // allows this in the wasm spec.
612
613 // Suppress closure compiler warning here. Closure compiler's builtin extern
614 // definition for WebAssembly.RuntimeError claims it takes no arguments even
615 // though it can.
616 // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.
617 /** @suppress {checkTypes} */
618 var e = new WebAssembly.RuntimeError(what);
619
620 readyPromiseReject?.(e);
621 // Throw the error whether or not MODULARIZE is set because abort is used
622 // in code paths apart from instantiation where an exception is expected
623 // to be thrown when abort is called.
624 throw e;
625}
626
627// show errors on likely calls to FS when it was not included
628var FS = {
629 error() {
630 abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM');
631 },
632 init() { FS.error() },
633 createDataFile() { FS.error() },
634 createPreloadedFile() { FS.error() },
635 createLazyFile() { FS.error() },
636 open() { FS.error() },
637 mkdev() { FS.error() },
638 registerDevice() { FS.error() },
639 analyzePath() { FS.error() },
640
641 ErrnoError() { FS.error() },
642};
643
644
645function createExportWrapper(name, nargs) {
646 return (...args) => {
647 assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`);
648 var f = wasmExports[name];
649 assert(f, `exported native function \`${name}\` not found`);
650 // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled.
651 assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`);
652 return f(...args);
653 };
654}
655
656var wasmBinaryFile;
657
658function findWasmBinary() {
659 if (Module['locateFile']) {
660 return locateFile('sum_library.wasm');
661 }
662 // Use bundler-friendly `new URL(..., import.meta.url)` pattern; works in browsers too.
663 return new URL('sum_library.wasm', import.meta.url).href;
664}
665
666function getBinarySync(file) {
667 if (file == wasmBinaryFile && wasmBinary) {
668 return new Uint8Array(wasmBinary);
669 }
670 if (readBinary) {
671 return readBinary(file);
672 }
673 throw 'both async and sync fetching of the wasm failed';
674}
675
676async function getWasmBinary(binaryFile) {
677 // If we don't have the binary yet, load it asynchronously using readAsync.
678 if (!wasmBinary) {
679 // Fetch the binary using readAsync
680 try {
681 var response = await readAsync(binaryFile);
682 return new Uint8Array(response);
683 } catch {
684 // Fall back to getBinarySync below;
685 }
686 }
687
688 // Otherwise, getBinarySync should be able to get it synchronously
689 return getBinarySync(binaryFile);
690}
691
692async function instantiateArrayBuffer(binaryFile, imports) {
693 try {
694 var binary = await getWasmBinary(binaryFile);
695 var instance = await WebAssembly.instantiate(binary, imports);
696 return instance;
697 } catch (reason) {
698 err(`failed to asynchronously prepare wasm: ${reason}`);
699
700 // Warn on some common problems.
701 if (isFileURI(wasmBinaryFile)) {
702 err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`);
703 }
704 abort(reason);
705 }
706}
707
708async function instantiateAsync(binary, binaryFile, imports) {
709 if (!binary && typeof WebAssembly.instantiateStreaming == 'function'
710 // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.
711 && !isFileURI(binaryFile)
712 // Avoid instantiateStreaming() on Node.js environment for now, as while
713 // Node.js v18.1.0 implements it, it does not have a full fetch()
714 // implementation yet.
715 //
716 // Reference:
717 // https://github.com/emscripten-core/emscripten/pull/16917
718 && !ENVIRONMENT_IS_NODE
719 ) {
720 try {
721 var response = fetch(binaryFile, { credentials: 'same-origin' });
722 var instantiationResult = await WebAssembly.instantiateStreaming(response, imports);
723 return instantiationResult;
724 } catch (reason) {
725 // We expect the most common failure cause to be a bad MIME type for the binary,
726 // in which case falling back to ArrayBuffer instantiation should work.
727 err(`wasm streaming compile failed: ${reason}`);
728 err('falling back to ArrayBuffer instantiation');
729 // fall back of instantiateArrayBuffer below
730 };
731 }
732 return instantiateArrayBuffer(binaryFile, imports);
733}
734
735function getWasmImports() {
736 // prepare imports
737 return {
738 'env': wasmImports,
739 'wasi_snapshot_preview1': wasmImports,
740 }
741}
742
743// Create the wasm instance.
744// Receives the wasm imports, returns the exports.
745async function createWasm() {
746 // Load the wasm module and create an instance of using native support in the JS engine.
747 // handle a generated wasm instance, receiving its exports and
748 // performing other necessary setup
749 /** @param {WebAssembly.Module=} module*/
750 function receiveInstance(instance, module) {
751 wasmExports = instance.exports;
752
753
754
755 wasmMemory = wasmExports['memory'];
756
757 assert(wasmMemory, 'memory not found in wasm exports');
758 updateMemoryViews();
759
760 assignWasmExports(wasmExports);
761 removeRunDependency('wasm-instantiate');
762 return wasmExports;
763 }
764 // wait for the pthread pool (if any)
765 addRunDependency('wasm-instantiate');
766
767 // Prefer streaming instantiation if available.
768 // Async compilation can be confusing when an error on the page overwrites Module
769 // (for example, if the order of elements is wrong, and the one defining Module is
770 // later), so we save Module and check it later.
771 var trueModule = Module;
772 function receiveInstantiationResult(result) {
773 // 'result' is a ResultObject object which has both the module and instance.
774 // receiveInstance() will swap in the exports (to Module.asm) so they can be called
775 assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
776 trueModule = null;
777 // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
778 // When the regression is fixed, can restore the above PTHREADS-enabled path.
779 return receiveInstance(result['instance']);
780 }
781
782 var info = getWasmImports();
783
784 // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
785 // to manually instantiate the Wasm module themselves. This allows pages to
786 // run the instantiation parallel to any other async startup actions they are
787 // performing.
788 // Also pthreads and wasm workers initialize the wasm instance through this
789 // path.
790 if (Module['instantiateWasm']) {
791 return new Promise((resolve, reject) => {
792 try {
793 Module['instantiateWasm'](info, (mod, inst) => {
794 resolve(receiveInstance(mod, inst));
795 });
796 } catch(e) {
797 err(`Module.instantiateWasm callback failed with error: ${e}`);
798 reject(e);
799 }
800 });
801 }
802
803 wasmBinaryFile ??= findWasmBinary();
804 var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
805 var exports = receiveInstantiationResult(result);
806 return exports;
807}
808
809// end include: preamble.js
810
811// Begin JS library code
812
813
814 class ExitStatus {
815 name = 'ExitStatus';
816 constructor(status) {
817 this.message = `Program terminated with exit(${status})`;
818 this.status = status;
819 }
820 }
821
822 var callRuntimeCallbacks = (callbacks) => {
823 while (callbacks.length > 0) {
824 // Pass the module as the first argument.
825 callbacks.shift()(Module);
826 }
827 };
828 var onPostRuns = [];
829 var addOnPostRun = (cb) => onPostRuns.push(cb);
830
831 var onPreRuns = [];
832 var addOnPreRun = (cb) => onPreRuns.push(cb);
833
834
835
836 /**
837 * @param {number} ptr
838 * @param {string} type
839 */
840 function getValue(ptr, type = 'i8') {
841 if (type.endsWith('*')) type = '*';
842 switch (type) {
843 case 'i1': return HEAP8[ptr];
844 case 'i8': return HEAP8[ptr];
845 case 'i16': return HEAP16[((ptr)>>1)];
846 case 'i32': return HEAP32[((ptr)>>2)];
847 case 'i64': return HEAP64[((ptr)>>3)];
848 case 'float': return HEAPF32[((ptr)>>2)];
849 case 'double': return HEAPF64[((ptr)>>3)];
850 case '*': return HEAPU32[((ptr)>>2)];
851 default: abort(`invalid type for getValue: ${type}`);
852 }
853 }
854
855 var noExitRuntime = true;
856
857 var ptrToString = (ptr) => {
858 assert(typeof ptr === 'number');
859 // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
860 ptr >>>= 0;
861 return '0x' + ptr.toString(16).padStart(8, '0');
862 };
863
864
865 /**
866 * @param {number} ptr
867 * @param {number} value
868 * @param {string} type
869 */
870 function setValue(ptr, value, type = 'i8') {
871 if (type.endsWith('*')) type = '*';
872 switch (type) {
873 case 'i1': HEAP8[ptr] = value; break;
874 case 'i8': HEAP8[ptr] = value; break;
875 case 'i16': HEAP16[((ptr)>>1)] = value; break;
876 case 'i32': HEAP32[((ptr)>>2)] = value; break;
877 case 'i64': HEAP64[((ptr)>>3)] = BigInt(value); break;
878 case 'float': HEAPF32[((ptr)>>2)] = value; break;
879 case 'double': HEAPF64[((ptr)>>3)] = value; break;
880 case '*': HEAPU32[((ptr)>>2)] = value; break;
881 default: abort(`invalid type for setValue: ${type}`);
882 }
883 }
884
885 var stackRestore = (val) => __emscripten_stack_restore(val);
886
887 var stackSave = () => _emscripten_stack_get_current();
888
889 var warnOnce = (text) => {
890 warnOnce.shown ||= {};
891 if (!warnOnce.shown[text]) {
892 warnOnce.shown[text] = 1;
893 if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text;
894 err(text);
895 }
896 };
897// End JS library code
898
899// include: postlibrary.js
900// This file is included after the automatically-generated JS library code
901// but before the wasm module is created.
902
903{
904
905 // Begin ATMODULES hooks
906 if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime'];
907if (Module['print']) out = Module['print'];
908if (Module['printErr']) err = Module['printErr'];
909if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
910
911Module['FS_createDataFile'] = FS.createDataFile;
912Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
913
914 // End ATMODULES hooks
915
916 checkIncomingModuleAPI();
917
918 if (Module['arguments']) arguments_ = Module['arguments'];
919 if (Module['thisProgram']) thisProgram = Module['thisProgram'];
920
921 // Assertions on removed incoming Module JS APIs.
922 assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
923 assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
924 assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
925 assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
926 assert(typeof Module['read'] == 'undefined', 'Module.read option was removed');
927 assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)');
928 assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)');
929 assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)');
930 assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY');
931 assert(typeof Module['ENVIRONMENT'] == 'undefined', 'Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)');
932 assert(typeof Module['STACK_SIZE'] == 'undefined', 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time')
933 // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY
934 assert(typeof Module['wasmMemory'] == 'undefined', 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally');
935 assert(typeof Module['INITIAL_MEMORY'] == 'undefined', 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically');
936
937}
938
939// Begin runtime exports
940 var missingLibrarySymbols = [
941 'writeI53ToI64',
942 'writeI53ToI64Clamped',
943 'writeI53ToI64Signaling',
944 'writeI53ToU64Clamped',
945 'writeI53ToU64Signaling',
946 'readI53FromI64',
947 'readI53FromU64',
948 'convertI32PairToI53',
949 'convertI32PairToI53Checked',
950 'convertU32PairToI53',
951 'bigintToI53Checked',
952 'stackAlloc',
953 'getTempRet0',
954 'setTempRet0',
955 'zeroMemory',
956 'exitJS',
957 'getHeapMax',
958 'abortOnCannotGrowMemory',
959 'growMemory',
960 'withStackSave',
961 'strError',
962 'inetPton4',
963 'inetNtop4',
964 'inetPton6',
965 'inetNtop6',
966 'readSockaddr',
967 'writeSockaddr',
968 'readEmAsmArgs',
969 'jstoi_q',
970 'getExecutableName',
971 'autoResumeAudioContext',
972 'getDynCaller',
973 'dynCall',
974 'handleException',
975 'keepRuntimeAlive',
976 'runtimeKeepalivePush',
977 'runtimeKeepalivePop',
978 'callUserCallback',
979 'maybeExit',
980 'asmjsMangle',
981 'asyncLoad',
982 'alignMemory',
983 'mmapAlloc',
984 'HandleAllocator',
985 'getNativeTypeSize',
986 'getUniqueRunDependency',
987 'addOnInit',
988 'addOnPostCtor',
989 'addOnPreMain',
990 'addOnExit',
991 'STACK_SIZE',
992 'STACK_ALIGN',
993 'POINTER_SIZE',
994 'ASSERTIONS',
995 'ccall',
996 'cwrap',
997 'convertJsFunctionToWasm',
998 'getEmptyTableSlot',
999 'updateTableMap',
1000 'getFunctionAddress',
1001 'addFunction',
1002 'removeFunction',
1003 'UTF8ArrayToString',
1004 'UTF8ToString',
1005 'stringToUTF8Array',
1006 'stringToUTF8',
1007 'lengthBytesUTF8',
1008 'intArrayFromString',
1009 'intArrayToString',
1010 'AsciiToString',
1011 'stringToAscii',
1012 'UTF16ToString',
1013 'stringToUTF16',
1014 'lengthBytesUTF16',
1015 'UTF32ToString',
1016 'stringToUTF32',
1017 'lengthBytesUTF32',
1018 'stringToNewUTF8',
1019 'stringToUTF8OnStack',
1020 'writeArrayToMemory',
1021 'registerKeyEventCallback',
1022 'maybeCStringToJsString',
1023 'findEventTarget',
1024 'getBoundingClientRect',
1025 'fillMouseEventData',
1026 'registerMouseEventCallback',
1027 'registerWheelEventCallback',
1028 'registerUiEventCallback',
1029 'registerFocusEventCallback',
1030 'fillDeviceOrientationEventData',
1031 'registerDeviceOrientationEventCallback',
1032 'fillDeviceMotionEventData',
1033 'registerDeviceMotionEventCallback',
1034 'screenOrientation',
1035 'fillOrientationChangeEventData',
1036 'registerOrientationChangeEventCallback',
1037 'fillFullscreenChangeEventData',
1038 'registerFullscreenChangeEventCallback',
1039 'JSEvents_requestFullscreen',
1040 'JSEvents_resizeCanvasForFullscreen',
1041 'registerRestoreOldStyle',
1042 'hideEverythingExceptGivenElement',
1043 'restoreHiddenElements',
1044 'setLetterbox',
1045 'softFullscreenResizeWebGLRenderTarget',
1046 'doRequestFullscreen',
1047 'fillPointerlockChangeEventData',
1048 'registerPointerlockChangeEventCallback',
1049 'registerPointerlockErrorEventCallback',
1050 'requestPointerLock',
1051 'fillVisibilityChangeEventData',
1052 'registerVisibilityChangeEventCallback',
1053 'registerTouchEventCallback',
1054 'fillGamepadEventData',
1055 'registerGamepadEventCallback',
1056 'registerBeforeUnloadEventCallback',
1057 'fillBatteryEventData',
1058 'registerBatteryEventCallback',
1059 'setCanvasElementSize',
1060 'getCanvasElementSize',
1061 'jsStackTrace',
1062 'getCallstack',
1063 'convertPCtoSourceLocation',
1064 'getEnvStrings',
1065 'checkWasiClock',
1066 'flush_NO_FILESYSTEM',
1067 'wasiRightsToMuslOFlags',
1068 'wasiOFlagsToMuslOFlags',
1069 'initRandomFill',
1070 'randomFill',
1071 'safeSetTimeout',
1072 'setImmediateWrapped',
1073 'safeRequestAnimationFrame',
1074 'clearImmediateWrapped',
1075 'registerPostMainLoop',
1076 'registerPreMainLoop',
1077 'getPromise',
1078 'makePromise',
1079 'idsToPromises',
1080 'makePromiseCallback',
1081 'ExceptionInfo',
1082 'findMatchingCatch',
1083 'Browser_asyncPrepareDataCounter',
1084 'isLeapYear',
1085 'ydayFromDate',
1086 'arraySum',
1087 'addDays',
1088 'getSocketFromFD',
1089 'getSocketAddress',
1090 'FS_createPreloadedFile',
1091 'FS_modeStringToFlags',
1092 'FS_getMode',
1093 'FS_stdin_getChar',
1094 'FS_mkdirTree',
1095 '_setNetworkCallback',
1096 'heapObjectForWebGLType',
1097 'toTypedArrayIndex',
1098 'webgl_enable_ANGLE_instanced_arrays',
1099 'webgl_enable_OES_vertex_array_object',
1100 'webgl_enable_WEBGL_draw_buffers',
1101 'webgl_enable_WEBGL_multi_draw',
1102 'webgl_enable_EXT_polygon_offset_clamp',
1103 'webgl_enable_EXT_clip_control',
1104 'webgl_enable_WEBGL_polygon_mode',
1105 'emscriptenWebGLGet',
1106 'computeUnpackAlignedImageSize',
1107 'colorChannelsInGlTextureFormat',
1108 'emscriptenWebGLGetTexPixelData',
1109 'emscriptenWebGLGetUniform',
1110 'webglGetUniformLocation',
1111 'webglPrepareUniformLocationsBeforeFirstUse',
1112 'webglGetLeftBracePos',
1113 'emscriptenWebGLGetVertexAttrib',
1114 '__glGetActiveAttribOrUniform',
1115 'writeGLArray',
1116 'registerWebGlEventCallback',
1117 'runAndAbortIfError',
1118 'ALLOC_NORMAL',
1119 'ALLOC_STACK',
1120 'allocate',
1121 'writeStringToMemory',
1122 'writeAsciiToMemory',
1123 'demangle',
1124 'stackTrace',
1125];
1126missingLibrarySymbols.forEach(missingLibrarySymbol)
1127
1128 var unexportedSymbols = [
1129 'run',
1130 'addRunDependency',
1131 'removeRunDependency',
1132 'out',
1133 'err',
1134 'callMain',
1135 'abort',
1136 'wasmMemory',
1137 'wasmExports',
1138 'HEAPF32',
1139 'HEAPF64',
1140 'HEAP8',
1141 'HEAPU8',
1142 'HEAP16',
1143 'HEAPU16',
1144 'HEAP32',
1145 'HEAPU32',
1146 'HEAP64',
1147 'HEAPU64',
1148 'writeStackCookie',
1149 'checkStackCookie',
1150 'INT53_MAX',
1151 'INT53_MIN',
1152 'stackSave',
1153 'stackRestore',
1154 'ptrToString',
1155 'ENV',
1156 'ERRNO_CODES',
1157 'DNS',
1158 'Protocols',
1159 'Sockets',
1160 'timers',
1161 'warnOnce',
1162 'readEmAsmArgsArray',
1163 'wasmTable',
1164 'noExitRuntime',
1165 'addOnPreRun',
1166 'addOnPostRun',
1167 'freeTableIndexes',
1168 'functionsInTableMap',
1169 'setValue',
1170 'getValue',
1171 'PATH',
1172 'PATH_FS',
1173 'UTF8Decoder',
1174 'UTF16Decoder',
1175 'JSEvents',
1176 'specialHTMLTargets',
1177 'findCanvasEventTarget',
1178 'currentFullscreenStrategy',
1179 'restoreOldWindowedStyle',
1180 'UNWIND_CACHE',
1181 'ExitStatus',
1182 'emSetImmediate',
1183 'emClearImmediate_deps',
1184 'emClearImmediate',
1185 'promiseMap',
1186 'uncaughtExceptionCount',
1187 'exceptionLast',
1188 'exceptionCaught',
1189 'Browser',
1190 'requestFullscreen',
1191 'requestFullScreen',
1192 'setCanvasSize',
1193 'getUserMedia',
1194 'createContext',
1195 'getPreloadedImageData__data',
1196 'wget',
1197 'MONTH_DAYS_REGULAR',
1198 'MONTH_DAYS_LEAP',
1199 'MONTH_DAYS_REGULAR_CUMULATIVE',
1200 'MONTH_DAYS_LEAP_CUMULATIVE',
1201 'SYSCALLS',
1202 'preloadPlugins',
1203 'FS_stdin_getChar_buffer',
1204 'FS_unlink',
1205 'FS_createPath',
1206 'FS_createDevice',
1207 'FS_readFile',
1208 'FS',
1209 'FS_root',
1210 'FS_mounts',
1211 'FS_devices',
1212 'FS_streams',
1213 'FS_nextInode',
1214 'FS_nameTable',
1215 'FS_currentPath',
1216 'FS_initialized',
1217 'FS_ignorePermissions',
1218 'FS_filesystems',
1219 'FS_syncFSRequests',
1220 'FS_readFiles',
1221 'FS_lookupPath',
1222 'FS_getPath',
1223 'FS_hashName',
1224 'FS_hashAddNode',
1225 'FS_hashRemoveNode',
1226 'FS_lookupNode',
1227 'FS_createNode',
1228 'FS_destroyNode',
1229 'FS_isRoot',
1230 'FS_isMountpoint',
1231 'FS_isFile',
1232 'FS_isDir',
1233 'FS_isLink',
1234 'FS_isChrdev',
1235 'FS_isBlkdev',
1236 'FS_isFIFO',
1237 'FS_isSocket',
1238 'FS_flagsToPermissionString',
1239 'FS_nodePermissions',
1240 'FS_mayLookup',
1241 'FS_mayCreate',
1242 'FS_mayDelete',
1243 'FS_mayOpen',
1244 'FS_checkOpExists',
1245 'FS_nextfd',
1246 'FS_getStreamChecked',
1247 'FS_getStream',
1248 'FS_createStream',
1249 'FS_closeStream',
1250 'FS_dupStream',
1251 'FS_doSetAttr',
1252 'FS_chrdev_stream_ops',
1253 'FS_major',
1254 'FS_minor',
1255 'FS_makedev',
1256 'FS_registerDevice',
1257 'FS_getDevice',
1258 'FS_getMounts',
1259 'FS_syncfs',
1260 'FS_mount',
1261 'FS_unmount',
1262 'FS_lookup',
1263 'FS_mknod',
1264 'FS_statfs',
1265 'FS_statfsStream',
1266 'FS_statfsNode',
1267 'FS_create',
1268 'FS_mkdir',
1269 'FS_mkdev',
1270 'FS_symlink',
1271 'FS_rename',
1272 'FS_rmdir',
1273 'FS_readdir',
1274 'FS_readlink',
1275 'FS_stat',
1276 'FS_fstat',
1277 'FS_lstat',
1278 'FS_doChmod',
1279 'FS_chmod',
1280 'FS_lchmod',
1281 'FS_fchmod',
1282 'FS_doChown',
1283 'FS_chown',
1284 'FS_lchown',
1285 'FS_fchown',
1286 'FS_doTruncate',
1287 'FS_truncate',
1288 'FS_ftruncate',
1289 'FS_utime',
1290 'FS_open',
1291 'FS_close',
1292 'FS_isClosed',
1293 'FS_llseek',
1294 'FS_read',
1295 'FS_write',
1296 'FS_mmap',
1297 'FS_msync',
1298 'FS_ioctl',
1299 'FS_writeFile',
1300 'FS_cwd',
1301 'FS_chdir',
1302 'FS_createDefaultDirectories',
1303 'FS_createDefaultDevices',
1304 'FS_createSpecialDirectories',
1305 'FS_createStandardStreams',
1306 'FS_staticInit',
1307 'FS_init',
1308 'FS_quit',
1309 'FS_findObject',
1310 'FS_analyzePath',
1311 'FS_createFile',
1312 'FS_createDataFile',
1313 'FS_forceLoadFile',
1314 'FS_createLazyFile',
1315 'FS_absolutePath',
1316 'FS_createFolder',
1317 'FS_createLink',
1318 'FS_joinPath',
1319 'FS_mmapAlloc',
1320 'FS_standardizePath',
1321 'MEMFS',
1322 'TTY',
1323 'PIPEFS',
1324 'SOCKFS',
1325 'tempFixedLengthArray',
1326 'miniTempWebGLFloatBuffers',
1327 'miniTempWebGLIntBuffers',
1328 'GL',
1329 'AL',
1330 'GLUT',
1331 'EGL',
1332 'GLEW',
1333 'IDBStore',
1334 'SDL',
1335 'SDL_gfx',
1336 'allocateUTF8',
1337 'allocateUTF8OnStack',
1338 'print',
1339 'printErr',
1340 'jstoi_s',
1341];
1342unexportedSymbols.forEach(unexportedRuntimeSymbol);
1343
1344 // End runtime exports
1345 // Begin JS library exports
1346 // End JS library exports
1347
1348// end include: postlibrary.js
1349
1350function checkIncomingModuleAPI() {
1351 ignoredModuleProp('fetchSettings');
1352}
1353
1354// Imports from the Wasm binary.
1355var _sum = Module['_sum'] = makeInvalidEarlyAccess('_sum');
1356var _fflush = makeInvalidEarlyAccess('_fflush');
1357var _emscripten_stack_init = makeInvalidEarlyAccess('_emscripten_stack_init');
1358var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_free');
1359var _emscripten_stack_get_base = makeInvalidEarlyAccess('_emscripten_stack_get_base');
1360var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_end');
1361var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore');
1362var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc');
1363var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current');
1364
1365function assignWasmExports(wasmExports) {
1366 Module['_sum'] = _sum = createExportWrapper('sum', 2);
1367 _fflush = createExportWrapper('fflush', 1);
1368 _emscripten_stack_init = wasmExports['emscripten_stack_init'];
1369 _emscripten_stack_get_free = wasmExports['emscripten_stack_get_free'];
1370 _emscripten_stack_get_base = wasmExports['emscripten_stack_get_base'];
1371 _emscripten_stack_get_end = wasmExports['emscripten_stack_get_end'];
1372 __emscripten_stack_restore = wasmExports['_emscripten_stack_restore'];
1373 __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'];
1374 _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'];
1375}
1376var wasmImports = {
1377
1378};
1379var wasmExports = await createWasm();
1380
1381
1382// include: postamble.js
1383// === Auto-generated postamble setup entry stuff ===
1384
1385var calledRun;
1386
1387function stackCheckInit() {
1388 // This is normally called automatically during __wasm_call_ctors but need to
1389 // get these values before even running any of the ctors so we call it redundantly
1390 // here.
1391 _emscripten_stack_init();
1392 // TODO(sbc): Move writeStackCookie to native to to avoid this.
1393 writeStackCookie();
1394}
1395
1396function run() {
1397
1398 if (runDependencies > 0) {
1399 dependenciesFulfilled = run;
1400 return;
1401 }
1402
1403 stackCheckInit();
1404
1405 preRun();
1406
1407 // a preRun added a dependency, run will be called later
1408 if (runDependencies > 0) {
1409 dependenciesFulfilled = run;
1410 return;
1411 }
1412
1413 function doRun() {
1414 // run may have just been called through dependencies being fulfilled just in this very frame,
1415 // or while the async setStatus time below was happening
1416 assert(!calledRun);
1417 calledRun = true;
1418 Module['calledRun'] = true;
1419
1420 if (ABORT) return;
1421
1422 initRuntime();
1423
1424 readyPromiseResolve?.(Module);
1425 Module['onRuntimeInitialized']?.();
1426 consumedModuleProp('onRuntimeInitialized');
1427
1428 assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]');
1429
1430 postRun();
1431 }
1432
1433 if (Module['setStatus']) {
1434 Module['setStatus']('Running...');
1435 setTimeout(() => {
1436 setTimeout(() => Module['setStatus'](''), 1);
1437 doRun();
1438 }, 1);
1439 } else
1440 {
1441 doRun();
1442 }
1443 checkStackCookie();
1444}
1445
1446function checkUnflushedContent() {
1447 // Compiler settings do not allow exiting the runtime, so flushing
1448 // the streams is not possible. but in ASSERTIONS mode we check
1449 // if there was something to flush, and if so tell the user they
1450 // should request that the runtime be exitable.
1451 // Normally we would not even include flush() at all, but in ASSERTIONS
1452 // builds we do so just for this check, and here we see if there is any
1453 // content to flush, that is, we check if there would have been
1454 // something a non-ASSERTIONS build would have not seen.
1455 // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
1456 // mode (which has its own special function for this; otherwise, all
1457 // the code is inside libc)
1458 var oldOut = out;
1459 var oldErr = err;
1460 var has = false;
1461 out = err = (x) => {
1462 has = true;
1463 }
1464 try { // it doesn't matter if it fails
1465 _fflush(0);
1466 } catch(e) {}
1467 out = oldOut;
1468 err = oldErr;
1469 if (has) {
1470 warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.');
1471 warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)');
1472 }
1473}
1474
1475function preInit() {
1476 if (Module['preInit']) {
1477 if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
1478 while (Module['preInit'].length > 0) {
1479 Module['preInit'].shift()();
1480 }
1481 }
1482 consumedModuleProp('preInit');
1483}
1484
1485preInit();
1486run();
1487
1488// end include: postamble.js
1489
1490// include: postamble_modularize.js
1491// In MODULARIZE mode we wrap the generated code in a factory function
1492// and return either the Module itself, or a promise of the module.
1493//
1494// We assign to the `moduleRtn` global here and configure closure to see
1495// this as and extern so it won't get minified.
1496
1497if (runtimeInitialized) {
1498 moduleRtn = Module;
1499} else {
1500 // Set up the promise that indicates the Module is initialized
1501 moduleRtn = new Promise((resolve, reject) => {
1502 readyPromiseResolve = resolve;
1503 readyPromiseReject = reject;
1504 });
1505}
1506
1507// Assertion for attempting to access module properties on the incoming
1508// moduleArg. In the past we used this object as the prototype of the module
1509// and assigned properties to it, but now we return a distinct object. This
1510// keeps the instance private until it is ready (i.e the promise has been
1511// resolved).
1512for (const prop of Object.keys(Module)) {
1513 if (!(prop in moduleArg)) {
1514 Object.defineProperty(moduleArg, prop, {
1515 configurable: true,
1516 get() {
1517 abort(`Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`)
1518 }
1519 });
1520 }
1521}
1522// end include: postamble_modularize.js
1523
1524
1525
1526 return moduleRtn;
1527}
1528
1529// Export using a UMD style export, or ES6 exports if selected
1530export default SumLibrary;
1531
diff --git a/src/talks/wasm/examples/2-sum/sum_library.wasm b/src/talks/wasm/examples/2-sum/sum_library.wasm
new file mode 100755
index 0000000..f3d3cc0
--- /dev/null
+++ b/src/talks/wasm/examples/2-sum/sum_library.wasm
Binary files differ
diff --git a/src/talks/wasm/examples/3-primes/index.html.raw b/src/talks/wasm/examples/3-primes/index.html.raw
new file mode 100644
index 0000000..235a639
--- /dev/null
+++ b/src/talks/wasm/examples/3-primes/index.html.raw
@@ -0,0 +1,18 @@
1<!doctype html>
2<html lang="en-US">
3<head>
4 <meta charset="utf-8" />
5 <meta name="viewport" content="width=device-width" />
6 <title>Count prime numbers</title>
7 <script src="./script.js" type="module" defer></script>
8</head>
9
10<body>
11 <input id="input" />
12 <button id="wasmButton">Count with WASM</button>
13 <button id="jsButton">Count with JS</button>
14 <br />
15 <p id="resultText"></p>
16</body>
17
18</html>
diff --git a/src/talks/wasm/examples/3-primes/mime.txt b/src/talks/wasm/examples/3-primes/mime.txt
new file mode 100644
index 0000000..6a9a425
--- /dev/null
+++ b/src/talks/wasm/examples/3-primes/mime.txt
@@ -0,0 +1 @@
text/javascript mjs
diff --git a/src/talks/wasm/examples/3-primes/primes.c b/src/talks/wasm/examples/3-primes/primes.c
new file mode 100644
index 0000000..6882f7e
--- /dev/null
+++ b/src/talks/wasm/examples/3-primes/primes.c
@@ -0,0 +1,15 @@
1int is_prime(int n) {
2 if (n < 2)
3 return 0;
4 for (int i = 2; i*i <= n; i++)
5 if (n % i == 0)
6 return 0;
7 return 1;
8}
9
10int count(int n) {
11 int count = 0;
12 for (int i = 0; i < n; i++)
13 count += is_prime(i);
14 return count;
15}
diff --git a/src/talks/wasm/examples/3-primes/primes.mjs b/src/talks/wasm/examples/3-primes/primes.mjs
new file mode 100644
index 0000000..66d5061
--- /dev/null
+++ b/src/talks/wasm/examples/3-primes/primes.mjs
@@ -0,0 +1,2 @@
1async function Primes(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&process.versions?.node&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");var require=createRequire(import.meta.url)}var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");if(_scriptName.startsWith("file:")){scriptDirectory=require("path").dirname(require("url").fileURLToPath(_scriptName))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var isFileURI=filename=>filename.startsWith("file://");var readyPromiseResolve,readyPromiseReject;var wasmMemory;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["b"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("primes.wasm")}return new URL("primes.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["a"];updateMemoryViews();assignWasmExports(wasmExports);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}var _count;function assignWasmExports(wasmExports){Module["_count"]=_count=wasmExports["c"]}var wasmImports={};var wasmExports=await createWasm();function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}
2;return moduleRtn}export default Primes;
diff --git a/src/talks/wasm/examples/3-primes/primes.wasm b/src/talks/wasm/examples/3-primes/primes.wasm
new file mode 100755
index 0000000..8c6bee8
--- /dev/null
+++ b/src/talks/wasm/examples/3-primes/primes.wasm
Binary files differ
diff --git a/src/talks/wasm/examples/3-primes/script.js b/src/talks/wasm/examples/3-primes/script.js
new file mode 100644
index 0000000..ccb0700
--- /dev/null
+++ b/src/talks/wasm/examples/3-primes/script.js
@@ -0,0 +1,38 @@
1import Primes from "./primes.mjs";
2
3var primes = await Primes();
4
5var input = document.getElementById("input");
6var wasm_button = document.getElementById("wasmButton");
7var js_button = document.getElementById("jsButton");
8var resultText = document.getElementById("resultText");
9
10var count_wasm = (n) => primes._count(n);
11
12var is_prime = (n) => {
13 if (n < 2)
14 return false;
15 for (var i = 2; i * i <= n; i++)
16 if (n % i == 0)
17 return false;
18 return true;
19}
20
21var count_js = (n) => {
22 var count = 0;
23 for (var i = 0; i < n; i++)
24 count += is_prime(i);
25 return count;
26}
27
28var timerun = (count, tag) => {
29 var n = Number(input.value);
30 var msg = "Counting primes less than " + n + " with " + tag;
31 console.time(msg);
32 var c = count(n);
33 console.timeEnd(msg);
34 resultText.innerText = "There are " + c + " primes less than " + n;
35}
36
37wasm_button.addEventListener("click", () => timerun(count_wasm, "WASM"));
38js_button.addEventListener("click", () => timerun(count_js, "JS"));
diff --git a/src/talks/wasm/examples/4-primes-sieve/index.html.raw b/src/talks/wasm/examples/4-primes-sieve/index.html.raw
new file mode 100644
index 0000000..48e84e0
--- /dev/null
+++ b/src/talks/wasm/examples/4-primes-sieve/index.html.raw
@@ -0,0 +1,18 @@
1<!doctype html>
2<html lang="en-US">
3<head>
4 <meta charset="utf-8" />
5 <meta name="viewport" content="width=device-width" />
6 <title>Count prime numbers (sieve)</title>
7 <script src="./script.js" type="module" defer></script>
8</head>
9
10<body>
11 <input id="input" />
12 <button id="wasmButton">Count with WASM</button>
13 <button id="jsButton">Count with JS</button>
14 <br />
15 <p id="resultText"></p>
16</body>
17
18</html>
diff --git a/src/talks/wasm/examples/4-primes-sieve/mime.txt b/src/talks/wasm/examples/4-primes-sieve/mime.txt
new file mode 100644
index 0000000..6a9a425
--- /dev/null
+++ b/src/talks/wasm/examples/4-primes-sieve/mime.txt
@@ -0,0 +1 @@
text/javascript mjs
diff --git a/src/talks/wasm/examples/4-primes-sieve/primes.c b/src/talks/wasm/examples/4-primes-sieve/primes.c
new file mode 100644
index 0000000..3f86864
--- /dev/null
+++ b/src/talks/wasm/examples/4-primes-sieve/primes.c
@@ -0,0 +1,23 @@
1#include <stdlib.h>
2#include <string.h>
3
4int count(int n) {
5 if (n < 2)
6 return 0;
7
8 /* Prepare sieve array */
9 char *notprime = malloc(n+2);
10 memset(notprime, 0, n+2);
11
12 int count = 0;
13 for (int i = 2; i < n; i++) {
14 count += 1 - notprime[i];
15 for (int j = 2*i; j < n; j += i)
16 notprime[j] = 1;
17 }
18
19 /* Manual memory management is fun :D */
20 free(notprime);
21
22 return count;
23}
diff --git a/src/talks/wasm/examples/4-primes-sieve/primes.mjs b/src/talks/wasm/examples/4-primes-sieve/primes.mjs
new file mode 100644
index 0000000..952cdb5
--- /dev/null
+++ b/src/talks/wasm/examples/4-primes-sieve/primes.mjs
@@ -0,0 +1,2 @@
1async function Primes(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&process.versions?.node&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");var require=createRequire(import.meta.url)}var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");if(_scriptName.startsWith("file:")){scriptDirectory=require("path").dirname(require("url").fileURLToPath(_scriptName))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var isFileURI=filename=>filename.startsWith("file://");var readyPromiseResolve,readyPromiseReject;var wasmMemory;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["c"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("primes.wasm")}return new URL("primes.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["b"];updateMemoryViews();assignWasmExports(wasmExports);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}var _count;function assignWasmExports(wasmExports){Module["_count"]=_count=wasmExports["d"]}var wasmImports={a:_emscripten_resize_heap};var wasmExports=await createWasm();function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}
2;return moduleRtn}export default Primes;
diff --git a/src/talks/wasm/examples/4-primes-sieve/primes.wasm b/src/talks/wasm/examples/4-primes-sieve/primes.wasm
new file mode 100755
index 0000000..b5a5d99
--- /dev/null
+++ b/src/talks/wasm/examples/4-primes-sieve/primes.wasm
Binary files differ
diff --git a/src/talks/wasm/examples/4-primes-sieve/script.js b/src/talks/wasm/examples/4-primes-sieve/script.js
new file mode 100644
index 0000000..8041e5b
--- /dev/null
+++ b/src/talks/wasm/examples/4-primes-sieve/script.js
@@ -0,0 +1,38 @@
1import Primes from "./primes.mjs";
2
3var primes = await Primes();
4
5var input = document.getElementById("input");
6var wasm_button = document.getElementById("wasmButton");
7var js_button = document.getElementById("jsButton");
8var resultText = document.getElementById("resultText");
9
10var count_wasm = (n) => primes._count(n);
11
12var count_js = (n) => {
13 if (n < 2)
14 return 0;
15
16 var notprime = new Uint8Array(n+2);
17
18 var count = 0;
19 for (var i = 2; i < n; i++) {
20 count += 1 - notprime[i];
21 for (var j = 2*i; j < n; j += i)
22 notprime[j] = 1;
23 }
24
25 return count;
26}
27
28var timerun = (count, tag) => {
29 var n = Number(input.value);
30 var msg = "Counting primes less than " + n + " with " + tag;
31 console.time(msg);
32 var c = count(n);
33 console.timeEnd(msg);
34 resultText.innerText = "There are " + c + " primes less than " + n;
35}
36
37wasm_button.addEventListener("click", () => timerun(count_wasm, "WASM"));
38js_button.addEventListener("click", () => timerun(count_js, "JS"));
diff --git a/src/talks/wasm/examples/5-matrix-multiplication/index.html.raw b/src/talks/wasm/examples/5-matrix-multiplication/index.html.raw
new file mode 100644
index 0000000..f011ff5
--- /dev/null
+++ b/src/talks/wasm/examples/5-matrix-multiplication/index.html.raw
@@ -0,0 +1,17 @@
1<!doctype html>
2<html lang="en-US">
3<head>
4 <meta charset="utf-8" />
5 <meta name="viewport" content="width=device-width" />
6 <title>Matrix multiplication</title>
7 <script src="./script.js" type="module" defer></script>
8</head>
9
10<body>
11 <p>Number of iterations:</p>
12 <input id="input">
13 <button id="wasmButton">WASM</button>
14 <button id="jsButton">JS</button>
15</body>
16
17</html>
diff --git a/src/talks/wasm/examples/5-matrix-multiplication/mime.txt b/src/talks/wasm/examples/5-matrix-multiplication/mime.txt
new file mode 100644
index 0000000..6a9a425
--- /dev/null
+++ b/src/talks/wasm/examples/5-matrix-multiplication/mime.txt
@@ -0,0 +1 @@
text/javascript mjs
diff --git a/src/talks/wasm/examples/5-matrix-multiplication/mm.c b/src/talks/wasm/examples/5-matrix-multiplication/mm.c
new file mode 100644
index 0000000..c421815
--- /dev/null
+++ b/src/talks/wasm/examples/5-matrix-multiplication/mm.c
@@ -0,0 +1,116 @@
1double r[100][100];
2double a[100][100] = {
3 { 1.379840, 1.457320, 0.526439, 0.577540, 1.325047, 0.615534, 1.488805, 1.340402, 0.657965, 0.544603, 1.177794, 0.615106, 1.049290, 0.729110, 0.687418, 1.147739, 0.527317, 1.229680, 1.377948, 0.617709, 1.001274, 1.494480, 1.195501, 0.715408, 1.220561, 1.469425, 0.725729, 1.438900, 1.245707, 0.917358, 0.925189, 1.423738, 1.291772, 0.671184, 1.377902, 0.661028, 1.041261, 0.670230, 1.000563, 0.526977, 0.532437, 1.273195, 1.072421, 1.184013, 1.460246, 1.235356, 1.018112, 0.564939, 0.974447, 1.236509, 1.469052, 1.487908, 0.876303, 0.813966, 1.427184, 0.903374, 0.906213, 1.208934, 1.422306, 1.333670, 1.226891, 0.639821, 1.049111, 1.046548, 1.017850, 1.250483, 1.139942, 0.769027, 1.204658, 0.719435, 1.113815, 1.027180, 0.919597, 1.043859, 0.835385, 0.615022, 0.631125, 0.516152, 0.781693, 1.329323, 0.791999, 0.929991, 1.478632, 0.742707, 1.183782, 0.932590, 0.896661, 1.222739, 1.357448, 0.896553, 1.418801, 0.784182, 1.477027, 0.719958, 1.007257, 1.108635, 1.227305, 1.225167, 1.399998, 0.909951 },
4 { 0.770320, 1.088820, 0.806404, 1.191327, 0.524736, 1.247941, 0.628279, 0.807087, 1.229163, 0.833273, 0.921270, 1.300579, 0.970054, 1.102469, 0.972525, 1.307489, 0.713645, 0.756865, 1.301716, 0.834530, 0.836716, 0.769485, 0.757780, 0.874359, 1.081706, 0.846308, 0.981992, 1.120864, 1.198629, 1.051810, 1.036825, 0.908976, 0.607560, 0.772128, 1.129458, 1.487689, 1.419089, 0.772358, 0.908206, 1.355476, 0.544880, 0.651748, 0.881704, 0.512456, 1.225989, 1.432957, 0.538338, 1.104897, 1.180066, 0.803559, 0.530221, 1.220832, 1.327059, 1.431481, 0.520253, 1.472932, 0.635210, 1.046532, 1.077470, 1.476779, 0.721953, 0.719889, 1.473898, 1.476609, 1.308158, 1.248389, 0.955689, 0.922675, 0.863480, 1.363027, 1.200162, 1.466177, 1.110155, 1.499118, 1.106165, 0.600838, 1.347230, 0.920781, 1.166626, 1.135420, 0.636591, 0.777398, 0.662020, 1.032416, 1.169259, 1.016769, 0.768522, 1.317541, 0.675173, 1.259698, 0.643791, 0.617781, 0.871839, 1.007753, 0.810626, 0.964750, 1.432919, 0.728661, 0.834531, 0.547773 },
5 { 1.022921, 1.455382, 0.573229, 0.555113, 1.106770, 1.031391, 1.183102, 1.189079, 1.236601, 1.030885, 1.035218, 1.043181, 1.405762, 1.093131, 1.195988, 0.501043, 0.809528, 1.242215, 0.776740, 1.348204, 0.560691, 1.109206, 1.076060, 0.999778, 0.736757, 1.078752, 1.211490, 0.755465, 0.553171, 1.267461, 1.492598, 0.693444, 0.985580, 1.350095, 0.948895, 0.914189, 0.588333, 1.093783, 1.488613, 1.462763, 0.702218, 0.916851, 0.917597, 1.015197, 0.946620, 1.448743, 1.077418, 1.340172, 1.163085, 1.265050, 0.544247, 1.487913, 0.840452, 1.128725, 0.654062, 1.340700, 0.738564, 0.913149, 0.581868, 0.805693, 0.994062, 1.408999, 1.324861, 0.990977, 0.535459, 0.791653, 1.189904, 1.145955, 0.888481, 1.464574, 1.250380, 1.119160, 0.604171, 0.977863, 1.403026, 0.978366, 1.134271, 0.649736, 1.162700, 0.941622, 1.479374, 1.325376, 1.161065, 0.553819, 1.305192, 1.366794, 0.819830, 0.711718, 1.375267, 0.562531, 1.037438, 1.084734, 1.350641, 1.493729, 1.131981, 1.031179, 1.388974, 1.206645, 0.849194, 0.648684 },
6 { 0.749634, 0.837431, 0.735919, 1.044205, 1.462659, 0.626831, 0.629570, 1.100217, 0.670899, 0.989660, 1.291640, 1.132597, 0.724378, 1.066016, 1.421987, 1.026298, 1.023056, 1.140343, 1.332638, 0.547305, 0.932998, 0.994599, 0.757525, 1.166217, 0.867773, 1.410006, 1.237011, 0.535154, 0.862225, 1.229949, 1.316465, 1.354578, 1.196442, 0.792996, 0.952346, 0.931531, 0.883668, 0.700919, 0.770030, 1.019247, 0.938733, 1.180407, 1.315777, 0.679926, 0.814807, 1.388835, 0.719369, 0.853766, 0.694034, 0.685061, 0.984125, 0.593272, 1.092776, 0.711073, 1.372115, 0.662872, 0.651995, 0.764461, 0.887624, 0.585551, 0.787700, 1.499448, 1.328319, 0.832012, 1.312053, 0.931837, 0.897224, 1.169771, 1.231099, 0.940722, 1.186465, 1.252034, 1.055956, 0.664915, 1.253323, 1.200115, 0.839711, 1.078984, 1.409160, 1.116431, 1.368128, 0.802220, 0.932299, 0.782206, 1.424530, 0.911095, 0.622881, 1.312137, 1.069809, 0.855654, 1.161587, 1.218958, 1.314299, 1.410139, 0.538026, 1.171283, 1.022315, 1.010163, 1.035148, 0.908867 },
7 { 0.919022, 1.398405, 1.233300, 0.989714, 1.171597, 0.556226, 0.767237, 0.842570, 1.283894, 1.361038, 1.276869, 0.901957, 1.076977, 0.712155, 1.394663, 0.602114, 1.420942, 1.339476, 1.027372, 1.492429, 0.922964, 1.174507, 0.816736, 0.787671, 1.464476, 1.174591, 0.501438, 0.728566, 1.041567, 1.072727, 1.380835, 0.500009, 0.944341, 1.170062, 1.242017, 0.523942, 0.517806, 0.854164, 0.915983, 1.322707, 0.977622, 1.055492, 0.739522, 0.704814, 0.663376, 1.198913, 1.353763, 1.040212, 1.390117, 1.381388, 1.486360, 1.351212, 1.017516, 1.068210, 0.930474, 0.585811, 0.850009, 1.066197, 1.050053, 1.365709, 0.789072, 0.921174, 0.546163, 1.106693, 1.270097, 0.531404, 1.051183, 1.134865, 1.481603, 0.650752, 0.832732, 0.524631, 1.221988, 1.441946, 1.221030, 0.908809, 0.720923, 1.491407, 0.946255, 1.021528, 1.259394, 0.705073, 1.292337, 0.704099, 0.871839, 1.034023, 0.583857, 0.794030, 1.219492, 1.123693, 0.672122, 0.731255, 0.746137, 1.121423, 0.780892, 0.574303, 0.743165, 1.258452, 1.362189, 1.250955 },
8 { 0.977071, 0.552201, 1.080643, 0.539261, 1.310048, 0.660761, 1.294630, 1.478950, 0.772533, 0.536887, 1.150149, 1.104056, 0.682505, 0.883728, 1.041299, 0.680478, 1.154212, 1.474394, 0.630695, 1.281055, 1.369207, 1.186527, 1.311456, 0.516192, 1.088244, 0.605104, 1.088825, 0.780569, 1.122989, 0.737886, 1.378204, 1.371106, 1.435991, 1.398055, 1.043914, 1.064240, 0.748594, 0.623393, 1.095334, 1.352523, 1.209754, 0.720605, 1.298917, 1.139826, 1.422846, 1.398755, 1.284136, 1.495882, 1.484167, 0.745682, 1.371278, 1.487349, 1.309574, 1.270554, 1.039483, 0.587182, 1.293170, 0.917281, 1.062024, 0.500492, 0.958083, 1.337678, 0.836751, 0.731072, 0.563460, 0.536270, 1.143554, 1.068031, 0.758510, 1.001835, 1.214302, 1.197533, 1.482870, 1.012942, 1.250227, 1.241036, 0.931513, 1.173656, 1.446194, 1.006231, 1.453459, 0.619180, 1.345502, 1.194686, 1.144477, 0.664117, 1.224949, 1.486615, 0.685459, 0.571111, 1.488568, 0.637279, 0.546399, 1.266292, 1.170286, 1.465348, 1.478842, 1.135760, 0.838267, 0.943116 },
9 { 1.015083, 0.700566, 1.140584, 0.622905, 1.183881, 1.034252, 1.250132, 0.535143, 1.001722, 0.659014, 1.139675, 0.619417, 0.708765, 1.269046, 1.074667, 0.695879, 1.494827, 0.884795, 1.248646, 1.112801, 1.182819, 0.621280, 1.330263, 1.010371, 1.389876, 0.936344, 1.190258, 0.826974, 0.956361, 1.202610, 0.917295, 0.911959, 0.913732, 1.365238, 0.747602, 0.527213, 1.344037, 0.830859, 1.295969, 1.296002, 0.794176, 0.963685, 0.842188, 1.045622, 0.565362, 0.766451, 0.509818, 0.821331, 0.613092, 0.856703, 0.655280, 0.738894, 1.324155, 0.504408, 0.643090, 0.929205, 1.183479, 1.043239, 1.291563, 1.247031, 1.474089, 0.648675, 1.342316, 0.609177, 1.175784, 0.910637, 0.686887, 0.693975, 1.414160, 0.792404, 1.198378, 1.250770, 1.177739, 0.577907, 1.338957, 1.409046, 0.545822, 1.159595, 1.031545, 0.609840, 0.789389, 0.519010, 1.058236, 0.991757, 1.217851, 0.553175, 0.632851, 1.401277, 1.050191, 0.506624, 0.992570, 0.981058, 1.430146, 1.354304, 0.997046, 1.153982, 1.123613, 1.473945, 0.749938, 1.213157 },
10 { 1.405982, 1.197478, 0.637058, 0.805892, 1.305976, 0.977344, 1.048013, 0.741212, 0.868960, 1.005337, 0.627931, 0.598499, 0.821601, 1.314121, 1.254795, 0.680376, 0.758433, 0.519533, 0.993518, 1.002461, 1.346782, 0.819196, 1.429711, 0.597831, 0.895030, 0.934926, 0.986203, 0.773401, 0.800336, 1.311236, 0.825662, 0.502791, 0.695289, 0.815667, 0.828792, 1.202503, 0.523077, 0.640797, 0.937877, 1.279229, 1.065799, 0.572868, 1.465550, 1.098656, 0.678538, 0.806286, 0.815742, 1.172072, 0.987045, 0.704586, 0.980271, 0.518117, 1.282374, 0.779172, 1.026949, 1.380595, 1.308772, 0.837549, 0.778556, 0.636199, 1.241954, 1.331912, 1.473157, 1.133607, 0.891569, 0.834186, 1.151385, 1.025913, 0.725175, 0.587760, 1.401914, 0.561164, 0.580885, 0.828233, 1.089123, 0.747066, 1.229951, 1.293622, 0.928510, 1.195056, 0.580756, 1.023644, 0.661421, 1.015302, 0.624562, 0.531619, 1.478040, 1.399590, 1.020078, 0.866674, 0.877655, 0.731070, 1.086416, 0.745452, 1.423449, 1.042301, 1.078667, 1.436047, 1.266505, 0.980906 },
11 { 1.040001, 0.820632, 1.328963, 1.117734, 0.791812, 0.613753, 0.585863, 1.020689, 1.234116, 0.566506, 0.527113, 1.060420, 1.130146, 0.531301, 1.016703, 1.475989, 1.096835, 0.704596, 1.071727, 0.788901, 1.155053, 1.253654, 0.955651, 0.537396, 1.229116, 0.586249, 0.521743, 0.865366, 0.503866, 1.495096, 0.513134, 0.631291, 0.549035, 1.242647, 0.840429, 1.129949, 1.378488, 0.850183, 0.748405, 1.160810, 1.454995, 0.671026, 1.102481, 1.303308, 0.591965, 0.586369, 1.224397, 0.567501, 1.204023, 1.088723, 1.461092, 0.891815, 1.277013, 1.302039, 0.988192, 0.903902, 1.212233, 0.536308, 1.110406, 0.710907, 1.046412, 1.376641, 1.423190, 0.758661, 0.555954, 1.179031, 0.548985, 1.142201, 0.762798, 0.844964, 0.802316, 1.254491, 1.106046, 1.035106, 1.253370, 1.455657, 1.461866, 1.185260, 0.834948, 0.702811, 0.756332, 0.825367, 0.716756, 0.767364, 1.365454, 1.270018, 1.103650, 1.362612, 1.342970, 0.763540, 1.086376, 1.356383, 1.428927, 1.273614, 1.072929, 1.291103, 1.002316, 1.275845, 1.239080, 0.525129 },
12 { 0.852458, 1.012163, 1.094343, 0.626270, 0.712085, 1.453596, 0.719229, 0.880382, 1.445201, 1.199101, 0.826680, 0.761592, 1.255516, 1.039536, 0.663317, 0.678507, 0.624810, 1.101728, 1.360986, 1.164603, 0.694327, 1.099941, 1.277279, 0.723458, 1.058843, 0.658423, 1.143374, 0.826423, 1.029169, 1.383051, 0.947076, 1.010066, 0.951579, 0.599619, 0.663565, 0.912163, 1.309274, 0.873070, 1.341813, 0.859951, 1.051781, 0.618223, 0.697698, 0.587372, 1.178858, 0.602993, 1.479577, 0.935205, 0.730836, 0.741055, 1.325569, 0.692586, 0.967676, 0.695391, 0.580394, 1.157045, 1.405592, 1.058926, 1.338580, 0.987563, 0.734112, 1.031516, 1.001340, 1.269465, 0.715089, 1.492873, 1.299185, 0.694653, 1.058834, 1.132656, 0.936608, 1.261128, 0.951297, 1.061960, 0.539656, 1.208357, 0.727034, 1.033661, 1.165124, 1.278480, 0.931361, 0.692748, 0.785445, 0.974163, 0.915073, 0.525015, 0.826581, 0.626220, 1.209535, 0.920672, 0.807524, 1.061286, 1.463323, 0.546471, 1.043217, 0.868291, 1.370899, 0.830769, 0.854478, 1.170617 },
13 { 0.616517, 1.443055, 1.026026, 1.206694, 0.560104, 1.293162, 1.265195, 0.543083, 1.265609, 0.860181, 1.388395, 0.984564, 0.682433, 0.593328, 1.074492, 1.251490, 0.809722, 0.689954, 1.051594, 1.378881, 1.322507, 1.445788, 0.949544, 1.066709, 0.530507, 1.381566, 0.845323, 0.524806, 1.260120, 1.432854, 1.301013, 1.151888, 1.470194, 1.232427, 1.468055, 1.227202, 1.279278, 1.386881, 1.238219, 0.521631, 1.361035, 1.112702, 0.838180, 1.228488, 0.929345, 1.222863, 0.967889, 1.193393, 1.471730, 1.435504, 1.289713, 0.562960, 1.098829, 1.485166, 1.487027, 0.833199, 0.651152, 1.147549, 0.869748, 0.858988, 1.327363, 0.768325, 0.878441, 0.593166, 0.509079, 0.936741, 0.751060, 0.902366, 1.227019, 0.766698, 1.497274, 0.797546, 0.799705, 0.912254, 1.104385, 0.501824, 1.011509, 1.214150, 0.895176, 0.992651, 0.580613, 0.997013, 0.848914, 1.118351, 0.815626, 0.528297, 1.234113, 0.734467, 1.031996, 1.044361, 1.378018, 1.236396, 1.402341, 1.192375, 0.711524, 1.185566, 1.479372, 1.170364, 1.168047, 0.771651 },
14 { 1.035645, 0.752043, 0.682883, 0.806710, 0.614566, 1.369655, 1.277805, 0.752415, 0.899997, 0.833801, 1.052429, 0.577319, 0.672101, 1.104752, 1.427363, 1.364322, 1.059223, 0.660182, 1.245092, 0.620931, 1.257429, 0.532960, 1.186581, 0.775032, 0.874266, 1.010928, 1.376006, 0.641199, 0.859200, 1.287133, 1.464968, 0.704744, 0.697641, 0.840731, 0.586551, 0.516134, 1.424682, 1.206258, 1.118910, 1.370345, 1.101806, 1.397061, 0.857233, 1.472652, 0.850085, 0.923462, 1.394293, 0.756729, 0.546220, 0.574689, 1.306560, 0.744991, 1.463906, 0.941980, 0.939255, 1.255091, 1.218636, 1.230149, 1.457333, 0.630926, 0.709858, 0.846090, 1.263623, 1.277463, 1.370851, 0.835641, 0.969697, 1.104382, 1.069412, 0.971201, 0.580095, 0.806637, 0.952442, 1.201108, 1.427995, 1.099506, 0.819469, 0.974739, 0.864016, 0.824615, 1.163138, 1.483070, 0.812258, 0.871926, 1.086473, 1.386947, 1.034206, 0.872092, 1.218277, 1.283519, 1.333427, 1.404546, 1.044582, 0.561266, 0.689110, 1.066559, 0.644311, 1.221741, 0.610132, 0.852129 },
15 { 0.618663, 1.336078, 1.368165, 0.661169, 0.866506, 0.690724, 0.731951, 0.508812, 1.059013, 0.757197, 1.492504, 1.014257, 1.267113, 0.506423, 1.055350, 0.825293, 0.879469, 1.471683, 0.793992, 0.533054, 1.480807, 0.754957, 1.336918, 1.125689, 0.736081, 1.393862, 1.032447, 1.354615, 0.543344, 0.515142, 1.440051, 1.320628, 1.081268, 0.520299, 1.021305, 1.056526, 0.510438, 1.360632, 0.936504, 1.088227, 0.805880, 0.561505, 1.356912, 0.730384, 1.437388, 0.993533, 0.514120, 0.670090, 0.709688, 0.630127, 1.367373, 1.128299, 1.030564, 1.355391, 1.239998, 1.175158, 0.800300, 0.719165, 0.941539, 1.441110, 0.554317, 1.362435, 1.170083, 1.396863, 1.373768, 0.895597, 0.640745, 1.029234, 1.010758, 1.199022, 0.754428, 1.280655, 1.036356, 0.964284, 0.628751, 0.851114, 1.449296, 1.047135, 0.771612, 0.514838, 0.766721, 1.124031, 0.929417, 1.499994, 1.282911, 0.980488, 0.761096, 0.608985, 0.831098, 0.594824, 1.383824, 0.592297, 1.465586, 1.171000, 1.199365, 1.135142, 1.263273, 1.298987, 1.351476, 1.109735 },
16 { 0.949717, 0.514730, 0.831522, 1.105646, 1.076431, 1.289812, 1.471717, 1.330824, 1.057036, 1.065231, 0.563560, 0.820464, 0.753345, 0.710041, 0.975967, 1.379326, 1.441037, 0.937239, 1.268232, 1.358517, 1.292954, 0.683278, 0.528327, 1.116240, 1.343968, 1.380012, 1.472979, 0.620119, 1.223771, 1.188494, 0.706674, 0.693461, 1.498639, 1.255514, 0.975632, 0.879119, 0.664607, 0.584431, 1.123098, 1.461201, 1.012226, 1.026015, 1.229114, 0.988348, 0.961873, 1.359427, 0.956140, 1.422604, 1.425922, 0.901882, 1.276091, 1.487913, 1.155353, 1.079338, 1.062339, 1.274887, 1.386595, 0.751009, 0.667001, 0.646474, 1.004071, 1.213665, 1.242443, 0.789910, 1.394605, 0.937931, 1.178310, 1.003996, 1.091854, 1.214377, 0.533779, 0.634530, 1.365652, 1.058563, 0.636683, 0.816513, 1.469335, 0.693524, 0.961351, 1.470187, 0.526375, 1.013957, 1.442304, 0.633400, 0.838306, 0.573759, 1.169509, 0.982836, 1.212050, 1.151487, 1.318048, 0.874149, 0.961943, 1.342736, 1.152057, 1.314568, 0.658368, 1.131554, 0.533313, 0.560492 },
17 { 0.894394, 0.534669, 1.445673, 1.064550, 0.690233, 1.395785, 0.542153, 1.163745, 0.845369, 0.879235, 0.564344, 0.839402, 0.595677, 1.341009, 0.713978, 0.655409, 1.226168, 1.445491, 0.894321, 0.588291, 0.855839, 1.220591, 0.754797, 0.788673, 0.866265, 0.511912, 1.491235, 1.383211, 0.758327, 1.353588, 0.511555, 1.201987, 0.637992, 1.485950, 1.164965, 1.111934, 1.303277, 0.588901, 1.348737, 1.031711, 0.704409, 1.395345, 0.753160, 0.763983, 1.112902, 1.165360, 0.539436, 1.412235, 1.231251, 1.017793, 0.647978, 0.818132, 0.871954, 0.546996, 1.375123, 1.486646, 0.928391, 1.257972, 1.489719, 0.667652, 1.227663, 1.192517, 0.809811, 1.336241, 1.113290, 0.771042, 0.511071, 0.566225, 1.355315, 1.190884, 1.209532, 1.193295, 1.216941, 1.413085, 0.609676, 1.057956, 0.979763, 1.093288, 0.757852, 0.724416, 1.475834, 1.257406, 0.544063, 0.513977, 1.108923, 1.416123, 0.598522, 0.718665, 0.641836, 1.455411, 1.257997, 0.822163, 0.801038, 1.111105, 1.062185, 1.271582, 1.418117, 1.120094, 1.170226, 0.772968 },
18 { 1.094654, 0.909249, 0.698803, 1.112162, 1.278420, 0.712791, 0.661049, 1.252611, 0.809695, 1.138021, 0.578689, 1.311752, 1.066878, 0.623708, 1.364311, 1.477678, 0.761498, 1.073827, 0.687298, 1.474617, 1.386571, 1.269925, 1.457383, 1.153422, 1.052444, 0.643296, 1.383710, 0.912269, 0.904742, 0.534924, 0.505871, 1.378533, 0.975227, 0.579491, 1.351738, 1.470035, 0.626863, 1.392503, 1.268417, 0.838357, 1.177199, 1.091441, 0.664046, 1.337755, 0.722195, 0.740199, 1.498992, 0.651546, 0.525625, 0.813742, 1.350180, 0.579933, 0.882205, 1.294477, 1.173377, 0.762886, 1.278912, 0.973848, 1.011046, 0.510022, 0.901065, 1.493243, 0.517579, 0.925782, 0.707881, 1.332174, 1.379673, 1.222175, 1.289407, 1.467325, 0.580161, 0.919327, 0.892668, 0.911077, 0.936426, 0.831706, 0.588626, 1.490671, 0.878156, 1.045652, 0.761242, 1.300258, 1.203702, 1.018772, 0.987196, 1.388463, 0.957461, 0.724833, 1.175080, 1.044391, 1.329461, 1.353965, 1.397004, 0.673297, 1.038934, 0.751710, 1.097459, 1.477077, 1.170324, 1.139129 },
19 { 0.573377, 1.055942, 0.502463, 1.157195, 1.232144, 0.807219, 0.565860, 1.215637, 1.367717, 1.015482, 1.051443, 0.988276, 1.279255, 0.600234, 0.607690, 1.417625, 1.255950, 1.394105, 0.922424, 1.068400, 1.445676, 1.025523, 1.355517, 0.930260, 1.252279, 1.195155, 0.628339, 0.929404, 1.204930, 0.775309, 1.126973, 0.736514, 1.120344, 0.644657, 0.540436, 0.905497, 1.103201, 0.546880, 1.377595, 1.064152, 0.524782, 1.117157, 0.540668, 1.103237, 0.528638, 0.754039, 1.155532, 0.741591, 0.902295, 0.949123, 1.300465, 1.240965, 0.864461, 0.822150, 1.346924, 1.313824, 1.262898, 0.903507, 0.609306, 1.406028, 0.930912, 1.197258, 0.878371, 1.420981, 1.247879, 1.273837, 1.432853, 0.538973, 0.988217, 0.977710, 1.171301, 0.585110, 0.587200, 0.913916, 0.931225, 1.362692, 1.020358, 0.878893, 0.606028, 1.404739, 1.116511, 1.341880, 0.752649, 1.291709, 0.534092, 1.468243, 0.656194, 1.102179, 1.192849, 0.970220, 0.633339, 1.483856, 1.496053, 1.133030, 1.066856, 0.752588, 1.059472, 0.755514, 1.404185, 1.180930 },
20 { 0.507156, 0.856665, 1.490896, 1.217472, 1.236834, 0.915338, 1.202186, 0.721066, 0.779526, 1.261272, 1.027980, 0.716773, 0.692263, 1.101181, 0.766624, 0.895857, 1.355746, 0.868830, 1.288894, 0.766911, 0.512991, 0.540944, 1.218274, 0.812943, 0.574863, 0.852288, 0.538374, 1.026084, 0.815323, 0.530770, 1.107382, 1.376333, 1.420501, 0.540373, 1.173693, 0.694341, 0.725795, 1.286806, 0.726304, 1.056273, 1.184513, 0.654313, 0.950082, 1.252721, 0.634493, 0.672434, 0.610553, 0.501763, 1.407276, 0.779915, 1.333954, 0.747588, 0.874763, 0.997523, 1.219118, 0.637742, 0.848946, 0.774052, 1.121896, 1.092341, 1.294883, 1.429779, 0.649028, 1.131258, 0.721951, 0.678782, 1.138279, 0.534505, 0.595932, 1.392442, 0.640936, 1.067260, 1.031528, 0.755401, 0.597741, 1.154729, 0.916791, 0.808975, 1.325047, 1.260351, 1.155946, 0.805610, 0.818695, 0.845248, 1.308146, 1.312051, 0.525203, 0.813999, 0.542705, 0.776254, 1.044531, 0.964142, 0.596806, 0.523298, 1.196557, 1.091069, 1.449676, 0.949618, 0.660993, 0.962601 },
21 { 1.127201, 1.178125, 0.953694, 0.970692, 0.807285, 1.389709, 1.299479, 1.474478, 1.378179, 1.499286, 0.503116, 1.349827, 0.963865, 1.031846, 0.814196, 0.806542, 0.766297, 1.174684, 1.471588, 0.929876, 0.961361, 0.670819, 1.343956, 1.357844, 0.723206, 0.686968, 1.298598, 0.678060, 1.356131, 0.979183, 0.714921, 1.391575, 1.447226, 1.417858, 0.564270, 0.976300, 0.936759, 1.285196, 1.169306, 1.224974, 0.923705, 1.248839, 0.954538, 0.877812, 1.429656, 0.617240, 0.551824, 0.797845, 0.968579, 1.424941, 0.574983, 1.474173, 0.625376, 1.158667, 0.555669, 1.464197, 0.967170, 0.932571, 0.701657, 0.880713, 0.883021, 1.364931, 0.993488, 1.465625, 0.788107, 1.273592, 1.086732, 0.800203, 0.944675, 0.840713, 0.688199, 1.066932, 0.655072, 0.887627, 0.616309, 1.313399, 1.156383, 0.666851, 1.346556, 1.085754, 1.308911, 1.136696, 0.670242, 0.832520, 0.852418, 0.575563, 1.047735, 0.845469, 0.844136, 0.520253, 1.217176, 1.381074, 1.087089, 1.250975, 1.207621, 0.704615, 0.949347, 1.489477, 0.891151, 1.075852 },
22 { 0.803988, 0.592191, 0.936936, 0.785377, 0.531247, 0.538478, 1.059376, 1.103463, 0.788163, 1.320063, 0.639634, 0.988259, 0.594844, 1.329344, 0.814903, 1.406562, 1.044747, 0.692758, 1.218708, 0.812738, 1.419730, 0.638070, 1.203164, 1.409187, 1.228318, 0.764911, 0.848624, 1.163128, 1.235081, 1.255889, 0.867932, 0.606968, 0.860820, 0.841432, 1.239716, 1.401557, 1.128356, 1.308716, 0.876111, 0.511910, 1.099047, 1.289450, 0.959950, 1.482284, 1.285539, 1.363555, 1.038224, 0.777216, 1.166660, 0.828907, 0.530141, 0.592273, 0.813610, 0.741881, 1.308770, 1.316062, 0.745095, 1.439703, 0.878080, 0.717879, 0.877578, 0.556963, 1.405707, 0.676299, 0.957472, 0.890305, 1.231392, 1.048016, 1.063083, 1.195917, 1.188201, 1.006246, 0.988548, 1.315875, 0.662577, 0.851969, 0.961593, 0.543026, 0.603634, 0.850110, 1.116670, 1.386684, 1.120321, 1.101843, 0.549506, 1.025287, 0.839529, 0.606021, 0.860794, 1.150215, 0.924447, 0.808559, 0.575717, 0.743997, 0.955073, 0.528279, 1.480624, 1.319889, 1.032342, 1.449156 },
23 { 1.064925, 1.165930, 0.629421, 0.672690, 0.561317, 1.072269, 1.021905, 1.083695, 1.476355, 1.021207, 0.537966, 1.048662, 0.891155, 1.132750, 1.161596, 0.641663, 0.650858, 0.606814, 0.501783, 1.085964, 0.882020, 0.635081, 1.020970, 1.185886, 1.117703, 1.289773, 0.839498, 0.925069, 0.957820, 1.151486, 0.960285, 0.665684, 1.003754, 0.533236, 1.227916, 1.157796, 1.171234, 1.159887, 1.258029, 0.561410, 1.091964, 1.320706, 1.446026, 1.410930, 0.599671, 1.289452, 0.853614, 1.152244, 1.192090, 1.325902, 0.932180, 1.123548, 1.488662, 0.913823, 1.232059, 1.366630, 0.828670, 1.104580, 1.319255, 1.361925, 0.629022, 1.054307, 1.028735, 1.042474, 1.070028, 0.908594, 1.485243, 0.832180, 1.151813, 0.571739, 0.554578, 0.610841, 0.767849, 1.390230, 1.054069, 1.483479, 1.194211, 0.992158, 0.889873, 0.802495, 1.386267, 1.297668, 1.006065, 0.910000, 0.839246, 1.244821, 0.981511, 1.230819, 1.225688, 1.377085, 0.729216, 1.103160, 1.124075, 0.629982, 1.356577, 1.244020, 1.132332, 1.108234, 1.272118, 1.042909 },
24 { 1.262197, 1.479594, 1.126217, 0.912587, 1.105467, 0.575392, 0.918194, 1.239556, 1.438972, 0.657223, 1.242838, 0.610069, 0.578638, 0.712605, 1.256524, 1.284622, 0.797258, 1.131761, 1.463578, 0.844352, 0.595925, 1.224777, 0.859633, 1.475942, 1.298109, 1.364806, 0.749268, 1.348422, 0.578226, 0.796614, 0.570095, 1.359919, 1.246286, 1.368591, 0.840059, 1.298973, 0.643778, 0.686597, 0.859047, 1.237056, 0.742673, 0.747815, 1.247792, 1.290162, 0.756777, 0.563507, 0.863288, 0.682509, 1.080180, 1.133754, 1.321960, 1.092736, 1.259266, 0.666265, 0.994918, 1.413404, 1.350950, 1.459057, 0.979937, 1.171537, 0.704576, 1.275417, 0.974033, 0.745555, 0.732466, 0.959350, 0.579275, 0.980182, 0.799385, 0.788382, 1.483068, 1.066114, 0.830753, 0.868194, 1.081828, 0.942445, 1.440731, 1.103431, 0.714311, 1.484662, 0.596011, 1.153667, 1.407513, 1.413298, 1.241642, 0.981736, 1.379815, 0.922463, 1.231429, 0.515336, 0.718997, 1.298361, 1.437249, 0.782551, 1.049722, 0.536265, 0.617771, 1.474267, 0.954025, 1.083556 },
25 { 1.217035, 0.695591, 0.578156, 0.848962, 1.427829, 1.215914, 1.122692, 1.388473, 0.985161, 1.281578, 1.128760, 0.543331, 1.202971, 1.100853, 1.434685, 1.134722, 1.099547, 1.263585, 0.686003, 1.472993, 1.149317, 1.439659, 1.422743, 1.484463, 0.686885, 1.310617, 0.871554, 1.233656, 1.452158, 0.730773, 0.847753, 1.497054, 0.824241, 0.661274, 0.800855, 0.536039, 1.344562, 1.286414, 1.255780, 0.971182, 0.776100, 0.708962, 1.398522, 1.180485, 0.575353, 1.495225, 0.789749, 0.630048, 1.096514, 1.463562, 1.346374, 0.711540, 1.413699, 1.168681, 1.278572, 1.106093, 1.138924, 1.337823, 0.511244, 0.850750, 1.006314, 1.484081, 1.140409, 0.805172, 1.494745, 0.629106, 1.239630, 0.657051, 0.783426, 0.810695, 1.432138, 1.064497, 1.412639, 0.800956, 0.917957, 1.477868, 0.790523, 1.272365, 0.604193, 0.972635, 0.805355, 1.469947, 0.677404, 1.480622, 1.433567, 0.981693, 1.174748, 0.940415, 1.376264, 0.579275, 0.900526, 1.365264, 1.372620, 0.598313, 1.056571, 1.294138, 0.586539, 0.743678, 0.764572, 1.157899 },
26 { 1.201523, 1.027468, 0.901949, 1.110895, 1.403999, 0.757482, 1.298213, 1.171225, 1.436567, 1.046984, 0.923697, 0.657013, 0.877982, 1.057018, 0.944663, 0.772531, 0.947572, 1.349146, 1.244356, 0.605607, 1.084655, 1.378966, 0.620842, 1.264332, 1.099473, 1.274382, 1.305394, 0.786524, 1.251119, 1.016077, 1.386217, 0.970040, 0.726476, 0.803294, 1.404221, 0.923539, 0.842919, 0.953603, 0.569399, 0.571433, 1.426067, 0.935799, 1.243485, 1.030845, 0.741862, 0.857587, 1.197636, 0.566251, 1.483127, 0.916760, 1.496572, 0.659577, 1.010667, 1.098021, 1.272353, 1.273820, 1.412826, 1.490049, 0.913891, 0.867520, 0.569084, 0.824216, 1.323672, 1.033290, 1.430912, 0.890651, 1.137019, 0.834733, 1.468710, 0.618709, 0.610994, 0.972064, 0.883801, 1.165623, 0.741220, 1.037879, 1.384999, 0.729172, 1.083528, 0.842272, 1.170382, 1.254562, 0.898972, 0.561435, 0.645993, 1.346259, 0.690452, 0.676524, 0.882629, 0.828436, 0.854777, 1.403788, 1.012819, 0.502400, 0.733010, 0.873260, 0.599903, 1.109524, 0.833262, 0.730986 },
27 { 1.214712, 1.240329, 1.056559, 0.607788, 0.607857, 0.955354, 0.816051, 0.630960, 0.593947, 1.394108, 1.006599, 1.256016, 1.093498, 0.791155, 1.190612, 0.997918, 1.029458, 0.952985, 1.181254, 0.633892, 0.894333, 0.821641, 1.154008, 1.109684, 0.691937, 0.601407, 0.582024, 1.332208, 1.451227, 1.358216, 0.838643, 1.095096, 0.583275, 0.800447, 0.841641, 0.760157, 1.277548, 0.733513, 1.494976, 1.478717, 0.856626, 1.196359, 0.766694, 1.416158, 0.784081, 1.100492, 1.284083, 1.105381, 1.252262, 1.470584, 0.839068, 1.135289, 1.251025, 1.453558, 1.371152, 1.030149, 1.476135, 1.496326, 0.691748, 1.183721, 1.130820, 0.735762, 1.178873, 0.530612, 1.326097, 1.308058, 1.355550, 0.835391, 0.576451, 1.202698, 0.608668, 1.055382, 1.473067, 0.528230, 0.995702, 1.019338, 1.172881, 0.821179, 1.072662, 0.763798, 0.930941, 0.842827, 0.543817, 0.905309, 0.504348, 0.554860, 1.186880, 1.361356, 1.310599, 0.974783, 1.155413, 0.865095, 1.038954, 1.370128, 0.758955, 0.768111, 1.152557, 1.167069, 0.698322, 0.522085 },
28 { 1.206634, 0.635869, 1.151382, 0.693975, 0.825380, 1.371575, 0.525082, 1.448024, 0.511968, 0.795579, 1.267383, 0.648161, 1.374856, 1.413803, 1.252482, 0.831875, 0.950416, 1.317786, 0.749293, 1.380449, 1.262748, 1.147300, 1.370290, 0.931082, 1.465643, 1.162432, 1.280755, 1.493789, 0.565438, 1.423253, 0.890998, 1.487277, 0.816100, 0.664559, 0.952888, 0.748666, 1.168102, 1.101342, 1.346711, 0.764868, 0.548922, 1.121846, 1.496408, 0.821431, 0.661539, 1.405466, 1.199778, 1.150778, 0.714936, 1.460419, 0.755280, 0.837649, 1.188936, 1.319255, 1.015642, 1.359142, 1.337227, 1.091844, 0.570722, 0.906042, 0.751411, 1.348593, 0.952548, 1.053595, 1.332893, 1.464777, 0.916189, 0.755398, 0.948363, 0.662467, 1.059513, 1.231404, 0.781350, 0.812775, 1.220844, 0.903309, 0.718696, 0.776082, 0.900594, 0.578764, 1.405535, 0.562267, 0.518113, 0.508415, 0.620056, 1.464239, 1.427830, 0.943725, 0.931066, 1.349475, 1.224164, 1.488699, 1.164264, 0.644614, 1.239359, 1.253992, 1.466645, 0.632918, 0.870057, 1.002211 },
29 { 0.833753, 0.929313, 1.488637, 1.455720, 1.271718, 1.055615, 1.259622, 0.833021, 1.261795, 1.041340, 0.558039, 1.049431, 1.408980, 0.789772, 0.502103, 1.163316, 1.289332, 0.945229, 0.714776, 0.830077, 0.982637, 1.406487, 1.276885, 1.270726, 1.399565, 0.914799, 0.826732, 0.915176, 1.365908, 0.545687, 0.651075, 0.888609, 1.197526, 0.526534, 0.529328, 1.219542, 1.031870, 1.161021, 1.238821, 0.874741, 1.403101, 1.436376, 0.728499, 1.255315, 0.665306, 1.403139, 1.239756, 0.835768, 1.293107, 1.268579, 1.157846, 0.839218, 0.595919, 1.365005, 0.630321, 0.601935, 1.155934, 0.698344, 0.873120, 0.991498, 0.536119, 0.676511, 1.114307, 0.935897, 0.951660, 1.090147, 0.718387, 0.761715, 0.907502, 1.258510, 0.582233, 1.409695, 0.720504, 1.293029, 1.259462, 0.860600, 1.317249, 0.601104, 1.231428, 0.566570, 0.641016, 1.461837, 1.330019, 0.519725, 0.670136, 1.165059, 1.348742, 1.082031, 1.105044, 1.322447, 1.167232, 1.367666, 0.527432, 0.679376, 0.846873, 1.034356, 1.036337, 1.415348, 1.151070, 0.902823 },
30 { 1.217006, 0.678584, 1.289713, 1.408019, 1.491300, 0.557134, 1.277684, 0.659036, 1.001299, 1.391471, 0.641386, 0.670720, 1.310463, 1.090796, 0.674469, 0.897813, 1.263225, 0.692485, 0.772929, 1.170076, 0.660356, 1.022005, 1.032685, 0.937489, 0.940583, 1.130792, 1.440873, 0.914413, 1.216428, 0.818736, 0.647242, 1.138099, 1.483615, 1.412141, 0.606132, 0.765131, 0.580137, 1.269375, 0.621577, 0.546337, 1.136931, 0.654725, 1.097341, 0.546765, 1.137874, 1.283026, 0.912220, 1.391823, 0.520010, 1.272602, 1.466470, 0.615733, 1.081613, 1.142448, 1.302860, 1.218141, 1.137230, 0.689922, 0.920870, 1.031165, 0.580295, 1.301424, 0.616626, 1.291289, 1.169661, 0.900023, 0.553110, 0.519946, 0.734780, 1.246575, 1.036160, 1.255417, 1.016422, 1.123499, 0.528773, 1.266719, 0.757937, 0.732871, 0.516183, 0.594452, 1.008420, 1.053303, 0.757148, 0.828274, 0.527421, 0.616101, 0.886849, 0.685453, 1.164700, 0.892421, 0.569646, 1.434737, 1.315190, 0.917398, 0.668712, 1.057104, 0.970693, 0.932457, 0.986910, 0.545409 },
31 { 1.229206, 1.436945, 1.428496, 0.682747, 0.705947, 0.947639, 1.022814, 1.086172, 1.292043, 0.935154, 0.788720, 1.470943, 0.946684, 0.653933, 1.021897, 1.460900, 1.378421, 0.763658, 1.396703, 1.426487, 0.610364, 0.734830, 0.746912, 0.881856, 0.906875, 1.188510, 0.569263, 1.177225, 0.570384, 1.231396, 1.362972, 1.095270, 0.617626, 0.636824, 1.351976, 1.080995, 1.223010, 0.857018, 1.008881, 0.822917, 0.684228, 1.043667, 0.832037, 1.030542, 0.922625, 1.258336, 1.101458, 1.104848, 1.442378, 0.641766, 0.700162, 1.056367, 0.720938, 1.335045, 1.231414, 0.509698, 1.484949, 0.641753, 0.632319, 0.837340, 0.573356, 0.868622, 0.676946, 0.815690, 1.219338, 1.388308, 1.407020, 0.948561, 0.635508, 0.640841, 0.942052, 0.534168, 0.785949, 0.955005, 0.982833, 0.847037, 0.800862, 1.008711, 0.548902, 0.953126, 0.824775, 1.412708, 1.398044, 0.618547, 0.839201, 1.129548, 0.733706, 0.884059, 1.422737, 0.771020, 1.406317, 0.883168, 1.252705, 0.513589, 1.156766, 1.207956, 0.814534, 0.828586, 0.628942, 1.489124 },
32 { 1.257287, 0.631994, 0.821547, 1.464627, 0.938968, 1.246103, 0.924975, 0.728902, 0.954655, 0.737723, 1.498712, 1.119454, 1.187093, 0.734237, 1.280057, 1.486393, 1.313113, 1.451450, 1.060039, 0.612169, 0.773521, 0.690826, 1.275960, 1.349401, 0.518757, 0.598269, 0.706026, 1.037151, 0.817885, 0.906819, 0.868752, 1.226024, 1.196616, 1.215337, 1.268921, 0.928082, 0.518825, 0.900413, 1.283585, 1.158909, 0.643504, 0.928986, 0.910790, 0.899092, 0.907780, 1.275159, 0.577147, 0.596788, 1.343017, 1.151872, 0.504921, 1.117453, 1.426974, 0.962528, 1.251247, 1.004227, 1.269488, 0.951393, 0.804154, 1.155649, 1.421842, 1.406011, 0.961185, 1.320245, 0.635301, 0.906425, 1.016676, 1.009237, 0.914572, 0.954280, 1.081601, 0.938459, 1.204942, 1.043397, 0.818611, 0.614295, 1.073840, 1.115089, 1.190327, 1.434745, 1.497915, 1.018093, 0.877717, 1.470135, 1.231589, 1.028813, 1.154080, 0.767496, 0.729784, 1.097323, 0.515355, 1.389827, 1.220093, 1.093498, 0.503477, 0.862539, 1.012151, 1.324919, 0.848111, 0.840435 },
33 { 0.794092, 1.104723, 1.142302, 0.596199, 0.798704, 1.379256, 0.539173, 1.092589, 0.840609, 1.072423, 0.863456, 0.661262, 1.242564, 1.202363, 1.082990, 0.890986, 0.783320, 0.861179, 0.730685, 1.236340, 0.631861, 1.205299, 1.091304, 1.442763, 0.689730, 1.091574, 1.487165, 0.589757, 0.699548, 0.922785, 1.495555, 1.012958, 1.220156, 1.482942, 1.033049, 0.916642, 1.073122, 1.464463, 0.618132, 0.755355, 1.444651, 1.047268, 0.515263, 0.698235, 1.213737, 0.510138, 1.187793, 1.002588, 1.411000, 0.943044, 1.362698, 1.333991, 1.404936, 0.563767, 0.887261, 0.634021, 1.166965, 1.242319, 0.981639, 0.726885, 1.218921, 0.981622, 0.815452, 0.585188, 1.204149, 0.529974, 0.739383, 0.697257, 1.234008, 0.970071, 1.112824, 1.159627, 0.932285, 0.994092, 1.114359, 1.357456, 0.947046, 1.043997, 1.292209, 0.815504, 1.098825, 0.987817, 0.899514, 1.375150, 0.502796, 1.135852, 1.222336, 1.299652, 0.875222, 1.401836, 0.672479, 1.288178, 1.262454, 1.035992, 1.213637, 0.521166, 1.342401, 1.194182, 1.178112, 0.516449 },
34 { 0.909860, 1.233279, 1.416451, 1.027400, 1.005189, 0.694141, 0.632237, 1.263693, 0.582803, 0.772835, 1.249844, 0.620313, 1.254167, 0.644321, 0.895979, 0.633501, 1.358743, 1.436233, 0.996283, 0.666950, 0.871365, 1.137707, 1.150705, 1.334873, 0.970046, 1.304745, 0.865838, 1.182630, 0.959571, 1.282336, 1.434050, 0.534580, 0.860039, 0.584933, 1.328996, 0.973934, 0.901685, 1.183128, 1.203826, 1.322495, 1.019590, 0.610345, 0.631041, 0.712080, 1.441077, 1.102507, 1.019037, 1.344945, 0.514258, 0.560314, 0.744381, 0.611662, 1.143286, 1.009895, 0.647214, 1.081665, 0.843321, 1.156600, 0.885680, 0.614067, 0.862076, 0.868778, 1.028029, 0.540115, 0.851816, 0.953881, 0.918121, 0.927072, 0.798849, 1.276566, 0.893005, 1.301520, 1.334027, 1.022297, 0.841130, 0.736467, 0.821324, 0.589077, 1.238739, 0.508721, 0.805105, 1.256619, 1.226892, 0.573132, 0.937335, 0.537319, 0.524212, 0.838047, 1.367114, 1.450211, 1.046535, 0.593933, 1.429171, 1.414017, 0.683543, 1.482650, 1.488056, 0.643427, 0.992082, 0.831072 },
35 { 0.930563, 1.341359, 0.733987, 1.200175, 1.096558, 1.030539, 0.537736, 0.885313, 1.384528, 1.133974, 0.831964, 1.200899, 1.470555, 1.408522, 0.571361, 0.850128, 0.676683, 1.123604, 0.505488, 1.127296, 1.466618, 1.486714, 1.214663, 0.747280, 1.470862, 0.973795, 0.624167, 0.811232, 1.071253, 1.364991, 0.974248, 0.716471, 0.951544, 0.524253, 1.487474, 1.127666, 0.950365, 1.488467, 0.943538, 1.385342, 1.428770, 1.474043, 0.806881, 0.858295, 1.122699, 0.878389, 1.044084, 0.572205, 1.205813, 1.483118, 1.281674, 1.327887, 0.989011, 1.170076, 1.488152, 1.346988, 1.233715, 0.725484, 1.221650, 1.488727, 1.052185, 0.616406, 0.905710, 1.498522, 0.513559, 1.344261, 1.359425, 0.700745, 1.074680, 0.588329, 1.180291, 1.238982, 0.734463, 1.412548, 1.444899, 1.406701, 1.389668, 1.121685, 1.474501, 0.751375, 0.861259, 1.065579, 0.648896, 1.412539, 0.794683, 1.033792, 1.298987, 0.555507, 1.497277, 0.661315, 1.159007, 0.564860, 1.185888, 1.015081, 0.856806, 0.514841, 0.918747, 0.681178, 0.904396, 0.631713 },
36 { 0.834543, 0.724370, 0.690387, 0.716326, 1.277884, 1.149745, 1.336569, 0.873810, 1.221602, 1.289921, 1.359366, 0.776772, 0.868006, 1.482802, 1.386247, 0.727306, 1.152006, 1.235002, 0.841161, 0.726308, 0.808330, 0.828342, 1.404573, 1.045031, 0.716376, 0.585553, 1.362715, 0.939475, 0.882352, 0.711058, 1.323082, 1.406481, 0.786396, 1.228940, 0.924473, 1.349798, 0.833321, 0.784191, 1.351992, 0.504361, 0.599088, 0.715164, 1.083420, 1.183670, 1.273886, 1.104639, 0.982525, 0.910814, 1.188755, 0.745048, 1.162060, 1.326419, 1.215254, 0.601977, 1.427540, 0.790091, 0.656613, 1.298610, 0.896001, 0.519838, 0.650353, 1.333911, 1.076191, 0.762819, 1.059570, 1.289504, 0.989030, 0.873209, 1.046230, 0.698030, 0.700668, 0.755495, 1.115073, 0.671187, 1.024344, 0.682976, 1.286713, 0.641358, 1.348746, 1.101625, 1.116239, 0.767083, 0.760369, 0.789431, 1.414523, 0.907276, 1.302119, 1.493363, 1.417792, 1.266137, 1.476566, 1.199599, 0.633903, 0.652688, 0.595961, 1.028158, 0.683026, 1.057688, 1.445035, 0.891821 },
37 { 1.315587, 1.044515, 1.200029, 1.409059, 0.964862, 1.499867, 1.143311, 1.254049, 0.933216, 0.545925, 1.269151, 1.317783, 0.707251, 1.080521, 1.096778, 0.887432, 0.704922, 0.949870, 0.519969, 0.633731, 1.245146, 1.469891, 0.582362, 1.362345, 0.621007, 0.732539, 0.732922, 1.357033, 0.999267, 1.395831, 0.536844, 1.353791, 1.028993, 0.841236, 0.569334, 1.368553, 0.675972, 0.592600, 0.798983, 0.591262, 1.465353, 1.205449, 1.488737, 0.830719, 0.627644, 0.915078, 0.652940, 0.574788, 0.908922, 0.547874, 0.597544, 0.724315, 0.783084, 0.669090, 1.329581, 1.479665, 0.901612, 0.757222, 0.590977, 0.939683, 0.734398, 1.405560, 1.484860, 1.262169, 0.847320, 1.147545, 1.115558, 1.115001, 1.282142, 1.245312, 0.512934, 0.587409, 0.748015, 1.137804, 0.934285, 0.659516, 0.570683, 0.638020, 1.277745, 0.865680, 0.580597, 1.097336, 0.606227, 1.053585, 0.620551, 1.493760, 1.436824, 0.954041, 1.075210, 1.393790, 1.039681, 0.631532, 1.382563, 0.579592, 1.314158, 0.840667, 0.995589, 0.642214, 1.306196, 0.500741 },
38 { 0.574945, 0.725081, 1.403158, 0.806457, 1.093281, 1.295158, 1.121620, 0.760942, 0.578930, 1.287016, 0.792601, 0.533802, 0.555386, 0.943474, 1.234918, 0.674430, 0.600282, 0.588318, 1.128548, 0.862167, 0.813385, 1.360912, 1.423028, 0.561411, 1.075318, 0.579664, 0.856843, 1.302976, 1.395384, 1.049080, 0.717677, 1.410685, 1.265288, 1.233963, 1.213870, 0.911732, 0.656924, 1.004567, 1.483752, 1.152371, 0.523737, 0.667294, 0.540805, 1.071469, 0.650513, 0.847177, 0.585443, 1.048513, 1.235277, 0.715494, 0.970806, 0.731717, 0.670415, 0.770139, 0.642860, 0.868173, 1.166077, 1.397270, 0.860222, 0.977048, 1.223795, 1.238837, 1.136860, 1.127560, 0.590381, 1.424478, 0.652488, 0.971402, 1.299389, 1.046034, 1.019467, 0.805221, 0.854870, 0.980597, 0.979723, 1.214519, 1.121689, 1.435373, 0.527776, 0.694722, 1.046026, 1.255094, 1.204143, 1.076658, 0.892511, 0.866373, 1.263462, 0.838399, 1.402889, 1.410993, 1.145245, 1.131632, 0.879673, 1.005937, 0.979453, 0.619352, 0.770406, 0.723308, 0.735299, 0.905938 },
39 { 1.280506, 1.427073, 0.879789, 1.086139, 1.036706, 1.014353, 1.147556, 1.164896, 0.843121, 1.225658, 0.982239, 1.469344, 1.309790, 1.435840, 1.367651, 0.817233, 1.094605, 1.177248, 0.656487, 0.639727, 0.744188, 1.452216, 1.103546, 1.214505, 1.079936, 1.216600, 1.009478, 1.125042, 1.254938, 0.550030, 1.189085, 1.267309, 1.353996, 0.530584, 0.981013, 0.919253, 1.175170, 0.950235, 1.029522, 0.562356, 1.248757, 1.448359, 0.613384, 1.310808, 1.253853, 1.144909, 1.214412, 1.309913, 1.210858, 1.214954, 1.156127, 1.025335, 1.291851, 1.082201, 0.732061, 0.916355, 0.996536, 0.872104, 0.748274, 0.556044, 1.252064, 0.834954, 0.651078, 1.460592, 0.509710, 1.250452, 0.835672, 1.391963, 1.060117, 0.650755, 1.412867, 1.101646, 0.965050, 1.109307, 1.253508, 0.766335, 1.231471, 1.340628, 1.284467, 0.845298, 1.402009, 0.794779, 0.896674, 1.243952, 1.417294, 0.697860, 0.679539, 0.851853, 1.378351, 1.412807, 1.338983, 0.873406, 1.323241, 1.215563, 0.528130, 1.455520, 1.020062, 1.000210, 1.373335, 1.432730 },
40 { 1.240513, 1.033298, 0.522560, 1.213807, 0.911869, 0.827741, 0.794976, 0.969230, 0.626645, 0.986357, 1.251177, 0.994851, 1.020110, 1.312822, 0.926407, 0.983671, 0.994010, 0.756009, 0.895726, 1.003499, 0.562756, 1.305284, 1.413133, 0.669466, 0.845270, 0.552020, 1.149270, 1.371840, 1.175793, 1.320329, 0.657078, 1.004552, 0.620331, 1.358643, 1.221971, 1.377358, 1.015070, 1.259890, 0.905796, 1.160333, 0.551994, 0.592783, 1.091467, 0.775688, 0.754513, 0.983893, 1.233747, 0.745092, 0.901294, 0.898268, 0.710254, 0.735907, 1.404299, 0.547054, 1.466718, 0.666106, 1.253068, 1.301775, 0.664992, 0.631767, 0.725976, 1.450178, 1.429771, 0.788148, 0.764200, 1.281182, 1.307371, 1.170866, 1.239594, 0.735317, 0.763682, 0.542242, 0.862845, 0.725894, 1.036795, 1.226789, 0.748517, 0.834509, 1.488584, 0.954555, 0.719467, 0.836054, 1.463329, 1.331410, 0.618399, 1.304639, 1.138905, 1.082355, 0.566909, 1.361495, 0.862528, 0.613203, 0.628790, 1.496718, 1.453116, 0.619761, 1.203898, 1.073236, 0.951866, 1.274655 },
41 { 0.636181, 1.088489, 1.173684, 1.033445, 0.732267, 1.447785, 0.755248, 1.324392, 0.647175, 0.879011, 1.363957, 1.119208, 1.257362, 1.171908, 0.594229, 0.676823, 1.003686, 1.373630, 1.483868, 1.417955, 1.270865, 1.058633, 0.748285, 1.105380, 0.895899, 0.644852, 1.291218, 0.914932, 0.928978, 1.070640, 0.991385, 0.966379, 1.415228, 1.491662, 1.453947, 0.778985, 1.381445, 1.470697, 0.629664, 1.153360, 0.831713, 0.894630, 0.756541, 0.949981, 1.089522, 1.298259, 0.608494, 0.691989, 1.273858, 0.769418, 1.193965, 0.602736, 0.670953, 0.540535, 0.750419, 0.816189, 1.281947, 0.863904, 0.674390, 1.273259, 1.388311, 1.204608, 0.806371, 0.980616, 0.924502, 0.829790, 1.222088, 0.513586, 1.425925, 1.381753, 1.044760, 0.590380, 0.644188, 1.106744, 1.343447, 1.359713, 1.158890, 1.389677, 1.115926, 0.580977, 0.628175, 1.449797, 1.097237, 0.863093, 0.641586, 0.979967, 1.415270, 1.451763, 1.487804, 1.268733, 0.752753, 0.655134, 0.906114, 1.235399, 1.009420, 0.929635, 0.607187, 1.312780, 1.136365, 0.921108 },
42 { 0.748524, 1.369177, 0.934533, 1.102703, 1.146367, 0.853069, 1.198869, 1.241657, 1.191021, 0.747985, 0.979408, 1.458972, 0.869351, 0.988991, 0.603401, 1.259519, 0.980549, 1.069499, 1.139180, 1.055040, 0.591555, 1.060951, 1.160591, 0.979863, 1.492859, 0.763594, 0.913991, 0.710668, 1.056531, 0.985256, 0.779584, 1.383766, 0.585667, 1.242378, 1.154392, 0.795802, 0.563005, 1.161807, 0.725422, 0.562225, 1.036866, 1.216658, 1.274284, 1.488570, 1.316633, 1.461860, 0.789054, 1.361144, 0.719320, 0.763150, 0.551529, 1.412504, 1.147728, 0.811577, 1.228210, 1.018510, 0.655228, 0.730655, 0.807956, 1.282889, 0.881588, 1.349047, 0.951104, 0.686217, 0.747707, 1.263202, 0.650127, 1.037251, 1.122519, 1.224163, 0.789462, 0.629659, 1.208203, 0.656317, 0.726476, 0.895043, 0.791120, 1.092991, 0.711909, 1.266077, 0.534302, 1.135435, 1.347722, 0.653737, 0.831916, 1.021062, 1.352690, 0.505870, 0.602692, 1.045314, 1.098172, 0.799132, 1.462976, 0.971011, 0.842995, 0.673609, 0.795435, 0.621573, 0.592284, 1.318302 },
43 { 1.311631, 0.995282, 0.786780, 0.904811, 0.879885, 0.535916, 1.019403, 1.199235, 1.278574, 0.617895, 0.771239, 0.633041, 1.266253, 0.924334, 0.597578, 1.174370, 0.615993, 1.353696, 0.836635, 0.989610, 0.803431, 1.331548, 0.832721, 0.723852, 1.334291, 0.713263, 1.219369, 0.625581, 0.992898, 0.982628, 1.241848, 0.973272, 1.037474, 1.217156, 1.029343, 0.684628, 0.759857, 0.511688, 0.930552, 1.234483, 0.895232, 1.037478, 1.011466, 0.711956, 0.803547, 0.746492, 1.272604, 1.037333, 1.006048, 1.058568, 1.176609, 0.882520, 0.541480, 0.802976, 0.844504, 0.703699, 0.671613, 0.890023, 0.501083, 0.810488, 0.740479, 1.420010, 1.429948, 1.146862, 1.316193, 0.931004, 0.989071, 1.400385, 0.913639, 0.639571, 0.641433, 1.398360, 0.899608, 0.926937, 1.215681, 1.117349, 1.235624, 0.882989, 0.818594, 0.881352, 1.484024, 0.607456, 0.640642, 0.850981, 0.909445, 0.546183, 0.787244, 0.686868, 1.076608, 1.308196, 1.092043, 1.447057, 0.633696, 0.630374, 0.816885, 0.849989, 1.168251, 1.373178, 0.565708, 1.295896 },
44 { 1.228643, 0.738633, 0.652577, 1.185162, 1.318912, 1.409365, 1.228588, 1.148795, 1.331306, 0.550249, 0.742371, 0.509078, 1.492198, 0.864823, 0.569176, 0.684871, 0.597131, 0.556188, 1.214118, 1.420784, 0.897166, 1.130377, 1.240613, 1.454156, 0.523106, 0.821094, 1.324682, 1.026031, 1.472817, 0.984822, 0.505128, 0.827566, 0.771461, 0.534161, 1.158544, 1.005448, 0.897420, 0.542134, 0.624452, 1.142559, 0.823504, 1.300411, 0.725065, 1.433246, 1.335957, 1.068355, 1.330080, 1.471292, 0.882025, 0.686774, 0.917441, 1.489229, 0.905663, 0.542094, 1.468851, 0.645157, 1.295944, 1.023661, 1.347507, 0.875402, 1.084266, 1.040575, 0.754818, 1.303567, 0.586569, 0.824401, 0.504861, 0.750788, 1.436682, 0.521441, 0.968313, 0.966591, 0.842421, 0.739896, 0.536155, 0.601406, 0.924895, 1.011223, 0.976541, 0.829191, 1.126608, 1.380677, 0.539406, 1.113236, 1.358651, 1.343717, 0.813231, 0.929970, 1.196677, 0.689668, 0.567011, 0.972333, 0.839404, 1.148986, 0.522457, 1.136774, 1.392630, 0.741390, 0.966315, 0.885431 },
45 { 1.297295, 1.378437, 1.164570, 0.895825, 0.963395, 0.862295, 0.744340, 1.364998, 0.655335, 0.768841, 1.217173, 0.963525, 1.303287, 0.821915, 0.677960, 0.800138, 1.448253, 0.979767, 1.392119, 0.585982, 0.921116, 0.562224, 0.812862, 1.329531, 0.887943, 0.902994, 1.408764, 0.968904, 0.957420, 0.960017, 0.586739, 1.052696, 0.621264, 1.157113, 1.434573, 1.268988, 1.384373, 1.147503, 1.065945, 1.482257, 1.088117, 0.899774, 0.961920, 1.303949, 1.491552, 1.015181, 1.410257, 1.372790, 0.779078, 1.132351, 1.123983, 1.176391, 1.155115, 1.358237, 1.172782, 0.753902, 0.748648, 1.463951, 0.617509, 0.629725, 0.575769, 0.512727, 1.142919, 1.350719, 0.603780, 0.988247, 0.958885, 0.964036, 0.519951, 0.622180, 1.205202, 0.974844, 0.818712, 0.735477, 1.312122, 1.141732, 1.197968, 0.632684, 1.205996, 1.297368, 0.812143, 0.512066, 1.218316, 1.484007, 0.589762, 1.036795, 1.085377, 0.739645, 0.974279, 1.012355, 1.433491, 0.670476, 1.422006, 1.209889, 0.942809, 1.443062, 0.522259, 1.344268, 1.366238, 1.147227 },
46 { 0.692855, 0.963820, 0.566287, 0.561259, 0.615691, 1.015099, 1.382108, 0.866510, 1.340430, 0.875466, 0.580694, 1.313270, 1.311595, 1.165124, 1.292756, 0.781488, 0.647129, 1.301405, 0.927022, 1.296080, 0.723913, 0.942827, 0.750353, 0.552402, 0.593624, 1.487831, 0.540218, 0.904311, 0.698329, 1.249872, 1.100354, 1.153210, 1.292435, 1.012553, 0.608275, 1.225163, 0.611127, 1.194936, 0.527464, 1.426521, 0.646311, 0.804665, 1.084145, 1.034143, 1.088279, 0.664487, 1.192200, 0.918317, 1.142646, 0.569235, 0.945882, 1.087182, 0.848297, 1.074845, 1.388766, 0.609106, 1.140778, 1.198879, 1.351980, 1.218628, 1.145560, 1.109429, 1.344311, 1.223163, 1.398792, 1.291418, 1.184115, 0.870645, 1.284665, 1.416059, 0.777524, 0.951476, 0.541381, 0.644964, 1.237234, 0.729530, 0.577324, 0.701065, 1.478748, 1.431658, 1.487870, 0.880464, 1.061229, 1.379999, 0.583312, 0.933728, 1.294578, 0.978165, 1.233571, 1.109879, 0.516053, 1.023313, 0.886110, 1.153631, 0.590171, 0.885499, 0.870380, 1.041900, 0.997516, 0.939240 },
47 { 0.722730, 1.480353, 1.436669, 0.808576, 0.945710, 1.176355, 1.354404, 0.931491, 0.643934, 0.890557, 1.421781, 1.356383, 0.772310, 1.135264, 0.982245, 1.470156, 0.698212, 0.818315, 0.909842, 0.529245, 0.850432, 0.714098, 0.689035, 0.523322, 0.892562, 0.852723, 0.686777, 1.177383, 0.526833, 1.313950, 1.212798, 1.466209, 0.568782, 0.919507, 0.841937, 1.491518, 1.160020, 0.548895, 0.825159, 0.528143, 1.102369, 1.230860, 0.840324, 0.784020, 0.569058, 1.167023, 1.133038, 0.751083, 1.002116, 0.660695, 1.175234, 0.538943, 1.040375, 1.294261, 1.022649, 1.112564, 0.994752, 1.209664, 0.802031, 0.832267, 1.087234, 1.447808, 1.174182, 0.682898, 1.282792, 1.063484, 0.628875, 0.856724, 0.667678, 0.882975, 1.489054, 0.686924, 1.496083, 0.912370, 0.968535, 1.027022, 0.853282, 1.493143, 0.957449, 0.815292, 1.181962, 0.523791, 1.459402, 1.233873, 1.376232, 0.549287, 1.271033, 0.865421, 1.181097, 0.921327, 1.229216, 1.444183, 1.058755, 1.174061, 1.177193, 0.957264, 1.493189, 0.896211, 0.562810, 0.559379 },
48 { 0.587099, 0.687016, 1.184920, 1.390886, 1.047799, 0.577556, 0.988973, 0.884809, 0.780843, 1.242257, 0.712039, 1.019675, 0.883079, 0.910861, 1.138993, 0.672161, 1.386088, 1.277571, 1.103470, 1.022888, 0.971385, 0.795682, 1.279136, 1.271236, 0.613298, 0.664994, 1.210768, 0.829340, 1.066858, 0.514891, 1.062482, 1.087765, 1.412044, 1.415776, 1.497073, 1.192484, 1.032552, 1.395519, 1.162634, 1.018649, 1.074131, 0.510119, 1.277594, 0.994976, 0.723647, 0.844321, 1.313150, 0.656162, 1.322187, 0.675055, 1.432463, 0.699152, 1.340842, 0.561684, 1.180689, 1.203130, 1.272870, 0.769434, 0.857942, 0.549277, 1.259807, 1.149281, 1.179255, 1.206596, 1.294566, 1.386951, 1.241932, 0.504205, 0.547852, 0.567474, 0.923101, 0.866201, 1.401489, 1.123678, 0.950110, 1.326069, 0.995138, 0.971752, 1.180311, 0.598078, 1.172467, 1.173235, 0.744679, 0.725303, 1.149524, 1.163761, 0.936380, 1.100728, 1.450567, 0.613182, 0.772447, 1.012539, 0.864765, 1.079364, 0.924737, 0.588277, 1.082651, 0.698034, 0.959668, 1.023185 },
49 { 0.988981, 0.689229, 1.486933, 0.599011, 0.982337, 0.614349, 0.573770, 1.262524, 1.424293, 0.987521, 0.726811, 1.412779, 1.248769, 1.234086, 0.557360, 0.689084, 1.200291, 1.456376, 1.077152, 1.401346, 0.881220, 0.660305, 1.375346, 1.167847, 0.672541, 0.771209, 0.782543, 0.893133, 0.997477, 0.706968, 1.388540, 0.861025, 0.958766, 1.172811, 0.631715, 1.308802, 1.436923, 1.273562, 1.384133, 1.479127, 0.879950, 0.636853, 0.766011, 0.566885, 0.948727, 1.271401, 1.486664, 0.785128, 1.061584, 1.327139, 1.094675, 1.370093, 0.850541, 0.641494, 1.145567, 1.460751, 0.596990, 0.954087, 0.636962, 1.092563, 1.426923, 0.920506, 0.505638, 1.357573, 1.455444, 0.530191, 0.721097, 1.325209, 1.349248, 1.381790, 0.900607, 1.304454, 0.593939, 1.458256, 1.227553, 0.877515, 0.772776, 0.510315, 0.959775, 0.920924, 1.475126, 0.832748, 0.695902, 0.557866, 0.918660, 0.790759, 0.918023, 1.306716, 1.197084, 1.213258, 1.287765, 1.278836, 0.964354, 1.010394, 0.615742, 1.133320, 0.569700, 1.118194, 1.201309, 1.098770 },
50 { 0.610081, 0.737955, 0.926984, 0.903793, 0.632381, 0.751552, 1.342128, 1.349278, 1.408423, 1.217757, 0.905092, 1.435228, 1.107308, 0.891698, 1.131404, 1.416677, 0.589718, 0.981011, 1.184637, 1.316450, 0.591721, 1.370070, 1.132957, 0.872514, 0.676285, 1.482809, 0.868402, 0.982266, 1.145556, 1.068159, 0.651381, 0.853492, 0.617194, 1.361320, 0.687469, 1.194165, 1.435292, 1.043898, 0.898241, 1.075107, 0.860373, 1.312734, 1.159875, 0.938705, 1.354157, 0.830498, 0.666395, 0.535221, 0.773000, 1.424380, 0.964546, 1.006395, 0.807752, 0.516482, 1.346470, 1.431348, 1.182579, 0.989412, 1.255138, 1.482466, 0.841909, 0.985874, 0.667158, 1.137700, 1.417949, 0.779480, 0.668516, 1.363037, 0.550007, 1.024390, 1.348684, 0.837570, 1.280495, 0.957944, 1.398153, 0.937464, 1.263686, 0.919538, 1.125201, 0.864092, 1.118298, 1.015054, 1.497190, 1.025647, 1.420625, 1.020863, 1.049759, 1.399448, 1.382671, 0.776813, 0.707191, 0.778973, 0.802587, 1.096483, 1.396604, 0.713665, 1.441795, 0.977361, 1.262871, 1.461402 },
51 { 0.813943, 0.680519, 0.511478, 0.558429, 1.094609, 0.799908, 0.773460, 1.279708, 1.386888, 1.348276, 0.778009, 0.905605, 0.666383, 1.470536, 1.299767, 1.346888, 0.782914, 1.428907, 0.697892, 0.606730, 1.351930, 0.864346, 0.946365, 1.231249, 1.206699, 1.144011, 1.165052, 0.727949, 0.563290, 0.960477, 0.586924, 0.903605, 1.357522, 1.169519, 0.685505, 1.059413, 0.743235, 0.695182, 0.679872, 1.411399, 0.795301, 1.196999, 0.903812, 1.156331, 1.165709, 0.565184, 1.282335, 1.498951, 0.912860, 0.905371, 0.836275, 1.393140, 0.525175, 1.473613, 0.584668, 1.465398, 0.640308, 1.346438, 1.118658, 1.204170, 0.565874, 0.904597, 0.880009, 0.945815, 1.091614, 0.552600, 0.772920, 1.140507, 1.367006, 0.764824, 0.815681, 0.513934, 1.398151, 1.010974, 1.372802, 1.234327, 1.195082, 0.896907, 0.941516, 1.390891, 0.683558, 1.391734, 0.731815, 1.456296, 1.052963, 1.392538, 0.646926, 1.472379, 0.504058, 1.062336, 0.753548, 1.262995, 1.173000, 1.178359, 0.992326, 1.103609, 0.932861, 1.425049, 0.597675, 0.972518 },
52 { 0.944463, 1.277893, 1.355262, 1.317821, 1.020200, 1.307974, 0.517232, 1.349689, 0.824928, 0.793442, 0.517350, 0.846077, 1.055395, 0.688177, 0.811814, 1.404456, 0.858749, 0.680923, 1.160846, 0.786850, 1.184568, 0.940702, 0.775340, 1.444527, 1.102044, 0.950843, 1.287114, 1.122676, 0.797592, 1.248898, 1.174536, 1.023530, 1.237861, 0.502915, 0.844259, 0.612471, 0.823806, 0.829548, 1.493739, 1.298925, 0.556888, 1.377708, 0.527229, 0.731321, 0.727799, 1.047573, 1.047175, 0.888962, 1.144364, 0.678165, 1.478719, 0.601012, 1.089768, 1.360020, 1.471700, 1.410507, 0.705025, 0.933493, 1.499039, 0.942692, 1.055819, 0.707047, 0.607226, 0.905808, 1.205594, 0.845379, 0.770954, 0.819792, 0.789148, 1.106259, 0.619862, 0.525928, 1.122709, 0.903631, 1.266429, 1.303021, 1.312815, 0.541525, 0.646086, 0.925632, 1.284957, 0.963873, 0.603842, 0.998181, 0.839279, 1.442330, 1.499839, 1.273325, 0.740793, 1.182872, 1.247894, 1.350491, 0.652831, 0.960712, 0.561896, 1.329911, 1.063076, 1.452755, 1.042146, 0.669313 },
53 { 0.677053, 1.450654, 0.681746, 1.005820, 0.589914, 0.671740, 1.089172, 0.521950, 0.896587, 1.191735, 0.728402, 0.919739, 1.330404, 0.623453, 1.090528, 1.241996, 0.660063, 1.061985, 0.766965, 1.165892, 0.953633, 0.586406, 0.821410, 0.933062, 0.575013, 0.863445, 1.020924, 1.152529, 0.702934, 1.055894, 1.211744, 1.035656, 0.821326, 1.030520, 0.720927, 0.711973, 0.538362, 0.986073, 1.390227, 0.810621, 1.448758, 1.437193, 0.772821, 1.483152, 0.955085, 1.064271, 1.194874, 0.662785, 0.911286, 0.877904, 1.324479, 1.336087, 1.131266, 0.938485, 1.052959, 1.497782, 1.188433, 1.429192, 0.776999, 0.797690, 1.123579, 1.114667, 1.220637, 0.717060, 0.974480, 1.391882, 1.444966, 0.762352, 0.800971, 1.257304, 1.471378, 0.844295, 0.993357, 1.116639, 1.290868, 0.947945, 1.100383, 0.931819, 1.297723, 1.203131, 0.770499, 0.908679, 1.086434, 1.480419, 1.362894, 0.830707, 1.477182, 1.457445, 0.640418, 1.128763, 0.720541, 1.404052, 0.675977, 1.332138, 1.108372, 1.428894, 1.061116, 0.595576, 0.801511, 0.931090 },
54 { 0.643420, 1.362300, 1.474952, 0.926531, 1.381211, 1.431771, 1.046737, 1.210830, 1.298809, 1.168734, 1.009451, 0.947465, 0.909941, 1.177119, 0.784524, 1.219616, 1.454565, 0.534898, 0.978879, 1.226380, 0.815606, 1.038218, 1.361420, 0.778024, 1.441346, 1.485796, 0.937099, 1.375639, 1.154427, 0.890535, 1.267625, 0.622470, 1.483020, 1.314277, 1.404574, 1.371651, 0.768889, 1.313662, 0.636042, 1.023995, 0.953827, 0.829175, 0.754455, 1.317779, 0.503153, 1.106937, 0.812034, 1.454598, 1.461104, 1.068981, 1.223514, 0.884404, 0.836136, 0.787167, 1.197114, 0.798132, 0.502230, 1.246851, 0.974236, 1.430769, 0.568862, 1.374975, 0.710428, 1.128492, 1.145935, 1.433811, 0.988121, 1.327453, 0.614006, 0.951511, 1.280087, 1.188676, 0.624892, 0.830363, 1.060348, 0.675502, 0.685491, 0.583219, 1.225793, 0.780175, 1.147304, 1.292539, 0.903020, 0.759726, 1.413597, 1.019283, 1.107386, 1.460782, 0.508626, 0.849334, 1.154008, 1.254488, 0.686210, 1.470986, 0.610893, 0.670393, 1.121561, 0.845200, 0.759875, 1.206710 },
55 { 1.065558, 1.163891, 0.804453, 0.587116, 0.827693, 0.817210, 0.631240, 0.886643, 1.340130, 0.675996, 0.590660, 0.751568, 0.903656, 0.745866, 1.456385, 0.986844, 1.110281, 0.889903, 1.351026, 1.004253, 1.494489, 1.071129, 1.045616, 0.988856, 0.843773, 1.219725, 1.371029, 1.355663, 1.186525, 1.080059, 1.346296, 1.309578, 0.617709, 1.313196, 0.758414, 1.159872, 1.285458, 0.783482, 1.402323, 1.230263, 1.476751, 0.910991, 0.640093, 1.329906, 1.397887, 0.623863, 0.766371, 1.011667, 0.703489, 0.652436, 1.192745, 1.226452, 1.381471, 1.113720, 1.128661, 0.581083, 0.888773, 1.197396, 1.406884, 1.419972, 1.443221, 0.601071, 1.135247, 0.918485, 1.391332, 0.909509, 1.010628, 1.430850, 1.283277, 0.683353, 0.670572, 1.387354, 1.369173, 1.486147, 1.385065, 0.690328, 0.984858, 1.214500, 0.606477, 0.881161, 0.636055, 0.860682, 0.584929, 1.162528, 0.687090, 0.891145, 0.868081, 1.227512, 0.809845, 0.644450, 0.933233, 0.561348, 0.594675, 0.746191, 0.539361, 0.859919, 1.154841, 1.177022, 0.592519, 0.695240 },
56 { 1.307073, 1.060171, 0.985989, 1.302419, 0.599171, 1.279548, 0.612157, 1.339375, 0.706198, 0.865803, 0.785091, 0.662037, 0.633563, 0.686540, 0.656337, 1.346492, 1.134035, 1.460974, 0.634225, 0.715126, 0.533116, 0.521919, 1.425005, 1.100706, 0.634682, 0.759830, 0.898285, 1.163993, 0.709671, 1.458231, 1.451669, 0.951285, 1.195509, 0.821576, 1.048659, 0.883815, 1.336353, 1.299437, 1.309326, 1.145091, 0.800970, 0.949192, 0.989204, 0.966698, 1.483895, 0.541994, 1.481214, 1.348319, 0.517804, 1.238796, 1.093987, 1.274598, 1.037472, 0.825707, 0.839411, 0.534473, 1.088648, 0.871750, 0.793572, 0.918413, 1.347887, 0.600003, 0.856966, 1.355622, 0.901064, 1.373408, 1.105120, 1.087480, 0.845619, 1.443290, 0.990788, 1.021125, 0.798618, 1.339497, 1.438196, 0.938998, 0.510930, 1.012374, 0.829899, 0.741384, 1.125728, 1.486529, 0.524355, 0.779083, 1.318244, 0.733207, 0.968435, 0.909394, 1.025079, 0.596948, 1.255514, 0.792539, 1.290562, 0.869886, 1.367188, 1.370763, 0.611779, 1.422283, 1.206951, 0.759789 },
57 { 0.628118, 0.986460, 0.661796, 1.389779, 1.017296, 0.888325, 1.047390, 0.806516, 1.340260, 0.657085, 1.181462, 0.778365, 1.385428, 0.599716, 0.696260, 1.393996, 1.378781, 1.214659, 0.609555, 1.084008, 0.992759, 1.268500, 0.584955, 1.284553, 1.017518, 1.433847, 1.242534, 1.316496, 0.611646, 1.247809, 1.163828, 1.354679, 0.548542, 1.477290, 0.783664, 0.869490, 0.812383, 1.337877, 0.581077, 0.874071, 0.500250, 0.892658, 1.159818, 1.001490, 1.127929, 1.091757, 0.634960, 1.313267, 0.653831, 0.639887, 1.472987, 1.382286, 1.431821, 0.715500, 0.898174, 1.414657, 1.493099, 0.598091, 1.016865, 0.540285, 0.832288, 1.383222, 1.193591, 0.502488, 1.469457, 0.927579, 1.010603, 0.966315, 1.375137, 0.728748, 0.896679, 0.688481, 0.540595, 1.148342, 0.851399, 0.733405, 1.111513, 1.009719, 1.394952, 1.185673, 0.683425, 0.626130, 1.359411, 1.448770, 0.529089, 0.825793, 1.089878, 1.111468, 0.815180, 1.174382, 1.362746, 0.956612, 0.957135, 1.011150, 0.630857, 0.807129, 1.048334, 0.612882, 1.388455, 1.256420 },
58 { 1.123186, 0.887811, 1.120422, 0.944150, 1.135521, 0.692968, 1.150914, 1.431752, 1.277622, 0.663900, 0.633598, 1.073001, 1.203762, 1.330694, 0.660117, 0.951956, 1.250083, 1.187391, 1.402099, 0.815812, 1.452202, 0.937322, 0.819355, 0.611906, 1.228004, 1.102393, 1.146756, 0.685456, 0.565851, 0.655269, 0.725638, 0.884126, 1.426332, 1.164023, 1.325686, 0.583175, 1.491974, 0.853858, 0.602065, 0.547459, 0.615989, 0.534945, 0.740132, 0.756071, 1.355647, 1.054257, 0.591385, 0.514674, 1.494585, 1.206039, 1.472892, 1.235039, 1.247592, 1.078207, 1.227007, 1.059723, 1.069905, 1.474985, 1.240604, 1.265733, 1.317280, 0.924961, 1.064172, 1.489886, 0.889740, 1.223275, 0.845877, 1.388685, 1.022245, 0.530828, 1.420735, 0.986296, 0.774931, 0.989966, 1.004876, 1.365143, 1.070201, 1.336545, 0.555874, 1.333750, 0.589715, 1.216764, 1.147382, 1.048948, 1.133480, 0.524698, 0.818307, 0.680001, 0.637915, 1.107480, 1.354593, 0.571013, 0.800586, 1.180872, 0.989638, 1.177721, 0.666825, 0.810721, 1.273648, 0.554075 },
59 { 1.043900, 1.240287, 1.209958, 0.826213, 1.342646, 0.781448, 0.599894, 0.958047, 0.973484, 1.257917, 1.181843, 0.559902, 1.394877, 0.703383, 1.462728, 0.859463, 1.201552, 1.166392, 0.796967, 1.339768, 0.744285, 1.219831, 1.199772, 0.514047, 1.402293, 1.125664, 1.443023, 0.538936, 0.511895, 0.633584, 1.268637, 1.443648, 0.565841, 1.325301, 1.416712, 1.129156, 1.185031, 1.075235, 0.619197, 0.605593, 1.282352, 1.154266, 0.808002, 0.746882, 0.741806, 1.088216, 1.426496, 1.249235, 1.195733, 0.548990, 0.758599, 0.753935, 0.870433, 1.431161, 1.321455, 0.848566, 1.423187, 0.596820, 0.535996, 1.049019, 0.714521, 1.019492, 0.687287, 1.203584, 1.076291, 1.169336, 1.064990, 0.507994, 0.695313, 0.854872, 0.741875, 0.829731, 1.127131, 0.818975, 1.150661, 0.779207, 1.470372, 1.307541, 1.243043, 1.422727, 0.874610, 1.252954, 1.473780, 1.304516, 1.318572, 0.894120, 0.588865, 0.687488, 1.472428, 0.918656, 1.323939, 1.406423, 1.050762, 0.892280, 1.145244, 0.889083, 1.128182, 0.869011, 1.168184, 1.117911 },
60 { 0.875060, 1.314981, 1.431955, 1.360897, 1.330123, 0.878816, 1.037516, 1.066977, 0.923814, 0.634828, 0.766401, 1.309031, 1.025698, 1.009135, 1.067087, 0.886196, 0.708259, 1.443071, 0.833758, 0.690030, 0.676341, 0.986915, 1.140032, 0.748755, 1.468690, 1.256891, 0.839220, 1.481236, 0.609901, 0.620020, 1.427007, 0.765061, 1.218173, 1.256902, 1.445317, 0.923784, 0.689765, 1.325511, 1.451756, 1.212756, 0.998874, 1.181274, 1.030370, 1.175103, 1.260383, 0.626551, 0.940208, 1.350733, 1.455814, 1.355004, 1.476460, 0.817381, 0.843167, 0.941242, 1.416786, 0.897703, 0.854643, 0.840549, 1.163709, 0.507771, 1.279304, 1.345945, 1.497428, 0.973198, 0.579716, 1.241767, 0.816868, 0.713616, 1.270998, 1.334559, 1.351746, 0.581553, 0.775823, 1.303400, 1.368665, 0.635983, 1.299402, 0.538457, 1.498671, 1.176010, 1.287824, 1.444752, 1.379996, 1.087086, 1.243929, 1.131779, 1.468878, 1.133481, 0.637244, 0.529194, 0.717628, 1.360326, 1.123830, 0.557756, 0.872732, 0.922547, 1.114523, 1.438563, 0.743833, 0.720907 },
61 { 1.345938, 1.418358, 1.424275, 1.155991, 0.626149, 0.571493, 1.150268, 0.584680, 0.604146, 1.471212, 0.935993, 0.537377, 1.013664, 0.897073, 1.001501, 1.274813, 1.129630, 0.677259, 1.078578, 0.625138, 1.059150, 1.131486, 0.895937, 0.983373, 0.773572, 1.291491, 1.070917, 1.316595, 1.226574, 0.615640, 1.260544, 1.408848, 0.766322, 1.000240, 0.678138, 0.632134, 0.751839, 0.614574, 1.335281, 0.862874, 0.735116, 0.510164, 0.825152, 1.000108, 1.433593, 0.605665, 0.889756, 1.300515, 1.098498, 0.614721, 1.461195, 1.483252, 0.988557, 1.238099, 0.801520, 0.550741, 0.789153, 1.455642, 0.674229, 1.429373, 0.890240, 1.308407, 0.507882, 1.188864, 1.227585, 1.374329, 1.393874, 1.134409, 0.736491, 0.820877, 1.465487, 1.130531, 1.239679, 1.304525, 0.918847, 0.566421, 0.548522, 1.119883, 0.642187, 0.524335, 1.128029, 1.444313, 0.530247, 1.149273, 1.146949, 1.281323, 0.853004, 0.505300, 1.113191, 0.757923, 1.071819, 1.195013, 1.065261, 0.854545, 1.312237, 1.137344, 0.621631, 1.299676, 1.425879, 1.396843 },
62 { 0.635556, 1.059111, 1.308952, 0.704766, 0.777577, 0.556573, 1.048830, 0.960567, 1.483903, 0.601256, 1.417074, 0.767609, 0.867716, 0.697499, 0.603437, 0.626009, 0.774052, 0.556517, 0.571561, 0.561268, 1.254766, 0.556985, 0.943533, 1.191793, 1.012351, 1.014343, 1.161136, 0.595661, 0.534088, 1.336995, 1.191277, 0.599785, 0.862058, 1.239023, 0.656823, 1.382766, 0.809660, 0.864525, 0.680553, 1.093310, 0.905496, 0.585869, 0.649157, 0.690196, 0.699296, 1.126553, 1.324224, 0.570062, 1.054777, 1.247412, 0.706222, 1.255465, 1.224234, 1.441106, 1.025345, 0.790910, 1.336143, 1.434829, 1.351849, 0.912824, 1.039535, 1.334563, 1.425817, 1.056184, 0.903885, 0.945097, 1.006046, 1.256698, 0.823517, 0.651247, 0.660987, 1.046842, 0.528239, 0.569738, 0.573642, 0.973655, 1.142437, 1.097988, 0.890620, 1.362035, 0.706367, 0.952173, 1.154068, 0.966686, 1.012419, 1.021340, 0.637085, 0.963258, 0.610081, 0.558546, 1.381745, 0.587094, 0.689553, 1.121866, 0.779377, 0.824409, 0.944902, 0.775049, 1.265050, 0.517354 },
63 { 0.734900, 1.119260, 0.843622, 0.704809, 1.330814, 1.474340, 1.032411, 0.505694, 0.824936, 0.992780, 1.496604, 0.525476, 0.785172, 0.732564, 0.539921, 0.579143, 1.429222, 1.387006, 0.677721, 1.294291, 1.442514, 0.585160, 0.834461, 1.363386, 0.827060, 1.001998, 1.428217, 0.531227, 1.297473, 1.312636, 0.909997, 0.922830, 1.107568, 0.759923, 0.820326, 0.870107, 1.289272, 0.825146, 1.488850, 1.170181, 1.446206, 0.747835, 0.627882, 1.280218, 1.327983, 1.238888, 0.777494, 0.943308, 1.327586, 1.002670, 1.182035, 1.406544, 1.030074, 1.204054, 0.844526, 1.124704, 0.594368, 1.327619, 1.476624, 0.829647, 0.743005, 0.686308, 1.259147, 1.213336, 0.886493, 0.560378, 0.550993, 1.485941, 0.921959, 0.870450, 0.950378, 1.374255, 0.632401, 0.712168, 1.127171, 1.343072, 0.697690, 1.362223, 0.638022, 1.383644, 1.235128, 0.897480, 1.426219, 1.072101, 1.349763, 0.879846, 0.982531, 1.436232, 0.892840, 0.676757, 0.879941, 0.540303, 0.527823, 1.182996, 0.688427, 0.805384, 1.141954, 0.912076, 1.443228, 0.561961 },
64 { 0.619583, 0.908220, 0.655543, 0.597012, 0.538192, 0.866151, 1.372380, 1.452376, 1.214701, 1.377784, 0.656336, 1.278099, 0.743594, 0.944078, 1.458225, 0.607476, 0.663891, 1.071079, 1.218320, 0.604553, 1.298038, 1.007390, 1.346154, 0.529281, 0.820564, 1.466176, 1.072455, 0.960620, 1.374843, 0.524257, 0.798524, 1.098067, 0.769498, 0.576331, 1.303613, 1.059493, 0.513170, 0.722168, 0.910329, 0.788630, 0.543182, 1.396245, 1.419360, 1.443838, 0.793549, 1.477234, 1.484029, 0.834170, 0.725374, 0.912801, 0.637919, 0.503459, 0.832874, 1.380588, 0.908287, 1.465089, 1.427761, 1.482611, 0.615283, 1.127030, 1.416306, 0.543117, 1.045509, 0.571099, 0.849557, 1.244264, 1.499765, 1.435468, 0.627860, 1.038495, 0.581902, 0.743817, 1.259628, 0.720385, 0.893064, 0.605289, 1.393656, 1.491742, 1.081272, 0.662783, 1.266906, 0.830318, 1.188704, 1.081714, 0.648343, 1.137915, 0.988191, 0.881204, 0.964808, 0.722758, 1.020527, 0.971575, 0.661291, 1.271737, 1.350533, 1.162144, 1.282630, 1.221133, 1.128489, 0.758767 },
65 { 1.094744, 1.449561, 1.071110, 1.353642, 0.783702, 0.902558, 1.074954, 1.143760, 1.408050, 1.230958, 1.333502, 1.160335, 1.445780, 0.821178, 1.035229, 1.386131, 0.943130, 1.367576, 1.445800, 0.895306, 0.737235, 0.689140, 1.277045, 1.219042, 0.999189, 0.597013, 0.657893, 1.011706, 0.643968, 1.373057, 0.743838, 0.605406, 0.932299, 0.781985, 0.744317, 1.390433, 1.417748, 0.677239, 0.526382, 1.429636, 1.220976, 0.890141, 1.210511, 1.393789, 1.080778, 0.794967, 0.844574, 1.031463, 0.700638, 1.411410, 0.690343, 1.228668, 1.027177, 1.341832, 1.457629, 0.792155, 1.262338, 0.764030, 0.882158, 0.603022, 0.734244, 1.262396, 0.643198, 1.149344, 0.862620, 0.825129, 0.839640, 1.336547, 0.899160, 0.961490, 1.437300, 0.863710, 1.397868, 0.564692, 1.103704, 0.728641, 0.604724, 1.346087, 0.532961, 1.009466, 0.725735, 0.574246, 0.757156, 1.248943, 1.405088, 0.574402, 1.341561, 1.457685, 1.079504, 0.645329, 1.168122, 0.868963, 0.940918, 1.211615, 0.601606, 1.448788, 0.748838, 0.943322, 1.083784, 0.901646 },
66 { 1.167641, 1.112451, 0.535931, 0.947706, 0.888675, 1.408667, 1.032946, 1.200435, 0.641524, 0.756565, 0.547207, 0.905872, 1.446300, 1.147797, 0.904047, 0.791513, 1.404653, 1.092697, 1.177800, 1.118598, 0.569978, 1.496952, 1.088718, 1.256389, 0.810806, 0.944087, 1.062446, 0.587010, 0.806498, 1.121109, 0.549740, 0.989608, 1.073241, 1.366084, 1.488263, 0.826025, 0.572142, 1.149351, 1.338909, 1.416253, 1.368357, 1.491190, 0.993610, 0.824534, 0.510296, 1.362356, 1.258862, 0.988767, 1.066141, 1.452240, 1.217312, 1.140926, 0.568250, 1.241786, 1.446832, 0.720296, 1.293081, 0.769166, 1.249523, 0.619600, 0.857399, 0.862334, 1.043659, 0.596569, 0.630266, 1.260230, 1.121536, 1.440912, 1.456759, 0.723228, 0.697675, 0.858840, 1.464669, 1.277079, 1.335189, 0.605894, 1.200725, 1.408902, 0.766034, 1.253729, 0.754399, 0.659588, 0.721686, 0.648845, 0.554910, 1.388891, 1.468556, 1.062467, 1.484209, 1.231654, 1.269116, 0.961065, 0.926877, 1.418771, 0.920339, 1.481656, 1.496486, 1.257313, 0.555515, 1.123589 },
67 { 1.116234, 0.569000, 1.148371, 1.213464, 0.847500, 1.398437, 0.881196, 1.011374, 1.041046, 1.160339, 0.948184, 0.541478, 0.751001, 0.719342, 1.151283, 0.677398, 1.156195, 1.202239, 1.479082, 1.321553, 1.190452, 0.992746, 1.198480, 1.046161, 0.623673, 1.455355, 0.903832, 1.285455, 1.297053, 1.124483, 1.410240, 1.296438, 0.657316, 1.085601, 1.431401, 1.355320, 1.324462, 1.432921, 0.742826, 0.670706, 0.675775, 0.931263, 0.869977, 0.703497, 1.137491, 0.968263, 0.903027, 0.939470, 1.366475, 0.999347, 0.840546, 0.542362, 1.044259, 0.897461, 0.677064, 0.762184, 1.378701, 0.556484, 0.500879, 0.863882, 1.043415, 0.844455, 0.720266, 1.250452, 1.219721, 0.609329, 1.168317, 1.008124, 1.263868, 1.285371, 1.267612, 0.956247, 0.613906, 0.982968, 0.890671, 1.269056, 1.405158, 1.394865, 0.612409, 1.224123, 1.456423, 1.045532, 0.764319, 0.539082, 0.970792, 0.502726, 0.689715, 1.403668, 1.338404, 0.694803, 1.361656, 0.983067, 0.691668, 0.508948, 1.471354, 0.692869, 1.141161, 1.382808, 1.022105, 1.340210 },
68 { 1.305027, 1.417294, 1.411711, 0.929088, 1.279166, 0.745954, 0.805378, 1.014312, 1.147074, 1.461683, 0.775968, 1.127427, 1.205592, 1.024311, 1.112450, 0.937935, 0.548958, 1.013580, 1.232978, 0.958685, 1.230789, 0.824367, 1.415602, 0.983085, 0.812914, 0.673555, 0.924277, 1.175504, 0.618840, 0.714958, 0.807589, 0.551825, 0.506550, 1.219134, 1.107405, 0.719842, 0.631640, 0.624481, 1.401661, 0.857339, 0.802297, 0.716544, 0.528783, 1.484474, 0.864336, 0.606295, 1.444175, 1.160480, 1.322432, 1.219129, 0.692506, 0.789991, 1.471677, 0.550392, 1.012413, 1.191612, 1.233205, 1.389600, 1.448538, 1.410877, 1.332642, 1.457888, 1.076923, 0.570433, 1.174454, 0.571202, 1.169341, 0.774461, 0.949637, 1.496979, 1.341200, 0.529471, 0.580710, 0.886545, 0.846563, 1.026198, 0.755716, 1.163037, 0.694687, 1.395481, 1.454198, 1.285041, 1.265287, 1.264468, 1.222440, 0.994904, 1.221549, 1.049353, 0.894578, 1.447085, 0.804555, 0.768331, 0.889337, 1.059252, 1.156951, 0.563632, 1.415725, 1.449061, 1.482976, 0.742506 },
69 { 0.920315, 0.652752, 0.996433, 0.671131, 0.915834, 1.126481, 1.431469, 0.904975, 1.331753, 0.712123, 1.004036, 1.399249, 1.059027, 0.644583, 1.482883, 0.754166, 1.295965, 0.518653, 0.944016, 0.813149, 0.584188, 0.812512, 0.553859, 1.219481, 0.591115, 0.819874, 0.813568, 1.161684, 0.945147, 1.163196, 1.475042, 1.112102, 0.860164, 1.190670, 1.154397, 1.285748, 1.033687, 1.430824, 1.409531, 0.751444, 0.517261, 0.939580, 0.509179, 0.660066, 1.211547, 0.721262, 0.835340, 0.704713, 1.124623, 1.065840, 0.575917, 1.362895, 1.217630, 1.170938, 1.351641, 0.507758, 0.847091, 0.689311, 0.623260, 0.515929, 0.785452, 0.755167, 0.781900, 0.551448, 1.305338, 1.021574, 0.618043, 1.112669, 0.961044, 0.982826, 0.505608, 0.796394, 1.172716, 1.420101, 0.695585, 1.089549, 1.249750, 1.289342, 0.579339, 1.477380, 1.149356, 0.699074, 1.115248, 0.536878, 0.745607, 0.821738, 0.549569, 1.175895, 0.795487, 0.835929, 1.203680, 0.565299, 0.612610, 1.021754, 1.498217, 1.194223, 1.133953, 1.019904, 0.594652, 0.790909 },
70 { 0.965789, 1.194328, 0.616379, 0.777838, 0.921299, 1.207086, 1.496303, 1.120253, 1.222593, 1.081036, 1.171151, 0.666471, 0.570996, 1.380889, 0.703075, 0.618993, 1.218284, 1.323520, 0.983416, 0.974910, 0.823529, 0.805998, 1.191164, 0.903444, 1.476858, 1.153093, 1.175976, 1.376058, 0.687381, 1.434627, 1.313396, 0.687739, 1.467098, 1.225961, 1.328663, 0.918464, 1.404405, 0.786276, 0.697552, 1.208431, 0.508722, 0.973600, 0.592625, 0.750477, 0.816762, 0.869360, 0.744586, 0.707582, 0.677276, 1.347686, 1.362123, 0.833759, 1.147330, 0.944373, 1.245300, 1.371705, 0.900468, 1.301551, 1.277147, 0.530418, 0.867355, 0.897317, 1.246269, 1.048079, 1.185179, 1.168351, 0.717229, 1.318631, 1.080505, 1.111622, 0.542030, 1.377112, 1.452016, 0.514739, 0.841373, 1.336502, 0.505720, 0.988298, 0.751935, 0.846356, 0.529360, 0.988094, 1.423488, 1.242249, 1.171515, 1.389450, 0.832910, 1.058424, 0.744120, 1.234346, 1.442857, 1.321819, 1.417105, 1.074780, 0.552294, 1.481139, 1.296479, 0.549762, 1.331197, 1.119685 },
71 { 1.240994, 1.004417, 1.076903, 1.380301, 0.681073, 1.240072, 0.599144, 0.827421, 1.385618, 1.171047, 1.292965, 0.703596, 1.205914, 0.886948, 0.729909, 0.814431, 0.745337, 0.941036, 1.417759, 0.606827, 0.984781, 1.033517, 1.496025, 0.624208, 1.139225, 1.401152, 0.672173, 0.600005, 1.307557, 1.011739, 1.117489, 0.801016, 0.836676, 0.694911, 1.064258, 0.594293, 0.748017, 0.742004, 1.378077, 0.807274, 0.790488, 1.461195, 0.946933, 0.847030, 1.031838, 0.623853, 1.218063, 0.787130, 1.229268, 1.022002, 0.798828, 1.307609, 1.484368, 1.093625, 0.790662, 0.672610, 0.633210, 0.614258, 1.079917, 1.090258, 0.961887, 0.881970, 1.271143, 0.865783, 1.266286, 0.684233, 0.852523, 0.582680, 1.003595, 1.115824, 0.781990, 1.139477, 1.414482, 0.825298, 1.410234, 1.364811, 0.512456, 1.222190, 1.340780, 0.960877, 0.655250, 0.749875, 1.195300, 1.213657, 1.355008, 1.324839, 0.894057, 1.092388, 1.442207, 0.896312, 1.111010, 0.648649, 0.695120, 1.098782, 0.671672, 0.760553, 0.532518, 0.674752, 0.643760, 0.600867 },
72 { 0.508616, 1.139587, 0.837599, 0.769587, 1.211012, 0.887854, 0.883565, 1.032578, 1.242788, 0.948547, 1.091274, 0.843865, 1.309834, 0.725819, 0.799935, 1.369575, 0.858794, 0.880898, 1.043715, 0.920951, 1.285454, 0.996651, 1.062302, 0.905226, 1.360901, 1.326388, 1.063816, 0.711928, 1.327673, 0.800966, 1.276300, 0.780729, 1.238602, 0.798943, 0.504048, 1.139552, 1.148977, 0.890112, 1.496389, 0.931725, 1.376060, 1.304630, 1.491572, 0.890379, 0.525971, 0.627441, 0.792760, 0.854679, 0.656863, 0.978076, 0.591386, 1.264768, 1.123142, 0.843199, 1.182173, 1.486243, 1.174058, 1.451406, 0.686886, 0.994648, 0.726293, 0.914456, 0.594147, 1.194929, 0.992670, 0.673703, 0.914177, 1.112832, 0.826886, 1.415108, 1.102929, 1.114907, 1.092527, 1.232665, 1.230158, 1.168135, 0.967937, 0.675485, 1.359749, 1.349738, 0.876208, 0.955242, 1.104643, 1.369442, 1.124279, 1.380672, 1.330784, 1.084123, 0.557695, 0.937055, 1.029034, 1.113690, 1.389994, 1.204602, 1.174971, 1.315004, 1.085035, 0.540704, 1.484719, 0.658090 },
73 { 0.644493, 0.983155, 1.182966, 0.845419, 1.275536, 1.325423, 0.745975, 0.570021, 0.874557, 0.948904, 0.941743, 0.899095, 1.497975, 1.271383, 1.019847, 0.667677, 0.916173, 0.657668, 1.075617, 0.919916, 1.166330, 1.499661, 0.522915, 0.812047, 1.446334, 0.512609, 0.870505, 1.046295, 1.110097, 0.866803, 0.635209, 1.300125, 0.519909, 1.386939, 1.139499, 1.198598, 0.854740, 0.790703, 0.671686, 0.630423, 1.119348, 1.454993, 0.896905, 1.089852, 1.199049, 1.450959, 0.877996, 1.089548, 1.094816, 0.988921, 0.658782, 1.177731, 1.018045, 1.043646, 1.311295, 0.955994, 0.554548, 1.219336, 0.811264, 1.342269, 0.672093, 0.695354, 1.161571, 0.896857, 0.766394, 0.892116, 0.564959, 1.385207, 0.522631, 0.894384, 0.970877, 1.099129, 1.016986, 0.697671, 1.292497, 1.191440, 0.866367, 0.646984, 1.297190, 0.519869, 1.190706, 1.001869, 0.619883, 1.078022, 0.851316, 0.680539, 1.377275, 0.559557, 0.818389, 1.428808, 0.625263, 0.615101, 1.209763, 1.431413, 0.656432, 1.341990, 1.257941, 1.069684, 1.434806, 1.187104 },
74 { 0.906778, 1.451152, 0.626091, 1.374484, 1.208466, 0.846907, 1.422893, 0.955109, 1.406620, 1.115623, 0.577848, 1.444335, 0.583812, 1.497962, 1.300350, 0.764714, 1.071251, 1.428979, 1.389508, 0.885985, 0.924611, 0.867551, 1.205046, 0.588003, 0.990795, 1.141550, 0.663796, 1.003369, 0.720503, 1.244627, 1.267241, 1.499126, 1.153575, 0.732174, 0.858555, 1.151455, 0.541626, 1.076552, 0.692514, 0.709541, 1.435705, 1.194576, 1.097784, 1.297998, 0.782486, 1.195638, 0.822783, 0.645133, 0.672125, 0.853602, 1.229869, 0.977755, 1.425408, 1.127760, 1.104448, 0.930101, 0.989530, 1.269785, 1.054534, 0.665179, 1.271324, 0.826416, 0.562041, 0.992957, 1.014662, 1.222646, 0.532179, 1.444889, 1.313611, 1.080462, 1.313297, 0.675162, 0.598569, 1.299007, 1.181278, 0.645639, 0.946280, 1.481928, 0.981646, 0.704662, 1.380946, 1.083209, 0.640011, 0.631266, 1.372796, 0.856719, 0.644891, 0.738278, 0.560036, 1.027745, 1.250566, 0.552875, 1.063773, 1.061246, 0.652126, 0.626595, 0.970681, 0.759502, 0.722700, 1.134021 },
75 { 1.387871, 0.609813, 0.813069, 0.566363, 0.527317, 1.442384, 1.304885, 0.894983, 1.046120, 1.088910, 1.494889, 1.074205, 0.515195, 0.844693, 1.356374, 1.356267, 0.940708, 1.044935, 0.768694, 1.007897, 0.979126, 0.575399, 1.017452, 0.912747, 1.333192, 1.497731, 1.060138, 1.445037, 1.023201, 1.416673, 0.992615, 0.653885, 1.093788, 0.599927, 0.855519, 1.315686, 1.085223, 1.233672, 1.418842, 1.202688, 1.295957, 0.717462, 0.985073, 0.976602, 0.786492, 1.414705, 0.925322, 0.907698, 1.389002, 1.328574, 1.293807, 0.588292, 0.613594, 1.241227, 1.351431, 1.303771, 1.345010, 1.424566, 1.010957, 1.159745, 1.384649, 1.077787, 0.635514, 1.250644, 0.601466, 1.405826, 1.311718, 0.657155, 0.949901, 0.796142, 0.915244, 1.222870, 1.072124, 1.060371, 0.822443, 1.065006, 0.757374, 0.573611, 0.712603, 1.273337, 0.607814, 0.717470, 1.224186, 1.241583, 1.328050, 1.423945, 1.170057, 1.036718, 1.315543, 0.948351, 1.010692, 1.417729, 0.741797, 1.135802, 1.060786, 0.783794, 0.698745, 0.727327, 0.959432, 0.692119 },
76 { 0.738312, 1.368673, 1.272295, 1.134404, 0.600813, 1.221585, 1.118723, 0.797170, 0.527686, 1.261763, 1.402506, 1.260051, 1.430003, 0.806598, 1.370994, 1.138765, 0.525156, 0.699431, 0.816863, 1.369131, 0.653552, 1.288147, 0.688019, 0.726687, 1.231721, 0.922910, 1.224324, 0.576355, 0.776873, 1.392493, 1.033669, 0.887735, 0.737417, 0.969096, 1.214279, 0.934014, 0.973639, 0.553851, 0.656182, 1.188153, 0.966950, 1.373333, 1.082330, 1.410659, 0.508866, 0.909102, 1.337173, 0.667223, 0.873761, 0.667350, 0.718255, 0.823825, 0.736182, 0.850593, 1.137762, 0.547577, 1.093636, 1.414856, 0.977363, 0.992577, 0.799437, 1.298316, 1.281197, 1.031891, 0.660476, 0.770730, 0.793347, 0.662836, 0.523499, 1.094230, 1.307977, 1.143905, 0.643860, 0.850456, 1.234348, 0.593189, 1.428094, 0.706980, 0.895995, 1.322824, 0.895809, 1.096039, 0.848946, 0.972987, 0.720160, 0.561125, 0.856005, 0.700435, 0.826886, 0.794326, 0.877164, 0.548644, 0.539996, 1.021595, 0.963166, 0.634559, 1.189426, 0.747234, 1.348540, 0.953749 },
77 { 0.985315, 0.704352, 1.397999, 1.038796, 1.488352, 1.354934, 0.871678, 0.631635, 1.100694, 1.418171, 0.811054, 0.833993, 0.513125, 1.045352, 1.367670, 1.410774, 1.029148, 0.515630, 0.709050, 1.054905, 1.164654, 1.168202, 1.470566, 0.997603, 0.616050, 1.190203, 1.438883, 1.110476, 1.239297, 1.052980, 0.653245, 1.017186, 0.813782, 1.395764, 0.551639, 1.055481, 0.623637, 0.728084, 1.475822, 1.075564, 0.713656, 1.287321, 1.106922, 0.536547, 1.022419, 0.618270, 0.512253, 0.959047, 0.856455, 1.216523, 1.220906, 0.579231, 0.758747, 0.866775, 1.217947, 1.023284, 0.590988, 0.905848, 0.798622, 1.257428, 1.390597, 1.042814, 1.023884, 1.330038, 1.011143, 1.468719, 1.232211, 1.368746, 0.839081, 1.266290, 0.606969, 0.830876, 1.257777, 0.615443, 0.644256, 0.848973, 0.648742, 0.905941, 0.913503, 1.354197, 0.579414, 1.496019, 0.685784, 0.668678, 0.663697, 0.895138, 0.610505, 1.186064, 0.985842, 1.166234, 0.846619, 1.450244, 1.417878, 1.292107, 0.775660, 0.891393, 1.313883, 1.043405, 0.995813, 1.481517 },
78 { 0.640877, 1.327333, 0.961836, 0.806825, 1.240657, 0.649677, 0.808458, 1.328261, 1.440129, 1.007999, 0.594534, 0.883857, 0.989150, 1.427353, 1.233809, 1.215201, 0.727943, 0.682892, 0.694028, 1.237397, 0.632620, 1.235775, 0.589679, 1.424777, 0.927340, 0.954497, 0.815958, 1.373852, 1.135772, 1.371480, 0.932600, 1.362612, 0.719244, 0.855989, 0.812727, 1.153256, 1.018393, 0.803630, 0.512113, 0.982791, 0.712353, 1.021196, 1.427824, 1.411798, 1.397839, 1.144779, 1.020467, 1.162991, 0.607513, 1.008414, 0.924310, 0.557041, 0.898710, 0.656819, 1.411971, 0.911640, 0.579479, 1.034588, 1.171898, 0.664034, 1.146245, 0.601063, 1.069210, 0.695957, 0.598223, 0.512450, 1.293624, 0.993032, 1.238930, 0.936630, 1.320678, 0.794628, 0.971412, 1.111458, 1.224351, 0.597840, 1.336486, 0.864127, 0.898238, 1.368809, 0.623409, 1.181660, 1.316528, 1.072483, 1.163308, 0.784934, 0.955917, 0.624979, 1.076012, 0.713495, 0.943278, 0.506444, 0.818137, 0.768702, 1.080901, 1.491032, 0.884601, 1.130702, 0.891783, 1.331143 },
79 { 0.723649, 0.509882, 0.647810, 1.155065, 0.509926, 1.084331, 1.403480, 1.349277, 0.513127, 0.746407, 0.967295, 0.640856, 0.904310, 0.538313, 1.296847, 0.610958, 1.457350, 0.540260, 0.704253, 1.407081, 1.250183, 1.168920, 0.949919, 1.431098, 0.963586, 0.860907, 1.118912, 1.445349, 0.699598, 1.440225, 0.571621, 1.169492, 0.615442, 0.970083, 0.876664, 0.745521, 1.106972, 1.360372, 0.669592, 0.763706, 1.015500, 0.569078, 1.227421, 1.279028, 0.998759, 1.479352, 0.814426, 1.033065, 1.199136, 1.238209, 1.041256, 0.793704, 1.124651, 0.642323, 1.026726, 1.174032, 0.658884, 1.424633, 0.745169, 0.811719, 1.259226, 0.868268, 0.975141, 0.862810, 0.670848, 1.121842, 0.550525, 0.590948, 0.965080, 0.910664, 1.388301, 0.731976, 0.544855, 1.408798, 0.761519, 1.495353, 0.764252, 1.091198, 1.088864, 0.718721, 0.808916, 0.604445, 0.673350, 1.085818, 0.511122, 0.930413, 1.441205, 0.650186, 1.321636, 0.584376, 0.523661, 0.575510, 1.444069, 1.102778, 0.832996, 1.368440, 0.546556, 1.355194, 0.562543, 1.209938 },
80 { 1.214572, 1.039993, 0.680085, 1.164949, 1.002062, 0.961051, 0.604524, 1.065257, 0.677918, 0.712075, 0.613299, 1.033344, 0.932251, 0.995424, 0.831484, 0.871557, 1.019711, 1.133589, 0.643787, 0.996871, 1.034259, 0.951186, 0.807462, 1.202862, 1.160362, 0.528913, 1.208434, 0.598020, 1.419734, 1.311390, 0.698922, 0.542989, 1.190362, 0.990131, 0.570625, 0.805170, 0.616436, 1.102436, 0.553573, 1.436306, 0.806401, 1.267365, 1.498419, 1.211866, 0.933485, 0.672030, 1.055211, 0.618925, 0.788577, 0.774461, 0.842783, 1.178160, 1.340560, 1.486576, 0.709341, 0.886641, 0.960695, 1.454251, 1.478608, 1.130784, 1.042065, 0.892575, 1.224600, 0.888711, 0.529256, 0.684621, 1.179671, 1.375272, 0.529209, 1.362014, 0.608204, 0.840499, 0.934685, 1.233276, 1.081495, 1.474929, 1.358147, 1.102358, 0.730007, 1.219612, 0.854049, 0.567538, 0.951308, 1.250278, 1.091972, 0.697218, 0.538106, 1.254326, 1.136701, 0.570114, 0.797050, 1.486991, 1.054933, 0.828866, 0.946051, 0.997102, 1.250373, 0.944071, 0.752005, 0.515667 },
81 { 0.809350, 1.359780, 0.600982, 1.493723, 0.796782, 1.149483, 1.398054, 1.429972, 1.492201, 0.992389, 1.079050, 0.818349, 1.366158, 1.017034, 1.352828, 1.153733, 0.655009, 1.140788, 1.158859, 0.787855, 1.315486, 1.272949, 1.057755, 1.356871, 1.446270, 1.381894, 1.248968, 0.944158, 0.563956, 1.247665, 0.779481, 0.944363, 1.159841, 0.638168, 0.889985, 1.085756, 0.758917, 0.951204, 1.270134, 0.549008, 0.738000, 1.280982, 1.352218, 0.972994, 1.086381, 1.126967, 1.187764, 1.410095, 1.355641, 1.166941, 0.818781, 0.722547, 0.657046, 0.805249, 1.365357, 0.664131, 1.381766, 1.401825, 1.215666, 0.781842, 1.212773, 1.112052, 0.551452, 0.608990, 0.645066, 0.685463, 0.957799, 0.936196, 0.557161, 0.900272, 0.660222, 0.859132, 0.545214, 0.821197, 0.974400, 1.100794, 1.042523, 0.607037, 0.900486, 1.459339, 1.389636, 0.621707, 1.463127, 0.621887, 0.876692, 0.736315, 1.130713, 1.406145, 1.363593, 1.270951, 0.793367, 1.391867, 1.207168, 1.207735, 1.000901, 1.017706, 1.033368, 1.100003, 0.633149, 0.967004 },
82 { 0.626931, 1.444905, 1.318359, 0.972580, 0.593403, 0.567111, 0.554632, 0.974880, 0.828927, 0.616972, 1.421004, 1.106021, 0.606889, 1.286136, 0.802616, 0.791794, 0.761888, 0.607877, 0.816262, 1.262600, 0.782472, 0.666884, 0.737416, 0.997915, 1.343890, 1.410148, 1.464873, 0.911559, 0.790641, 0.700732, 1.452371, 0.782972, 0.684384, 0.625698, 1.400811, 1.473465, 0.927034, 1.358953, 0.502487, 1.435757, 1.270470, 1.026820, 0.831564, 1.256241, 1.385993, 1.372673, 0.882723, 0.704278, 0.746598, 1.219771, 1.395164, 0.885599, 0.859060, 0.767359, 1.145437, 0.606450, 1.427974, 0.655194, 0.889236, 0.965893, 1.463926, 1.462137, 1.263596, 0.727402, 0.790362, 0.861748, 0.630642, 0.891843, 1.100525, 0.655383, 1.258031, 1.207258, 1.371471, 0.700879, 1.017174, 0.922222, 1.153933, 0.929697, 1.393703, 0.937475, 1.332430, 0.864712, 0.639764, 1.316236, 1.157590, 1.320712, 1.387065, 1.163920, 0.625335, 1.342419, 1.207963, 0.533909, 1.148876, 0.886732, 1.435446, 1.201829, 1.233496, 1.086206, 0.558883, 0.713089 },
83 { 0.988295, 0.762884, 1.313199, 1.123317, 0.952232, 0.831979, 0.750432, 1.340974, 0.725942, 0.814581, 0.733329, 1.158103, 1.396324, 0.740645, 0.564837, 1.000287, 1.377813, 0.937557, 1.333060, 0.663665, 0.942539, 1.400300, 1.090478, 1.223100, 1.487518, 0.702633, 1.024040, 1.152132, 0.916265, 1.383463, 1.402412, 1.033143, 1.386177, 0.659104, 0.616553, 1.231105, 1.339300, 1.366822, 1.479312, 0.848494, 0.720733, 1.475692, 1.328503, 0.986967, 1.305781, 1.264851, 1.321744, 0.729760, 1.108402, 1.101063, 0.965927, 1.000644, 0.706637, 0.838824, 1.125750, 0.502387, 1.004438, 1.452247, 1.405028, 1.214763, 1.375028, 1.105815, 0.847369, 0.955517, 1.498046, 0.954711, 0.736375, 1.395312, 0.867068, 1.119190, 1.030265, 1.479736, 1.300380, 0.572864, 1.048599, 0.749164, 0.640281, 1.302624, 0.730820, 1.361672, 0.981857, 1.366846, 1.411342, 0.961575, 0.922481, 0.821713, 1.024829, 0.939880, 1.320397, 0.997840, 1.282790, 1.270580, 1.123464, 1.066718, 1.483112, 1.396862, 0.673090, 0.945979, 0.976400, 1.060684 },
84 { 0.778329, 1.019960, 1.155592, 1.011709, 0.962522, 1.024312, 1.249807, 1.218276, 0.942391, 0.756578, 0.950052, 0.955916, 1.185621, 0.991797, 1.111812, 0.592674, 0.853166, 1.467343, 1.178504, 1.144205, 1.012709, 1.011444, 0.960433, 1.265262, 0.816535, 0.750572, 1.308952, 0.591803, 1.244169, 1.028586, 1.364701, 0.954047, 1.400614, 1.043265, 1.133610, 1.141332, 1.102244, 1.118963, 0.670766, 1.194605, 0.648640, 1.448193, 0.544588, 1.372787, 1.154782, 0.804750, 1.217493, 1.443245, 0.504347, 0.570255, 1.492601, 1.420252, 1.026062, 0.679760, 0.645206, 0.516296, 0.661468, 0.653332, 0.913223, 0.758011, 0.904949, 1.157821, 1.095742, 0.869873, 1.184705, 1.006653, 0.552212, 0.564480, 1.328734, 1.140836, 1.009319, 0.650664, 0.657904, 0.747506, 1.354308, 1.065564, 0.713396, 1.460759, 1.374823, 0.509654, 0.961235, 0.856880, 0.745888, 1.349113, 0.921934, 1.253657, 0.875911, 1.127038, 0.887310, 1.333888, 1.280715, 1.179885, 1.428373, 1.133731, 1.115140, 1.418982, 0.524605, 1.158749, 0.912886, 0.745023 },
85 { 0.708036, 1.235998, 1.138715, 0.736582, 0.966364, 1.178495, 0.609169, 0.741633, 0.735817, 0.605059, 1.033781, 1.471969, 0.673801, 1.125199, 1.199222, 0.912167, 1.372897, 1.369846, 1.134501, 0.687340, 1.428333, 0.566714, 1.311297, 0.883358, 0.878887, 1.493202, 0.547065, 0.694242, 0.585173, 1.461313, 1.140628, 0.822938, 1.037035, 0.642309, 1.214680, 1.342054, 0.654932, 1.090065, 0.738547, 1.123500, 0.627493, 1.275588, 0.717966, 0.845934, 0.933142, 1.143343, 1.040910, 1.468639, 1.215699, 0.598918, 0.718710, 0.634452, 1.255943, 1.076367, 0.851038, 0.772967, 1.035298, 0.605490, 1.012981, 1.104679, 0.782583, 0.926421, 0.638948, 0.819173, 1.098642, 0.946217, 1.475376, 1.110332, 1.206555, 1.313432, 1.216302, 1.318865, 0.924427, 1.212314, 0.928995, 1.015580, 0.630632, 1.026960, 1.131653, 0.872091, 1.446960, 0.730820, 1.441733, 1.376960, 0.724539, 0.749060, 0.623606, 1.420635, 0.910489, 1.313295, 1.076429, 0.902798, 0.665274, 0.530803, 0.612697, 1.124972, 1.025492, 0.828526, 0.910482, 0.603148 },
86 { 0.521650, 1.266214, 1.470026, 0.650625, 1.084034, 1.497130, 0.840335, 0.936002, 1.246390, 1.006482, 1.315827, 0.917981, 0.833334, 0.703071, 0.510178, 1.489843, 0.728887, 1.077628, 1.322840, 1.328622, 0.688955, 0.788702, 1.089059, 0.908531, 1.348517, 0.869191, 0.755563, 1.172802, 1.318900, 1.060632, 1.363841, 1.210730, 0.618432, 0.578620, 1.174781, 1.269938, 1.376232, 1.018477, 0.628338, 1.176299, 1.493641, 1.037836, 0.726962, 1.144339, 0.800461, 1.315022, 1.379805, 0.911215, 1.132912, 0.569348, 1.072328, 1.101764, 0.836970, 0.682196, 1.434041, 0.864732, 0.829147, 1.412476, 0.743760, 1.033652, 0.996010, 1.107478, 0.643804, 1.037783, 1.427049, 0.638536, 1.222413, 1.221760, 1.197483, 1.342764, 0.945239, 0.740867, 1.432177, 1.257515, 0.520053, 1.463265, 1.248918, 0.896788, 0.892998, 1.487472, 1.198921, 0.659823, 1.357991, 0.810898, 1.310575, 1.124429, 1.037217, 0.515660, 1.227322, 0.906694, 1.393558, 1.266569, 0.559233, 1.207121, 1.451199, 0.758669, 0.612015, 1.476968, 0.654928, 0.718152 },
87 { 1.024127, 1.495283, 1.489878, 0.927181, 1.315850, 0.606116, 1.355508, 0.997172, 0.702415, 0.956651, 0.715332, 1.274922, 0.921800, 0.894828, 1.385034, 1.122407, 1.418957, 0.842340, 1.109210, 1.269795, 0.976424, 0.676123, 0.800033, 1.266827, 1.062128, 1.292869, 1.152776, 0.558487, 0.523094, 0.513150, 0.557316, 0.607553, 0.665764, 1.050192, 1.497034, 0.967941, 0.597823, 0.954929, 0.675015, 1.290270, 1.494349, 0.581029, 1.318338, 0.539854, 1.096320, 1.091391, 0.699305, 1.386300, 0.988549, 0.862360, 0.785192, 0.526696, 0.628645, 1.338231, 1.105271, 0.602625, 0.529857, 1.096209, 1.249293, 0.777409, 1.038690, 1.402697, 0.607443, 0.625789, 0.607886, 0.857354, 0.779171, 1.039353, 1.053734, 1.043698, 1.165407, 1.318337, 0.617933, 1.387777, 1.193598, 1.351537, 0.698892, 0.737048, 1.220746, 0.928422, 0.854536, 0.771950, 0.858193, 1.221586, 1.293635, 1.240386, 0.976621, 0.536264, 1.023585, 0.796352, 1.000601, 0.843821, 0.826399, 1.216280, 0.791928, 0.926234, 0.526338, 1.376215, 1.009498, 0.588150 },
88 { 0.949119, 0.954873, 1.060459, 1.251071, 0.580790, 0.688599, 0.796981, 0.756132, 0.922087, 0.765355, 1.340698, 0.854488, 0.913589, 1.461735, 0.994120, 1.225736, 1.134862, 1.478658, 1.459265, 0.778111, 1.306419, 0.510516, 1.424558, 1.046597, 0.547683, 1.339005, 1.192105, 0.996973, 1.456719, 1.285638, 1.261008, 0.900413, 0.949656, 0.511103, 1.037448, 0.848058, 0.690955, 1.202551, 1.468066, 0.784363, 1.165649, 0.783819, 0.875360, 0.773472, 0.859289, 0.855087, 1.496793, 0.687949, 1.395201, 0.935606, 0.705895, 1.297252, 0.875631, 1.497689, 0.763754, 0.563475, 1.193381, 0.676062, 1.186325, 0.538187, 0.527030, 0.984316, 0.708656, 1.323979, 1.408402, 0.615360, 1.225772, 1.475173, 0.588310, 1.474351, 1.391724, 1.431060, 0.803384, 0.817392, 1.064470, 1.066926, 1.076269, 1.259651, 0.998642, 1.303268, 1.094524, 0.568777, 0.743766, 1.352067, 0.959397, 1.496260, 1.011572, 0.664430, 0.977202, 1.477929, 0.656638, 1.047184, 1.214907, 0.885829, 0.673824, 1.469000, 0.624456, 0.992774, 0.670236, 1.091976 },
89 { 1.331403, 0.985375, 0.764736, 0.782149, 1.247607, 0.638323, 1.254194, 1.162323, 1.342171, 1.424315, 1.183724, 0.654329, 1.104968, 1.008915, 1.231776, 1.356580, 0.997676, 0.807233, 0.780993, 0.820387, 0.569350, 1.064043, 0.525502, 0.845591, 1.074894, 1.067388, 0.915275, 1.230209, 0.577127, 1.347854, 0.552127, 1.321423, 0.996616, 1.105851, 1.311933, 0.986245, 0.988884, 0.983167, 1.019199, 1.261118, 1.035526, 0.914264, 0.886494, 1.092465, 0.667554, 0.806933, 1.196344, 1.307693, 1.367782, 0.634143, 1.340261, 0.959177, 1.174439, 1.195839, 1.243088, 1.388428, 0.844144, 0.718629, 0.581084, 1.256311, 0.829747, 0.951994, 0.660481, 1.351405, 0.925050, 0.585700, 0.875212, 1.450617, 0.797932, 0.941259, 0.893945, 1.361064, 0.570913, 0.613029, 1.477959, 0.647904, 0.905724, 1.337021, 1.427383, 1.324801, 1.478273, 1.317706, 1.303610, 1.389987, 0.562941, 0.660920, 0.656160, 0.503454, 1.421185, 1.042838, 0.997829, 0.674170, 1.151508, 0.572698, 1.015967, 1.062941, 1.288323, 1.270597, 0.920360, 1.172104 },
90 { 1.134847, 1.038818, 1.472632, 1.160664, 0.867704, 0.614087, 1.222456, 0.540973, 1.316706, 1.499767, 1.357058, 0.516482, 0.873457, 1.012978, 0.930782, 1.177539, 1.446456, 1.342282, 1.449846, 1.146443, 0.550732, 0.892033, 1.320422, 0.593238, 0.719982, 0.893977, 1.125449, 1.382961, 1.276205, 0.568179, 1.041222, 1.176288, 0.928196, 0.944841, 0.764324, 1.012346, 0.851727, 1.460232, 1.224604, 0.727660, 1.289895, 0.909298, 1.124504, 1.021548, 1.192782, 1.344030, 1.270827, 1.000118, 0.590797, 1.049546, 0.921588, 0.983075, 0.855396, 0.510775, 0.622266, 0.691837, 1.257550, 0.914480, 1.254193, 1.296889, 1.222200, 1.345897, 0.567840, 1.459333, 0.954301, 1.282301, 1.445140, 0.973129, 0.896473, 1.024648, 1.442783, 1.441547, 0.752883, 1.129533, 0.992542, 1.152084, 1.314569, 1.248915, 1.108822, 1.090165, 0.565096, 1.343211, 0.728629, 0.756739, 1.456362, 0.985615, 1.264054, 1.325518, 0.723981, 0.968267, 0.709870, 1.089297, 1.122948, 1.473171, 1.096531, 1.314034, 1.483818, 1.186794, 0.923668, 1.029792 },
91 { 0.597253, 0.799251, 0.905409, 1.468894, 0.535370, 0.711432, 0.581510, 0.541563, 0.739989, 1.182075, 0.989210, 0.944446, 0.565250, 1.380719, 0.983452, 0.641176, 0.558215, 1.431426, 1.320159, 0.969035, 1.435061, 1.345217, 1.369672, 1.413094, 1.222936, 1.411626, 1.351621, 0.985243, 1.005497, 1.490124, 1.136992, 1.471105, 0.542479, 0.509720, 1.067412, 1.252674, 0.524385, 1.384920, 1.416139, 1.454256, 1.235673, 1.152592, 1.073261, 0.786933, 0.641393, 1.002007, 1.184127, 0.515118, 1.180701, 1.359760, 0.563263, 1.230380, 0.758176, 1.415955, 0.646483, 0.708893, 1.417754, 0.541697, 0.879082, 0.748453, 1.307930, 1.050408, 0.732296, 1.209092, 1.211179, 0.914255, 1.004797, 0.991841, 0.583068, 1.003844, 1.240923, 1.373435, 1.291458, 0.915571, 0.926674, 1.344294, 1.048435, 1.489005, 0.983877, 0.750354, 1.119053, 0.993603, 0.998648, 0.614102, 1.117184, 0.750785, 0.592123, 1.432115, 0.984268, 0.931344, 1.345967, 0.997614, 0.935728, 1.137575, 1.372229, 0.868024, 1.345964, 1.189571, 1.491298, 1.326938 },
92 { 1.082912, 1.181678, 1.185099, 1.313650, 1.377859, 1.352493, 1.331866, 0.931193, 1.061484, 0.765170, 0.904009, 0.628613, 1.323466, 0.549533, 1.222837, 0.914672, 1.118088, 0.973019, 0.642699, 1.309030, 1.411356, 1.132923, 0.672942, 0.665643, 0.710553, 1.366405, 0.745557, 1.421295, 1.431519, 0.609365, 0.692433, 1.124405, 0.771087, 0.591953, 1.443277, 1.332320, 0.860024, 1.107532, 0.521178, 1.005168, 1.238336, 0.835770, 1.052221, 1.033435, 1.430245, 1.126542, 1.481221, 1.419398, 0.818155, 0.883944, 0.513883, 0.818858, 0.802456, 0.940688, 0.843969, 1.326481, 1.050839, 0.847575, 0.763647, 1.429890, 0.971999, 1.424054, 0.638074, 1.191596, 0.624211, 1.493782, 1.207555, 1.167841, 1.006292, 1.258554, 1.050045, 0.955291, 0.733685, 1.318825, 0.835121, 1.437911, 1.259287, 0.664375, 0.895771, 0.756579, 0.522379, 1.104937, 0.936212, 1.001353, 1.139783, 0.646490, 0.542047, 0.728272, 0.809556, 1.259977, 0.933555, 0.643002, 0.854997, 0.889322, 1.114794, 0.960158, 0.942016, 1.089236, 1.364400, 1.363714 },
93 { 0.677320, 0.772269, 0.763991, 0.612507, 1.259262, 1.235765, 1.006180, 1.156648, 1.421010, 0.556364, 1.469475, 0.876685, 0.881285, 1.238676, 0.819213, 1.329145, 0.754818, 0.679649, 0.750775, 1.027427, 0.947496, 1.052792, 1.373591, 1.233260, 0.693790, 1.485538, 1.105016, 1.147317, 0.607311, 1.492527, 0.603892, 0.820978, 1.317708, 1.434420, 1.066312, 0.933085, 0.668957, 1.412110, 0.596938, 1.227050, 1.436119, 1.443238, 0.584585, 0.911049, 0.554833, 0.521956, 1.299572, 1.238003, 1.087295, 1.157003, 0.542128, 0.994972, 0.602552, 1.209272, 0.842322, 0.924029, 1.013402, 0.506935, 1.484984, 0.631483, 1.343303, 1.439904, 0.748405, 1.146100, 0.965540, 0.572033, 1.014313, 1.393747, 1.244641, 0.976230, 0.621144, 1.449403, 0.960579, 1.107954, 0.997306, 1.176637, 0.774141, 0.984868, 0.508819, 1.357484, 1.341519, 1.277961, 1.317836, 1.367466, 0.510856, 0.501116, 1.296064, 0.773931, 0.988340, 1.341983, 1.104444, 1.024074, 1.383132, 0.769627, 0.620207, 0.942099, 0.510290, 0.657012, 0.958157, 0.782726 },
94 { 1.157200, 1.150381, 0.635453, 1.126869, 1.419574, 0.639285, 1.420756, 0.713620, 0.930891, 0.961966, 1.045292, 1.265292, 0.942704, 0.569121, 0.583718, 1.352817, 0.562996, 0.939638, 0.777058, 1.296903, 1.244542, 0.542132, 0.634519, 0.732130, 1.143313, 0.849805, 0.823014, 1.274900, 0.506055, 0.752783, 1.485194, 1.057378, 0.611100, 0.701156, 1.078414, 1.372583, 1.058671, 1.000479, 1.006200, 0.764008, 1.339531, 1.350983, 1.114327, 1.196495, 0.670712, 0.595735, 1.094107, 0.738880, 0.530451, 0.532564, 1.252672, 0.784698, 1.184255, 1.273468, 0.839801, 1.131599, 0.537070, 1.496898, 0.560369, 1.381109, 1.112997, 0.823838, 1.472795, 1.419896, 1.272883, 1.102069, 0.574097, 0.935665, 1.086420, 1.145461, 1.339865, 0.883951, 0.743782, 1.218830, 1.490614, 1.227371, 0.935125, 0.690151, 0.968294, 0.848107, 1.316137, 0.946529, 0.508778, 0.984389, 1.450121, 0.777034, 0.963283, 0.501758, 0.803714, 1.049221, 1.319684, 1.079475, 1.294284, 1.294072, 0.945637, 1.341222, 1.471282, 0.923967, 0.707099, 1.419285 },
95 { 1.053945, 1.487315, 1.434206, 0.997445, 1.380575, 0.639680, 0.684008, 0.725847, 0.860518, 0.585253, 1.095622, 1.119182, 0.829465, 1.376055, 0.912492, 1.327548, 1.367839, 1.476268, 1.041358, 1.428820, 0.661210, 1.303985, 0.822362, 0.527981, 0.571833, 0.565839, 1.130443, 0.767777, 0.589506, 0.866723, 1.026868, 0.640990, 1.230671, 0.548334, 0.715751, 0.569683, 0.621158, 1.304611, 0.644728, 1.106238, 0.634461, 0.651168, 1.277091, 0.743871, 1.322942, 0.697228, 0.844156, 0.953160, 1.206861, 0.584618, 0.568810, 1.360064, 0.767565, 1.495218, 0.711320, 0.658810, 1.408937, 1.225493, 1.028595, 0.611750, 1.427857, 0.960891, 1.022113, 0.574975, 0.955790, 0.563773, 0.667251, 0.511959, 0.976748, 1.068262, 1.027840, 0.651682, 0.638900, 0.509443, 0.909551, 0.791912, 0.847393, 0.702647, 0.624660, 1.110491, 0.703323, 1.216365, 1.394993, 0.986728, 0.784776, 1.395552, 1.192049, 1.215660, 0.706870, 0.945299, 1.289793, 0.510399, 0.605275, 1.152316, 1.141695, 0.648422, 1.064855, 0.852042, 0.876452, 0.953891 },
96 { 0.582954, 1.258871, 1.387376, 1.187072, 0.969934, 0.660464, 1.306963, 1.148498, 1.097213, 1.365004, 1.359632, 1.458438, 0.516309, 0.754135, 0.779247, 0.593456, 0.891718, 0.733157, 0.726860, 1.017885, 1.008027, 0.699307, 1.449585, 0.971261, 0.766789, 1.066734, 1.463509, 1.295367, 1.106051, 0.644335, 1.067326, 1.223226, 0.518979, 0.650998, 0.564996, 0.781282, 1.053701, 0.833459, 1.061255, 1.202172, 1.106475, 1.158809, 1.192192, 0.880557, 0.812101, 0.816034, 0.956473, 1.451484, 0.605885, 0.691388, 1.385383, 0.883073, 1.402808, 0.708813, 1.412004, 1.207385, 1.316418, 1.082706, 1.312261, 1.369080, 0.921690, 1.324731, 0.648603, 1.058193, 0.857387, 0.563364, 1.151817, 1.252361, 0.691646, 0.855598, 1.320484, 0.711556, 1.015407, 0.714758, 0.667925, 1.442904, 1.145531, 1.108721, 0.898449, 0.672410, 1.073196, 1.244842, 0.935717, 0.583965, 0.665496, 1.082540, 1.296179, 0.573848, 1.317429, 0.509004, 1.155077, 0.971161, 1.351752, 0.501523, 1.058530, 0.570756, 0.731889, 0.661260, 1.235890, 0.695590 },
97 { 0.853516, 0.835152, 0.522142, 0.990419, 0.976019, 1.009563, 0.507391, 0.816791, 1.486459, 0.712277, 1.488886, 0.906667, 1.478636, 0.568392, 0.859515, 1.202489, 0.786150, 0.767905, 0.753821, 0.686536, 0.798300, 0.514267, 0.500777, 1.168514, 0.829936, 1.369296, 0.793550, 0.684221, 1.113760, 1.134146, 0.639323, 1.215263, 1.167040, 1.403723, 1.072640, 1.308133, 0.819918, 1.024681, 1.097654, 0.612524, 1.321603, 1.032999, 0.904795, 1.451293, 1.454521, 0.819469, 1.242145, 1.011931, 1.319191, 1.254506, 1.450550, 1.132562, 1.296762, 1.135556, 0.799027, 0.750574, 1.029773, 1.096606, 1.047945, 1.305247, 1.001937, 1.210461, 0.666378, 1.340910, 0.619713, 0.993074, 1.455130, 1.341105, 0.616753, 1.382260, 0.831995, 0.655223, 1.070652, 1.215852, 0.785375, 1.371158, 0.856595, 1.290430, 1.262729, 0.615507, 1.378414, 1.235670, 1.030434, 1.349905, 1.216841, 0.748461, 1.394933, 0.543928, 1.208168, 1.461498, 1.322008, 1.099455, 1.252689, 1.040188, 1.208512, 0.783211, 1.461020, 0.913319, 1.119291, 1.411381 },
98 { 0.599279, 1.409285, 1.133472, 1.484047, 1.421138, 0.684039, 1.305247, 1.239558, 0.907202, 1.019782, 0.748224, 1.433472, 1.269365, 1.419743, 0.660919, 0.668305, 1.236694, 1.226680, 1.067404, 1.329187, 0.537570, 0.867907, 0.662281, 1.401240, 0.630854, 0.899560, 0.894782, 0.557441, 0.833109, 0.991030, 0.573341, 1.343792, 1.384428, 1.481583, 0.722351, 1.105542, 0.915459, 0.860535, 0.598589, 0.508816, 0.725634, 1.288407, 0.633024, 0.876826, 1.391443, 0.843248, 0.515160, 0.519513, 1.096624, 1.376166, 0.726021, 1.336768, 0.676926, 0.685114, 1.222650, 0.749168, 1.497255, 1.402374, 0.939324, 1.229990, 0.905854, 1.444436, 0.554274, 1.216742, 1.404194, 1.452113, 0.725921, 0.519206, 0.761845, 0.613645, 0.835264, 0.824543, 0.655236, 0.880184, 1.453588, 1.049310, 0.861300, 0.797780, 0.700150, 1.204855, 0.517575, 0.677691, 1.384287, 0.887621, 1.318121, 0.666573, 0.752227, 0.775621, 0.559673, 0.721291, 1.109311, 0.686454, 1.140567, 1.472279, 0.667733, 1.000311, 1.110083, 0.927088, 0.583778, 0.539131 },
99 { 0.840927, 0.861817, 0.729394, 0.585669, 1.286449, 1.442175, 1.339639, 1.238115, 0.608774, 1.204573, 1.458721, 0.627585, 1.256892, 1.170931, 1.007124, 1.092465, 0.859497, 1.268020, 1.263024, 1.113091, 1.221003, 1.246889, 1.392024, 0.582026, 1.175914, 0.798913, 1.093525, 0.823780, 1.491374, 0.709630, 0.703630, 1.006234, 0.794070, 1.174506, 0.988575, 0.917477, 0.524048, 1.151325, 1.224588, 0.971254, 0.613029, 0.847169, 1.199524, 1.101445, 1.112380, 0.688257, 1.158544, 0.805394, 1.172401, 0.987006, 0.639337, 0.616837, 0.765252, 1.086793, 1.481456, 0.565125, 0.989144, 1.045340, 1.358776, 0.704726, 1.437476, 1.152182, 0.719659, 0.690769, 0.883005, 0.509321, 1.200794, 1.149680, 0.712915, 0.596090, 0.770830, 0.585907, 1.140401, 0.966342, 0.992883, 0.541140, 1.245288, 1.094743, 0.529246, 0.922248, 1.139134, 1.237104, 1.457779, 0.703451, 0.622614, 1.034574, 0.625606, 0.907488, 0.746861, 0.504618, 1.461859, 1.198971, 1.202941, 1.441101, 1.352973, 1.490976, 1.236082, 1.450715, 1.344185, 0.873536 },
100 { 0.676345, 1.041653, 0.669446, 1.078965, 0.590513, 0.884390, 0.722535, 0.819124, 0.890205, 1.070916, 0.547644, 0.507168, 1.126033, 0.809319, 1.186970, 1.277825, 0.652439, 1.417828, 0.697153, 1.431388, 1.195437, 1.427955, 1.435741, 1.202559, 0.567421, 0.650510, 1.317313, 0.995057, 0.934392, 1.443726, 0.872409, 1.324887, 1.251221, 0.878804, 0.923280, 0.964266, 0.859474, 1.442379, 1.383988, 0.834741, 0.858088, 1.251179, 1.272500, 1.308284, 0.685685, 1.306359, 1.292101, 1.014470, 1.185299, 1.211278, 0.513106, 0.948541, 1.323875, 1.198828, 0.890285, 0.765174, 0.621824, 1.389740, 0.535701, 0.548251, 1.073063, 0.791590, 1.009725, 0.779499, 0.971738, 0.507443, 1.248220, 1.488543, 1.200429, 0.669257, 1.354378, 0.756719, 1.408434, 0.554524, 1.324468, 1.324208, 0.998446, 0.746510, 0.973005, 1.125262, 0.711995, 0.811362, 1.197366, 1.171445, 1.475421, 1.184001, 0.592483, 1.225465, 1.254602, 0.523795, 1.144070, 1.174465, 0.785018, 0.874953, 0.728676, 1.137066, 0.948503, 1.330686, 0.614552, 1.419287 },
101 { 0.874759, 1.494385, 1.493532, 1.414311, 1.235544, 0.642515, 1.270163, 0.565514, 0.674294, 0.664717, 1.399382, 1.318168, 0.747256, 0.519288, 0.818985, 0.645393, 0.506681, 1.363968, 0.729454, 0.751167, 0.946403, 1.016917, 1.111753, 1.262694, 0.825513, 0.682871, 1.173340, 0.936581, 1.017654, 0.882798, 0.892498, 1.430150, 1.034255, 1.251330, 0.891626, 1.273964, 0.981920, 0.737445, 1.479756, 0.717457, 0.962425, 1.128200, 1.467144, 0.985831, 0.641012, 1.289720, 1.040964, 0.538054, 0.869896, 1.442539, 1.411660, 1.140480, 1.041674, 1.281760, 0.709274, 1.458736, 1.322914, 0.565340, 0.806176, 1.244824, 0.514498, 0.605097, 1.253443, 0.713271, 0.710627, 0.872855, 1.081622, 0.696155, 1.395577, 1.075020, 0.980204, 0.855250, 1.398709, 0.913372, 0.597283, 1.120711, 1.347113, 0.845804, 0.935442, 1.291124, 0.700689, 0.731007, 0.572326, 1.459884, 1.489903, 0.521568, 0.714006, 0.793117, 0.541584, 1.469353, 0.727636, 0.874200, 0.860149, 1.495571, 1.194840, 0.906229, 0.509897, 0.837127, 1.021301, 1.162643 },
102 { 0.562193, 1.442308, 1.405268, 1.225527, 1.418377, 1.264287, 1.496640, 0.818130, 1.069232, 0.601383, 1.379491, 0.806930, 0.724178, 1.151950, 1.209119, 0.712019, 0.710795, 0.589047, 0.839792, 0.866845, 1.221167, 0.507146, 1.154270, 1.267574, 0.579116, 1.102602, 1.046368, 0.632901, 0.895141, 0.543660, 1.141196, 0.583227, 0.814167, 0.798132, 0.681940, 0.605859, 0.944061, 0.552595, 0.760150, 1.406800, 1.293860, 1.160374, 0.908370, 1.424617, 1.142074, 1.480297, 1.340409, 0.675192, 0.570799, 0.782525, 0.809126, 0.578217, 0.952980, 0.998741, 0.971371, 0.579208, 0.544424, 1.193377, 1.408670, 0.927863, 0.749216, 0.518682, 0.894648, 0.574994, 1.254076, 0.990272, 1.029009, 1.461775, 1.015163, 0.881145, 0.791783, 1.051413, 0.605848, 1.441037, 1.371880, 0.977418, 0.711938, 1.082672, 0.719236, 1.231820, 0.942933, 1.020719, 1.285001, 1.345003, 1.090345, 1.150005, 1.294361, 1.191207, 0.577909, 1.410626, 0.809941, 1.220479, 0.920788, 1.064786, 1.161375, 0.801747, 1.390577, 1.138016, 1.182548, 0.832041 },
103};
104
105double multiply() {
106 double do_not_optimize_out = 0;
107 for (int i = 0; i < 100; i++) {
108 for (int j = 0; j < 100; j++) {
109 r[i][j] = 0;
110 for (int k = 0; k < 100; k++)
111 r[i][j] += a[i][k] * a[k][j];
112 do_not_optimize_out += r[i][j];
113 }
114 }
115 return do_not_optimize_out;
116}
diff --git a/src/talks/wasm/examples/5-matrix-multiplication/mm.mjs b/src/talks/wasm/examples/5-matrix-multiplication/mm.mjs
new file mode 100644
index 0000000..e830faf
--- /dev/null
+++ b/src/talks/wasm/examples/5-matrix-multiplication/mm.mjs
@@ -0,0 +1,2 @@
1async function MM(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&process.versions?.node&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");var require=createRequire(import.meta.url)}var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");if(_scriptName.startsWith("file:")){scriptDirectory=require("path").dirname(require("url").fileURLToPath(_scriptName))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var isFileURI=filename=>filename.startsWith("file://");var readyPromiseResolve,readyPromiseReject;var wasmMemory;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["b"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("mm.wasm")}return new URL("mm.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["a"];updateMemoryViews();assignWasmExports(wasmExports);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}var _multiply;function assignWasmExports(wasmExports){Module["_multiply"]=_multiply=wasmExports["c"]}var wasmImports={};var wasmExports=await createWasm();function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}
2;return moduleRtn}export default MM;
diff --git a/src/talks/wasm/examples/5-matrix-multiplication/mm.wasm b/src/talks/wasm/examples/5-matrix-multiplication/mm.wasm
new file mode 100755
index 0000000..7a193be
--- /dev/null
+++ b/src/talks/wasm/examples/5-matrix-multiplication/mm.wasm
Binary files differ
diff --git a/src/talks/wasm/examples/5-matrix-multiplication/script.js b/src/talks/wasm/examples/5-matrix-multiplication/script.js
new file mode 100644
index 0000000..6e5e2c6
--- /dev/null
+++ b/src/talks/wasm/examples/5-matrix-multiplication/script.js
@@ -0,0 +1,142 @@
1import MM from "./mm.mjs";
2
3const zeros = (m, n) => [...Array(m)].map(e => Array(n).fill(0));
4const r = zeros(100, 100);
5const a = [
6 [1.379840, 1.457320, 0.526439, 0.577540, 1.325047, 0.615534, 1.488805, 1.340402, 0.657965, 0.544603, 1.177794, 0.615106, 1.049290, 0.729110, 0.687418, 1.147739, 0.527317, 1.229680, 1.377948, 0.617709, 1.001274, 1.494480, 1.195501, 0.715408, 1.220561, 1.469425, 0.725729, 1.438900, 1.245707, 0.917358, 0.925189, 1.423738, 1.291772, 0.671184, 1.377902, 0.661028, 1.041261, 0.670230, 1.000563, 0.526977, 0.532437, 1.273195, 1.072421, 1.184013, 1.460246, 1.235356, 1.018112, 0.564939, 0.974447, 1.236509, 1.469052, 1.487908, 0.876303, 0.813966, 1.427184, 0.903374, 0.906213, 1.208934, 1.422306, 1.333670, 1.226891, 0.639821, 1.049111, 1.046548, 1.017850, 1.250483, 1.139942, 0.769027, 1.204658, 0.719435, 1.113815, 1.027180, 0.919597, 1.043859, 0.835385, 0.615022, 0.631125, 0.516152, 0.781693, 1.329323, 0.791999, 0.929991, 1.478632, 0.742707, 1.183782, 0.932590, 0.896661, 1.222739, 1.357448, 0.896553, 1.418801, 0.784182, 1.477027, 0.719958, 1.007257, 1.108635, 1.227305, 1.225167, 1.399998, 0.909951],
7 [0.770320, 1.088820, 0.806404, 1.191327, 0.524736, 1.247941, 0.628279, 0.807087, 1.229163, 0.833273, 0.921270, 1.300579, 0.970054, 1.102469, 0.972525, 1.307489, 0.713645, 0.756865, 1.301716, 0.834530, 0.836716, 0.769485, 0.757780, 0.874359, 1.081706, 0.846308, 0.981992, 1.120864, 1.198629, 1.051810, 1.036825, 0.908976, 0.607560, 0.772128, 1.129458, 1.487689, 1.419089, 0.772358, 0.908206, 1.355476, 0.544880, 0.651748, 0.881704, 0.512456, 1.225989, 1.432957, 0.538338, 1.104897, 1.180066, 0.803559, 0.530221, 1.220832, 1.327059, 1.431481, 0.520253, 1.472932, 0.635210, 1.046532, 1.077470, 1.476779, 0.721953, 0.719889, 1.473898, 1.476609, 1.308158, 1.248389, 0.955689, 0.922675, 0.863480, 1.363027, 1.200162, 1.466177, 1.110155, 1.499118, 1.106165, 0.600838, 1.347230, 0.920781, 1.166626, 1.135420, 0.636591, 0.777398, 0.662020, 1.032416, 1.169259, 1.016769, 0.768522, 1.317541, 0.675173, 1.259698, 0.643791, 0.617781, 0.871839, 1.007753, 0.810626, 0.964750, 1.432919, 0.728661, 0.834531, 0.547773],
8 [1.022921, 1.455382, 0.573229, 0.555113, 1.106770, 1.031391, 1.183102, 1.189079, 1.236601, 1.030885, 1.035218, 1.043181, 1.405762, 1.093131, 1.195988, 0.501043, 0.809528, 1.242215, 0.776740, 1.348204, 0.560691, 1.109206, 1.076060, 0.999778, 0.736757, 1.078752, 1.211490, 0.755465, 0.553171, 1.267461, 1.492598, 0.693444, 0.985580, 1.350095, 0.948895, 0.914189, 0.588333, 1.093783, 1.488613, 1.462763, 0.702218, 0.916851, 0.917597, 1.015197, 0.946620, 1.448743, 1.077418, 1.340172, 1.163085, 1.265050, 0.544247, 1.487913, 0.840452, 1.128725, 0.654062, 1.340700, 0.738564, 0.913149, 0.581868, 0.805693, 0.994062, 1.408999, 1.324861, 0.990977, 0.535459, 0.791653, 1.189904, 1.145955, 0.888481, 1.464574, 1.250380, 1.119160, 0.604171, 0.977863, 1.403026, 0.978366, 1.134271, 0.649736, 1.162700, 0.941622, 1.479374, 1.325376, 1.161065, 0.553819, 1.305192, 1.366794, 0.819830, 0.711718, 1.375267, 0.562531, 1.037438, 1.084734, 1.350641, 1.493729, 1.131981, 1.031179, 1.388974, 1.206645, 0.849194, 0.648684],
9 [0.749634, 0.837431, 0.735919, 1.044205, 1.462659, 0.626831, 0.629570, 1.100217, 0.670899, 0.989660, 1.291640, 1.132597, 0.724378, 1.066016, 1.421987, 1.026298, 1.023056, 1.140343, 1.332638, 0.547305, 0.932998, 0.994599, 0.757525, 1.166217, 0.867773, 1.410006, 1.237011, 0.535154, 0.862225, 1.229949, 1.316465, 1.354578, 1.196442, 0.792996, 0.952346, 0.931531, 0.883668, 0.700919, 0.770030, 1.019247, 0.938733, 1.180407, 1.315777, 0.679926, 0.814807, 1.388835, 0.719369, 0.853766, 0.694034, 0.685061, 0.984125, 0.593272, 1.092776, 0.711073, 1.372115, 0.662872, 0.651995, 0.764461, 0.887624, 0.585551, 0.787700, 1.499448, 1.328319, 0.832012, 1.312053, 0.931837, 0.897224, 1.169771, 1.231099, 0.940722, 1.186465, 1.252034, 1.055956, 0.664915, 1.253323, 1.200115, 0.839711, 1.078984, 1.409160, 1.116431, 1.368128, 0.802220, 0.932299, 0.782206, 1.424530, 0.911095, 0.622881, 1.312137, 1.069809, 0.855654, 1.161587, 1.218958, 1.314299, 1.410139, 0.538026, 1.171283, 1.022315, 1.010163, 1.035148, 0.908867],
10 [0.919022, 1.398405, 1.233300, 0.989714, 1.171597, 0.556226, 0.767237, 0.842570, 1.283894, 1.361038, 1.276869, 0.901957, 1.076977, 0.712155, 1.394663, 0.602114, 1.420942, 1.339476, 1.027372, 1.492429, 0.922964, 1.174507, 0.816736, 0.787671, 1.464476, 1.174591, 0.501438, 0.728566, 1.041567, 1.072727, 1.380835, 0.500009, 0.944341, 1.170062, 1.242017, 0.523942, 0.517806, 0.854164, 0.915983, 1.322707, 0.977622, 1.055492, 0.739522, 0.704814, 0.663376, 1.198913, 1.353763, 1.040212, 1.390117, 1.381388, 1.486360, 1.351212, 1.017516, 1.068210, 0.930474, 0.585811, 0.850009, 1.066197, 1.050053, 1.365709, 0.789072, 0.921174, 0.546163, 1.106693, 1.270097, 0.531404, 1.051183, 1.134865, 1.481603, 0.650752, 0.832732, 0.524631, 1.221988, 1.441946, 1.221030, 0.908809, 0.720923, 1.491407, 0.946255, 1.021528, 1.259394, 0.705073, 1.292337, 0.704099, 0.871839, 1.034023, 0.583857, 0.794030, 1.219492, 1.123693, 0.672122, 0.731255, 0.746137, 1.121423, 0.780892, 0.574303, 0.743165, 1.258452, 1.362189, 1.250955],
11 [0.977071, 0.552201, 1.080643, 0.539261, 1.310048, 0.660761, 1.294630, 1.478950, 0.772533, 0.536887, 1.150149, 1.104056, 0.682505, 0.883728, 1.041299, 0.680478, 1.154212, 1.474394, 0.630695, 1.281055, 1.369207, 1.186527, 1.311456, 0.516192, 1.088244, 0.605104, 1.088825, 0.780569, 1.122989, 0.737886, 1.378204, 1.371106, 1.435991, 1.398055, 1.043914, 1.064240, 0.748594, 0.623393, 1.095334, 1.352523, 1.209754, 0.720605, 1.298917, 1.139826, 1.422846, 1.398755, 1.284136, 1.495882, 1.484167, 0.745682, 1.371278, 1.487349, 1.309574, 1.270554, 1.039483, 0.587182, 1.293170, 0.917281, 1.062024, 0.500492, 0.958083, 1.337678, 0.836751, 0.731072, 0.563460, 0.536270, 1.143554, 1.068031, 0.758510, 1.001835, 1.214302, 1.197533, 1.482870, 1.012942, 1.250227, 1.241036, 0.931513, 1.173656, 1.446194, 1.006231, 1.453459, 0.619180, 1.345502, 1.194686, 1.144477, 0.664117, 1.224949, 1.486615, 0.685459, 0.571111, 1.488568, 0.637279, 0.546399, 1.266292, 1.170286, 1.465348, 1.478842, 1.135760, 0.838267, 0.943116],
12 [1.015083, 0.700566, 1.140584, 0.622905, 1.183881, 1.034252, 1.250132, 0.535143, 1.001722, 0.659014, 1.139675, 0.619417, 0.708765, 1.269046, 1.074667, 0.695879, 1.494827, 0.884795, 1.248646, 1.112801, 1.182819, 0.621280, 1.330263, 1.010371, 1.389876, 0.936344, 1.190258, 0.826974, 0.956361, 1.202610, 0.917295, 0.911959, 0.913732, 1.365238, 0.747602, 0.527213, 1.344037, 0.830859, 1.295969, 1.296002, 0.794176, 0.963685, 0.842188, 1.045622, 0.565362, 0.766451, 0.509818, 0.821331, 0.613092, 0.856703, 0.655280, 0.738894, 1.324155, 0.504408, 0.643090, 0.929205, 1.183479, 1.043239, 1.291563, 1.247031, 1.474089, 0.648675, 1.342316, 0.609177, 1.175784, 0.910637, 0.686887, 0.693975, 1.414160, 0.792404, 1.198378, 1.250770, 1.177739, 0.577907, 1.338957, 1.409046, 0.545822, 1.159595, 1.031545, 0.609840, 0.789389, 0.519010, 1.058236, 0.991757, 1.217851, 0.553175, 0.632851, 1.401277, 1.050191, 0.506624, 0.992570, 0.981058, 1.430146, 1.354304, 0.997046, 1.153982, 1.123613, 1.473945, 0.749938, 1.213157],
13 [1.405982, 1.197478, 0.637058, 0.805892, 1.305976, 0.977344, 1.048013, 0.741212, 0.868960, 1.005337, 0.627931, 0.598499, 0.821601, 1.314121, 1.254795, 0.680376, 0.758433, 0.519533, 0.993518, 1.002461, 1.346782, 0.819196, 1.429711, 0.597831, 0.895030, 0.934926, 0.986203, 0.773401, 0.800336, 1.311236, 0.825662, 0.502791, 0.695289, 0.815667, 0.828792, 1.202503, 0.523077, 0.640797, 0.937877, 1.279229, 1.065799, 0.572868, 1.465550, 1.098656, 0.678538, 0.806286, 0.815742, 1.172072, 0.987045, 0.704586, 0.980271, 0.518117, 1.282374, 0.779172, 1.026949, 1.380595, 1.308772, 0.837549, 0.778556, 0.636199, 1.241954, 1.331912, 1.473157, 1.133607, 0.891569, 0.834186, 1.151385, 1.025913, 0.725175, 0.587760, 1.401914, 0.561164, 0.580885, 0.828233, 1.089123, 0.747066, 1.229951, 1.293622, 0.928510, 1.195056, 0.580756, 1.023644, 0.661421, 1.015302, 0.624562, 0.531619, 1.478040, 1.399590, 1.020078, 0.866674, 0.877655, 0.731070, 1.086416, 0.745452, 1.423449, 1.042301, 1.078667, 1.436047, 1.266505, 0.980906],
14 [1.040001, 0.820632, 1.328963, 1.117734, 0.791812, 0.613753, 0.585863, 1.020689, 1.234116, 0.566506, 0.527113, 1.060420, 1.130146, 0.531301, 1.016703, 1.475989, 1.096835, 0.704596, 1.071727, 0.788901, 1.155053, 1.253654, 0.955651, 0.537396, 1.229116, 0.586249, 0.521743, 0.865366, 0.503866, 1.495096, 0.513134, 0.631291, 0.549035, 1.242647, 0.840429, 1.129949, 1.378488, 0.850183, 0.748405, 1.160810, 1.454995, 0.671026, 1.102481, 1.303308, 0.591965, 0.586369, 1.224397, 0.567501, 1.204023, 1.088723, 1.461092, 0.891815, 1.277013, 1.302039, 0.988192, 0.903902, 1.212233, 0.536308, 1.110406, 0.710907, 1.046412, 1.376641, 1.423190, 0.758661, 0.555954, 1.179031, 0.548985, 1.142201, 0.762798, 0.844964, 0.802316, 1.254491, 1.106046, 1.035106, 1.253370, 1.455657, 1.461866, 1.185260, 0.834948, 0.702811, 0.756332, 0.825367, 0.716756, 0.767364, 1.365454, 1.270018, 1.103650, 1.362612, 1.342970, 0.763540, 1.086376, 1.356383, 1.428927, 1.273614, 1.072929, 1.291103, 1.002316, 1.275845, 1.239080, 0.525129],
15 [0.852458, 1.012163, 1.094343, 0.626270, 0.712085, 1.453596, 0.719229, 0.880382, 1.445201, 1.199101, 0.826680, 0.761592, 1.255516, 1.039536, 0.663317, 0.678507, 0.624810, 1.101728, 1.360986, 1.164603, 0.694327, 1.099941, 1.277279, 0.723458, 1.058843, 0.658423, 1.143374, 0.826423, 1.029169, 1.383051, 0.947076, 1.010066, 0.951579, 0.599619, 0.663565, 0.912163, 1.309274, 0.873070, 1.341813, 0.859951, 1.051781, 0.618223, 0.697698, 0.587372, 1.178858, 0.602993, 1.479577, 0.935205, 0.730836, 0.741055, 1.325569, 0.692586, 0.967676, 0.695391, 0.580394, 1.157045, 1.405592, 1.058926, 1.338580, 0.987563, 0.734112, 1.031516, 1.001340, 1.269465, 0.715089, 1.492873, 1.299185, 0.694653, 1.058834, 1.132656, 0.936608, 1.261128, 0.951297, 1.061960, 0.539656, 1.208357, 0.727034, 1.033661, 1.165124, 1.278480, 0.931361, 0.692748, 0.785445, 0.974163, 0.915073, 0.525015, 0.826581, 0.626220, 1.209535, 0.920672, 0.807524, 1.061286, 1.463323, 0.546471, 1.043217, 0.868291, 1.370899, 0.830769, 0.854478, 1.170617],
16 [0.616517, 1.443055, 1.026026, 1.206694, 0.560104, 1.293162, 1.265195, 0.543083, 1.265609, 0.860181, 1.388395, 0.984564, 0.682433, 0.593328, 1.074492, 1.251490, 0.809722, 0.689954, 1.051594, 1.378881, 1.322507, 1.445788, 0.949544, 1.066709, 0.530507, 1.381566, 0.845323, 0.524806, 1.260120, 1.432854, 1.301013, 1.151888, 1.470194, 1.232427, 1.468055, 1.227202, 1.279278, 1.386881, 1.238219, 0.521631, 1.361035, 1.112702, 0.838180, 1.228488, 0.929345, 1.222863, 0.967889, 1.193393, 1.471730, 1.435504, 1.289713, 0.562960, 1.098829, 1.485166, 1.487027, 0.833199, 0.651152, 1.147549, 0.869748, 0.858988, 1.327363, 0.768325, 0.878441, 0.593166, 0.509079, 0.936741, 0.751060, 0.902366, 1.227019, 0.766698, 1.497274, 0.797546, 0.799705, 0.912254, 1.104385, 0.501824, 1.011509, 1.214150, 0.895176, 0.992651, 0.580613, 0.997013, 0.848914, 1.118351, 0.815626, 0.528297, 1.234113, 0.734467, 1.031996, 1.044361, 1.378018, 1.236396, 1.402341, 1.192375, 0.711524, 1.185566, 1.479372, 1.170364, 1.168047, 0.771651],
17 [1.035645, 0.752043, 0.682883, 0.806710, 0.614566, 1.369655, 1.277805, 0.752415, 0.899997, 0.833801, 1.052429, 0.577319, 0.672101, 1.104752, 1.427363, 1.364322, 1.059223, 0.660182, 1.245092, 0.620931, 1.257429, 0.532960, 1.186581, 0.775032, 0.874266, 1.010928, 1.376006, 0.641199, 0.859200, 1.287133, 1.464968, 0.704744, 0.697641, 0.840731, 0.586551, 0.516134, 1.424682, 1.206258, 1.118910, 1.370345, 1.101806, 1.397061, 0.857233, 1.472652, 0.850085, 0.923462, 1.394293, 0.756729, 0.546220, 0.574689, 1.306560, 0.744991, 1.463906, 0.941980, 0.939255, 1.255091, 1.218636, 1.230149, 1.457333, 0.630926, 0.709858, 0.846090, 1.263623, 1.277463, 1.370851, 0.835641, 0.969697, 1.104382, 1.069412, 0.971201, 0.580095, 0.806637, 0.952442, 1.201108, 1.427995, 1.099506, 0.819469, 0.974739, 0.864016, 0.824615, 1.163138, 1.483070, 0.812258, 0.871926, 1.086473, 1.386947, 1.034206, 0.872092, 1.218277, 1.283519, 1.333427, 1.404546, 1.044582, 0.561266, 0.689110, 1.066559, 0.644311, 1.221741, 0.610132, 0.852129],
18 [0.618663, 1.336078, 1.368165, 0.661169, 0.866506, 0.690724, 0.731951, 0.508812, 1.059013, 0.757197, 1.492504, 1.014257, 1.267113, 0.506423, 1.055350, 0.825293, 0.879469, 1.471683, 0.793992, 0.533054, 1.480807, 0.754957, 1.336918, 1.125689, 0.736081, 1.393862, 1.032447, 1.354615, 0.543344, 0.515142, 1.440051, 1.320628, 1.081268, 0.520299, 1.021305, 1.056526, 0.510438, 1.360632, 0.936504, 1.088227, 0.805880, 0.561505, 1.356912, 0.730384, 1.437388, 0.993533, 0.514120, 0.670090, 0.709688, 0.630127, 1.367373, 1.128299, 1.030564, 1.355391, 1.239998, 1.175158, 0.800300, 0.719165, 0.941539, 1.441110, 0.554317, 1.362435, 1.170083, 1.396863, 1.373768, 0.895597, 0.640745, 1.029234, 1.010758, 1.199022, 0.754428, 1.280655, 1.036356, 0.964284, 0.628751, 0.851114, 1.449296, 1.047135, 0.771612, 0.514838, 0.766721, 1.124031, 0.929417, 1.499994, 1.282911, 0.980488, 0.761096, 0.608985, 0.831098, 0.594824, 1.383824, 0.592297, 1.465586, 1.171000, 1.199365, 1.135142, 1.263273, 1.298987, 1.351476, 1.109735],
19 [0.949717, 0.514730, 0.831522, 1.105646, 1.076431, 1.289812, 1.471717, 1.330824, 1.057036, 1.065231, 0.563560, 0.820464, 0.753345, 0.710041, 0.975967, 1.379326, 1.441037, 0.937239, 1.268232, 1.358517, 1.292954, 0.683278, 0.528327, 1.116240, 1.343968, 1.380012, 1.472979, 0.620119, 1.223771, 1.188494, 0.706674, 0.693461, 1.498639, 1.255514, 0.975632, 0.879119, 0.664607, 0.584431, 1.123098, 1.461201, 1.012226, 1.026015, 1.229114, 0.988348, 0.961873, 1.359427, 0.956140, 1.422604, 1.425922, 0.901882, 1.276091, 1.487913, 1.155353, 1.079338, 1.062339, 1.274887, 1.386595, 0.751009, 0.667001, 0.646474, 1.004071, 1.213665, 1.242443, 0.789910, 1.394605, 0.937931, 1.178310, 1.003996, 1.091854, 1.214377, 0.533779, 0.634530, 1.365652, 1.058563, 0.636683, 0.816513, 1.469335, 0.693524, 0.961351, 1.470187, 0.526375, 1.013957, 1.442304, 0.633400, 0.838306, 0.573759, 1.169509, 0.982836, 1.212050, 1.151487, 1.318048, 0.874149, 0.961943, 1.342736, 1.152057, 1.314568, 0.658368, 1.131554, 0.533313, 0.560492],
20 [0.894394, 0.534669, 1.445673, 1.064550, 0.690233, 1.395785, 0.542153, 1.163745, 0.845369, 0.879235, 0.564344, 0.839402, 0.595677, 1.341009, 0.713978, 0.655409, 1.226168, 1.445491, 0.894321, 0.588291, 0.855839, 1.220591, 0.754797, 0.788673, 0.866265, 0.511912, 1.491235, 1.383211, 0.758327, 1.353588, 0.511555, 1.201987, 0.637992, 1.485950, 1.164965, 1.111934, 1.303277, 0.588901, 1.348737, 1.031711, 0.704409, 1.395345, 0.753160, 0.763983, 1.112902, 1.165360, 0.539436, 1.412235, 1.231251, 1.017793, 0.647978, 0.818132, 0.871954, 0.546996, 1.375123, 1.486646, 0.928391, 1.257972, 1.489719, 0.667652, 1.227663, 1.192517, 0.809811, 1.336241, 1.113290, 0.771042, 0.511071, 0.566225, 1.355315, 1.190884, 1.209532, 1.193295, 1.216941, 1.413085, 0.609676, 1.057956, 0.979763, 1.093288, 0.757852, 0.724416, 1.475834, 1.257406, 0.544063, 0.513977, 1.108923, 1.416123, 0.598522, 0.718665, 0.641836, 1.455411, 1.257997, 0.822163, 0.801038, 1.111105, 1.062185, 1.271582, 1.418117, 1.120094, 1.170226, 0.772968],
21 [1.094654, 0.909249, 0.698803, 1.112162, 1.278420, 0.712791, 0.661049, 1.252611, 0.809695, 1.138021, 0.578689, 1.311752, 1.066878, 0.623708, 1.364311, 1.477678, 0.761498, 1.073827, 0.687298, 1.474617, 1.386571, 1.269925, 1.457383, 1.153422, 1.052444, 0.643296, 1.383710, 0.912269, 0.904742, 0.534924, 0.505871, 1.378533, 0.975227, 0.579491, 1.351738, 1.470035, 0.626863, 1.392503, 1.268417, 0.838357, 1.177199, 1.091441, 0.664046, 1.337755, 0.722195, 0.740199, 1.498992, 0.651546, 0.525625, 0.813742, 1.350180, 0.579933, 0.882205, 1.294477, 1.173377, 0.762886, 1.278912, 0.973848, 1.011046, 0.510022, 0.901065, 1.493243, 0.517579, 0.925782, 0.707881, 1.332174, 1.379673, 1.222175, 1.289407, 1.467325, 0.580161, 0.919327, 0.892668, 0.911077, 0.936426, 0.831706, 0.588626, 1.490671, 0.878156, 1.045652, 0.761242, 1.300258, 1.203702, 1.018772, 0.987196, 1.388463, 0.957461, 0.724833, 1.175080, 1.044391, 1.329461, 1.353965, 1.397004, 0.673297, 1.038934, 0.751710, 1.097459, 1.477077, 1.170324, 1.139129],
22 [0.573377, 1.055942, 0.502463, 1.157195, 1.232144, 0.807219, 0.565860, 1.215637, 1.367717, 1.015482, 1.051443, 0.988276, 1.279255, 0.600234, 0.607690, 1.417625, 1.255950, 1.394105, 0.922424, 1.068400, 1.445676, 1.025523, 1.355517, 0.930260, 1.252279, 1.195155, 0.628339, 0.929404, 1.204930, 0.775309, 1.126973, 0.736514, 1.120344, 0.644657, 0.540436, 0.905497, 1.103201, 0.546880, 1.377595, 1.064152, 0.524782, 1.117157, 0.540668, 1.103237, 0.528638, 0.754039, 1.155532, 0.741591, 0.902295, 0.949123, 1.300465, 1.240965, 0.864461, 0.822150, 1.346924, 1.313824, 1.262898, 0.903507, 0.609306, 1.406028, 0.930912, 1.197258, 0.878371, 1.420981, 1.247879, 1.273837, 1.432853, 0.538973, 0.988217, 0.977710, 1.171301, 0.585110, 0.587200, 0.913916, 0.931225, 1.362692, 1.020358, 0.878893, 0.606028, 1.404739, 1.116511, 1.341880, 0.752649, 1.291709, 0.534092, 1.468243, 0.656194, 1.102179, 1.192849, 0.970220, 0.633339, 1.483856, 1.496053, 1.133030, 1.066856, 0.752588, 1.059472, 0.755514, 1.404185, 1.180930],
23 [0.507156, 0.856665, 1.490896, 1.217472, 1.236834, 0.915338, 1.202186, 0.721066, 0.779526, 1.261272, 1.027980, 0.716773, 0.692263, 1.101181, 0.766624, 0.895857, 1.355746, 0.868830, 1.288894, 0.766911, 0.512991, 0.540944, 1.218274, 0.812943, 0.574863, 0.852288, 0.538374, 1.026084, 0.815323, 0.530770, 1.107382, 1.376333, 1.420501, 0.540373, 1.173693, 0.694341, 0.725795, 1.286806, 0.726304, 1.056273, 1.184513, 0.654313, 0.950082, 1.252721, 0.634493, 0.672434, 0.610553, 0.501763, 1.407276, 0.779915, 1.333954, 0.747588, 0.874763, 0.997523, 1.219118, 0.637742, 0.848946, 0.774052, 1.121896, 1.092341, 1.294883, 1.429779, 0.649028, 1.131258, 0.721951, 0.678782, 1.138279, 0.534505, 0.595932, 1.392442, 0.640936, 1.067260, 1.031528, 0.755401, 0.597741, 1.154729, 0.916791, 0.808975, 1.325047, 1.260351, 1.155946, 0.805610, 0.818695, 0.845248, 1.308146, 1.312051, 0.525203, 0.813999, 0.542705, 0.776254, 1.044531, 0.964142, 0.596806, 0.523298, 1.196557, 1.091069, 1.449676, 0.949618, 0.660993, 0.962601],
24 [1.127201, 1.178125, 0.953694, 0.970692, 0.807285, 1.389709, 1.299479, 1.474478, 1.378179, 1.499286, 0.503116, 1.349827, 0.963865, 1.031846, 0.814196, 0.806542, 0.766297, 1.174684, 1.471588, 0.929876, 0.961361, 0.670819, 1.343956, 1.357844, 0.723206, 0.686968, 1.298598, 0.678060, 1.356131, 0.979183, 0.714921, 1.391575, 1.447226, 1.417858, 0.564270, 0.976300, 0.936759, 1.285196, 1.169306, 1.224974, 0.923705, 1.248839, 0.954538, 0.877812, 1.429656, 0.617240, 0.551824, 0.797845, 0.968579, 1.424941, 0.574983, 1.474173, 0.625376, 1.158667, 0.555669, 1.464197, 0.967170, 0.932571, 0.701657, 0.880713, 0.883021, 1.364931, 0.993488, 1.465625, 0.788107, 1.273592, 1.086732, 0.800203, 0.944675, 0.840713, 0.688199, 1.066932, 0.655072, 0.887627, 0.616309, 1.313399, 1.156383, 0.666851, 1.346556, 1.085754, 1.308911, 1.136696, 0.670242, 0.832520, 0.852418, 0.575563, 1.047735, 0.845469, 0.844136, 0.520253, 1.217176, 1.381074, 1.087089, 1.250975, 1.207621, 0.704615, 0.949347, 1.489477, 0.891151, 1.075852],
25 [0.803988, 0.592191, 0.936936, 0.785377, 0.531247, 0.538478, 1.059376, 1.103463, 0.788163, 1.320063, 0.639634, 0.988259, 0.594844, 1.329344, 0.814903, 1.406562, 1.044747, 0.692758, 1.218708, 0.812738, 1.419730, 0.638070, 1.203164, 1.409187, 1.228318, 0.764911, 0.848624, 1.163128, 1.235081, 1.255889, 0.867932, 0.606968, 0.860820, 0.841432, 1.239716, 1.401557, 1.128356, 1.308716, 0.876111, 0.511910, 1.099047, 1.289450, 0.959950, 1.482284, 1.285539, 1.363555, 1.038224, 0.777216, 1.166660, 0.828907, 0.530141, 0.592273, 0.813610, 0.741881, 1.308770, 1.316062, 0.745095, 1.439703, 0.878080, 0.717879, 0.877578, 0.556963, 1.405707, 0.676299, 0.957472, 0.890305, 1.231392, 1.048016, 1.063083, 1.195917, 1.188201, 1.006246, 0.988548, 1.315875, 0.662577, 0.851969, 0.961593, 0.543026, 0.603634, 0.850110, 1.116670, 1.386684, 1.120321, 1.101843, 0.549506, 1.025287, 0.839529, 0.606021, 0.860794, 1.150215, 0.924447, 0.808559, 0.575717, 0.743997, 0.955073, 0.528279, 1.480624, 1.319889, 1.032342, 1.449156],
26 [1.064925, 1.165930, 0.629421, 0.672690, 0.561317, 1.072269, 1.021905, 1.083695, 1.476355, 1.021207, 0.537966, 1.048662, 0.891155, 1.132750, 1.161596, 0.641663, 0.650858, 0.606814, 0.501783, 1.085964, 0.882020, 0.635081, 1.020970, 1.185886, 1.117703, 1.289773, 0.839498, 0.925069, 0.957820, 1.151486, 0.960285, 0.665684, 1.003754, 0.533236, 1.227916, 1.157796, 1.171234, 1.159887, 1.258029, 0.561410, 1.091964, 1.320706, 1.446026, 1.410930, 0.599671, 1.289452, 0.853614, 1.152244, 1.192090, 1.325902, 0.932180, 1.123548, 1.488662, 0.913823, 1.232059, 1.366630, 0.828670, 1.104580, 1.319255, 1.361925, 0.629022, 1.054307, 1.028735, 1.042474, 1.070028, 0.908594, 1.485243, 0.832180, 1.151813, 0.571739, 0.554578, 0.610841, 0.767849, 1.390230, 1.054069, 1.483479, 1.194211, 0.992158, 0.889873, 0.802495, 1.386267, 1.297668, 1.006065, 0.910000, 0.839246, 1.244821, 0.981511, 1.230819, 1.225688, 1.377085, 0.729216, 1.103160, 1.124075, 0.629982, 1.356577, 1.244020, 1.132332, 1.108234, 1.272118, 1.042909],
27 [1.262197, 1.479594, 1.126217, 0.912587, 1.105467, 0.575392, 0.918194, 1.239556, 1.438972, 0.657223, 1.242838, 0.610069, 0.578638, 0.712605, 1.256524, 1.284622, 0.797258, 1.131761, 1.463578, 0.844352, 0.595925, 1.224777, 0.859633, 1.475942, 1.298109, 1.364806, 0.749268, 1.348422, 0.578226, 0.796614, 0.570095, 1.359919, 1.246286, 1.368591, 0.840059, 1.298973, 0.643778, 0.686597, 0.859047, 1.237056, 0.742673, 0.747815, 1.247792, 1.290162, 0.756777, 0.563507, 0.863288, 0.682509, 1.080180, 1.133754, 1.321960, 1.092736, 1.259266, 0.666265, 0.994918, 1.413404, 1.350950, 1.459057, 0.979937, 1.171537, 0.704576, 1.275417, 0.974033, 0.745555, 0.732466, 0.959350, 0.579275, 0.980182, 0.799385, 0.788382, 1.483068, 1.066114, 0.830753, 0.868194, 1.081828, 0.942445, 1.440731, 1.103431, 0.714311, 1.484662, 0.596011, 1.153667, 1.407513, 1.413298, 1.241642, 0.981736, 1.379815, 0.922463, 1.231429, 0.515336, 0.718997, 1.298361, 1.437249, 0.782551, 1.049722, 0.536265, 0.617771, 1.474267, 0.954025, 1.083556],
28 [1.217035, 0.695591, 0.578156, 0.848962, 1.427829, 1.215914, 1.122692, 1.388473, 0.985161, 1.281578, 1.128760, 0.543331, 1.202971, 1.100853, 1.434685, 1.134722, 1.099547, 1.263585, 0.686003, 1.472993, 1.149317, 1.439659, 1.422743, 1.484463, 0.686885, 1.310617, 0.871554, 1.233656, 1.452158, 0.730773, 0.847753, 1.497054, 0.824241, 0.661274, 0.800855, 0.536039, 1.344562, 1.286414, 1.255780, 0.971182, 0.776100, 0.708962, 1.398522, 1.180485, 0.575353, 1.495225, 0.789749, 0.630048, 1.096514, 1.463562, 1.346374, 0.711540, 1.413699, 1.168681, 1.278572, 1.106093, 1.138924, 1.337823, 0.511244, 0.850750, 1.006314, 1.484081, 1.140409, 0.805172, 1.494745, 0.629106, 1.239630, 0.657051, 0.783426, 0.810695, 1.432138, 1.064497, 1.412639, 0.800956, 0.917957, 1.477868, 0.790523, 1.272365, 0.604193, 0.972635, 0.805355, 1.469947, 0.677404, 1.480622, 1.433567, 0.981693, 1.174748, 0.940415, 1.376264, 0.579275, 0.900526, 1.365264, 1.372620, 0.598313, 1.056571, 1.294138, 0.586539, 0.743678, 0.764572, 1.157899],
29 [1.201523, 1.027468, 0.901949, 1.110895, 1.403999, 0.757482, 1.298213, 1.171225, 1.436567, 1.046984, 0.923697, 0.657013, 0.877982, 1.057018, 0.944663, 0.772531, 0.947572, 1.349146, 1.244356, 0.605607, 1.084655, 1.378966, 0.620842, 1.264332, 1.099473, 1.274382, 1.305394, 0.786524, 1.251119, 1.016077, 1.386217, 0.970040, 0.726476, 0.803294, 1.404221, 0.923539, 0.842919, 0.953603, 0.569399, 0.571433, 1.426067, 0.935799, 1.243485, 1.030845, 0.741862, 0.857587, 1.197636, 0.566251, 1.483127, 0.916760, 1.496572, 0.659577, 1.010667, 1.098021, 1.272353, 1.273820, 1.412826, 1.490049, 0.913891, 0.867520, 0.569084, 0.824216, 1.323672, 1.033290, 1.430912, 0.890651, 1.137019, 0.834733, 1.468710, 0.618709, 0.610994, 0.972064, 0.883801, 1.165623, 0.741220, 1.037879, 1.384999, 0.729172, 1.083528, 0.842272, 1.170382, 1.254562, 0.898972, 0.561435, 0.645993, 1.346259, 0.690452, 0.676524, 0.882629, 0.828436, 0.854777, 1.403788, 1.012819, 0.502400, 0.733010, 0.873260, 0.599903, 1.109524, 0.833262, 0.730986],
30 [1.214712, 1.240329, 1.056559, 0.607788, 0.607857, 0.955354, 0.816051, 0.630960, 0.593947, 1.394108, 1.006599, 1.256016, 1.093498, 0.791155, 1.190612, 0.997918, 1.029458, 0.952985, 1.181254, 0.633892, 0.894333, 0.821641, 1.154008, 1.109684, 0.691937, 0.601407, 0.582024, 1.332208, 1.451227, 1.358216, 0.838643, 1.095096, 0.583275, 0.800447, 0.841641, 0.760157, 1.277548, 0.733513, 1.494976, 1.478717, 0.856626, 1.196359, 0.766694, 1.416158, 0.784081, 1.100492, 1.284083, 1.105381, 1.252262, 1.470584, 0.839068, 1.135289, 1.251025, 1.453558, 1.371152, 1.030149, 1.476135, 1.496326, 0.691748, 1.183721, 1.130820, 0.735762, 1.178873, 0.530612, 1.326097, 1.308058, 1.355550, 0.835391, 0.576451, 1.202698, 0.608668, 1.055382, 1.473067, 0.528230, 0.995702, 1.019338, 1.172881, 0.821179, 1.072662, 0.763798, 0.930941, 0.842827, 0.543817, 0.905309, 0.504348, 0.554860, 1.186880, 1.361356, 1.310599, 0.974783, 1.155413, 0.865095, 1.038954, 1.370128, 0.758955, 0.768111, 1.152557, 1.167069, 0.698322, 0.522085],
31 [1.206634, 0.635869, 1.151382, 0.693975, 0.825380, 1.371575, 0.525082, 1.448024, 0.511968, 0.795579, 1.267383, 0.648161, 1.374856, 1.413803, 1.252482, 0.831875, 0.950416, 1.317786, 0.749293, 1.380449, 1.262748, 1.147300, 1.370290, 0.931082, 1.465643, 1.162432, 1.280755, 1.493789, 0.565438, 1.423253, 0.890998, 1.487277, 0.816100, 0.664559, 0.952888, 0.748666, 1.168102, 1.101342, 1.346711, 0.764868, 0.548922, 1.121846, 1.496408, 0.821431, 0.661539, 1.405466, 1.199778, 1.150778, 0.714936, 1.460419, 0.755280, 0.837649, 1.188936, 1.319255, 1.015642, 1.359142, 1.337227, 1.091844, 0.570722, 0.906042, 0.751411, 1.348593, 0.952548, 1.053595, 1.332893, 1.464777, 0.916189, 0.755398, 0.948363, 0.662467, 1.059513, 1.231404, 0.781350, 0.812775, 1.220844, 0.903309, 0.718696, 0.776082, 0.900594, 0.578764, 1.405535, 0.562267, 0.518113, 0.508415, 0.620056, 1.464239, 1.427830, 0.943725, 0.931066, 1.349475, 1.224164, 1.488699, 1.164264, 0.644614, 1.239359, 1.253992, 1.466645, 0.632918, 0.870057, 1.002211],
32 [0.833753, 0.929313, 1.488637, 1.455720, 1.271718, 1.055615, 1.259622, 0.833021, 1.261795, 1.041340, 0.558039, 1.049431, 1.408980, 0.789772, 0.502103, 1.163316, 1.289332, 0.945229, 0.714776, 0.830077, 0.982637, 1.406487, 1.276885, 1.270726, 1.399565, 0.914799, 0.826732, 0.915176, 1.365908, 0.545687, 0.651075, 0.888609, 1.197526, 0.526534, 0.529328, 1.219542, 1.031870, 1.161021, 1.238821, 0.874741, 1.403101, 1.436376, 0.728499, 1.255315, 0.665306, 1.403139, 1.239756, 0.835768, 1.293107, 1.268579, 1.157846, 0.839218, 0.595919, 1.365005, 0.630321, 0.601935, 1.155934, 0.698344, 0.873120, 0.991498, 0.536119, 0.676511, 1.114307, 0.935897, 0.951660, 1.090147, 0.718387, 0.761715, 0.907502, 1.258510, 0.582233, 1.409695, 0.720504, 1.293029, 1.259462, 0.860600, 1.317249, 0.601104, 1.231428, 0.566570, 0.641016, 1.461837, 1.330019, 0.519725, 0.670136, 1.165059, 1.348742, 1.082031, 1.105044, 1.322447, 1.167232, 1.367666, 0.527432, 0.679376, 0.846873, 1.034356, 1.036337, 1.415348, 1.151070, 0.902823],
33 [1.217006, 0.678584, 1.289713, 1.408019, 1.491300, 0.557134, 1.277684, 0.659036, 1.001299, 1.391471, 0.641386, 0.670720, 1.310463, 1.090796, 0.674469, 0.897813, 1.263225, 0.692485, 0.772929, 1.170076, 0.660356, 1.022005, 1.032685, 0.937489, 0.940583, 1.130792, 1.440873, 0.914413, 1.216428, 0.818736, 0.647242, 1.138099, 1.483615, 1.412141, 0.606132, 0.765131, 0.580137, 1.269375, 0.621577, 0.546337, 1.136931, 0.654725, 1.097341, 0.546765, 1.137874, 1.283026, 0.912220, 1.391823, 0.520010, 1.272602, 1.466470, 0.615733, 1.081613, 1.142448, 1.302860, 1.218141, 1.137230, 0.689922, 0.920870, 1.031165, 0.580295, 1.301424, 0.616626, 1.291289, 1.169661, 0.900023, 0.553110, 0.519946, 0.734780, 1.246575, 1.036160, 1.255417, 1.016422, 1.123499, 0.528773, 1.266719, 0.757937, 0.732871, 0.516183, 0.594452, 1.008420, 1.053303, 0.757148, 0.828274, 0.527421, 0.616101, 0.886849, 0.685453, 1.164700, 0.892421, 0.569646, 1.434737, 1.315190, 0.917398, 0.668712, 1.057104, 0.970693, 0.932457, 0.986910, 0.545409],
34 [1.229206, 1.436945, 1.428496, 0.682747, 0.705947, 0.947639, 1.022814, 1.086172, 1.292043, 0.935154, 0.788720, 1.470943, 0.946684, 0.653933, 1.021897, 1.460900, 1.378421, 0.763658, 1.396703, 1.426487, 0.610364, 0.734830, 0.746912, 0.881856, 0.906875, 1.188510, 0.569263, 1.177225, 0.570384, 1.231396, 1.362972, 1.095270, 0.617626, 0.636824, 1.351976, 1.080995, 1.223010, 0.857018, 1.008881, 0.822917, 0.684228, 1.043667, 0.832037, 1.030542, 0.922625, 1.258336, 1.101458, 1.104848, 1.442378, 0.641766, 0.700162, 1.056367, 0.720938, 1.335045, 1.231414, 0.509698, 1.484949, 0.641753, 0.632319, 0.837340, 0.573356, 0.868622, 0.676946, 0.815690, 1.219338, 1.388308, 1.407020, 0.948561, 0.635508, 0.640841, 0.942052, 0.534168, 0.785949, 0.955005, 0.982833, 0.847037, 0.800862, 1.008711, 0.548902, 0.953126, 0.824775, 1.412708, 1.398044, 0.618547, 0.839201, 1.129548, 0.733706, 0.884059, 1.422737, 0.771020, 1.406317, 0.883168, 1.252705, 0.513589, 1.156766, 1.207956, 0.814534, 0.828586, 0.628942, 1.489124],
35 [1.257287, 0.631994, 0.821547, 1.464627, 0.938968, 1.246103, 0.924975, 0.728902, 0.954655, 0.737723, 1.498712, 1.119454, 1.187093, 0.734237, 1.280057, 1.486393, 1.313113, 1.451450, 1.060039, 0.612169, 0.773521, 0.690826, 1.275960, 1.349401, 0.518757, 0.598269, 0.706026, 1.037151, 0.817885, 0.906819, 0.868752, 1.226024, 1.196616, 1.215337, 1.268921, 0.928082, 0.518825, 0.900413, 1.283585, 1.158909, 0.643504, 0.928986, 0.910790, 0.899092, 0.907780, 1.275159, 0.577147, 0.596788, 1.343017, 1.151872, 0.504921, 1.117453, 1.426974, 0.962528, 1.251247, 1.004227, 1.269488, 0.951393, 0.804154, 1.155649, 1.421842, 1.406011, 0.961185, 1.320245, 0.635301, 0.906425, 1.016676, 1.009237, 0.914572, 0.954280, 1.081601, 0.938459, 1.204942, 1.043397, 0.818611, 0.614295, 1.073840, 1.115089, 1.190327, 1.434745, 1.497915, 1.018093, 0.877717, 1.470135, 1.231589, 1.028813, 1.154080, 0.767496, 0.729784, 1.097323, 0.515355, 1.389827, 1.220093, 1.093498, 0.503477, 0.862539, 1.012151, 1.324919, 0.848111, 0.840435],
36 [0.794092, 1.104723, 1.142302, 0.596199, 0.798704, 1.379256, 0.539173, 1.092589, 0.840609, 1.072423, 0.863456, 0.661262, 1.242564, 1.202363, 1.082990, 0.890986, 0.783320, 0.861179, 0.730685, 1.236340, 0.631861, 1.205299, 1.091304, 1.442763, 0.689730, 1.091574, 1.487165, 0.589757, 0.699548, 0.922785, 1.495555, 1.012958, 1.220156, 1.482942, 1.033049, 0.916642, 1.073122, 1.464463, 0.618132, 0.755355, 1.444651, 1.047268, 0.515263, 0.698235, 1.213737, 0.510138, 1.187793, 1.002588, 1.411000, 0.943044, 1.362698, 1.333991, 1.404936, 0.563767, 0.887261, 0.634021, 1.166965, 1.242319, 0.981639, 0.726885, 1.218921, 0.981622, 0.815452, 0.585188, 1.204149, 0.529974, 0.739383, 0.697257, 1.234008, 0.970071, 1.112824, 1.159627, 0.932285, 0.994092, 1.114359, 1.357456, 0.947046, 1.043997, 1.292209, 0.815504, 1.098825, 0.987817, 0.899514, 1.375150, 0.502796, 1.135852, 1.222336, 1.299652, 0.875222, 1.401836, 0.672479, 1.288178, 1.262454, 1.035992, 1.213637, 0.521166, 1.342401, 1.194182, 1.178112, 0.516449],
37 [0.909860, 1.233279, 1.416451, 1.027400, 1.005189, 0.694141, 0.632237, 1.263693, 0.582803, 0.772835, 1.249844, 0.620313, 1.254167, 0.644321, 0.895979, 0.633501, 1.358743, 1.436233, 0.996283, 0.666950, 0.871365, 1.137707, 1.150705, 1.334873, 0.970046, 1.304745, 0.865838, 1.182630, 0.959571, 1.282336, 1.434050, 0.534580, 0.860039, 0.584933, 1.328996, 0.973934, 0.901685, 1.183128, 1.203826, 1.322495, 1.019590, 0.610345, 0.631041, 0.712080, 1.441077, 1.102507, 1.019037, 1.344945, 0.514258, 0.560314, 0.744381, 0.611662, 1.143286, 1.009895, 0.647214, 1.081665, 0.843321, 1.156600, 0.885680, 0.614067, 0.862076, 0.868778, 1.028029, 0.540115, 0.851816, 0.953881, 0.918121, 0.927072, 0.798849, 1.276566, 0.893005, 1.301520, 1.334027, 1.022297, 0.841130, 0.736467, 0.821324, 0.589077, 1.238739, 0.508721, 0.805105, 1.256619, 1.226892, 0.573132, 0.937335, 0.537319, 0.524212, 0.838047, 1.367114, 1.450211, 1.046535, 0.593933, 1.429171, 1.414017, 0.683543, 1.482650, 1.488056, 0.643427, 0.992082, 0.831072],
38 [0.930563, 1.341359, 0.733987, 1.200175, 1.096558, 1.030539, 0.537736, 0.885313, 1.384528, 1.133974, 0.831964, 1.200899, 1.470555, 1.408522, 0.571361, 0.850128, 0.676683, 1.123604, 0.505488, 1.127296, 1.466618, 1.486714, 1.214663, 0.747280, 1.470862, 0.973795, 0.624167, 0.811232, 1.071253, 1.364991, 0.974248, 0.716471, 0.951544, 0.524253, 1.487474, 1.127666, 0.950365, 1.488467, 0.943538, 1.385342, 1.428770, 1.474043, 0.806881, 0.858295, 1.122699, 0.878389, 1.044084, 0.572205, 1.205813, 1.483118, 1.281674, 1.327887, 0.989011, 1.170076, 1.488152, 1.346988, 1.233715, 0.725484, 1.221650, 1.488727, 1.052185, 0.616406, 0.905710, 1.498522, 0.513559, 1.344261, 1.359425, 0.700745, 1.074680, 0.588329, 1.180291, 1.238982, 0.734463, 1.412548, 1.444899, 1.406701, 1.389668, 1.121685, 1.474501, 0.751375, 0.861259, 1.065579, 0.648896, 1.412539, 0.794683, 1.033792, 1.298987, 0.555507, 1.497277, 0.661315, 1.159007, 0.564860, 1.185888, 1.015081, 0.856806, 0.514841, 0.918747, 0.681178, 0.904396, 0.631713],
39 [0.834543, 0.724370, 0.690387, 0.716326, 1.277884, 1.149745, 1.336569, 0.873810, 1.221602, 1.289921, 1.359366, 0.776772, 0.868006, 1.482802, 1.386247, 0.727306, 1.152006, 1.235002, 0.841161, 0.726308, 0.808330, 0.828342, 1.404573, 1.045031, 0.716376, 0.585553, 1.362715, 0.939475, 0.882352, 0.711058, 1.323082, 1.406481, 0.786396, 1.228940, 0.924473, 1.349798, 0.833321, 0.784191, 1.351992, 0.504361, 0.599088, 0.715164, 1.083420, 1.183670, 1.273886, 1.104639, 0.982525, 0.910814, 1.188755, 0.745048, 1.162060, 1.326419, 1.215254, 0.601977, 1.427540, 0.790091, 0.656613, 1.298610, 0.896001, 0.519838, 0.650353, 1.333911, 1.076191, 0.762819, 1.059570, 1.289504, 0.989030, 0.873209, 1.046230, 0.698030, 0.700668, 0.755495, 1.115073, 0.671187, 1.024344, 0.682976, 1.286713, 0.641358, 1.348746, 1.101625, 1.116239, 0.767083, 0.760369, 0.789431, 1.414523, 0.907276, 1.302119, 1.493363, 1.417792, 1.266137, 1.476566, 1.199599, 0.633903, 0.652688, 0.595961, 1.028158, 0.683026, 1.057688, 1.445035, 0.891821],
40 [1.315587, 1.044515, 1.200029, 1.409059, 0.964862, 1.499867, 1.143311, 1.254049, 0.933216, 0.545925, 1.269151, 1.317783, 0.707251, 1.080521, 1.096778, 0.887432, 0.704922, 0.949870, 0.519969, 0.633731, 1.245146, 1.469891, 0.582362, 1.362345, 0.621007, 0.732539, 0.732922, 1.357033, 0.999267, 1.395831, 0.536844, 1.353791, 1.028993, 0.841236, 0.569334, 1.368553, 0.675972, 0.592600, 0.798983, 0.591262, 1.465353, 1.205449, 1.488737, 0.830719, 0.627644, 0.915078, 0.652940, 0.574788, 0.908922, 0.547874, 0.597544, 0.724315, 0.783084, 0.669090, 1.329581, 1.479665, 0.901612, 0.757222, 0.590977, 0.939683, 0.734398, 1.405560, 1.484860, 1.262169, 0.847320, 1.147545, 1.115558, 1.115001, 1.282142, 1.245312, 0.512934, 0.587409, 0.748015, 1.137804, 0.934285, 0.659516, 0.570683, 0.638020, 1.277745, 0.865680, 0.580597, 1.097336, 0.606227, 1.053585, 0.620551, 1.493760, 1.436824, 0.954041, 1.075210, 1.393790, 1.039681, 0.631532, 1.382563, 0.579592, 1.314158, 0.840667, 0.995589, 0.642214, 1.306196, 0.500741],
41 [0.574945, 0.725081, 1.403158, 0.806457, 1.093281, 1.295158, 1.121620, 0.760942, 0.578930, 1.287016, 0.792601, 0.533802, 0.555386, 0.943474, 1.234918, 0.674430, 0.600282, 0.588318, 1.128548, 0.862167, 0.813385, 1.360912, 1.423028, 0.561411, 1.075318, 0.579664, 0.856843, 1.302976, 1.395384, 1.049080, 0.717677, 1.410685, 1.265288, 1.233963, 1.213870, 0.911732, 0.656924, 1.004567, 1.483752, 1.152371, 0.523737, 0.667294, 0.540805, 1.071469, 0.650513, 0.847177, 0.585443, 1.048513, 1.235277, 0.715494, 0.970806, 0.731717, 0.670415, 0.770139, 0.642860, 0.868173, 1.166077, 1.397270, 0.860222, 0.977048, 1.223795, 1.238837, 1.136860, 1.127560, 0.590381, 1.424478, 0.652488, 0.971402, 1.299389, 1.046034, 1.019467, 0.805221, 0.854870, 0.980597, 0.979723, 1.214519, 1.121689, 1.435373, 0.527776, 0.694722, 1.046026, 1.255094, 1.204143, 1.076658, 0.892511, 0.866373, 1.263462, 0.838399, 1.402889, 1.410993, 1.145245, 1.131632, 0.879673, 1.005937, 0.979453, 0.619352, 0.770406, 0.723308, 0.735299, 0.905938],
42 [1.280506, 1.427073, 0.879789, 1.086139, 1.036706, 1.014353, 1.147556, 1.164896, 0.843121, 1.225658, 0.982239, 1.469344, 1.309790, 1.435840, 1.367651, 0.817233, 1.094605, 1.177248, 0.656487, 0.639727, 0.744188, 1.452216, 1.103546, 1.214505, 1.079936, 1.216600, 1.009478, 1.125042, 1.254938, 0.550030, 1.189085, 1.267309, 1.353996, 0.530584, 0.981013, 0.919253, 1.175170, 0.950235, 1.029522, 0.562356, 1.248757, 1.448359, 0.613384, 1.310808, 1.253853, 1.144909, 1.214412, 1.309913, 1.210858, 1.214954, 1.156127, 1.025335, 1.291851, 1.082201, 0.732061, 0.916355, 0.996536, 0.872104, 0.748274, 0.556044, 1.252064, 0.834954, 0.651078, 1.460592, 0.509710, 1.250452, 0.835672, 1.391963, 1.060117, 0.650755, 1.412867, 1.101646, 0.965050, 1.109307, 1.253508, 0.766335, 1.231471, 1.340628, 1.284467, 0.845298, 1.402009, 0.794779, 0.896674, 1.243952, 1.417294, 0.697860, 0.679539, 0.851853, 1.378351, 1.412807, 1.338983, 0.873406, 1.323241, 1.215563, 0.528130, 1.455520, 1.020062, 1.000210, 1.373335, 1.432730],
43 [1.240513, 1.033298, 0.522560, 1.213807, 0.911869, 0.827741, 0.794976, 0.969230, 0.626645, 0.986357, 1.251177, 0.994851, 1.020110, 1.312822, 0.926407, 0.983671, 0.994010, 0.756009, 0.895726, 1.003499, 0.562756, 1.305284, 1.413133, 0.669466, 0.845270, 0.552020, 1.149270, 1.371840, 1.175793, 1.320329, 0.657078, 1.004552, 0.620331, 1.358643, 1.221971, 1.377358, 1.015070, 1.259890, 0.905796, 1.160333, 0.551994, 0.592783, 1.091467, 0.775688, 0.754513, 0.983893, 1.233747, 0.745092, 0.901294, 0.898268, 0.710254, 0.735907, 1.404299, 0.547054, 1.466718, 0.666106, 1.253068, 1.301775, 0.664992, 0.631767, 0.725976, 1.450178, 1.429771, 0.788148, 0.764200, 1.281182, 1.307371, 1.170866, 1.239594, 0.735317, 0.763682, 0.542242, 0.862845, 0.725894, 1.036795, 1.226789, 0.748517, 0.834509, 1.488584, 0.954555, 0.719467, 0.836054, 1.463329, 1.331410, 0.618399, 1.304639, 1.138905, 1.082355, 0.566909, 1.361495, 0.862528, 0.613203, 0.628790, 1.496718, 1.453116, 0.619761, 1.203898, 1.073236, 0.951866, 1.274655],
44 [0.636181, 1.088489, 1.173684, 1.033445, 0.732267, 1.447785, 0.755248, 1.324392, 0.647175, 0.879011, 1.363957, 1.119208, 1.257362, 1.171908, 0.594229, 0.676823, 1.003686, 1.373630, 1.483868, 1.417955, 1.270865, 1.058633, 0.748285, 1.105380, 0.895899, 0.644852, 1.291218, 0.914932, 0.928978, 1.070640, 0.991385, 0.966379, 1.415228, 1.491662, 1.453947, 0.778985, 1.381445, 1.470697, 0.629664, 1.153360, 0.831713, 0.894630, 0.756541, 0.949981, 1.089522, 1.298259, 0.608494, 0.691989, 1.273858, 0.769418, 1.193965, 0.602736, 0.670953, 0.540535, 0.750419, 0.816189, 1.281947, 0.863904, 0.674390, 1.273259, 1.388311, 1.204608, 0.806371, 0.980616, 0.924502, 0.829790, 1.222088, 0.513586, 1.425925, 1.381753, 1.044760, 0.590380, 0.644188, 1.106744, 1.343447, 1.359713, 1.158890, 1.389677, 1.115926, 0.580977, 0.628175, 1.449797, 1.097237, 0.863093, 0.641586, 0.979967, 1.415270, 1.451763, 1.487804, 1.268733, 0.752753, 0.655134, 0.906114, 1.235399, 1.009420, 0.929635, 0.607187, 1.312780, 1.136365, 0.921108],
45 [0.748524, 1.369177, 0.934533, 1.102703, 1.146367, 0.853069, 1.198869, 1.241657, 1.191021, 0.747985, 0.979408, 1.458972, 0.869351, 0.988991, 0.603401, 1.259519, 0.980549, 1.069499, 1.139180, 1.055040, 0.591555, 1.060951, 1.160591, 0.979863, 1.492859, 0.763594, 0.913991, 0.710668, 1.056531, 0.985256, 0.779584, 1.383766, 0.585667, 1.242378, 1.154392, 0.795802, 0.563005, 1.161807, 0.725422, 0.562225, 1.036866, 1.216658, 1.274284, 1.488570, 1.316633, 1.461860, 0.789054, 1.361144, 0.719320, 0.763150, 0.551529, 1.412504, 1.147728, 0.811577, 1.228210, 1.018510, 0.655228, 0.730655, 0.807956, 1.282889, 0.881588, 1.349047, 0.951104, 0.686217, 0.747707, 1.263202, 0.650127, 1.037251, 1.122519, 1.224163, 0.789462, 0.629659, 1.208203, 0.656317, 0.726476, 0.895043, 0.791120, 1.092991, 0.711909, 1.266077, 0.534302, 1.135435, 1.347722, 0.653737, 0.831916, 1.021062, 1.352690, 0.505870, 0.602692, 1.045314, 1.098172, 0.799132, 1.462976, 0.971011, 0.842995, 0.673609, 0.795435, 0.621573, 0.592284, 1.318302],
46 [1.311631, 0.995282, 0.786780, 0.904811, 0.879885, 0.535916, 1.019403, 1.199235, 1.278574, 0.617895, 0.771239, 0.633041, 1.266253, 0.924334, 0.597578, 1.174370, 0.615993, 1.353696, 0.836635, 0.989610, 0.803431, 1.331548, 0.832721, 0.723852, 1.334291, 0.713263, 1.219369, 0.625581, 0.992898, 0.982628, 1.241848, 0.973272, 1.037474, 1.217156, 1.029343, 0.684628, 0.759857, 0.511688, 0.930552, 1.234483, 0.895232, 1.037478, 1.011466, 0.711956, 0.803547, 0.746492, 1.272604, 1.037333, 1.006048, 1.058568, 1.176609, 0.882520, 0.541480, 0.802976, 0.844504, 0.703699, 0.671613, 0.890023, 0.501083, 0.810488, 0.740479, 1.420010, 1.429948, 1.146862, 1.316193, 0.931004, 0.989071, 1.400385, 0.913639, 0.639571, 0.641433, 1.398360, 0.899608, 0.926937, 1.215681, 1.117349, 1.235624, 0.882989, 0.818594, 0.881352, 1.484024, 0.607456, 0.640642, 0.850981, 0.909445, 0.546183, 0.787244, 0.686868, 1.076608, 1.308196, 1.092043, 1.447057, 0.633696, 0.630374, 0.816885, 0.849989, 1.168251, 1.373178, 0.565708, 1.295896],
47 [1.228643, 0.738633, 0.652577, 1.185162, 1.318912, 1.409365, 1.228588, 1.148795, 1.331306, 0.550249, 0.742371, 0.509078, 1.492198, 0.864823, 0.569176, 0.684871, 0.597131, 0.556188, 1.214118, 1.420784, 0.897166, 1.130377, 1.240613, 1.454156, 0.523106, 0.821094, 1.324682, 1.026031, 1.472817, 0.984822, 0.505128, 0.827566, 0.771461, 0.534161, 1.158544, 1.005448, 0.897420, 0.542134, 0.624452, 1.142559, 0.823504, 1.300411, 0.725065, 1.433246, 1.335957, 1.068355, 1.330080, 1.471292, 0.882025, 0.686774, 0.917441, 1.489229, 0.905663, 0.542094, 1.468851, 0.645157, 1.295944, 1.023661, 1.347507, 0.875402, 1.084266, 1.040575, 0.754818, 1.303567, 0.586569, 0.824401, 0.504861, 0.750788, 1.436682, 0.521441, 0.968313, 0.966591, 0.842421, 0.739896, 0.536155, 0.601406, 0.924895, 1.011223, 0.976541, 0.829191, 1.126608, 1.380677, 0.539406, 1.113236, 1.358651, 1.343717, 0.813231, 0.929970, 1.196677, 0.689668, 0.567011, 0.972333, 0.839404, 1.148986, 0.522457, 1.136774, 1.392630, 0.741390, 0.966315, 0.885431],
48 [1.297295, 1.378437, 1.164570, 0.895825, 0.963395, 0.862295, 0.744340, 1.364998, 0.655335, 0.768841, 1.217173, 0.963525, 1.303287, 0.821915, 0.677960, 0.800138, 1.448253, 0.979767, 1.392119, 0.585982, 0.921116, 0.562224, 0.812862, 1.329531, 0.887943, 0.902994, 1.408764, 0.968904, 0.957420, 0.960017, 0.586739, 1.052696, 0.621264, 1.157113, 1.434573, 1.268988, 1.384373, 1.147503, 1.065945, 1.482257, 1.088117, 0.899774, 0.961920, 1.303949, 1.491552, 1.015181, 1.410257, 1.372790, 0.779078, 1.132351, 1.123983, 1.176391, 1.155115, 1.358237, 1.172782, 0.753902, 0.748648, 1.463951, 0.617509, 0.629725, 0.575769, 0.512727, 1.142919, 1.350719, 0.603780, 0.988247, 0.958885, 0.964036, 0.519951, 0.622180, 1.205202, 0.974844, 0.818712, 0.735477, 1.312122, 1.141732, 1.197968, 0.632684, 1.205996, 1.297368, 0.812143, 0.512066, 1.218316, 1.484007, 0.589762, 1.036795, 1.085377, 0.739645, 0.974279, 1.012355, 1.433491, 0.670476, 1.422006, 1.209889, 0.942809, 1.443062, 0.522259, 1.344268, 1.366238, 1.147227],
49 [0.692855, 0.963820, 0.566287, 0.561259, 0.615691, 1.015099, 1.382108, 0.866510, 1.340430, 0.875466, 0.580694, 1.313270, 1.311595, 1.165124, 1.292756, 0.781488, 0.647129, 1.301405, 0.927022, 1.296080, 0.723913, 0.942827, 0.750353, 0.552402, 0.593624, 1.487831, 0.540218, 0.904311, 0.698329, 1.249872, 1.100354, 1.153210, 1.292435, 1.012553, 0.608275, 1.225163, 0.611127, 1.194936, 0.527464, 1.426521, 0.646311, 0.804665, 1.084145, 1.034143, 1.088279, 0.664487, 1.192200, 0.918317, 1.142646, 0.569235, 0.945882, 1.087182, 0.848297, 1.074845, 1.388766, 0.609106, 1.140778, 1.198879, 1.351980, 1.218628, 1.145560, 1.109429, 1.344311, 1.223163, 1.398792, 1.291418, 1.184115, 0.870645, 1.284665, 1.416059, 0.777524, 0.951476, 0.541381, 0.644964, 1.237234, 0.729530, 0.577324, 0.701065, 1.478748, 1.431658, 1.487870, 0.880464, 1.061229, 1.379999, 0.583312, 0.933728, 1.294578, 0.978165, 1.233571, 1.109879, 0.516053, 1.023313, 0.886110, 1.153631, 0.590171, 0.885499, 0.870380, 1.041900, 0.997516, 0.939240],
50 [0.722730, 1.480353, 1.436669, 0.808576, 0.945710, 1.176355, 1.354404, 0.931491, 0.643934, 0.890557, 1.421781, 1.356383, 0.772310, 1.135264, 0.982245, 1.470156, 0.698212, 0.818315, 0.909842, 0.529245, 0.850432, 0.714098, 0.689035, 0.523322, 0.892562, 0.852723, 0.686777, 1.177383, 0.526833, 1.313950, 1.212798, 1.466209, 0.568782, 0.919507, 0.841937, 1.491518, 1.160020, 0.548895, 0.825159, 0.528143, 1.102369, 1.230860, 0.840324, 0.784020, 0.569058, 1.167023, 1.133038, 0.751083, 1.002116, 0.660695, 1.175234, 0.538943, 1.040375, 1.294261, 1.022649, 1.112564, 0.994752, 1.209664, 0.802031, 0.832267, 1.087234, 1.447808, 1.174182, 0.682898, 1.282792, 1.063484, 0.628875, 0.856724, 0.667678, 0.882975, 1.489054, 0.686924, 1.496083, 0.912370, 0.968535, 1.027022, 0.853282, 1.493143, 0.957449, 0.815292, 1.181962, 0.523791, 1.459402, 1.233873, 1.376232, 0.549287, 1.271033, 0.865421, 1.181097, 0.921327, 1.229216, 1.444183, 1.058755, 1.174061, 1.177193, 0.957264, 1.493189, 0.896211, 0.562810, 0.559379],
51 [0.587099, 0.687016, 1.184920, 1.390886, 1.047799, 0.577556, 0.988973, 0.884809, 0.780843, 1.242257, 0.712039, 1.019675, 0.883079, 0.910861, 1.138993, 0.672161, 1.386088, 1.277571, 1.103470, 1.022888, 0.971385, 0.795682, 1.279136, 1.271236, 0.613298, 0.664994, 1.210768, 0.829340, 1.066858, 0.514891, 1.062482, 1.087765, 1.412044, 1.415776, 1.497073, 1.192484, 1.032552, 1.395519, 1.162634, 1.018649, 1.074131, 0.510119, 1.277594, 0.994976, 0.723647, 0.844321, 1.313150, 0.656162, 1.322187, 0.675055, 1.432463, 0.699152, 1.340842, 0.561684, 1.180689, 1.203130, 1.272870, 0.769434, 0.857942, 0.549277, 1.259807, 1.149281, 1.179255, 1.206596, 1.294566, 1.386951, 1.241932, 0.504205, 0.547852, 0.567474, 0.923101, 0.866201, 1.401489, 1.123678, 0.950110, 1.326069, 0.995138, 0.971752, 1.180311, 0.598078, 1.172467, 1.173235, 0.744679, 0.725303, 1.149524, 1.163761, 0.936380, 1.100728, 1.450567, 0.613182, 0.772447, 1.012539, 0.864765, 1.079364, 0.924737, 0.588277, 1.082651, 0.698034, 0.959668, 1.023185],
52 [0.988981, 0.689229, 1.486933, 0.599011, 0.982337, 0.614349, 0.573770, 1.262524, 1.424293, 0.987521, 0.726811, 1.412779, 1.248769, 1.234086, 0.557360, 0.689084, 1.200291, 1.456376, 1.077152, 1.401346, 0.881220, 0.660305, 1.375346, 1.167847, 0.672541, 0.771209, 0.782543, 0.893133, 0.997477, 0.706968, 1.388540, 0.861025, 0.958766, 1.172811, 0.631715, 1.308802, 1.436923, 1.273562, 1.384133, 1.479127, 0.879950, 0.636853, 0.766011, 0.566885, 0.948727, 1.271401, 1.486664, 0.785128, 1.061584, 1.327139, 1.094675, 1.370093, 0.850541, 0.641494, 1.145567, 1.460751, 0.596990, 0.954087, 0.636962, 1.092563, 1.426923, 0.920506, 0.505638, 1.357573, 1.455444, 0.530191, 0.721097, 1.325209, 1.349248, 1.381790, 0.900607, 1.304454, 0.593939, 1.458256, 1.227553, 0.877515, 0.772776, 0.510315, 0.959775, 0.920924, 1.475126, 0.832748, 0.695902, 0.557866, 0.918660, 0.790759, 0.918023, 1.306716, 1.197084, 1.213258, 1.287765, 1.278836, 0.964354, 1.010394, 0.615742, 1.133320, 0.569700, 1.118194, 1.201309, 1.098770],
53 [0.610081, 0.737955, 0.926984, 0.903793, 0.632381, 0.751552, 1.342128, 1.349278, 1.408423, 1.217757, 0.905092, 1.435228, 1.107308, 0.891698, 1.131404, 1.416677, 0.589718, 0.981011, 1.184637, 1.316450, 0.591721, 1.370070, 1.132957, 0.872514, 0.676285, 1.482809, 0.868402, 0.982266, 1.145556, 1.068159, 0.651381, 0.853492, 0.617194, 1.361320, 0.687469, 1.194165, 1.435292, 1.043898, 0.898241, 1.075107, 0.860373, 1.312734, 1.159875, 0.938705, 1.354157, 0.830498, 0.666395, 0.535221, 0.773000, 1.424380, 0.964546, 1.006395, 0.807752, 0.516482, 1.346470, 1.431348, 1.182579, 0.989412, 1.255138, 1.482466, 0.841909, 0.985874, 0.667158, 1.137700, 1.417949, 0.779480, 0.668516, 1.363037, 0.550007, 1.024390, 1.348684, 0.837570, 1.280495, 0.957944, 1.398153, 0.937464, 1.263686, 0.919538, 1.125201, 0.864092, 1.118298, 1.015054, 1.497190, 1.025647, 1.420625, 1.020863, 1.049759, 1.399448, 1.382671, 0.776813, 0.707191, 0.778973, 0.802587, 1.096483, 1.396604, 0.713665, 1.441795, 0.977361, 1.262871, 1.461402],
54 [0.813943, 0.680519, 0.511478, 0.558429, 1.094609, 0.799908, 0.773460, 1.279708, 1.386888, 1.348276, 0.778009, 0.905605, 0.666383, 1.470536, 1.299767, 1.346888, 0.782914, 1.428907, 0.697892, 0.606730, 1.351930, 0.864346, 0.946365, 1.231249, 1.206699, 1.144011, 1.165052, 0.727949, 0.563290, 0.960477, 0.586924, 0.903605, 1.357522, 1.169519, 0.685505, 1.059413, 0.743235, 0.695182, 0.679872, 1.411399, 0.795301, 1.196999, 0.903812, 1.156331, 1.165709, 0.565184, 1.282335, 1.498951, 0.912860, 0.905371, 0.836275, 1.393140, 0.525175, 1.473613, 0.584668, 1.465398, 0.640308, 1.346438, 1.118658, 1.204170, 0.565874, 0.904597, 0.880009, 0.945815, 1.091614, 0.552600, 0.772920, 1.140507, 1.367006, 0.764824, 0.815681, 0.513934, 1.398151, 1.010974, 1.372802, 1.234327, 1.195082, 0.896907, 0.941516, 1.390891, 0.683558, 1.391734, 0.731815, 1.456296, 1.052963, 1.392538, 0.646926, 1.472379, 0.504058, 1.062336, 0.753548, 1.262995, 1.173000, 1.178359, 0.992326, 1.103609, 0.932861, 1.425049, 0.597675, 0.972518],
55 [0.944463, 1.277893, 1.355262, 1.317821, 1.020200, 1.307974, 0.517232, 1.349689, 0.824928, 0.793442, 0.517350, 0.846077, 1.055395, 0.688177, 0.811814, 1.404456, 0.858749, 0.680923, 1.160846, 0.786850, 1.184568, 0.940702, 0.775340, 1.444527, 1.102044, 0.950843, 1.287114, 1.122676, 0.797592, 1.248898, 1.174536, 1.023530, 1.237861, 0.502915, 0.844259, 0.612471, 0.823806, 0.829548, 1.493739, 1.298925, 0.556888, 1.377708, 0.527229, 0.731321, 0.727799, 1.047573, 1.047175, 0.888962, 1.144364, 0.678165, 1.478719, 0.601012, 1.089768, 1.360020, 1.471700, 1.410507, 0.705025, 0.933493, 1.499039, 0.942692, 1.055819, 0.707047, 0.607226, 0.905808, 1.205594, 0.845379, 0.770954, 0.819792, 0.789148, 1.106259, 0.619862, 0.525928, 1.122709, 0.903631, 1.266429, 1.303021, 1.312815, 0.541525, 0.646086, 0.925632, 1.284957, 0.963873, 0.603842, 0.998181, 0.839279, 1.442330, 1.499839, 1.273325, 0.740793, 1.182872, 1.247894, 1.350491, 0.652831, 0.960712, 0.561896, 1.329911, 1.063076, 1.452755, 1.042146, 0.669313],
56 [0.677053, 1.450654, 0.681746, 1.005820, 0.589914, 0.671740, 1.089172, 0.521950, 0.896587, 1.191735, 0.728402, 0.919739, 1.330404, 0.623453, 1.090528, 1.241996, 0.660063, 1.061985, 0.766965, 1.165892, 0.953633, 0.586406, 0.821410, 0.933062, 0.575013, 0.863445, 1.020924, 1.152529, 0.702934, 1.055894, 1.211744, 1.035656, 0.821326, 1.030520, 0.720927, 0.711973, 0.538362, 0.986073, 1.390227, 0.810621, 1.448758, 1.437193, 0.772821, 1.483152, 0.955085, 1.064271, 1.194874, 0.662785, 0.911286, 0.877904, 1.324479, 1.336087, 1.131266, 0.938485, 1.052959, 1.497782, 1.188433, 1.429192, 0.776999, 0.797690, 1.123579, 1.114667, 1.220637, 0.717060, 0.974480, 1.391882, 1.444966, 0.762352, 0.800971, 1.257304, 1.471378, 0.844295, 0.993357, 1.116639, 1.290868, 0.947945, 1.100383, 0.931819, 1.297723, 1.203131, 0.770499, 0.908679, 1.086434, 1.480419, 1.362894, 0.830707, 1.477182, 1.457445, 0.640418, 1.128763, 0.720541, 1.404052, 0.675977, 1.332138, 1.108372, 1.428894, 1.061116, 0.595576, 0.801511, 0.931090],
57 [0.643420, 1.362300, 1.474952, 0.926531, 1.381211, 1.431771, 1.046737, 1.210830, 1.298809, 1.168734, 1.009451, 0.947465, 0.909941, 1.177119, 0.784524, 1.219616, 1.454565, 0.534898, 0.978879, 1.226380, 0.815606, 1.038218, 1.361420, 0.778024, 1.441346, 1.485796, 0.937099, 1.375639, 1.154427, 0.890535, 1.267625, 0.622470, 1.483020, 1.314277, 1.404574, 1.371651, 0.768889, 1.313662, 0.636042, 1.023995, 0.953827, 0.829175, 0.754455, 1.317779, 0.503153, 1.106937, 0.812034, 1.454598, 1.461104, 1.068981, 1.223514, 0.884404, 0.836136, 0.787167, 1.197114, 0.798132, 0.502230, 1.246851, 0.974236, 1.430769, 0.568862, 1.374975, 0.710428, 1.128492, 1.145935, 1.433811, 0.988121, 1.327453, 0.614006, 0.951511, 1.280087, 1.188676, 0.624892, 0.830363, 1.060348, 0.675502, 0.685491, 0.583219, 1.225793, 0.780175, 1.147304, 1.292539, 0.903020, 0.759726, 1.413597, 1.019283, 1.107386, 1.460782, 0.508626, 0.849334, 1.154008, 1.254488, 0.686210, 1.470986, 0.610893, 0.670393, 1.121561, 0.845200, 0.759875, 1.206710],
58 [1.065558, 1.163891, 0.804453, 0.587116, 0.827693, 0.817210, 0.631240, 0.886643, 1.340130, 0.675996, 0.590660, 0.751568, 0.903656, 0.745866, 1.456385, 0.986844, 1.110281, 0.889903, 1.351026, 1.004253, 1.494489, 1.071129, 1.045616, 0.988856, 0.843773, 1.219725, 1.371029, 1.355663, 1.186525, 1.080059, 1.346296, 1.309578, 0.617709, 1.313196, 0.758414, 1.159872, 1.285458, 0.783482, 1.402323, 1.230263, 1.476751, 0.910991, 0.640093, 1.329906, 1.397887, 0.623863, 0.766371, 1.011667, 0.703489, 0.652436, 1.192745, 1.226452, 1.381471, 1.113720, 1.128661, 0.581083, 0.888773, 1.197396, 1.406884, 1.419972, 1.443221, 0.601071, 1.135247, 0.918485, 1.391332, 0.909509, 1.010628, 1.430850, 1.283277, 0.683353, 0.670572, 1.387354, 1.369173, 1.486147, 1.385065, 0.690328, 0.984858, 1.214500, 0.606477, 0.881161, 0.636055, 0.860682, 0.584929, 1.162528, 0.687090, 0.891145, 0.868081, 1.227512, 0.809845, 0.644450, 0.933233, 0.561348, 0.594675, 0.746191, 0.539361, 0.859919, 1.154841, 1.177022, 0.592519, 0.695240],
59 [1.307073, 1.060171, 0.985989, 1.302419, 0.599171, 1.279548, 0.612157, 1.339375, 0.706198, 0.865803, 0.785091, 0.662037, 0.633563, 0.686540, 0.656337, 1.346492, 1.134035, 1.460974, 0.634225, 0.715126, 0.533116, 0.521919, 1.425005, 1.100706, 0.634682, 0.759830, 0.898285, 1.163993, 0.709671, 1.458231, 1.451669, 0.951285, 1.195509, 0.821576, 1.048659, 0.883815, 1.336353, 1.299437, 1.309326, 1.145091, 0.800970, 0.949192, 0.989204, 0.966698, 1.483895, 0.541994, 1.481214, 1.348319, 0.517804, 1.238796, 1.093987, 1.274598, 1.037472, 0.825707, 0.839411, 0.534473, 1.088648, 0.871750, 0.793572, 0.918413, 1.347887, 0.600003, 0.856966, 1.355622, 0.901064, 1.373408, 1.105120, 1.087480, 0.845619, 1.443290, 0.990788, 1.021125, 0.798618, 1.339497, 1.438196, 0.938998, 0.510930, 1.012374, 0.829899, 0.741384, 1.125728, 1.486529, 0.524355, 0.779083, 1.318244, 0.733207, 0.968435, 0.909394, 1.025079, 0.596948, 1.255514, 0.792539, 1.290562, 0.869886, 1.367188, 1.370763, 0.611779, 1.422283, 1.206951, 0.759789],
60 [0.628118, 0.986460, 0.661796, 1.389779, 1.017296, 0.888325, 1.047390, 0.806516, 1.340260, 0.657085, 1.181462, 0.778365, 1.385428, 0.599716, 0.696260, 1.393996, 1.378781, 1.214659, 0.609555, 1.084008, 0.992759, 1.268500, 0.584955, 1.284553, 1.017518, 1.433847, 1.242534, 1.316496, 0.611646, 1.247809, 1.163828, 1.354679, 0.548542, 1.477290, 0.783664, 0.869490, 0.812383, 1.337877, 0.581077, 0.874071, 0.500250, 0.892658, 1.159818, 1.001490, 1.127929, 1.091757, 0.634960, 1.313267, 0.653831, 0.639887, 1.472987, 1.382286, 1.431821, 0.715500, 0.898174, 1.414657, 1.493099, 0.598091, 1.016865, 0.540285, 0.832288, 1.383222, 1.193591, 0.502488, 1.469457, 0.927579, 1.010603, 0.966315, 1.375137, 0.728748, 0.896679, 0.688481, 0.540595, 1.148342, 0.851399, 0.733405, 1.111513, 1.009719, 1.394952, 1.185673, 0.683425, 0.626130, 1.359411, 1.448770, 0.529089, 0.825793, 1.089878, 1.111468, 0.815180, 1.174382, 1.362746, 0.956612, 0.957135, 1.011150, 0.630857, 0.807129, 1.048334, 0.612882, 1.388455, 1.256420],
61 [1.123186, 0.887811, 1.120422, 0.944150, 1.135521, 0.692968, 1.150914, 1.431752, 1.277622, 0.663900, 0.633598, 1.073001, 1.203762, 1.330694, 0.660117, 0.951956, 1.250083, 1.187391, 1.402099, 0.815812, 1.452202, 0.937322, 0.819355, 0.611906, 1.228004, 1.102393, 1.146756, 0.685456, 0.565851, 0.655269, 0.725638, 0.884126, 1.426332, 1.164023, 1.325686, 0.583175, 1.491974, 0.853858, 0.602065, 0.547459, 0.615989, 0.534945, 0.740132, 0.756071, 1.355647, 1.054257, 0.591385, 0.514674, 1.494585, 1.206039, 1.472892, 1.235039, 1.247592, 1.078207, 1.227007, 1.059723, 1.069905, 1.474985, 1.240604, 1.265733, 1.317280, 0.924961, 1.064172, 1.489886, 0.889740, 1.223275, 0.845877, 1.388685, 1.022245, 0.530828, 1.420735, 0.986296, 0.774931, 0.989966, 1.004876, 1.365143, 1.070201, 1.336545, 0.555874, 1.333750, 0.589715, 1.216764, 1.147382, 1.048948, 1.133480, 0.524698, 0.818307, 0.680001, 0.637915, 1.107480, 1.354593, 0.571013, 0.800586, 1.180872, 0.989638, 1.177721, 0.666825, 0.810721, 1.273648, 0.554075],
62 [1.043900, 1.240287, 1.209958, 0.826213, 1.342646, 0.781448, 0.599894, 0.958047, 0.973484, 1.257917, 1.181843, 0.559902, 1.394877, 0.703383, 1.462728, 0.859463, 1.201552, 1.166392, 0.796967, 1.339768, 0.744285, 1.219831, 1.199772, 0.514047, 1.402293, 1.125664, 1.443023, 0.538936, 0.511895, 0.633584, 1.268637, 1.443648, 0.565841, 1.325301, 1.416712, 1.129156, 1.185031, 1.075235, 0.619197, 0.605593, 1.282352, 1.154266, 0.808002, 0.746882, 0.741806, 1.088216, 1.426496, 1.249235, 1.195733, 0.548990, 0.758599, 0.753935, 0.870433, 1.431161, 1.321455, 0.848566, 1.423187, 0.596820, 0.535996, 1.049019, 0.714521, 1.019492, 0.687287, 1.203584, 1.076291, 1.169336, 1.064990, 0.507994, 0.695313, 0.854872, 0.741875, 0.829731, 1.127131, 0.818975, 1.150661, 0.779207, 1.470372, 1.307541, 1.243043, 1.422727, 0.874610, 1.252954, 1.473780, 1.304516, 1.318572, 0.894120, 0.588865, 0.687488, 1.472428, 0.918656, 1.323939, 1.406423, 1.050762, 0.892280, 1.145244, 0.889083, 1.128182, 0.869011, 1.168184, 1.117911],
63 [0.875060, 1.314981, 1.431955, 1.360897, 1.330123, 0.878816, 1.037516, 1.066977, 0.923814, 0.634828, 0.766401, 1.309031, 1.025698, 1.009135, 1.067087, 0.886196, 0.708259, 1.443071, 0.833758, 0.690030, 0.676341, 0.986915, 1.140032, 0.748755, 1.468690, 1.256891, 0.839220, 1.481236, 0.609901, 0.620020, 1.427007, 0.765061, 1.218173, 1.256902, 1.445317, 0.923784, 0.689765, 1.325511, 1.451756, 1.212756, 0.998874, 1.181274, 1.030370, 1.175103, 1.260383, 0.626551, 0.940208, 1.350733, 1.455814, 1.355004, 1.476460, 0.817381, 0.843167, 0.941242, 1.416786, 0.897703, 0.854643, 0.840549, 1.163709, 0.507771, 1.279304, 1.345945, 1.497428, 0.973198, 0.579716, 1.241767, 0.816868, 0.713616, 1.270998, 1.334559, 1.351746, 0.581553, 0.775823, 1.303400, 1.368665, 0.635983, 1.299402, 0.538457, 1.498671, 1.176010, 1.287824, 1.444752, 1.379996, 1.087086, 1.243929, 1.131779, 1.468878, 1.133481, 0.637244, 0.529194, 0.717628, 1.360326, 1.123830, 0.557756, 0.872732, 0.922547, 1.114523, 1.438563, 0.743833, 0.720907],
64 [1.345938, 1.418358, 1.424275, 1.155991, 0.626149, 0.571493, 1.150268, 0.584680, 0.604146, 1.471212, 0.935993, 0.537377, 1.013664, 0.897073, 1.001501, 1.274813, 1.129630, 0.677259, 1.078578, 0.625138, 1.059150, 1.131486, 0.895937, 0.983373, 0.773572, 1.291491, 1.070917, 1.316595, 1.226574, 0.615640, 1.260544, 1.408848, 0.766322, 1.000240, 0.678138, 0.632134, 0.751839, 0.614574, 1.335281, 0.862874, 0.735116, 0.510164, 0.825152, 1.000108, 1.433593, 0.605665, 0.889756, 1.300515, 1.098498, 0.614721, 1.461195, 1.483252, 0.988557, 1.238099, 0.801520, 0.550741, 0.789153, 1.455642, 0.674229, 1.429373, 0.890240, 1.308407, 0.507882, 1.188864, 1.227585, 1.374329, 1.393874, 1.134409, 0.736491, 0.820877, 1.465487, 1.130531, 1.239679, 1.304525, 0.918847, 0.566421, 0.548522, 1.119883, 0.642187, 0.524335, 1.128029, 1.444313, 0.530247, 1.149273, 1.146949, 1.281323, 0.853004, 0.505300, 1.113191, 0.757923, 1.071819, 1.195013, 1.065261, 0.854545, 1.312237, 1.137344, 0.621631, 1.299676, 1.425879, 1.396843],
65 [0.635556, 1.059111, 1.308952, 0.704766, 0.777577, 0.556573, 1.048830, 0.960567, 1.483903, 0.601256, 1.417074, 0.767609, 0.867716, 0.697499, 0.603437, 0.626009, 0.774052, 0.556517, 0.571561, 0.561268, 1.254766, 0.556985, 0.943533, 1.191793, 1.012351, 1.014343, 1.161136, 0.595661, 0.534088, 1.336995, 1.191277, 0.599785, 0.862058, 1.239023, 0.656823, 1.382766, 0.809660, 0.864525, 0.680553, 1.093310, 0.905496, 0.585869, 0.649157, 0.690196, 0.699296, 1.126553, 1.324224, 0.570062, 1.054777, 1.247412, 0.706222, 1.255465, 1.224234, 1.441106, 1.025345, 0.790910, 1.336143, 1.434829, 1.351849, 0.912824, 1.039535, 1.334563, 1.425817, 1.056184, 0.903885, 0.945097, 1.006046, 1.256698, 0.823517, 0.651247, 0.660987, 1.046842, 0.528239, 0.569738, 0.573642, 0.973655, 1.142437, 1.097988, 0.890620, 1.362035, 0.706367, 0.952173, 1.154068, 0.966686, 1.012419, 1.021340, 0.637085, 0.963258, 0.610081, 0.558546, 1.381745, 0.587094, 0.689553, 1.121866, 0.779377, 0.824409, 0.944902, 0.775049, 1.265050, 0.517354],
66 [0.734900, 1.119260, 0.843622, 0.704809, 1.330814, 1.474340, 1.032411, 0.505694, 0.824936, 0.992780, 1.496604, 0.525476, 0.785172, 0.732564, 0.539921, 0.579143, 1.429222, 1.387006, 0.677721, 1.294291, 1.442514, 0.585160, 0.834461, 1.363386, 0.827060, 1.001998, 1.428217, 0.531227, 1.297473, 1.312636, 0.909997, 0.922830, 1.107568, 0.759923, 0.820326, 0.870107, 1.289272, 0.825146, 1.488850, 1.170181, 1.446206, 0.747835, 0.627882, 1.280218, 1.327983, 1.238888, 0.777494, 0.943308, 1.327586, 1.002670, 1.182035, 1.406544, 1.030074, 1.204054, 0.844526, 1.124704, 0.594368, 1.327619, 1.476624, 0.829647, 0.743005, 0.686308, 1.259147, 1.213336, 0.886493, 0.560378, 0.550993, 1.485941, 0.921959, 0.870450, 0.950378, 1.374255, 0.632401, 0.712168, 1.127171, 1.343072, 0.697690, 1.362223, 0.638022, 1.383644, 1.235128, 0.897480, 1.426219, 1.072101, 1.349763, 0.879846, 0.982531, 1.436232, 0.892840, 0.676757, 0.879941, 0.540303, 0.527823, 1.182996, 0.688427, 0.805384, 1.141954, 0.912076, 1.443228, 0.561961],
67 [0.619583, 0.908220, 0.655543, 0.597012, 0.538192, 0.866151, 1.372380, 1.452376, 1.214701, 1.377784, 0.656336, 1.278099, 0.743594, 0.944078, 1.458225, 0.607476, 0.663891, 1.071079, 1.218320, 0.604553, 1.298038, 1.007390, 1.346154, 0.529281, 0.820564, 1.466176, 1.072455, 0.960620, 1.374843, 0.524257, 0.798524, 1.098067, 0.769498, 0.576331, 1.303613, 1.059493, 0.513170, 0.722168, 0.910329, 0.788630, 0.543182, 1.396245, 1.419360, 1.443838, 0.793549, 1.477234, 1.484029, 0.834170, 0.725374, 0.912801, 0.637919, 0.503459, 0.832874, 1.380588, 0.908287, 1.465089, 1.427761, 1.482611, 0.615283, 1.127030, 1.416306, 0.543117, 1.045509, 0.571099, 0.849557, 1.244264, 1.499765, 1.435468, 0.627860, 1.038495, 0.581902, 0.743817, 1.259628, 0.720385, 0.893064, 0.605289, 1.393656, 1.491742, 1.081272, 0.662783, 1.266906, 0.830318, 1.188704, 1.081714, 0.648343, 1.137915, 0.988191, 0.881204, 0.964808, 0.722758, 1.020527, 0.971575, 0.661291, 1.271737, 1.350533, 1.162144, 1.282630, 1.221133, 1.128489, 0.758767],
68 [1.094744, 1.449561, 1.071110, 1.353642, 0.783702, 0.902558, 1.074954, 1.143760, 1.408050, 1.230958, 1.333502, 1.160335, 1.445780, 0.821178, 1.035229, 1.386131, 0.943130, 1.367576, 1.445800, 0.895306, 0.737235, 0.689140, 1.277045, 1.219042, 0.999189, 0.597013, 0.657893, 1.011706, 0.643968, 1.373057, 0.743838, 0.605406, 0.932299, 0.781985, 0.744317, 1.390433, 1.417748, 0.677239, 0.526382, 1.429636, 1.220976, 0.890141, 1.210511, 1.393789, 1.080778, 0.794967, 0.844574, 1.031463, 0.700638, 1.411410, 0.690343, 1.228668, 1.027177, 1.341832, 1.457629, 0.792155, 1.262338, 0.764030, 0.882158, 0.603022, 0.734244, 1.262396, 0.643198, 1.149344, 0.862620, 0.825129, 0.839640, 1.336547, 0.899160, 0.961490, 1.437300, 0.863710, 1.397868, 0.564692, 1.103704, 0.728641, 0.604724, 1.346087, 0.532961, 1.009466, 0.725735, 0.574246, 0.757156, 1.248943, 1.405088, 0.574402, 1.341561, 1.457685, 1.079504, 0.645329, 1.168122, 0.868963, 0.940918, 1.211615, 0.601606, 1.448788, 0.748838, 0.943322, 1.083784, 0.901646],
69 [1.167641, 1.112451, 0.535931, 0.947706, 0.888675, 1.408667, 1.032946, 1.200435, 0.641524, 0.756565, 0.547207, 0.905872, 1.446300, 1.147797, 0.904047, 0.791513, 1.404653, 1.092697, 1.177800, 1.118598, 0.569978, 1.496952, 1.088718, 1.256389, 0.810806, 0.944087, 1.062446, 0.587010, 0.806498, 1.121109, 0.549740, 0.989608, 1.073241, 1.366084, 1.488263, 0.826025, 0.572142, 1.149351, 1.338909, 1.416253, 1.368357, 1.491190, 0.993610, 0.824534, 0.510296, 1.362356, 1.258862, 0.988767, 1.066141, 1.452240, 1.217312, 1.140926, 0.568250, 1.241786, 1.446832, 0.720296, 1.293081, 0.769166, 1.249523, 0.619600, 0.857399, 0.862334, 1.043659, 0.596569, 0.630266, 1.260230, 1.121536, 1.440912, 1.456759, 0.723228, 0.697675, 0.858840, 1.464669, 1.277079, 1.335189, 0.605894, 1.200725, 1.408902, 0.766034, 1.253729, 0.754399, 0.659588, 0.721686, 0.648845, 0.554910, 1.388891, 1.468556, 1.062467, 1.484209, 1.231654, 1.269116, 0.961065, 0.926877, 1.418771, 0.920339, 1.481656, 1.496486, 1.257313, 0.555515, 1.123589],
70 [1.116234, 0.569000, 1.148371, 1.213464, 0.847500, 1.398437, 0.881196, 1.011374, 1.041046, 1.160339, 0.948184, 0.541478, 0.751001, 0.719342, 1.151283, 0.677398, 1.156195, 1.202239, 1.479082, 1.321553, 1.190452, 0.992746, 1.198480, 1.046161, 0.623673, 1.455355, 0.903832, 1.285455, 1.297053, 1.124483, 1.410240, 1.296438, 0.657316, 1.085601, 1.431401, 1.355320, 1.324462, 1.432921, 0.742826, 0.670706, 0.675775, 0.931263, 0.869977, 0.703497, 1.137491, 0.968263, 0.903027, 0.939470, 1.366475, 0.999347, 0.840546, 0.542362, 1.044259, 0.897461, 0.677064, 0.762184, 1.378701, 0.556484, 0.500879, 0.863882, 1.043415, 0.844455, 0.720266, 1.250452, 1.219721, 0.609329, 1.168317, 1.008124, 1.263868, 1.285371, 1.267612, 0.956247, 0.613906, 0.982968, 0.890671, 1.269056, 1.405158, 1.394865, 0.612409, 1.224123, 1.456423, 1.045532, 0.764319, 0.539082, 0.970792, 0.502726, 0.689715, 1.403668, 1.338404, 0.694803, 1.361656, 0.983067, 0.691668, 0.508948, 1.471354, 0.692869, 1.141161, 1.382808, 1.022105, 1.340210],
71 [1.305027, 1.417294, 1.411711, 0.929088, 1.279166, 0.745954, 0.805378, 1.014312, 1.147074, 1.461683, 0.775968, 1.127427, 1.205592, 1.024311, 1.112450, 0.937935, 0.548958, 1.013580, 1.232978, 0.958685, 1.230789, 0.824367, 1.415602, 0.983085, 0.812914, 0.673555, 0.924277, 1.175504, 0.618840, 0.714958, 0.807589, 0.551825, 0.506550, 1.219134, 1.107405, 0.719842, 0.631640, 0.624481, 1.401661, 0.857339, 0.802297, 0.716544, 0.528783, 1.484474, 0.864336, 0.606295, 1.444175, 1.160480, 1.322432, 1.219129, 0.692506, 0.789991, 1.471677, 0.550392, 1.012413, 1.191612, 1.233205, 1.389600, 1.448538, 1.410877, 1.332642, 1.457888, 1.076923, 0.570433, 1.174454, 0.571202, 1.169341, 0.774461, 0.949637, 1.496979, 1.341200, 0.529471, 0.580710, 0.886545, 0.846563, 1.026198, 0.755716, 1.163037, 0.694687, 1.395481, 1.454198, 1.285041, 1.265287, 1.264468, 1.222440, 0.994904, 1.221549, 1.049353, 0.894578, 1.447085, 0.804555, 0.768331, 0.889337, 1.059252, 1.156951, 0.563632, 1.415725, 1.449061, 1.482976, 0.742506],
72 [0.920315, 0.652752, 0.996433, 0.671131, 0.915834, 1.126481, 1.431469, 0.904975, 1.331753, 0.712123, 1.004036, 1.399249, 1.059027, 0.644583, 1.482883, 0.754166, 1.295965, 0.518653, 0.944016, 0.813149, 0.584188, 0.812512, 0.553859, 1.219481, 0.591115, 0.819874, 0.813568, 1.161684, 0.945147, 1.163196, 1.475042, 1.112102, 0.860164, 1.190670, 1.154397, 1.285748, 1.033687, 1.430824, 1.409531, 0.751444, 0.517261, 0.939580, 0.509179, 0.660066, 1.211547, 0.721262, 0.835340, 0.704713, 1.124623, 1.065840, 0.575917, 1.362895, 1.217630, 1.170938, 1.351641, 0.507758, 0.847091, 0.689311, 0.623260, 0.515929, 0.785452, 0.755167, 0.781900, 0.551448, 1.305338, 1.021574, 0.618043, 1.112669, 0.961044, 0.982826, 0.505608, 0.796394, 1.172716, 1.420101, 0.695585, 1.089549, 1.249750, 1.289342, 0.579339, 1.477380, 1.149356, 0.699074, 1.115248, 0.536878, 0.745607, 0.821738, 0.549569, 1.175895, 0.795487, 0.835929, 1.203680, 0.565299, 0.612610, 1.021754, 1.498217, 1.194223, 1.133953, 1.019904, 0.594652, 0.790909],
73 [0.965789, 1.194328, 0.616379, 0.777838, 0.921299, 1.207086, 1.496303, 1.120253, 1.222593, 1.081036, 1.171151, 0.666471, 0.570996, 1.380889, 0.703075, 0.618993, 1.218284, 1.323520, 0.983416, 0.974910, 0.823529, 0.805998, 1.191164, 0.903444, 1.476858, 1.153093, 1.175976, 1.376058, 0.687381, 1.434627, 1.313396, 0.687739, 1.467098, 1.225961, 1.328663, 0.918464, 1.404405, 0.786276, 0.697552, 1.208431, 0.508722, 0.973600, 0.592625, 0.750477, 0.816762, 0.869360, 0.744586, 0.707582, 0.677276, 1.347686, 1.362123, 0.833759, 1.147330, 0.944373, 1.245300, 1.371705, 0.900468, 1.301551, 1.277147, 0.530418, 0.867355, 0.897317, 1.246269, 1.048079, 1.185179, 1.168351, 0.717229, 1.318631, 1.080505, 1.111622, 0.542030, 1.377112, 1.452016, 0.514739, 0.841373, 1.336502, 0.505720, 0.988298, 0.751935, 0.846356, 0.529360, 0.988094, 1.423488, 1.242249, 1.171515, 1.389450, 0.832910, 1.058424, 0.744120, 1.234346, 1.442857, 1.321819, 1.417105, 1.074780, 0.552294, 1.481139, 1.296479, 0.549762, 1.331197, 1.119685],
74 [1.240994, 1.004417, 1.076903, 1.380301, 0.681073, 1.240072, 0.599144, 0.827421, 1.385618, 1.171047, 1.292965, 0.703596, 1.205914, 0.886948, 0.729909, 0.814431, 0.745337, 0.941036, 1.417759, 0.606827, 0.984781, 1.033517, 1.496025, 0.624208, 1.139225, 1.401152, 0.672173, 0.600005, 1.307557, 1.011739, 1.117489, 0.801016, 0.836676, 0.694911, 1.064258, 0.594293, 0.748017, 0.742004, 1.378077, 0.807274, 0.790488, 1.461195, 0.946933, 0.847030, 1.031838, 0.623853, 1.218063, 0.787130, 1.229268, 1.022002, 0.798828, 1.307609, 1.484368, 1.093625, 0.790662, 0.672610, 0.633210, 0.614258, 1.079917, 1.090258, 0.961887, 0.881970, 1.271143, 0.865783, 1.266286, 0.684233, 0.852523, 0.582680, 1.003595, 1.115824, 0.781990, 1.139477, 1.414482, 0.825298, 1.410234, 1.364811, 0.512456, 1.222190, 1.340780, 0.960877, 0.655250, 0.749875, 1.195300, 1.213657, 1.355008, 1.324839, 0.894057, 1.092388, 1.442207, 0.896312, 1.111010, 0.648649, 0.695120, 1.098782, 0.671672, 0.760553, 0.532518, 0.674752, 0.643760, 0.600867],
75 [0.508616, 1.139587, 0.837599, 0.769587, 1.211012, 0.887854, 0.883565, 1.032578, 1.242788, 0.948547, 1.091274, 0.843865, 1.309834, 0.725819, 0.799935, 1.369575, 0.858794, 0.880898, 1.043715, 0.920951, 1.285454, 0.996651, 1.062302, 0.905226, 1.360901, 1.326388, 1.063816, 0.711928, 1.327673, 0.800966, 1.276300, 0.780729, 1.238602, 0.798943, 0.504048, 1.139552, 1.148977, 0.890112, 1.496389, 0.931725, 1.376060, 1.304630, 1.491572, 0.890379, 0.525971, 0.627441, 0.792760, 0.854679, 0.656863, 0.978076, 0.591386, 1.264768, 1.123142, 0.843199, 1.182173, 1.486243, 1.174058, 1.451406, 0.686886, 0.994648, 0.726293, 0.914456, 0.594147, 1.194929, 0.992670, 0.673703, 0.914177, 1.112832, 0.826886, 1.415108, 1.102929, 1.114907, 1.092527, 1.232665, 1.230158, 1.168135, 0.967937, 0.675485, 1.359749, 1.349738, 0.876208, 0.955242, 1.104643, 1.369442, 1.124279, 1.380672, 1.330784, 1.084123, 0.557695, 0.937055, 1.029034, 1.113690, 1.389994, 1.204602, 1.174971, 1.315004, 1.085035, 0.540704, 1.484719, 0.658090],
76 [0.644493, 0.983155, 1.182966, 0.845419, 1.275536, 1.325423, 0.745975, 0.570021, 0.874557, 0.948904, 0.941743, 0.899095, 1.497975, 1.271383, 1.019847, 0.667677, 0.916173, 0.657668, 1.075617, 0.919916, 1.166330, 1.499661, 0.522915, 0.812047, 1.446334, 0.512609, 0.870505, 1.046295, 1.110097, 0.866803, 0.635209, 1.300125, 0.519909, 1.386939, 1.139499, 1.198598, 0.854740, 0.790703, 0.671686, 0.630423, 1.119348, 1.454993, 0.896905, 1.089852, 1.199049, 1.450959, 0.877996, 1.089548, 1.094816, 0.988921, 0.658782, 1.177731, 1.018045, 1.043646, 1.311295, 0.955994, 0.554548, 1.219336, 0.811264, 1.342269, 0.672093, 0.695354, 1.161571, 0.896857, 0.766394, 0.892116, 0.564959, 1.385207, 0.522631, 0.894384, 0.970877, 1.099129, 1.016986, 0.697671, 1.292497, 1.191440, 0.866367, 0.646984, 1.297190, 0.519869, 1.190706, 1.001869, 0.619883, 1.078022, 0.851316, 0.680539, 1.377275, 0.559557, 0.818389, 1.428808, 0.625263, 0.615101, 1.209763, 1.431413, 0.656432, 1.341990, 1.257941, 1.069684, 1.434806, 1.187104],
77 [0.906778, 1.451152, 0.626091, 1.374484, 1.208466, 0.846907, 1.422893, 0.955109, 1.406620, 1.115623, 0.577848, 1.444335, 0.583812, 1.497962, 1.300350, 0.764714, 1.071251, 1.428979, 1.389508, 0.885985, 0.924611, 0.867551, 1.205046, 0.588003, 0.990795, 1.141550, 0.663796, 1.003369, 0.720503, 1.244627, 1.267241, 1.499126, 1.153575, 0.732174, 0.858555, 1.151455, 0.541626, 1.076552, 0.692514, 0.709541, 1.435705, 1.194576, 1.097784, 1.297998, 0.782486, 1.195638, 0.822783, 0.645133, 0.672125, 0.853602, 1.229869, 0.977755, 1.425408, 1.127760, 1.104448, 0.930101, 0.989530, 1.269785, 1.054534, 0.665179, 1.271324, 0.826416, 0.562041, 0.992957, 1.014662, 1.222646, 0.532179, 1.444889, 1.313611, 1.080462, 1.313297, 0.675162, 0.598569, 1.299007, 1.181278, 0.645639, 0.946280, 1.481928, 0.981646, 0.704662, 1.380946, 1.083209, 0.640011, 0.631266, 1.372796, 0.856719, 0.644891, 0.738278, 0.560036, 1.027745, 1.250566, 0.552875, 1.063773, 1.061246, 0.652126, 0.626595, 0.970681, 0.759502, 0.722700, 1.134021],
78 [1.387871, 0.609813, 0.813069, 0.566363, 0.527317, 1.442384, 1.304885, 0.894983, 1.046120, 1.088910, 1.494889, 1.074205, 0.515195, 0.844693, 1.356374, 1.356267, 0.940708, 1.044935, 0.768694, 1.007897, 0.979126, 0.575399, 1.017452, 0.912747, 1.333192, 1.497731, 1.060138, 1.445037, 1.023201, 1.416673, 0.992615, 0.653885, 1.093788, 0.599927, 0.855519, 1.315686, 1.085223, 1.233672, 1.418842, 1.202688, 1.295957, 0.717462, 0.985073, 0.976602, 0.786492, 1.414705, 0.925322, 0.907698, 1.389002, 1.328574, 1.293807, 0.588292, 0.613594, 1.241227, 1.351431, 1.303771, 1.345010, 1.424566, 1.010957, 1.159745, 1.384649, 1.077787, 0.635514, 1.250644, 0.601466, 1.405826, 1.311718, 0.657155, 0.949901, 0.796142, 0.915244, 1.222870, 1.072124, 1.060371, 0.822443, 1.065006, 0.757374, 0.573611, 0.712603, 1.273337, 0.607814, 0.717470, 1.224186, 1.241583, 1.328050, 1.423945, 1.170057, 1.036718, 1.315543, 0.948351, 1.010692, 1.417729, 0.741797, 1.135802, 1.060786, 0.783794, 0.698745, 0.727327, 0.959432, 0.692119],
79 [0.738312, 1.368673, 1.272295, 1.134404, 0.600813, 1.221585, 1.118723, 0.797170, 0.527686, 1.261763, 1.402506, 1.260051, 1.430003, 0.806598, 1.370994, 1.138765, 0.525156, 0.699431, 0.816863, 1.369131, 0.653552, 1.288147, 0.688019, 0.726687, 1.231721, 0.922910, 1.224324, 0.576355, 0.776873, 1.392493, 1.033669, 0.887735, 0.737417, 0.969096, 1.214279, 0.934014, 0.973639, 0.553851, 0.656182, 1.188153, 0.966950, 1.373333, 1.082330, 1.410659, 0.508866, 0.909102, 1.337173, 0.667223, 0.873761, 0.667350, 0.718255, 0.823825, 0.736182, 0.850593, 1.137762, 0.547577, 1.093636, 1.414856, 0.977363, 0.992577, 0.799437, 1.298316, 1.281197, 1.031891, 0.660476, 0.770730, 0.793347, 0.662836, 0.523499, 1.094230, 1.307977, 1.143905, 0.643860, 0.850456, 1.234348, 0.593189, 1.428094, 0.706980, 0.895995, 1.322824, 0.895809, 1.096039, 0.848946, 0.972987, 0.720160, 0.561125, 0.856005, 0.700435, 0.826886, 0.794326, 0.877164, 0.548644, 0.539996, 1.021595, 0.963166, 0.634559, 1.189426, 0.747234, 1.348540, 0.953749],
80 [0.985315, 0.704352, 1.397999, 1.038796, 1.488352, 1.354934, 0.871678, 0.631635, 1.100694, 1.418171, 0.811054, 0.833993, 0.513125, 1.045352, 1.367670, 1.410774, 1.029148, 0.515630, 0.709050, 1.054905, 1.164654, 1.168202, 1.470566, 0.997603, 0.616050, 1.190203, 1.438883, 1.110476, 1.239297, 1.052980, 0.653245, 1.017186, 0.813782, 1.395764, 0.551639, 1.055481, 0.623637, 0.728084, 1.475822, 1.075564, 0.713656, 1.287321, 1.106922, 0.536547, 1.022419, 0.618270, 0.512253, 0.959047, 0.856455, 1.216523, 1.220906, 0.579231, 0.758747, 0.866775, 1.217947, 1.023284, 0.590988, 0.905848, 0.798622, 1.257428, 1.390597, 1.042814, 1.023884, 1.330038, 1.011143, 1.468719, 1.232211, 1.368746, 0.839081, 1.266290, 0.606969, 0.830876, 1.257777, 0.615443, 0.644256, 0.848973, 0.648742, 0.905941, 0.913503, 1.354197, 0.579414, 1.496019, 0.685784, 0.668678, 0.663697, 0.895138, 0.610505, 1.186064, 0.985842, 1.166234, 0.846619, 1.450244, 1.417878, 1.292107, 0.775660, 0.891393, 1.313883, 1.043405, 0.995813, 1.481517],
81 [0.640877, 1.327333, 0.961836, 0.806825, 1.240657, 0.649677, 0.808458, 1.328261, 1.440129, 1.007999, 0.594534, 0.883857, 0.989150, 1.427353, 1.233809, 1.215201, 0.727943, 0.682892, 0.694028, 1.237397, 0.632620, 1.235775, 0.589679, 1.424777, 0.927340, 0.954497, 0.815958, 1.373852, 1.135772, 1.371480, 0.932600, 1.362612, 0.719244, 0.855989, 0.812727, 1.153256, 1.018393, 0.803630, 0.512113, 0.982791, 0.712353, 1.021196, 1.427824, 1.411798, 1.397839, 1.144779, 1.020467, 1.162991, 0.607513, 1.008414, 0.924310, 0.557041, 0.898710, 0.656819, 1.411971, 0.911640, 0.579479, 1.034588, 1.171898, 0.664034, 1.146245, 0.601063, 1.069210, 0.695957, 0.598223, 0.512450, 1.293624, 0.993032, 1.238930, 0.936630, 1.320678, 0.794628, 0.971412, 1.111458, 1.224351, 0.597840, 1.336486, 0.864127, 0.898238, 1.368809, 0.623409, 1.181660, 1.316528, 1.072483, 1.163308, 0.784934, 0.955917, 0.624979, 1.076012, 0.713495, 0.943278, 0.506444, 0.818137, 0.768702, 1.080901, 1.491032, 0.884601, 1.130702, 0.891783, 1.331143],
82 [0.723649, 0.509882, 0.647810, 1.155065, 0.509926, 1.084331, 1.403480, 1.349277, 0.513127, 0.746407, 0.967295, 0.640856, 0.904310, 0.538313, 1.296847, 0.610958, 1.457350, 0.540260, 0.704253, 1.407081, 1.250183, 1.168920, 0.949919, 1.431098, 0.963586, 0.860907, 1.118912, 1.445349, 0.699598, 1.440225, 0.571621, 1.169492, 0.615442, 0.970083, 0.876664, 0.745521, 1.106972, 1.360372, 0.669592, 0.763706, 1.015500, 0.569078, 1.227421, 1.279028, 0.998759, 1.479352, 0.814426, 1.033065, 1.199136, 1.238209, 1.041256, 0.793704, 1.124651, 0.642323, 1.026726, 1.174032, 0.658884, 1.424633, 0.745169, 0.811719, 1.259226, 0.868268, 0.975141, 0.862810, 0.670848, 1.121842, 0.550525, 0.590948, 0.965080, 0.910664, 1.388301, 0.731976, 0.544855, 1.408798, 0.761519, 1.495353, 0.764252, 1.091198, 1.088864, 0.718721, 0.808916, 0.604445, 0.673350, 1.085818, 0.511122, 0.930413, 1.441205, 0.650186, 1.321636, 0.584376, 0.523661, 0.575510, 1.444069, 1.102778, 0.832996, 1.368440, 0.546556, 1.355194, 0.562543, 1.209938],
83 [1.214572, 1.039993, 0.680085, 1.164949, 1.002062, 0.961051, 0.604524, 1.065257, 0.677918, 0.712075, 0.613299, 1.033344, 0.932251, 0.995424, 0.831484, 0.871557, 1.019711, 1.133589, 0.643787, 0.996871, 1.034259, 0.951186, 0.807462, 1.202862, 1.160362, 0.528913, 1.208434, 0.598020, 1.419734, 1.311390, 0.698922, 0.542989, 1.190362, 0.990131, 0.570625, 0.805170, 0.616436, 1.102436, 0.553573, 1.436306, 0.806401, 1.267365, 1.498419, 1.211866, 0.933485, 0.672030, 1.055211, 0.618925, 0.788577, 0.774461, 0.842783, 1.178160, 1.340560, 1.486576, 0.709341, 0.886641, 0.960695, 1.454251, 1.478608, 1.130784, 1.042065, 0.892575, 1.224600, 0.888711, 0.529256, 0.684621, 1.179671, 1.375272, 0.529209, 1.362014, 0.608204, 0.840499, 0.934685, 1.233276, 1.081495, 1.474929, 1.358147, 1.102358, 0.730007, 1.219612, 0.854049, 0.567538, 0.951308, 1.250278, 1.091972, 0.697218, 0.538106, 1.254326, 1.136701, 0.570114, 0.797050, 1.486991, 1.054933, 0.828866, 0.946051, 0.997102, 1.250373, 0.944071, 0.752005, 0.515667],
84 [0.809350, 1.359780, 0.600982, 1.493723, 0.796782, 1.149483, 1.398054, 1.429972, 1.492201, 0.992389, 1.079050, 0.818349, 1.366158, 1.017034, 1.352828, 1.153733, 0.655009, 1.140788, 1.158859, 0.787855, 1.315486, 1.272949, 1.057755, 1.356871, 1.446270, 1.381894, 1.248968, 0.944158, 0.563956, 1.247665, 0.779481, 0.944363, 1.159841, 0.638168, 0.889985, 1.085756, 0.758917, 0.951204, 1.270134, 0.549008, 0.738000, 1.280982, 1.352218, 0.972994, 1.086381, 1.126967, 1.187764, 1.410095, 1.355641, 1.166941, 0.818781, 0.722547, 0.657046, 0.805249, 1.365357, 0.664131, 1.381766, 1.401825, 1.215666, 0.781842, 1.212773, 1.112052, 0.551452, 0.608990, 0.645066, 0.685463, 0.957799, 0.936196, 0.557161, 0.900272, 0.660222, 0.859132, 0.545214, 0.821197, 0.974400, 1.100794, 1.042523, 0.607037, 0.900486, 1.459339, 1.389636, 0.621707, 1.463127, 0.621887, 0.876692, 0.736315, 1.130713, 1.406145, 1.363593, 1.270951, 0.793367, 1.391867, 1.207168, 1.207735, 1.000901, 1.017706, 1.033368, 1.100003, 0.633149, 0.967004],
85 [0.626931, 1.444905, 1.318359, 0.972580, 0.593403, 0.567111, 0.554632, 0.974880, 0.828927, 0.616972, 1.421004, 1.106021, 0.606889, 1.286136, 0.802616, 0.791794, 0.761888, 0.607877, 0.816262, 1.262600, 0.782472, 0.666884, 0.737416, 0.997915, 1.343890, 1.410148, 1.464873, 0.911559, 0.790641, 0.700732, 1.452371, 0.782972, 0.684384, 0.625698, 1.400811, 1.473465, 0.927034, 1.358953, 0.502487, 1.435757, 1.270470, 1.026820, 0.831564, 1.256241, 1.385993, 1.372673, 0.882723, 0.704278, 0.746598, 1.219771, 1.395164, 0.885599, 0.859060, 0.767359, 1.145437, 0.606450, 1.427974, 0.655194, 0.889236, 0.965893, 1.463926, 1.462137, 1.263596, 0.727402, 0.790362, 0.861748, 0.630642, 0.891843, 1.100525, 0.655383, 1.258031, 1.207258, 1.371471, 0.700879, 1.017174, 0.922222, 1.153933, 0.929697, 1.393703, 0.937475, 1.332430, 0.864712, 0.639764, 1.316236, 1.157590, 1.320712, 1.387065, 1.163920, 0.625335, 1.342419, 1.207963, 0.533909, 1.148876, 0.886732, 1.435446, 1.201829, 1.233496, 1.086206, 0.558883, 0.713089],
86 [0.988295, 0.762884, 1.313199, 1.123317, 0.952232, 0.831979, 0.750432, 1.340974, 0.725942, 0.814581, 0.733329, 1.158103, 1.396324, 0.740645, 0.564837, 1.000287, 1.377813, 0.937557, 1.333060, 0.663665, 0.942539, 1.400300, 1.090478, 1.223100, 1.487518, 0.702633, 1.024040, 1.152132, 0.916265, 1.383463, 1.402412, 1.033143, 1.386177, 0.659104, 0.616553, 1.231105, 1.339300, 1.366822, 1.479312, 0.848494, 0.720733, 1.475692, 1.328503, 0.986967, 1.305781, 1.264851, 1.321744, 0.729760, 1.108402, 1.101063, 0.965927, 1.000644, 0.706637, 0.838824, 1.125750, 0.502387, 1.004438, 1.452247, 1.405028, 1.214763, 1.375028, 1.105815, 0.847369, 0.955517, 1.498046, 0.954711, 0.736375, 1.395312, 0.867068, 1.119190, 1.030265, 1.479736, 1.300380, 0.572864, 1.048599, 0.749164, 0.640281, 1.302624, 0.730820, 1.361672, 0.981857, 1.366846, 1.411342, 0.961575, 0.922481, 0.821713, 1.024829, 0.939880, 1.320397, 0.997840, 1.282790, 1.270580, 1.123464, 1.066718, 1.483112, 1.396862, 0.673090, 0.945979, 0.976400, 1.060684],
87 [0.778329, 1.019960, 1.155592, 1.011709, 0.962522, 1.024312, 1.249807, 1.218276, 0.942391, 0.756578, 0.950052, 0.955916, 1.185621, 0.991797, 1.111812, 0.592674, 0.853166, 1.467343, 1.178504, 1.144205, 1.012709, 1.011444, 0.960433, 1.265262, 0.816535, 0.750572, 1.308952, 0.591803, 1.244169, 1.028586, 1.364701, 0.954047, 1.400614, 1.043265, 1.133610, 1.141332, 1.102244, 1.118963, 0.670766, 1.194605, 0.648640, 1.448193, 0.544588, 1.372787, 1.154782, 0.804750, 1.217493, 1.443245, 0.504347, 0.570255, 1.492601, 1.420252, 1.026062, 0.679760, 0.645206, 0.516296, 0.661468, 0.653332, 0.913223, 0.758011, 0.904949, 1.157821, 1.095742, 0.869873, 1.184705, 1.006653, 0.552212, 0.564480, 1.328734, 1.140836, 1.009319, 0.650664, 0.657904, 0.747506, 1.354308, 1.065564, 0.713396, 1.460759, 1.374823, 0.509654, 0.961235, 0.856880, 0.745888, 1.349113, 0.921934, 1.253657, 0.875911, 1.127038, 0.887310, 1.333888, 1.280715, 1.179885, 1.428373, 1.133731, 1.115140, 1.418982, 0.524605, 1.158749, 0.912886, 0.745023],
88 [0.708036, 1.235998, 1.138715, 0.736582, 0.966364, 1.178495, 0.609169, 0.741633, 0.735817, 0.605059, 1.033781, 1.471969, 0.673801, 1.125199, 1.199222, 0.912167, 1.372897, 1.369846, 1.134501, 0.687340, 1.428333, 0.566714, 1.311297, 0.883358, 0.878887, 1.493202, 0.547065, 0.694242, 0.585173, 1.461313, 1.140628, 0.822938, 1.037035, 0.642309, 1.214680, 1.342054, 0.654932, 1.090065, 0.738547, 1.123500, 0.627493, 1.275588, 0.717966, 0.845934, 0.933142, 1.143343, 1.040910, 1.468639, 1.215699, 0.598918, 0.718710, 0.634452, 1.255943, 1.076367, 0.851038, 0.772967, 1.035298, 0.605490, 1.012981, 1.104679, 0.782583, 0.926421, 0.638948, 0.819173, 1.098642, 0.946217, 1.475376, 1.110332, 1.206555, 1.313432, 1.216302, 1.318865, 0.924427, 1.212314, 0.928995, 1.015580, 0.630632, 1.026960, 1.131653, 0.872091, 1.446960, 0.730820, 1.441733, 1.376960, 0.724539, 0.749060, 0.623606, 1.420635, 0.910489, 1.313295, 1.076429, 0.902798, 0.665274, 0.530803, 0.612697, 1.124972, 1.025492, 0.828526, 0.910482, 0.603148],
89 [0.521650, 1.266214, 1.470026, 0.650625, 1.084034, 1.497130, 0.840335, 0.936002, 1.246390, 1.006482, 1.315827, 0.917981, 0.833334, 0.703071, 0.510178, 1.489843, 0.728887, 1.077628, 1.322840, 1.328622, 0.688955, 0.788702, 1.089059, 0.908531, 1.348517, 0.869191, 0.755563, 1.172802, 1.318900, 1.060632, 1.363841, 1.210730, 0.618432, 0.578620, 1.174781, 1.269938, 1.376232, 1.018477, 0.628338, 1.176299, 1.493641, 1.037836, 0.726962, 1.144339, 0.800461, 1.315022, 1.379805, 0.911215, 1.132912, 0.569348, 1.072328, 1.101764, 0.836970, 0.682196, 1.434041, 0.864732, 0.829147, 1.412476, 0.743760, 1.033652, 0.996010, 1.107478, 0.643804, 1.037783, 1.427049, 0.638536, 1.222413, 1.221760, 1.197483, 1.342764, 0.945239, 0.740867, 1.432177, 1.257515, 0.520053, 1.463265, 1.248918, 0.896788, 0.892998, 1.487472, 1.198921, 0.659823, 1.357991, 0.810898, 1.310575, 1.124429, 1.037217, 0.515660, 1.227322, 0.906694, 1.393558, 1.266569, 0.559233, 1.207121, 1.451199, 0.758669, 0.612015, 1.476968, 0.654928, 0.718152],
90 [1.024127, 1.495283, 1.489878, 0.927181, 1.315850, 0.606116, 1.355508, 0.997172, 0.702415, 0.956651, 0.715332, 1.274922, 0.921800, 0.894828, 1.385034, 1.122407, 1.418957, 0.842340, 1.109210, 1.269795, 0.976424, 0.676123, 0.800033, 1.266827, 1.062128, 1.292869, 1.152776, 0.558487, 0.523094, 0.513150, 0.557316, 0.607553, 0.665764, 1.050192, 1.497034, 0.967941, 0.597823, 0.954929, 0.675015, 1.290270, 1.494349, 0.581029, 1.318338, 0.539854, 1.096320, 1.091391, 0.699305, 1.386300, 0.988549, 0.862360, 0.785192, 0.526696, 0.628645, 1.338231, 1.105271, 0.602625, 0.529857, 1.096209, 1.249293, 0.777409, 1.038690, 1.402697, 0.607443, 0.625789, 0.607886, 0.857354, 0.779171, 1.039353, 1.053734, 1.043698, 1.165407, 1.318337, 0.617933, 1.387777, 1.193598, 1.351537, 0.698892, 0.737048, 1.220746, 0.928422, 0.854536, 0.771950, 0.858193, 1.221586, 1.293635, 1.240386, 0.976621, 0.536264, 1.023585, 0.796352, 1.000601, 0.843821, 0.826399, 1.216280, 0.791928, 0.926234, 0.526338, 1.376215, 1.009498, 0.588150],
91 [0.949119, 0.954873, 1.060459, 1.251071, 0.580790, 0.688599, 0.796981, 0.756132, 0.922087, 0.765355, 1.340698, 0.854488, 0.913589, 1.461735, 0.994120, 1.225736, 1.134862, 1.478658, 1.459265, 0.778111, 1.306419, 0.510516, 1.424558, 1.046597, 0.547683, 1.339005, 1.192105, 0.996973, 1.456719, 1.285638, 1.261008, 0.900413, 0.949656, 0.511103, 1.037448, 0.848058, 0.690955, 1.202551, 1.468066, 0.784363, 1.165649, 0.783819, 0.875360, 0.773472, 0.859289, 0.855087, 1.496793, 0.687949, 1.395201, 0.935606, 0.705895, 1.297252, 0.875631, 1.497689, 0.763754, 0.563475, 1.193381, 0.676062, 1.186325, 0.538187, 0.527030, 0.984316, 0.708656, 1.323979, 1.408402, 0.615360, 1.225772, 1.475173, 0.588310, 1.474351, 1.391724, 1.431060, 0.803384, 0.817392, 1.064470, 1.066926, 1.076269, 1.259651, 0.998642, 1.303268, 1.094524, 0.568777, 0.743766, 1.352067, 0.959397, 1.496260, 1.011572, 0.664430, 0.977202, 1.477929, 0.656638, 1.047184, 1.214907, 0.885829, 0.673824, 1.469000, 0.624456, 0.992774, 0.670236, 1.091976],
92 [1.331403, 0.985375, 0.764736, 0.782149, 1.247607, 0.638323, 1.254194, 1.162323, 1.342171, 1.424315, 1.183724, 0.654329, 1.104968, 1.008915, 1.231776, 1.356580, 0.997676, 0.807233, 0.780993, 0.820387, 0.569350, 1.064043, 0.525502, 0.845591, 1.074894, 1.067388, 0.915275, 1.230209, 0.577127, 1.347854, 0.552127, 1.321423, 0.996616, 1.105851, 1.311933, 0.986245, 0.988884, 0.983167, 1.019199, 1.261118, 1.035526, 0.914264, 0.886494, 1.092465, 0.667554, 0.806933, 1.196344, 1.307693, 1.367782, 0.634143, 1.340261, 0.959177, 1.174439, 1.195839, 1.243088, 1.388428, 0.844144, 0.718629, 0.581084, 1.256311, 0.829747, 0.951994, 0.660481, 1.351405, 0.925050, 0.585700, 0.875212, 1.450617, 0.797932, 0.941259, 0.893945, 1.361064, 0.570913, 0.613029, 1.477959, 0.647904, 0.905724, 1.337021, 1.427383, 1.324801, 1.478273, 1.317706, 1.303610, 1.389987, 0.562941, 0.660920, 0.656160, 0.503454, 1.421185, 1.042838, 0.997829, 0.674170, 1.151508, 0.572698, 1.015967, 1.062941, 1.288323, 1.270597, 0.920360, 1.172104],
93 [1.134847, 1.038818, 1.472632, 1.160664, 0.867704, 0.614087, 1.222456, 0.540973, 1.316706, 1.499767, 1.357058, 0.516482, 0.873457, 1.012978, 0.930782, 1.177539, 1.446456, 1.342282, 1.449846, 1.146443, 0.550732, 0.892033, 1.320422, 0.593238, 0.719982, 0.893977, 1.125449, 1.382961, 1.276205, 0.568179, 1.041222, 1.176288, 0.928196, 0.944841, 0.764324, 1.012346, 0.851727, 1.460232, 1.224604, 0.727660, 1.289895, 0.909298, 1.124504, 1.021548, 1.192782, 1.344030, 1.270827, 1.000118, 0.590797, 1.049546, 0.921588, 0.983075, 0.855396, 0.510775, 0.622266, 0.691837, 1.257550, 0.914480, 1.254193, 1.296889, 1.222200, 1.345897, 0.567840, 1.459333, 0.954301, 1.282301, 1.445140, 0.973129, 0.896473, 1.024648, 1.442783, 1.441547, 0.752883, 1.129533, 0.992542, 1.152084, 1.314569, 1.248915, 1.108822, 1.090165, 0.565096, 1.343211, 0.728629, 0.756739, 1.456362, 0.985615, 1.264054, 1.325518, 0.723981, 0.968267, 0.709870, 1.089297, 1.122948, 1.473171, 1.096531, 1.314034, 1.483818, 1.186794, 0.923668, 1.029792],
94 [0.597253, 0.799251, 0.905409, 1.468894, 0.535370, 0.711432, 0.581510, 0.541563, 0.739989, 1.182075, 0.989210, 0.944446, 0.565250, 1.380719, 0.983452, 0.641176, 0.558215, 1.431426, 1.320159, 0.969035, 1.435061, 1.345217, 1.369672, 1.413094, 1.222936, 1.411626, 1.351621, 0.985243, 1.005497, 1.490124, 1.136992, 1.471105, 0.542479, 0.509720, 1.067412, 1.252674, 0.524385, 1.384920, 1.416139, 1.454256, 1.235673, 1.152592, 1.073261, 0.786933, 0.641393, 1.002007, 1.184127, 0.515118, 1.180701, 1.359760, 0.563263, 1.230380, 0.758176, 1.415955, 0.646483, 0.708893, 1.417754, 0.541697, 0.879082, 0.748453, 1.307930, 1.050408, 0.732296, 1.209092, 1.211179, 0.914255, 1.004797, 0.991841, 0.583068, 1.003844, 1.240923, 1.373435, 1.291458, 0.915571, 0.926674, 1.344294, 1.048435, 1.489005, 0.983877, 0.750354, 1.119053, 0.993603, 0.998648, 0.614102, 1.117184, 0.750785, 0.592123, 1.432115, 0.984268, 0.931344, 1.345967, 0.997614, 0.935728, 1.137575, 1.372229, 0.868024, 1.345964, 1.189571, 1.491298, 1.326938],
95 [1.082912, 1.181678, 1.185099, 1.313650, 1.377859, 1.352493, 1.331866, 0.931193, 1.061484, 0.765170, 0.904009, 0.628613, 1.323466, 0.549533, 1.222837, 0.914672, 1.118088, 0.973019, 0.642699, 1.309030, 1.411356, 1.132923, 0.672942, 0.665643, 0.710553, 1.366405, 0.745557, 1.421295, 1.431519, 0.609365, 0.692433, 1.124405, 0.771087, 0.591953, 1.443277, 1.332320, 0.860024, 1.107532, 0.521178, 1.005168, 1.238336, 0.835770, 1.052221, 1.033435, 1.430245, 1.126542, 1.481221, 1.419398, 0.818155, 0.883944, 0.513883, 0.818858, 0.802456, 0.940688, 0.843969, 1.326481, 1.050839, 0.847575, 0.763647, 1.429890, 0.971999, 1.424054, 0.638074, 1.191596, 0.624211, 1.493782, 1.207555, 1.167841, 1.006292, 1.258554, 1.050045, 0.955291, 0.733685, 1.318825, 0.835121, 1.437911, 1.259287, 0.664375, 0.895771, 0.756579, 0.522379, 1.104937, 0.936212, 1.001353, 1.139783, 0.646490, 0.542047, 0.728272, 0.809556, 1.259977, 0.933555, 0.643002, 0.854997, 0.889322, 1.114794, 0.960158, 0.942016, 1.089236, 1.364400, 1.363714],
96 [0.677320, 0.772269, 0.763991, 0.612507, 1.259262, 1.235765, 1.006180, 1.156648, 1.421010, 0.556364, 1.469475, 0.876685, 0.881285, 1.238676, 0.819213, 1.329145, 0.754818, 0.679649, 0.750775, 1.027427, 0.947496, 1.052792, 1.373591, 1.233260, 0.693790, 1.485538, 1.105016, 1.147317, 0.607311, 1.492527, 0.603892, 0.820978, 1.317708, 1.434420, 1.066312, 0.933085, 0.668957, 1.412110, 0.596938, 1.227050, 1.436119, 1.443238, 0.584585, 0.911049, 0.554833, 0.521956, 1.299572, 1.238003, 1.087295, 1.157003, 0.542128, 0.994972, 0.602552, 1.209272, 0.842322, 0.924029, 1.013402, 0.506935, 1.484984, 0.631483, 1.343303, 1.439904, 0.748405, 1.146100, 0.965540, 0.572033, 1.014313, 1.393747, 1.244641, 0.976230, 0.621144, 1.449403, 0.960579, 1.107954, 0.997306, 1.176637, 0.774141, 0.984868, 0.508819, 1.357484, 1.341519, 1.277961, 1.317836, 1.367466, 0.510856, 0.501116, 1.296064, 0.773931, 0.988340, 1.341983, 1.104444, 1.024074, 1.383132, 0.769627, 0.620207, 0.942099, 0.510290, 0.657012, 0.958157, 0.782726],
97 [1.157200, 1.150381, 0.635453, 1.126869, 1.419574, 0.639285, 1.420756, 0.713620, 0.930891, 0.961966, 1.045292, 1.265292, 0.942704, 0.569121, 0.583718, 1.352817, 0.562996, 0.939638, 0.777058, 1.296903, 1.244542, 0.542132, 0.634519, 0.732130, 1.143313, 0.849805, 0.823014, 1.274900, 0.506055, 0.752783, 1.485194, 1.057378, 0.611100, 0.701156, 1.078414, 1.372583, 1.058671, 1.000479, 1.006200, 0.764008, 1.339531, 1.350983, 1.114327, 1.196495, 0.670712, 0.595735, 1.094107, 0.738880, 0.530451, 0.532564, 1.252672, 0.784698, 1.184255, 1.273468, 0.839801, 1.131599, 0.537070, 1.496898, 0.560369, 1.381109, 1.112997, 0.823838, 1.472795, 1.419896, 1.272883, 1.102069, 0.574097, 0.935665, 1.086420, 1.145461, 1.339865, 0.883951, 0.743782, 1.218830, 1.490614, 1.227371, 0.935125, 0.690151, 0.968294, 0.848107, 1.316137, 0.946529, 0.508778, 0.984389, 1.450121, 0.777034, 0.963283, 0.501758, 0.803714, 1.049221, 1.319684, 1.079475, 1.294284, 1.294072, 0.945637, 1.341222, 1.471282, 0.923967, 0.707099, 1.419285],
98 [1.053945, 1.487315, 1.434206, 0.997445, 1.380575, 0.639680, 0.684008, 0.725847, 0.860518, 0.585253, 1.095622, 1.119182, 0.829465, 1.376055, 0.912492, 1.327548, 1.367839, 1.476268, 1.041358, 1.428820, 0.661210, 1.303985, 0.822362, 0.527981, 0.571833, 0.565839, 1.130443, 0.767777, 0.589506, 0.866723, 1.026868, 0.640990, 1.230671, 0.548334, 0.715751, 0.569683, 0.621158, 1.304611, 0.644728, 1.106238, 0.634461, 0.651168, 1.277091, 0.743871, 1.322942, 0.697228, 0.844156, 0.953160, 1.206861, 0.584618, 0.568810, 1.360064, 0.767565, 1.495218, 0.711320, 0.658810, 1.408937, 1.225493, 1.028595, 0.611750, 1.427857, 0.960891, 1.022113, 0.574975, 0.955790, 0.563773, 0.667251, 0.511959, 0.976748, 1.068262, 1.027840, 0.651682, 0.638900, 0.509443, 0.909551, 0.791912, 0.847393, 0.702647, 0.624660, 1.110491, 0.703323, 1.216365, 1.394993, 0.986728, 0.784776, 1.395552, 1.192049, 1.215660, 0.706870, 0.945299, 1.289793, 0.510399, 0.605275, 1.152316, 1.141695, 0.648422, 1.064855, 0.852042, 0.876452, 0.953891],
99 [0.582954, 1.258871, 1.387376, 1.187072, 0.969934, 0.660464, 1.306963, 1.148498, 1.097213, 1.365004, 1.359632, 1.458438, 0.516309, 0.754135, 0.779247, 0.593456, 0.891718, 0.733157, 0.726860, 1.017885, 1.008027, 0.699307, 1.449585, 0.971261, 0.766789, 1.066734, 1.463509, 1.295367, 1.106051, 0.644335, 1.067326, 1.223226, 0.518979, 0.650998, 0.564996, 0.781282, 1.053701, 0.833459, 1.061255, 1.202172, 1.106475, 1.158809, 1.192192, 0.880557, 0.812101, 0.816034, 0.956473, 1.451484, 0.605885, 0.691388, 1.385383, 0.883073, 1.402808, 0.708813, 1.412004, 1.207385, 1.316418, 1.082706, 1.312261, 1.369080, 0.921690, 1.324731, 0.648603, 1.058193, 0.857387, 0.563364, 1.151817, 1.252361, 0.691646, 0.855598, 1.320484, 0.711556, 1.015407, 0.714758, 0.667925, 1.442904, 1.145531, 1.108721, 0.898449, 0.672410, 1.073196, 1.244842, 0.935717, 0.583965, 0.665496, 1.082540, 1.296179, 0.573848, 1.317429, 0.509004, 1.155077, 0.971161, 1.351752, 0.501523, 1.058530, 0.570756, 0.731889, 0.661260, 1.235890, 0.695590],
100 [0.853516, 0.835152, 0.522142, 0.990419, 0.976019, 1.009563, 0.507391, 0.816791, 1.486459, 0.712277, 1.488886, 0.906667, 1.478636, 0.568392, 0.859515, 1.202489, 0.786150, 0.767905, 0.753821, 0.686536, 0.798300, 0.514267, 0.500777, 1.168514, 0.829936, 1.369296, 0.793550, 0.684221, 1.113760, 1.134146, 0.639323, 1.215263, 1.167040, 1.403723, 1.072640, 1.308133, 0.819918, 1.024681, 1.097654, 0.612524, 1.321603, 1.032999, 0.904795, 1.451293, 1.454521, 0.819469, 1.242145, 1.011931, 1.319191, 1.254506, 1.450550, 1.132562, 1.296762, 1.135556, 0.799027, 0.750574, 1.029773, 1.096606, 1.047945, 1.305247, 1.001937, 1.210461, 0.666378, 1.340910, 0.619713, 0.993074, 1.455130, 1.341105, 0.616753, 1.382260, 0.831995, 0.655223, 1.070652, 1.215852, 0.785375, 1.371158, 0.856595, 1.290430, 1.262729, 0.615507, 1.378414, 1.235670, 1.030434, 1.349905, 1.216841, 0.748461, 1.394933, 0.543928, 1.208168, 1.461498, 1.322008, 1.099455, 1.252689, 1.040188, 1.208512, 0.783211, 1.461020, 0.913319, 1.119291, 1.411381],
101 [0.599279, 1.409285, 1.133472, 1.484047, 1.421138, 0.684039, 1.305247, 1.239558, 0.907202, 1.019782, 0.748224, 1.433472, 1.269365, 1.419743, 0.660919, 0.668305, 1.236694, 1.226680, 1.067404, 1.329187, 0.537570, 0.867907, 0.662281, 1.401240, 0.630854, 0.899560, 0.894782, 0.557441, 0.833109, 0.991030, 0.573341, 1.343792, 1.384428, 1.481583, 0.722351, 1.105542, 0.915459, 0.860535, 0.598589, 0.508816, 0.725634, 1.288407, 0.633024, 0.876826, 1.391443, 0.843248, 0.515160, 0.519513, 1.096624, 1.376166, 0.726021, 1.336768, 0.676926, 0.685114, 1.222650, 0.749168, 1.497255, 1.402374, 0.939324, 1.229990, 0.905854, 1.444436, 0.554274, 1.216742, 1.404194, 1.452113, 0.725921, 0.519206, 0.761845, 0.613645, 0.835264, 0.824543, 0.655236, 0.880184, 1.453588, 1.049310, 0.861300, 0.797780, 0.700150, 1.204855, 0.517575, 0.677691, 1.384287, 0.887621, 1.318121, 0.666573, 0.752227, 0.775621, 0.559673, 0.721291, 1.109311, 0.686454, 1.140567, 1.472279, 0.667733, 1.000311, 1.110083, 0.927088, 0.583778, 0.539131],
102 [0.840927, 0.861817, 0.729394, 0.585669, 1.286449, 1.442175, 1.339639, 1.238115, 0.608774, 1.204573, 1.458721, 0.627585, 1.256892, 1.170931, 1.007124, 1.092465, 0.859497, 1.268020, 1.263024, 1.113091, 1.221003, 1.246889, 1.392024, 0.582026, 1.175914, 0.798913, 1.093525, 0.823780, 1.491374, 0.709630, 0.703630, 1.006234, 0.794070, 1.174506, 0.988575, 0.917477, 0.524048, 1.151325, 1.224588, 0.971254, 0.613029, 0.847169, 1.199524, 1.101445, 1.112380, 0.688257, 1.158544, 0.805394, 1.172401, 0.987006, 0.639337, 0.616837, 0.765252, 1.086793, 1.481456, 0.565125, 0.989144, 1.045340, 1.358776, 0.704726, 1.437476, 1.152182, 0.719659, 0.690769, 0.883005, 0.509321, 1.200794, 1.149680, 0.712915, 0.596090, 0.770830, 0.585907, 1.140401, 0.966342, 0.992883, 0.541140, 1.245288, 1.094743, 0.529246, 0.922248, 1.139134, 1.237104, 1.457779, 0.703451, 0.622614, 1.034574, 0.625606, 0.907488, 0.746861, 0.504618, 1.461859, 1.198971, 1.202941, 1.441101, 1.352973, 1.490976, 1.236082, 1.450715, 1.344185, 0.873536],
103 [0.676345, 1.041653, 0.669446, 1.078965, 0.590513, 0.884390, 0.722535, 0.819124, 0.890205, 1.070916, 0.547644, 0.507168, 1.126033, 0.809319, 1.186970, 1.277825, 0.652439, 1.417828, 0.697153, 1.431388, 1.195437, 1.427955, 1.435741, 1.202559, 0.567421, 0.650510, 1.317313, 0.995057, 0.934392, 1.443726, 0.872409, 1.324887, 1.251221, 0.878804, 0.923280, 0.964266, 0.859474, 1.442379, 1.383988, 0.834741, 0.858088, 1.251179, 1.272500, 1.308284, 0.685685, 1.306359, 1.292101, 1.014470, 1.185299, 1.211278, 0.513106, 0.948541, 1.323875, 1.198828, 0.890285, 0.765174, 0.621824, 1.389740, 0.535701, 0.548251, 1.073063, 0.791590, 1.009725, 0.779499, 0.971738, 0.507443, 1.248220, 1.488543, 1.200429, 0.669257, 1.354378, 0.756719, 1.408434, 0.554524, 1.324468, 1.324208, 0.998446, 0.746510, 0.973005, 1.125262, 0.711995, 0.811362, 1.197366, 1.171445, 1.475421, 1.184001, 0.592483, 1.225465, 1.254602, 0.523795, 1.144070, 1.174465, 0.785018, 0.874953, 0.728676, 1.137066, 0.948503, 1.330686, 0.614552, 1.419287],
104 [0.874759, 1.494385, 1.493532, 1.414311, 1.235544, 0.642515, 1.270163, 0.565514, 0.674294, 0.664717, 1.399382, 1.318168, 0.747256, 0.519288, 0.818985, 0.645393, 0.506681, 1.363968, 0.729454, 0.751167, 0.946403, 1.016917, 1.111753, 1.262694, 0.825513, 0.682871, 1.173340, 0.936581, 1.017654, 0.882798, 0.892498, 1.430150, 1.034255, 1.251330, 0.891626, 1.273964, 0.981920, 0.737445, 1.479756, 0.717457, 0.962425, 1.128200, 1.467144, 0.985831, 0.641012, 1.289720, 1.040964, 0.538054, 0.869896, 1.442539, 1.411660, 1.140480, 1.041674, 1.281760, 0.709274, 1.458736, 1.322914, 0.565340, 0.806176, 1.244824, 0.514498, 0.605097, 1.253443, 0.713271, 0.710627, 0.872855, 1.081622, 0.696155, 1.395577, 1.075020, 0.980204, 0.855250, 1.398709, 0.913372, 0.597283, 1.120711, 1.347113, 0.845804, 0.935442, 1.291124, 0.700689, 0.731007, 0.572326, 1.459884, 1.489903, 0.521568, 0.714006, 0.793117, 0.541584, 1.469353, 0.727636, 0.874200, 0.860149, 1.495571, 1.194840, 0.906229, 0.509897, 0.837127, 1.021301, 1.162643],
105 [0.562193, 1.442308, 1.405268, 1.225527, 1.418377, 1.264287, 1.496640, 0.818130, 1.069232, 0.601383, 1.379491, 0.806930, 0.724178, 1.151950, 1.209119, 0.712019, 0.710795, 0.589047, 0.839792, 0.866845, 1.221167, 0.507146, 1.154270, 1.267574, 0.579116, 1.102602, 1.046368, 0.632901, 0.895141, 0.543660, 1.141196, 0.583227, 0.814167, 0.798132, 0.681940, 0.605859, 0.944061, 0.552595, 0.760150, 1.406800, 1.293860, 1.160374, 0.908370, 1.424617, 1.142074, 1.480297, 1.340409, 0.675192, 0.570799, 0.782525, 0.809126, 0.578217, 0.952980, 0.998741, 0.971371, 0.579208, 0.544424, 1.193377, 1.408670, 0.927863, 0.749216, 0.518682, 0.894648, 0.574994, 1.254076, 0.990272, 1.029009, 1.461775, 1.015163, 0.881145, 0.791783, 1.051413, 0.605848, 1.441037, 1.371880, 0.977418, 0.711938, 1.082672, 0.719236, 1.231820, 0.942933, 1.020719, 1.285001, 1.345003, 1.090345, 1.150005, 1.294361, 1.191207, 0.577909, 1.410626, 0.809941, 1.220479, 0.920788, 1.064786, 1.161375, 0.801747, 1.390577, 1.138016, 1.182548, 0.832041],
106];
107
108var mm = await MM();
109
110var input = document.getElementById("input");
111var wasm_button = document.getElementById("wasmButton");
112var js_button = document.getElementById("jsButton");
113var resultText = document.getElementById("resultText");
114
115var multiply_wasm = () => mm._multiply();
116
117var multiply_js = () => {
118 var do_not_optimize_out = 0;
119 for (var i = 0; i < 100; i++) {
120 for (var j = 0; j < 100; j++) {
121 r[i][j] = 0;
122 for (var k = 0; k < 100; k++)
123 r[i][j] += a[i][k] * a[k][i];
124 do_not_optimize_out += r[i][j];
125 }
126 }
127 return do_not_optimize_out;
128}
129
130var timerun = (multiply, tag) => {
131 var n = Number(input.value);
132 var msg = "" + n + " matrix multiplications (100x100) with " + tag;
133 var res = 0;
134 console.time(msg);
135 for (var i = 0; i < n; i++)
136 res += multiply();
137 console.timeEnd(msg);
138 console.log("result * " + n + " is " + res);
139}
140
141wasm_button.addEventListener("click", () => timerun(multiply_wasm, "WASM"));
142js_button.addEventListener("click", () => timerun(multiply_js, "JS"));
diff --git a/src/talks/wasm/images/beer.jpg b/src/talks/wasm/images/beer.jpg
new file mode 100644
index 0000000..5a67225
--- /dev/null
+++ b/src/talks/wasm/images/beer.jpg
Binary files differ
diff --git a/src/talks/wasm/images/cpp-in-the-web.png b/src/talks/wasm/images/cpp-in-the-web.png
new file mode 100644
index 0000000..c4b2b18
--- /dev/null
+++ b/src/talks/wasm/images/cpp-in-the-web.png
Binary files differ
diff --git a/src/talks/wasm/images/cpp-logo.png b/src/talks/wasm/images/cpp-logo.png
new file mode 100644
index 0000000..82f9121
--- /dev/null
+++ b/src/talks/wasm/images/cpp-logo.png
Binary files differ
diff --git a/src/talks/wasm/images/cpp-logo.svg b/src/talks/wasm/images/cpp-logo.svg
new file mode 100644
index 0000000..0e44682
--- /dev/null
+++ b/src/talks/wasm/images/cpp-logo.svg
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="306px" height="344.35px" viewBox="0 0 306 344.35" enable-background="new 0 0 306 344.35" xml:space="preserve">
5<path fill="#00599C" d="M302.107,258.262c2.401-4.159,3.893-8.845,3.893-13.053V99.14c0-4.208-1.49-8.893-3.892-13.052L153,172.175 L302.107,258.262z"/>
6<path fill="#004482" d="M166.25,341.193l126.5-73.034c3.644-2.104,6.956-5.737,9.357-9.897L153,172.175L3.893,258.263 c2.401,4.159,5.714,7.793,9.357,9.896l126.5,73.034C147.037,345.401,158.963,345.401,166.25,341.193z"/>
7<path fill="#659AD2" d="M302.108,86.087c-2.402-4.16-5.715-7.793-9.358-9.897L166.25,3.156c-7.287-4.208-19.213-4.208-26.5,0 L13.25,76.19C5.962,80.397,0,90.725,0,99.14v146.069c0,4.208,1.491,8.894,3.893,13.053L153,172.175L302.108,86.087z"/>
8<g>
9 <path fill="#FFFFFF" d="M153,274.175c-56.243,0-102-45.757-102-102s45.757-102,102-102c36.292,0,70.139,19.53,88.331,50.968 l-44.143,25.544c-9.105-15.736-26.038-25.512-44.188-25.512c-28.122,0-51,22.878-51,51c0,28.121,22.878,51,51,51 c18.152,0,35.085-9.776,44.191-25.515l44.143,25.543C223.142,254.644,189.294,274.175,153,274.175z"/>
10</g>
11<g>
12 <polygon fill="#FFFFFF" points="255,166.508 243.666,166.508 243.666,155.175 232.334,155.175 232.334,166.508 221,166.508 221,177.841 232.334,177.841 232.334,189.175 243.666,189.175 243.666,177.841 255,177.841 "/>
13</g>
14<g>
15 <polygon fill="#FFFFFF" points="297.5,166.508 286.166,166.508 286.166,155.175 274.834,155.175 274.834,166.508 263.5,166.508 263.5,177.841 274.834,177.841 274.834,189.175 286.166,189.175 286.166,177.841 297.5,177.841 "/>
16</g>
17</svg> \ No newline at end of file
diff --git a/src/talks/wasm/images/emscripten-logo-full.png b/src/talks/wasm/images/emscripten-logo-full.png
new file mode 100644
index 0000000..43e5e2a
--- /dev/null
+++ b/src/talks/wasm/images/emscripten-logo-full.png
Binary files differ
diff --git a/src/talks/wasm/images/fast.jpg b/src/talks/wasm/images/fast.jpg
new file mode 100644
index 0000000..80befcf
--- /dev/null
+++ b/src/talks/wasm/images/fast.jpg
Binary files differ
diff --git a/src/talks/wasm/images/meme.png b/src/talks/wasm/images/meme.png
new file mode 100644
index 0000000..86d13e3
--- /dev/null
+++ b/src/talks/wasm/images/meme.png
Binary files differ
diff --git a/src/talks/wasm/images/meme2.jpg b/src/talks/wasm/images/meme2.jpg
new file mode 100644
index 0000000..782e059
--- /dev/null
+++ b/src/talks/wasm/images/meme2.jpg
Binary files differ
diff --git a/src/talks/wasm/images/pencil.jpg b/src/talks/wasm/images/pencil.jpg
new file mode 100644
index 0000000..e9a65c9
--- /dev/null
+++ b/src/talks/wasm/images/pencil.jpg
Binary files differ
diff --git a/src/talks/wasm/images/sum.jpg b/src/talks/wasm/images/sum.jpg
new file mode 100644
index 0000000..20d9e57
--- /dev/null
+++ b/src/talks/wasm/images/sum.jpg
Binary files differ
diff --git a/src/talks/wasm/images/wasm-logo.png b/src/talks/wasm/images/wasm-logo.png
new file mode 100644
index 0000000..9ce86b6
--- /dev/null
+++ b/src/talks/wasm/images/wasm-logo.png
Binary files differ
diff --git a/src/talks/wasm/index.html.raw b/src/talks/wasm/index.html.raw
new file mode 100644
index 0000000..66f8a6d
--- /dev/null
+++ b/src/talks/wasm/index.html.raw
@@ -0,0 +1,456 @@
1<!doctype html>
2<html lang="en">
3<head>
4 <title>WebAssembly and Emscripten</title>
5 <meta name="viewport" content="width=device-width" />
6
7 <!-- Import highlight.js script and style sheet -->
8 <script id="highlight.js" src="
9 https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"
10 ></script>
11 <link rel="stylesheet" href="
12 https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/vs.css"
13 >
14
15 <!-- Custom style -->
16 <style>
17 html { height: 100vh; width: 98vw; margin: 0 2vw 0 0; font-family: sans-serif; }
18 h1 {
19 font-size: 3.5vw;
20 background-color: #a4b5c5;
21 margin: 0;
22 padding: 2px 10px 2px 10px;
23 border-bottom-left-radius: 6px;
24 border-bottom-right-radius: 6px;
25 }
26 body { font-size: 2.2vw; height: 100%; width: 100%; }
27 a, a:visited { color: #0f2899; text-decoration: none; }
28 a:hover { text-decoration: underline; }
29 figcaption { text-align: center; font-size: 1.5vw; }
30 em { font-style: normal; color: blue; }
31
32 .slide { outline: none; height: 100vh; width: 100%; }
33 .slide {
34 display: flex;
35 flex-direction: column;
36 justify-content: space-between;
37 }
38 .slide ul { margin-left: 1.5vw; }
39 .slide ol { margin-left: 1.5vw; }
40 .slide p { margin-left: 1.5vw; }
41 .slide li { margin: 3.0vh 0; }
42
43 .slide.titlepage p, a { text-align: center; }
44 .slide.titlepage span.title { font-size: 3.6vw; font-weight: bold; }
45 .slide.titlepage span.author { }
46
47
48 .slide div.centertext { text-align: center; margin: auto; width: 60%; }
49
50 .columns {
51 display: flex;
52 flex-direction: row;
53 justify-content: space-between;
54 align-items: center;
55 }
56
57 .footer {
58 font-size: 1.8vw;
59 padding: 2px 10px 2px 10px;
60 border-top-left-radius: 6px;
61 border-top-right-radius: 6px;
62 background-color: #a4b5c5;
63 }
64 .footer table { width: 100%; }
65 .footer-title { font-weight: bold; }
66 .footer-link { text-align: right; }
67
68 #bench {
69 border-collapse: collapse;
70 width: 99%;
71 }
72 #bench th, #bench td {
73 border: 1px solid black;
74 padding: 5px;
75 text-align: center;
76 }
77 #bench th { white-space: normal; }
78 </style>
79 <meta charset="utf-8">
80</head>
81
82<body>
83
84<div class="slide titlepage" tabindex="-1"
85style="background-image: url('images/cpp-in-the-web.png');
86background-position: center;
87background-repeat: no-repeat;
88background-size: 70%;
89background-color: rgba(255, 255, 255, 0.85);
90background-blend-mode: overlay;">
91
92<p></p>
93
94<p><span class="title">WebAssembly and Emscripten</span></p>
95<p><span class="author">Sebastiano Tronto</span></p>
96<p><span class="event">ALTEN Advanced Software Evening</span></p>
97
98</div>
99
100
101<div class="slide" tabindex="-1">
102<h1>Your browser runs code</h1>
103
104<div class="columns">
105
106<div style="text-align: center;">
107<input id="aInput" size=10 style="font-size: 24px;">
108<br>
109+
110<br>
111<input id="bInput" size=10 style="font-size: 24px;">
112<br>
113<button id="resultButton" style="font-size: 24px;">=</button>
114<br>
115<span id="resultText" style="font-size: 30px;"></span>
116</div>
117
118<pre><code class="language-javascript"
119style="border: 0.2vw solid; font-size: 2.2vw;">
120var aInput = document.getElementById("aInput");
121var bInput = document.getElementById("bInput");
122var button = document.getElementById("resultButton");
123var resultText = document.getElementById("resultText");
124
125button.addEventListener("click", () => {
126 var a = Number(aInput.value);
127 var b = Number(bInput.value);
128 resultText.innerText = a + b;
129});
130</code></pre></div>
131
132</div>
133
134
135
136<div class="slide" tabindex="-1">
137<h1>WebAssembly</h1>
138
139<div class="columns">
140
141<a href="https://webassembly.org/">
142<img src="images/wasm-logo.png" style="width: 80%;">
143</a>
144
145<div>
146<p style="text-align: center;">
147WASM first appeared in 2017 as a more performant language for the browser.
148</p>
149
150<p style="text-align: center;">
151It runs in a VM and can interact with JavaScript, but not with the DOM.
152</p>
153</div>
154
155</div>
156</div>
157
158<div class="slide" tabindex="-1">
159<h1>WebAssembly - code example</h1>
160
161<div class="columns">
162
163<pre><code class="language-wasm"
164style="border: 0.2vw solid; font-size: 2.1vw;">
165(func (param i64) (result i64)
166 local.get 0
167 i64.eqz
168 if (result i64)
169 i64.const 1
170 else
171 local.get 0
172 local.get 0
173 i64.const 1
174 i64.sub
175 call 0
176 i64.mul
177 end)
178</code></pre>
179
180<div></div>
181
182</div>
183</div>
184
185<div class="slide" tabindex="-1">
186<h1>WebAssembly - code example</h1>
187
188<div class="columns">
189
190<pre><code class="language-wasm"
191style="border: 0.2vw solid; font-size: 2.1vw;">
192(func (param i64) (result i64)
193 local.get 0
194 i64.eqz
195 if (result i64)
196 i64.const 1
197 else
198 local.get 0
199 local.get 0
200 i64.const 1
201 i64.sub
202 call 0
203 i64.mul
204 end)
205</code></pre>
206
207<div>
208Same thing in Python:
209<pre><code class="language-python"
210style="border: 0.2vw solid; font-size: 2.1vw;">
211def f(n):
212 if n == 0:
213 return 1
214 else
215 return n * f(n-1)
216</code></pre>
217</div>
218
219</div>
220</div>
221
222<div class="slide" tabindex="-1">
223<h1>Emscripten</h1>
224
225<a href="https://emscripten.org/index.html">
226<img src="images/emscripten-logo-full.png">
227</a>
228
229<p style="text-align: center;">
230<strong>
231"Emscripten is a complete compiler toolchain to WebAssembly, using LLVM,
232with a special focus on speed, size, and the Web platform."
233</strong>
234</p>
235
236</div>
237
238<div class="slide" tabindex="-1">
239<h1>Hello, world!</h1>
240
241<div class="columns">
242
243<ol>
244<li>Write an Hello World program in C or C++</li>
245<li>Compile with <pre>emcc -o index.html hello.c</pre></li>
246<li>Run a web server and
247<a href="./examples/1-hello-world">open a browser</a>!</li>
248</ol>
249
250<img src="images/meme.png" style="width: 35%;">
251
252</div>
253</div>
254
255<div class="slide" tabindex="-1">
256<h1>Writing a library</h1>
257
258<i>Thanks Emscripten, we'll write our own HTML!</i>
259
260<div class="columns">
261
262<img src="./images/sum.jpg" style="width: 70%;">
263
264<div>
265<ul>
266<li><strong>Goal:</strong>
267write a library with a function to sum two numbers,
268and use it in a simple web page</li>
269<li>See <a href=./examples/2-sum>examples/2-sum</a></li>
270<li>Some extra options are needed:</li>
271</ul>
272<pre><code class="language-shell">
273emcc -sEXPORTED_FUNCTIONS=_sum \
274 -sMODULARIZE \
275 -sEXPORT_NAME=SumLibrary \
276 -o sum_library.mjs \
277 sum_library.c
278</code></pre>
279</div>
280
281</div>
282</div>
283
284<div class="slide" tabindex="-1">
285<h1>Exercise: count prime numbers</h1>
286<div class="columns">
287<ul>
288<li>Write a web app that takes a single integer n as input
289and prints <strong>the number of prime numberss less than n</strong> when
290the user presses a button.</li>
291<li>Solution: <a href=./examples/3-primes>examples/3-primes</a></li>
292</ul>
293<img src="./images/meme2.jpg" style="width: 70%;">
294</div>
295</div>
296
297<div class="slide" tabindex="-1">
298<h1>Performance benchmark</h1>
299<table id="bench">
300<tr>
301 <th></th>
302 <th>Firefox <br>WASM (-O3)</th><th>Firefox <br>JS</th>
303 <th>Chromium <br>WASM (-O3)</th><th>Chromium <br>JS</th>
304</tr>
305<tr>
306 <td>1e7 Primes (iterative)</td>
307 <td>4.5s</td><td>4.4s</td>
308 <td>4.7s</td><td>4.6s</td>
309<tr>
310<tr>
311 <td>1e7 Primes (sieve)</td>
312 <td>0.76s</td><td>0.82s</td>
313 <td>0.92s</td><td>0.80s</td>
314<tr>
315<tr>
316 <td>Matrix multiplication</td>
317 <td>0.81s</td><td>5.3s</td>
318 <td>1.5s</td><td>4.6s</td>
319<tr>
320</table>
321<img src="./images/fast.jpg" style="width: 30%; margin: auto;">
322</div>
323
324<div class="slide" tabindex="-1">
325<h1>More exercises</h1>
326
327<p>See <a href="https://github.com/sebastianotronto/emscripten-tutorial">
328github.com/sebastianotronto/emscripten-tutorial</a></p>
329
330<div class="columns">
331<ul>
332<li><strong>Fix UI freezing:</strong> very large numbers in example 3
333can block the UI. Can you fix this?</li>
334<li><strong>More faster:</strong> use multi-threading
335(<a href="https://en.wikipedia.org/wiki/Pthreads">pthreads</a> or
336<a href="https://en.cppreference.com/w/cpp/thread/thread.html">std::thread</a>) to make our examples faster. Watch out for
337<a href="https://spectreattack.com/">Spectre</a>!</li>
338<li><strong>Show progress:</strong> using callback functions, make our
339long-running examples show their progress in the web page.</li>
340</ul>
341
342<img src="./images/pencil.jpg" style="width: 60%; margin: auto;">
343
344</div>
345</div>
346
347
348<div class="slide titlepage" tabindex="-1"
349style="background-image: url('images/beer.jpg');
350background-position: center;
351background-repeat: no-repeat;
352background-size: 80%;
353background-color: rgba(255, 255, 255, 0.65);
354background-blend-mode: overlay;">
355<p></p>
356<p><span class="title">Drinks!</span></p>
357<p></p>
358</div>
359
360<script>
361 // The list of all slides of the presentation.
362 const slides = document.querySelectorAll(".slide");
363
364 // Navigation keys.
365 const keysNext = ["ArrowRight", "ArrowDown", " "];
366 const keysPrev = ["ArrowLeft", "ArrowUp"];
367
368 // Function to move to a given slide.
369 // This also focuses the slide, so any key press will be
370 // handled by the correct slide's event handler.
371 function goto(slide) {
372 slide.focus();
373 slide.scrollIntoView({
374 behavior: "instant",
375 block: "start"
376 });
377 }
378
379 // Handle key press events.
380 function onkeydown(i, e) {
381 if (keysNext.includes(e.key) && i+1 < slides.length) {
382 goto(slides[i+1]);
383 }
384 if (keysPrev.includes(e.key) && i > 0) {
385 goto(slides[i-1]);
386 }
387 }
388
389 // Disabled for these slides, it messes with interactive elements;
390 // see also the part that adds event listeners below.
391 //
392 // Handle click or tap events.
393 // Tapping on the right half of the screen scrolls forwards,
394 // tapping on the left half scrolls backwards.
395 //function onclick(i, e) {
396 // const w = slides[i].offsetWidth;
397 // const x = e.clientX;
398 //
399 // if (x > w/2 && i+1 < slides.length) {
400 // goto(slides[i+1]);
401 // }
402 // if (x < w/2 && i > 0) {
403 // goto(slides[i-1]);
404 // }
405 //}
406
407 // Disable default action of the navigation keys (e.g. scrolling).
408 document.addEventListener("keydown", function(e) {
409 if (keysNext.includes(e.key) || keysPrev.includes(e.key)) {
410 e.preventDefault();
411 }
412 });
413
414 // Function to add a footer to every slide.
415 function slideFooter() {
416 const start = "<div class=\"footer\"><table class=\"footer-table\"><tr>";
417 const title = "WebAssembly and Emscripten"
418 const link = "<a href=https://tronto.net/talks/wasm>tronto.net/talks/wasm</a>";
419 const end = "</tr></table></div>";
420 const content =
421 "<td class=\"footer-title\">" + title + "</td>" +
422 "<td class=\"footer-link\">" + link + "</td>";
423
424 return start + content + end;
425 }
426
427 // Add slide footers and event handlers.
428 for (let i = 0; i < slides.length; i++) {
429 slides[i].innerHTML += slideFooter();
430 slides[i].addEventListener("keydown", e => onkeydown(i, e));
431 //slides[i].addEventListener("click", e => onclick(i, e));
432 }
433
434 // Focus and scroll into view the first slide.
435 goto(slides[0]);
436
437 // Call highlight.js
438 hljs.highlightAll();
439</script>
440
441<!-- Script for first example slide -->
442<script>
443var aInput = document.getElementById("aInput");
444var bInput = document.getElementById("bInput");
445var button = document.getElementById("resultButton");
446var resultText = document.getElementById("resultText");
447
448button.addEventListener("click", () => {
449 var a = Number(aInput.value);
450 var b = Number(bInput.value);
451 resultText.innerText = a + b;
452});
453</script>
454
455</body>
456</html>

Generated with cgit - Back to sebastiano.tronto.net