├── src ├── main.wasm ├── extend.js ├── webgl.js ├── main.c ├── utils.js ├── index.js └── main.js ├── rollup ├── rollup.config.es.js ├── rollup.config.cjs.js ├── rollup.config.js ├── rollup.config.iife.js ├── compile.wasm.js └── rollup.bundle.js ├── package.json ├── .gitattributes ├── README.md ├── static ├── index.html └── stats.min.js ├── LICENSE ├── .gitignore └── dist └── bundle.js /src/main.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maierfelix/wasm-particles/HEAD/src/main.wasm -------------------------------------------------------------------------------- /rollup/rollup.config.es.js: -------------------------------------------------------------------------------- 1 | const pkg = require("../package.json"); 2 | import config from "./rollup.config"; 3 | 4 | config.format = "es"; 5 | config.dest = pkg.module; 6 | 7 | export default config; 8 | -------------------------------------------------------------------------------- /rollup/rollup.config.cjs.js: -------------------------------------------------------------------------------- 1 | const pkg = require("../package.json"); 2 | import config from "./rollup.config"; 3 | 4 | config.format = "cjs"; 5 | config.dest = pkg.main; 6 | config.paths = {}; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /rollup/rollup.config.js: -------------------------------------------------------------------------------- 1 | import json from "rollup-plugin-json"; 2 | 3 | export default { 4 | entry: "src/index.js", 5 | moduleName: "iroh", 6 | external: [], 7 | plugins: [ 8 | json() 9 | ] 10 | }; 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "rollup": "^0.47.2", 4 | "rollup-plugin-buble": "^0.15.0", 5 | "rollup-plugin-commonjs": "^8.1.0", 6 | "rollup-plugin-json": "^2.3.0", 7 | "rollup-plugin-node-resolve": "^3.0.0", 8 | "webassembly": "^0.11.0" 9 | }, 10 | "dependencies": {} 11 | } 12 | -------------------------------------------------------------------------------- /src/extend.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {Class} cls 3 | * @param {Array} prot 4 | */ 5 | export default function(cls, prot) { 6 | for (let key in prot) { 7 | if (prot[key] instanceof Function) { 8 | if (cls.prototype[key] instanceof Function) { 9 | console.log(`Warning: Overwriting ${cls.name}.prototype.${key}`); 10 | } 11 | cls.prototype[key] = prot[key]; 12 | } 13 | }; 14 | }; -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /rollup/rollup.config.iife.js: -------------------------------------------------------------------------------- 1 | const pkg = require("../package.json"); 2 | import config from "./rollup.config"; 3 | import json from "rollup-plugin-json"; 4 | import buble from "rollup-plugin-buble"; 5 | import resolve from "rollup-plugin-node-resolve"; 6 | import commonjs from "rollup-plugin-commonjs"; 7 | 8 | config.format = "iife"; 9 | config.dest = pkg.browser; 10 | config.external = []; 11 | config.plugins = [ 12 | json(), 13 | buble(), 14 | resolve({ 15 | jsnext: true, 16 | browser: true 17 | }), 18 | commonjs({ 19 | namedExports: {} 20 | }) 21 | ]; 22 | 23 | export default config; 24 | -------------------------------------------------------------------------------- /rollup/compile.wasm.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const compiler = require("webassembly/cli/compiler"); 3 | 4 | let args = [ 5 | "-q", 6 | "-o", "./wasm_tmp.wasm", 7 | "src/main.c" 8 | ]; 9 | 10 | module.exports = function() { 11 | return new Promise((resolve) => { 12 | compiler.main(args, (e, path) => { 13 | if (e) throw e; 14 | let data = fs.readFileSync(path); 15 | let code = ` 16 | let binary = new Uint8Array([${new Uint8Array(data).toString()}]); 17 | export default binary; 18 | `; 19 | fs.unlinkSync(path); 20 | fs.writeFileSync("src/main.wasm", data); 21 | fs.writeFileSync("src/main.js", code, "utf-8"); 22 | resolve(); 23 | }); 24 | }); 25 | }; 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wasm-particles 2 | 3 | [Demo](https://maierfelix.github.io/wasm-particles/static) 4 | 5 | This is a visual benchmark, each particle is updated from WebAssembly and then drawn to the screen with WebGL. Normally you would outsource everything to the GPU, but to showcase WASM's speed each particle is updated within the WASM module (and so updated on the CPU). 6 | 7 | There is also some basic glue code to work with point based textures. You can tell the wasm module to allocate some space for a RGB texture and then have access from JS to manipulate it etc. Since there is no garbage collection for WebAssembly yet, you have to free the texture manually. The three example methods to work with textures: ``allocateTexture``, ``freeTexture`` and ``drawTexture`` which fills the texture's pixels into the relative particles. 8 | -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 27 | 28 | 31 | -------------------------------------------------------------------------------- /rollup/rollup.bundle.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const pkg = require("../package.json"); 3 | const wasm = require("./compile.wasm"); 4 | 5 | const rollup = require("rollup"); 6 | const json = require("rollup-plugin-json"); 7 | const buble = require("rollup-plugin-buble"); 8 | const resolve = require("rollup-plugin-node-resolve"); 9 | const commonjs = require("rollup-plugin-commonjs"); 10 | 11 | let config = {}; 12 | config.entry = "src/index.js"; 13 | config.moduleName = "iroh"; 14 | config.useStrict = true; 15 | config.format = "iife"; 16 | config.dest = pkg.browser; 17 | config.external = []; 18 | config.plugins = [ 19 | json(), 20 | buble(), 21 | resolve({ 22 | browser: true 23 | }), 24 | commonjs() 25 | ]; 26 | 27 | const outputOptions = {}; 28 | 29 | async function build() { 30 | 31 | await wasm(); 32 | 33 | const bundle = await rollup.rollup(config); 34 | 35 | const { code, map } = await bundle.generate(config); 36 | fs.writeFileSync("dist/bundle.js", code, "utf-8"); 37 | 38 | } 39 | 40 | build(); 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Felix Maier 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directories 27 | node_modules 28 | jspm_packages 29 | 30 | # Optional npm cache directory 31 | .npm 32 | 33 | # Optional REPL history 34 | .node_repl_history 35 | 36 | # ========================= 37 | # Operating System Files 38 | # ========================= 39 | 40 | # OSX 41 | # ========================= 42 | 43 | .DS_Store 44 | .AppleDouble 45 | .LSOverride 46 | 47 | # Thumbnails 48 | ._* 49 | 50 | # Files that might appear in the root of a volume 51 | .DocumentRevisions-V100 52 | .fseventsd 53 | .Spotlight-V100 54 | .TemporaryItems 55 | .Trashes 56 | .VolumeIcon.icns 57 | 58 | # Directories potentially created on remote AFP share 59 | .AppleDB 60 | .AppleDesktop 61 | Network Trash Folder 62 | Temporary Items 63 | .apdisk 64 | 65 | # Windows 66 | # ========================= 67 | 68 | # Windows image file caches 69 | Thumbs.db 70 | ehthumbs.db 71 | 72 | # Folder config file 73 | Desktop.ini 74 | 75 | # Recycle Bin used on file shares 76 | $RECYCLE.BIN/ 77 | 78 | # Windows Installer files 79 | *.cab 80 | *.msi 81 | *.msm 82 | *.msp 83 | 84 | # Windows shortcuts 85 | *.lnk 86 | 87 | www 88 | 89 | package-lock.json -------------------------------------------------------------------------------- /static/stats.min.js: -------------------------------------------------------------------------------- 1 | // stats.js - http://github.com/mrdoob/stats.js 2 | (function(f,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;dg+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/ 4 | 1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v); 5 | b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f}); -------------------------------------------------------------------------------- /src/webgl.js: -------------------------------------------------------------------------------- 1 | function compileShader(gl, type, source) { 2 | let shader = gl.createShader(type); 3 | gl.shaderSource(shader, source); 4 | gl.compileShader(shader); 5 | return shader; 6 | }; 7 | 8 | export default function initRender (ptSize) { 9 | 10 | let gl = canvas.getContext("webgl", { 11 | antialias: false, 12 | alpha: true, 13 | depth: false, 14 | stencil: false 15 | }); 16 | 17 | gl.depthMask(false); 18 | gl.disable(gl.DEPTH_TEST); 19 | gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); 20 | 21 | let program = gl.createProgram(); 22 | 23 | gl.attachShader(program, compileShader(gl, gl.VERTEX_SHADER, 24 | ` 25 | attribute vec3 aColor; 26 | attribute vec3 aPosition; 27 | varying vec3 vColor; 28 | uniform vec2 res; 29 | uniform int time; 30 | void main(void) { 31 | vColor = aColor / 255.0; 32 | vec2 circle = aPosition.xy / res * vec2(2, -2) - vec2(1, -1); 33 | gl_Position = vec4(circle, 0, 1); 34 | gl_PointSize = 1.0; 35 | } 36 | `)); 37 | gl.attachShader(program, compileShader(gl, gl.FRAGMENT_SHADER, 38 | `precision lowp float; 39 | varying vec3 vColor; 40 | void main(void) { 41 | gl_FragColor = vec4(vColor.r, vColor.g, vColor.b, 1.0); 42 | } 43 | `)); 44 | 45 | gl.linkProgram(program); 46 | gl.useProgram(program); 47 | 48 | let resLoc = gl.getUniformLocation(program, "res"); 49 | gl.uniform2f(resLoc, canvas.width, canvas.height); 50 | 51 | gl.viewport(0, 0, canvas.width, canvas.height); 52 | 53 | let coordBuffer = gl.createBuffer(); 54 | let colorBuffer = gl.createBuffer(); 55 | 56 | let coordLoc = gl.getAttribLocation(program, "aPosition"); 57 | gl.enableVertexAttribArray(coordLoc); 58 | 59 | let colorLoc = gl.getAttribLocation(program, "aColor"); 60 | gl.enableVertexAttribArray(colorLoc); 61 | 62 | return { 63 | gl, program, 64 | coordBuffer, colorBuffer, 65 | coordLoc, colorLoc 66 | }; 67 | 68 | }; 69 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int PARTICLE_COUNT = 0; 6 | int PADDING = 2; 7 | 8 | import void printi(int); 9 | import void printfl(float); 10 | import void printxy(int, int); 11 | import int getTime(); 12 | import float randomf(); 13 | 14 | struct Ball { 15 | float x; 16 | float y; 17 | float vx; 18 | float vy; 19 | }; 20 | 21 | struct Ball ball = { 22 | .x = 0.0, .y = 0.0, 23 | .vx = 0.0, .vy = 0.0 24 | }; 25 | 26 | int width = 0; 27 | int height = 0; 28 | 29 | struct Particle { 30 | float x; 31 | float y; 32 | float z; 33 | }; 34 | 35 | struct Particle *particles; 36 | struct Particle *cparticles; 37 | struct Particle *oparticles; 38 | 39 | export int getParticleCount() { 40 | return PARTICLE_COUNT; 41 | } 42 | 43 | export int getParticleByteSize() { 44 | return sizeof (struct Particle); 45 | } 46 | 47 | export struct Particle* getParticleColorOffset() { 48 | return &cparticles[0]; 49 | } 50 | 51 | export struct Particle* getParticlePositionOffset() { 52 | return &particles[0]; 53 | } 54 | 55 | export void updateMouse(int x, int y) { 56 | ball.x = (float) x; 57 | ball.y = (float) y; 58 | } 59 | 60 | export void init(int ww, int hh) { 61 | width = ww; 62 | height = hh; 63 | PARTICLE_COUNT = (width * height) / PADDING; 64 | int amount = (width * height) * getParticleByteSize(); 65 | particles = malloc(amount); 66 | oparticles = malloc(amount); 67 | cparticles = malloc(amount); 68 | for (int ii = 0; ii < PARTICLE_COUNT; ++ii) { 69 | float xx = (ii % (width)) * PADDING; 70 | float yy = (ii / (width)) * PADDING; 71 | particles[ii].x = randomf() * width; 72 | particles[ii].y = randomf() * height; 73 | oparticles[ii].x = xx; 74 | oparticles[ii].y = yy; 75 | cparticles[ii].x = (xx / width) * 255.0f; 76 | cparticles[ii].y = (yy / height) * 255.0f; 77 | cparticles[ii].z = 128.0f; 78 | }; 79 | } 80 | 81 | export int* allocateTexture(int ww, int hh) { 82 | int size = 4 * (ww * hh); 83 | int *data = malloc(size * sizeof (*data)); 84 | // initialize with zero 85 | for (int ii = 0; ii < size; ++ii) data[ii] = 0; 86 | return data; 87 | } 88 | 89 | export void destroyTexture(int **texture) { 90 | free(*texture); 91 | } 92 | 93 | export void drawTexture(int *texture, int x, int y, int ww, int hh) { 94 | int size = (ww * hh); 95 | float factor = 0.1f; 96 | for (int ii = 0; ii < size; ++ii) { 97 | int px = ii * 4; 98 | if (texture[px + 3] == 0) continue; 99 | int r = texture[px + 0]; 100 | int g = texture[px + 1]; 101 | int b = texture[px + 2]; 102 | int xx = x + (ii % ww); 103 | int yy = y + (ii / ww); 104 | int ix = yy * width + xx; 105 | if (ix < 0 || xx >= width || yy >= height) continue; 106 | //particles[ix].x += 1.0f; 107 | cparticles[ix].x = r; 108 | cparticles[ix].y = g; 109 | cparticles[ix].z = b; 110 | }; 111 | } 112 | 113 | void updateBall() { 114 | 115 | } 116 | 117 | export void tick() { 118 | int t = (float) getTime(); 119 | float s = 19.75f; 120 | float ease = 0.05f; 121 | updateBall(); 122 | float bx = ball.x; 123 | float by = ball.y; 124 | for (int ii = PARTICLE_COUNT; ii > 0; --ii) { 125 | // move back to origin point 126 | particles[ii].x += (oparticles[ii].x - particles[ii].x) * ease; 127 | particles[ii].y += (oparticles[ii].y - particles[ii].y) * ease; 128 | 129 | int dx = bx - particles[ii].x; 130 | int dy = by - particles[ii].y; 131 | int dist = (dx * dx) + (dy * dy); 132 | 133 | if (dist < 12500) { 134 | float t = atan2(dy, dx); 135 | particles[ii].x -= cosf(t) * s; 136 | particles[ii].y -= sinf(t) * s; 137 | } 138 | 139 | // resets pixels after each frame (like clearRect) 140 | // disabled since we dont draw texture based 141 | //cparticles[ii].x = cparticles[ii].y = cparticles[ii].z = 0.0f; 142 | }; 143 | } 144 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | export function mergeObjects(a, b) { 2 | console.assert(a instanceof Object); 3 | console.assert(b instanceof Object); 4 | for (let key in b) { 5 | a[key] = b[key]; 6 | }; 7 | }; 8 | 9 | export function roundTo(a, b) { 10 | let n = 1 / b; 11 | return (Math.round(a * n) / n); 12 | }; 13 | 14 | export function load(buffer, options) { 15 | 16 | options || (options = {}); 17 | 18 | var imports = options.imports || {}; 19 | 20 | var memory = imports.memory; 21 | if (!memory) { 22 | var opts = { initial: options.initialMemory || 1 }; 23 | if (options.maximumMemory) 24 | opts.maximum = options.maximumMemory; 25 | memory = new WebAssembly.Memory(opts); 26 | memory.initial = options.initialMemory || 1; 27 | memory.maximum = options.maximumMemory; 28 | } 29 | 30 | var table = imports.table; 31 | if (!table) 32 | table = new WebAssembly.Table({ initial: 0, element: "anyfunc" }); 33 | 34 | function grow() { 35 | var buf = memory.buffer; 36 | memory.U8 = new Uint8Array (buf); 37 | memory.S32 = new Int32Array (buf); 38 | memory.U32 = new Uint32Array (buf); 39 | memory.F32 = new Float32Array(buf); 40 | memory.F64 = new Float64Array(buf); 41 | if (imports.ongrow) imports.ongrow(); 42 | } 43 | 44 | grow(); 45 | 46 | function getInt(ptr) { 47 | return memory.S32[ptr >> 2]; 48 | } 49 | 50 | memory.getInt = getInt; 51 | 52 | function getUint(ptr) { 53 | return memory.U32[ptr >> 2]; 54 | } 55 | 56 | memory.getUint = getUint; 57 | 58 | function getFloat(ptr) { 59 | return memory.F32[ptr >> 2]; 60 | } 61 | 62 | memory.getFloat = getFloat; 63 | 64 | function getDouble(ptr) { 65 | return memory.F64[ptr >> 3]; 66 | } 67 | 68 | memory.getDouble = getDouble; 69 | 70 | function getString(ptr) { 71 | var start = (ptr >>>= 0); 72 | while (memory.U8[ptr++]); 73 | getString.bytes = ptr - start; 74 | return String.fromCharCode.apply(null, memory.U8.subarray(start, ptr - 1)); 75 | } 76 | 77 | memory.getString = getString; 78 | 79 | var env = {}; 80 | 81 | env.memoryBase = imports.memoryBase || 0; 82 | env.memory = memory; 83 | env.tableBase = imports.tableBase || 0; 84 | env.table = table; 85 | 86 | function sprintf(ptr, base) { 87 | var s = getString(ptr); 88 | return base 89 | ? s.replace(/%([dfisu]|lf)/g, ($0, $1) => { 90 | var val; 91 | return base += 92 | $1 === "u" ? (val = getUint(base), 4) 93 | : $1 === "f" ? (val = getFloat(base), 4) 94 | : $1 === "s" ? (val = getString(getUint(base)), 4) 95 | : $1 === "lf" ? (val = getDouble(base), 8) 96 | : (val = getInt(base), 4) 97 | , val; 98 | }) 99 | : s; 100 | } 101 | 102 | Object.getOwnPropertyNames(console).forEach(key => { 103 | if (typeof console[key] === "function") 104 | env["console_" + key] = (ptr, base) => { 105 | console[key](sprintf(ptr, base)); 106 | }; 107 | }); 108 | 109 | Object.getOwnPropertyNames(Math).forEach(key => { 110 | if (typeof Math[key] === "function") 111 | env["Math_" + key] = Math[key]; 112 | }); 113 | 114 | Object.keys(imports).forEach(key => env[key] = imports[key]); 115 | 116 | if (!env._abort) 117 | env._abort = errno => { throw Error("abnormal abort in " + file + ": " + errno); }; 118 | if (!env._exit) 119 | env._exit = code => { if (code) throw Error("abnormal exit in " + file + ": " + code); } 120 | 121 | env._grow = grow; 122 | 123 | return WebAssembly.instantiate(buffer, { env: env }) 124 | .then(module => { 125 | var instance = module.instance; 126 | instance.imports = imports; 127 | instance.memory = memory; 128 | instance.env = env; 129 | return instance; 130 | }); 131 | }; 132 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { roundTo, load, mergeObjects } from "./utils"; 2 | 3 | import wgl from "./webgl"; 4 | import buffer from "./main.js"; 5 | 6 | canvas.width = roundTo(window.innerWidth, 2); 7 | canvas.height = roundTo(window.innerHeight, 2); 8 | 9 | let width = canvas.width; 10 | let height = canvas.height; 11 | 12 | let mx = 0; let my = 0; 13 | 14 | const INT_BYTES = Int32Array.BYTES_PER_ELEMENT; 15 | const UINT_BYTES = Uint32Array.BYTES_PER_ELEMENT; 16 | const FLOAT_BYTES = Float32Array.BYTES_PER_ELEMENT; 17 | const DOUBLE_BYTES = Float64Array.BYTES_PER_ELEMENT; 18 | 19 | function createTexture(width, height) { 20 | let offset = program.allocateTexture(width, height); 21 | //console.log(`Allocated ${width * height * 4} bytes at ${offset}`); 22 | // this can be used just like ImageData 23 | let data = new Uint32Array(instance.memory.buffer, offset, 4 * (width * height)); 24 | return ({ 25 | data, 26 | offset, 27 | width, height 28 | }); 29 | }; 30 | 31 | let tex = null; 32 | function draw() { 33 | let width = 128; 34 | let height = 128; 35 | if (tex === null) tex = createTexture(width, height); 36 | let xx = 0; 37 | let yy = 0; 38 | let ww = width; 39 | let hh = height; 40 | //program.drawTexture(tex.offset, xx, yy, ww, hh); 41 | }; 42 | 43 | window.addEventListener("contextmenu", function(e) { 44 | e.preventDefault(); 45 | }); 46 | 47 | window.addEventListener("mousemove", function(e) { 48 | if (program === null) return; 49 | mx = e.clientX; 50 | my = e.clientY; 51 | program.updateMouse(mx, my); 52 | }); 53 | 54 | window.program = null; 55 | let instance = null; 56 | let imports = { 57 | initialMemory: 512, 58 | imports: { 59 | printi: console.log.bind(console), 60 | printfl: console.log.bind(console), 61 | printxy: console.log.bind(console), 62 | powf: Math.pow, 63 | randomf: Math.random, 64 | getTime: Date.now 65 | } 66 | }; 67 | load(buffer, imports).then((inst) => { 68 | instance = inst; 69 | program = instance.exports; 70 | console.log("Initialising..."); 71 | program.init(width, height); 72 | let last = performance.now(); 73 | let frames = 0; 74 | let ptCount = program.getParticleCount(); 75 | let ptBytes = program.getParticleByteSize(); 76 | let ptSize = (ptBytes / FLOAT_BYTES); 77 | let ptColorOffset = program.getParticleColorOffset(); 78 | let ptPositionOffset = program.getParticlePositionOffset(); 79 | let ptColor = null; 80 | let ptPosition = null; 81 | let totalPtBytes = ptCount * ptBytes * FLOAT_BYTES; 82 | let usedKb = (totalPtBytes * 0.001) | 0; 83 | let initKb = (imports.initialMemory * 0x40) | 0; 84 | console.log(`Allocated ${ptCount} particles`); 85 | document.querySelector(".lbl").innerHTML = `${ptCount} Particles á ${ptBytes} byte`; 86 | console.log(`Memory: Used: ${usedKb}kB/${initKb}kB Left: ${initKb-usedKb}kB`); 87 | let webgl = wgl(ptSize); 88 | let gl = webgl.gl; 89 | let prog = webgl.program; 90 | let xx = 64; let yy = 64; 91 | let timeLoc = gl.getUniformLocation(prog, "time"); 92 | let count = 0; 93 | console.log(`Particle size of ${ptSize}/${ptBytes}byte`); 94 | inst.imports.ongrow = function() { 95 | // keep track of point data after each memory mutation 96 | ptColor = new Float32Array(instance.memory.buffer, ptColorOffset, ptCount * ptSize); 97 | ptPosition = new Float32Array(instance.memory.buffer, ptPositionOffset, ptCount * ptSize); 98 | }; 99 | inst.imports.ongrow(); 100 | (function drawLoop() { 101 | requestAnimationFrame(drawLoop); 102 | program.tick(); 103 | let now = performance.now(); 104 | let dt = (now - last); 105 | 106 | //console.log(`Update took ${then - now}ms`); 107 | gl.uniform1i(timeLoc, (Date.now())); 108 | 109 | // colors 110 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.colorBuffer); 111 | gl.bufferData(gl.ARRAY_BUFFER, ptColor, gl.DYNAMIC_DRAW); 112 | gl.vertexAttribPointer(webgl.colorLoc, 3, gl.FLOAT, false, ptSize * 4, 0); 113 | 114 | // points 115 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.coordBuffer); 116 | gl.bufferData(gl.ARRAY_BUFFER, ptPosition, gl.DYNAMIC_DRAW); 117 | gl.vertexAttribPointer(webgl.coordLoc, 3, gl.FLOAT, false, ptSize * 4, 0); 118 | 119 | gl.drawArrays(gl.POINTS, 0, ptCount); 120 | 121 | let then = performance.now(); 122 | //console.log(`Update took ${then - now}ms`); 123 | 124 | last = now; 125 | frames++; 126 | })(); 127 | }); 128 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | 2 | let binary = new Uint8Array([0,97,115,109,1,0,0,0,1,210,128,128,128,0,15,96,0,1,125,96,0,1,127,96,0,0,96,1,127,0,96,2,127,127,0,96,2,127,127,1,127,96,5,127,127,127,127,127,0,96,2,124,124,1,124,96,1,124,1,124,96,1,125,1,125,96,1,124,1,125,96,2,125,127,1,127,96,5,127,127,127,127,127,1,127,96,2,124,127,1,124,96,1,127,1,127,2,196,128,128,128,0,5,3,101,110,118,6,95,97,98,111,114,116,0,3,3,101,110,118,5,95,103,114,111,119,0,2,3,101,110,118,7,103,101,116,84,105,109,101,0,1,3,101,110,118,7,114,97,110,100,111,109,102,0,0,3,101,110,118,6,109,101,109,111,114,121,2,0,1,3,157,128,128,128,0,28,1,1,1,1,4,4,5,3,6,2,2,7,8,8,9,10,10,11,12,13,8,14,2,14,1,3,14,9,4,132,128,128,128,0,1,112,0,0,7,172,129,128,128,0,10,16,103,101,116,80,97,114,116,105,99,108,101,67,111,117,110,116,0,4,19,103,101,116,80,97,114,116,105,99,108,101,66,121,116,101,83,105,122,101,0,5,22,103,101,116,80,97,114,116,105,99,108,101,67,111,108,111,114,79,102,102,115,101,116,0,6,25,103,101,116,80,97,114,116,105,99,108,101,80,111,115,105,116,105,111,110,79,102,102,115,101,116,0,7,11,117,112,100,97,116,101,77,111,117,115,101,0,8,4,105,110,105,116,0,9,15,97,108,108,111,99,97,116,101,84,101,120,116,117,114,101,0,10,14,100,101,115,116,114,111,121,84,101,120,116,117,114,101,0,11,11,100,114,97,119,84,101,120,116,117,114,101,0,12,4,116,105,99,107,0,14,9,129,128,128,128,0,0,10,230,255,128,128,0,28,135,128,128,128,0,0,65,0,40,2,12,11,132,128,128,128,0,0,65,12,11,135,128,128,128,0,0,65,0,40,2,44,11,135,128,128,128,0,0,65,0,40,2,48,11,149,128,128,128,0,0,2,64,65,0,32,1,178,56,2,24,65,0,32,0,178,56,2,20,11,11,158,130,128,128,0,2,3,127,3,125,2,64,65,0,32,1,54,2,40,65,0,32,0,54,2,36,65,0,32,1,32,0,108,34,1,65,0,40,2,16,109,34,2,54,2,12,65,0,32,1,65,12,108,34,1,16,25,54,2,48,65,0,32,1,16,25,54,2,52,65,0,32,1,16,25,54,2,44,65,0,33,1,65,0,33,4,2,64,3,64,32,4,32,2,78,13,1,65,0,40,2,16,33,2,16,3,33,5,65,0,40,2,48,32,1,106,32,5,65,0,40,2,36,178,148,56,2,0,16,3,33,5,65,0,40,2,48,32,1,106,65,4,106,32,5,65,0,40,2,40,178,34,6,148,56,2,0,65,0,40,2,52,32,1,106,34,3,32,2,32,4,32,0,111,108,178,34,5,56,2,0,32,3,65,4,106,32,2,32,4,32,0,109,108,178,34,7,56,2,0,65,0,40,2,44,32,1,106,34,2,65,8,106,65,128,128,128,152,4,54,2,0,32,2,32,5,65,0,40,2,36,34,0,178,149,67,0,0,127,67,148,56,2,0,32,2,65,4,106,32,7,32,6,149,67,0,0,127,67,148,56,2,0,32,1,65,12,106,33,1,32,4,65,1,106,33,4,65,0,40,2,12,33,2,12,0,11,0,11,11,11,201,128,128,128,0,1,2,127,2,127,32,1,32,0,108,34,1,65,2,116,33,2,32,1,65,4,116,16,25,34,3,33,0,65,0,33,1,2,64,3,64,32,1,32,2,78,13,1,32,0,65,0,54,2,0,32,0,65,4,106,33,0,32,1,65,1,106,33,1,12,0,11,0,11,32,3,11,11,137,128,128,128,0,0,32,0,40,2,0,16,29,11,173,129,128,128,0,1,5,127,2,64,32,4,32,3,108,33,5,65,0,40,2,44,33,6,65,0,33,4,2,64,3,64,32,4,32,5,78,13,1,2,64,32,0,65,12,106,40,2,0,69,13,0,32,4,32,3,111,33,8,32,4,32,3,109,32,2,106,34,9,65,0,40,2,40,78,13,0,32,8,32,1,106,34,8,65,0,40,2,36,34,7,78,13,0,32,9,32,7,108,32,8,106,34,8,65,0,72,13,0,32,6,32,8,65,12,108,106,34,8,32,0,40,2,0,178,56,2,0,32,8,32,0,65,4,106,40,2,0,178,56,2,4,32,8,32,0,65,8,106,40,2,0,178,56,2,8,11,32,0,65,16,106,33,0,32,4,65,1,106,33,4,12,0,11,0,11,11,11,131,128,128,128,0,0,1,11,243,129,128,128,0,2,6,127,5,125,2,64,16,2,26,65,0,40,2,52,65,0,40,2,12,34,5,65,12,108,34,4,106,65,4,106,33,3,65,0,40,2,48,32,4,106,65,4,106,33,4,65,0,42,2,24,33,7,65,0,42,2,20,33,6,2,64,3,64,32,5,65,0,76,13,1,32,4,32,4,42,2,0,34,9,32,3,42,2,0,32,9,147,67,205,204,76,61,148,146,34,9,56,2,0,32,4,65,124,106,34,0,32,0,42,2,0,34,8,32,3,65,124,106,42,2,0,32,8,147,67,205,204,76,61,148,146,34,8,56,2,0,2,64,32,7,32,9,147,168,34,2,32,2,108,32,6,32,8,147,168,34,1,32,1,108,106,65,211,225,0,75,13,0,32,4,32,9,32,2,183,32,1,183,16,15,182,34,10,16,31,67,0,0,158,65,148,147,56,2,0,32,0,32,8,32,10,16,18,67,0,0,158,65,148,147,56,2,0,11,32,3,65,116,106,33,3,32,4,65,116,106,33,4,32,5,65,127,106,33,5,12,0,11,0,11,11,11,242,131,128,128,0,3,6,127,2,126,1,124,2,124,2,64,2,64,32,1,189,34,8,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,0,32,0,189,34,9,66,255,255,255,255,255,255,255,255,255,0,131,66,129,128,128,128,128,128,128,248,255,0,84,13,1,11,32,0,32,1,160,15,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,8,66,32,136,167,34,2,65,128,128,192,128,124,106,32,8,167,34,3,114,69,13,0,32,8,66,62,136,167,65,2,113,34,5,32,9,66,63,136,167,34,4,114,33,6,32,9,66,32,136,167,65,255,255,255,255,7,113,34,7,32,9,167,114,69,13,1,32,2,65,255,255,255,255,7,113,34,2,32,3,114,69,13,2,32,2,65,128,128,192,255,7,71,13,3,32,6,65,2,115,65,3,113,33,2,32,7,65,128,128,192,255,7,71,13,4,32,2,65,3,116,65,192,0,106,43,3,0,15,11,32,0,16,16,15,11,32,6,65,3,113,34,2,65,3,70,13,4,32,2,65,2,70,13,5,32,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,32,7,65,128,128,192,255,7,70,13,1,32,2,65,128,128,128,32,106,32,7,73,13,1,2,64,2,64,32,5,69,13,0,68,0,0,0,0,0,0,0,0,33,10,32,7,65,128,128,128,32,106,32,2,73,13,1,11,32,0,32,1,163,16,17,16,16,33,10,11,32,6,65,3,113,34,2,69,13,4,32,2,65,2,70,13,5,32,2,65,1,71,13,6,32,10,154,15,11,32,2,65,3,116,65,224,0,106,43,3,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,68,24,45,68,84,251,33,9,192,15,11,68,24,45,68,84,251,33,9,64,15,11,32,10,15,11,68,24,45,68,84,251,33,9,64,32,10,68,7,92,20,51,38,166,161,188,160,161,15,11,32,10,68,7,92,20,51,38,166,161,188,160,68,24,45,68,84,251,33,9,192,160,11,11,203,132,128,128,0,3,4,127,1,126,3,124,2,124,65,0,65,0,40,2,4,65,16,107,34,4,54,2,4,32,0,189,34,5,66,63,136,167,33,1,2,64,2,64,32,5,66,32,136,167,65,255,255,255,255,7,113,34,2,65,128,128,192,160,4,73,13,0,32,5,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,1,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,1,27,33,0,12,1,11,2,64,2,64,32,2,65,255,255,239,254,3,75,13,0,65,127,33,3,32,2,65,255,255,255,241,3,75,13,1,32,2,65,255,255,63,75,13,2,32,4,32,0,182,56,2,12,12,2,11,32,0,16,17,33,0,2,64,2,64,2,64,32,2,65,255,255,203,255,3,75,13,0,32,2,65,255,255,151,255,3,75,13,1,32,0,32,0,160,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,0,64,160,163,33,0,65,0,33,3,12,3,11,32,2,65,255,255,141,128,4,75,13,1,32,0,68,0,0,0,0,0,0,248,191,160,32,0,68,0,0,0,0,0,0,248,63,162,68,0,0,0,0,0,0,240,63,160,163,33,0,65,2,33,3,12,2,11,32,0,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,240,63,160,163,33,0,65,1,33,3,12,1,11,68,0,0,0,0,0,0,240,191,32,0,163,33,0,65,3,33,3,11,32,0,32,0,162,34,7,32,7,162,34,8,32,8,32,8,32,8,32,8,68,47,108,106,44,68,180,162,191,162,68,154,253,222,82,45,222,173,191,160,162,68,109,154,116,175,242,176,179,191,160,162,68,113,22,35,254,198,113,188,191,160,162,68,196,235,152,153,153,153,201,191,160,162,33,6,32,7,32,8,32,8,32,8,32,8,32,8,68,17,218,34,227,58,173,144,63,162,68,235,13,118,36,75,123,169,63,160,162,68,81,61,208,160,102,13,177,63,160,162,68,110,32,76,197,205,69,183,63,160,162,68,255,131,0,146,36,73,194,63,160,162,68,13,85,85,85,85,85,213,63,160,162,33,8,2,64,32,3,65,127,76,13,0,32,3,65,3,116,34,2,65,128,1,106,43,3,0,32,0,32,6,32,8,160,162,32,2,65,160,1,106,43,3,0,161,32,0,161,161,34,0,154,32,0,32,1,27,33,0,12,1,11,32,0,32,0,32,6,32,8,160,162,161,33,0,11,65,0,32,4,65,16,106,54,2,4,32,0,11,11,146,128,128,128,0,0,32,0,189,66,255,255,255,255,255,255,255,255,255,0,131,191,11,180,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,123,146,56,2,4,67,0,0,128,63,33,0,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,228,151,219,128,4,73,13,2,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,16,19,140,33,0,12,11,11,32,0,187,16,19,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,1,65,224,219,191,133,4,73,13,2,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,0,187,160,16,19,33,0,12,9,11,32,2,69,13,3,32,4,68,24,45,68,84,251,33,249,63,160,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,32,2,69,13,2,68,210,33,51,127,124,217,18,192,32,0,187,161,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,19,33,0,12,5,11,68,24,45,68,84,251,33,249,63,32,4,161,16,20,33,0,12,4,11,32,0,187,68,210,33,51,127,124,217,18,192,160,16,20,33,0,12,3,11,32,3,43,3,8,16,19,140,33,0,12,2,11,32,3,43,3,8,154,16,20,33,0,12,1,11,32,3,43,3,8,16,20,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,207,128,128,128,0,1,1,124,32,0,32,0,162,34,0,68,129,94,12,253,255,255,223,191,162,68,0,0,0,0,0,0,240,63,160,32,0,32,0,162,34,1,68,66,58,5,225,83,85,165,63,162,160,32,0,32,1,162,32,0,68,105,80,238,224,66,147,249,62,162,68,39,30,15,232,135,192,86,191,160,162,160,182,11,203,128,128,128,0,1,2,124,32,0,32,0,162,34,1,32,0,162,34,2,32,1,32,1,162,162,32,1,68,167,70,59,140,135,205,198,62,162,68,116,231,202,226,249,0,42,191,160,162,32,2,32,1,68,178,251,110,137,16,17,129,63,162,68,119,172,203,84,85,85,197,191,160,162,32,0,160,160,182,11,253,129,128,128,0,2,4,127,1,124,2,127,65,0,65,0,40,2,4,65,16,107,34,5,54,2,4,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,4,65,218,159,164,238,4,75,13,0,32,1,32,0,187,34,6,32,6,68,131,200,201,109,48,95,228,63,162,68,0,0,0,0,0,0,56,67,160,68,0,0,0,0,0,0,56,195,160,34,6,68,0,0,0,80,251,33,249,191,162,160,32,6,68,99,98,26,97,180,16,81,190,162,160,57,3,0,32,6,170,33,4,12,1,11,2,64,32,4,65,128,128,128,252,7,73,13,0,32,1,32,0,32,0,147,187,57,3,0,65,0,33,4,12,1,11,32,5,32,4,32,4,65,23,118,65,234,126,106,34,3,65,23,116,107,190,187,57,3,8,32,5,65,8,106,32,5,32,3,65,1,65,0,16,22,33,4,32,5,43,3,0,33,6,2,64,32,2,65,127,76,13,0,32,1,32,6,57,3,0,12,1,11,32,1,32,6,154,57,3,0,65,0,32,4,107,33,4,11,65,0,32,5,65,16,106,54,2,4,32,4,11,11,252,147,128,128,0,2,21,127,4,124,2,127,65,0,65,0,40,2,4,65,176,4,107,34,25,54,2,4,32,2,32,2,65,125,106,65,24,109,34,22,65,0,32,22,65,0,74,27,34,6,65,104,108,106,33,15,2,64,32,4,65,2,116,65,192,1,106,40,2,0,34,5,32,3,65,127,106,34,14,106,65,0,72,13,0,32,5,32,3,106,33,13,32,6,32,14,107,34,2,65,2,116,65,208,1,106,33,23,32,25,65,192,2,106,33,22,3,64,2,64,2,64,32,2,65,0,72,13,0,32,23,40,2,0,183,33,28,12,1,11,68,0,0,0,0,0,0,0,0,33,28,11,32,22,32,28,57,3,0,32,22,65,8,106,33,22,32,23,65,4,106,33,23,32,2,65,1,106,33,2,32,13,65,127,106,34,13,13,0,11,11,32,15,65,104,106,33,24,2,64,2,64,32,3,65,0,76,13,0,32,25,65,192,2,106,32,14,65,3,116,106,33,14,65,0,33,13,3,64,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,3,33,23,32,14,33,22,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,14,65,8,106,33,14,32,13,32,5,72,33,2,32,13,65,1,106,33,13,32,2,13,0,12,2,11,0,11,65,127,33,22,32,25,33,2,3,64,32,2,66,0,55,3,0,32,2,65,8,106,33,2,32,22,65,1,106,34,22,32,5,72,13,0,11,11,65,23,32,24,107,33,8,65,24,32,24,107,33,7,32,25,65,224,3,106,32,5,65,2,116,106,65,124,106,33,11,32,25,65,8,114,33,12,32,25,65,224,3,106,65,124,106,33,10,32,25,65,120,106,33,9,32,3,65,0,74,33,18,32,5,33,19,2,64,2,64,3,64,32,25,32,19,34,14,65,3,116,34,16,106,43,3,0,33,28,2,64,32,14,65,1,72,34,13,13,0,32,14,65,1,106,33,23,32,9,32,16,106,33,2,32,25,65,224,3,106,33,22,3,64,32,22,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,22,65,4,106,33,22,32,2,43,3,0,32,26,160,33,28,32,2,65,120,106,33,2,32,23,65,127,106,34,23,65,1,74,13,0,11,11,2,64,32,28,32,24,16,23,34,28,32,28,68,0,0,0,0,0,0,192,63,162,16,24,68,0,0,0,0,0,0,32,192,162,160,34,28,32,28,170,34,19,183,161,33,28,2,64,2,64,2,64,2,64,32,24,65,1,72,34,17,13,0,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,34,2,32,2,32,7,117,34,2,32,7,116,107,34,22,54,2,0,32,2,32,19,106,33,19,32,22,32,8,117,34,20,65,1,78,13,1,12,2,11,2,64,32,24,69,13,0,65,2,33,20,32,28,68,0,0,0,0,0,0,224,63,99,32,28,32,28,98,114,69,13,1,65,0,33,20,32,28,68,0,0,0,0,0,0,0,0,97,13,3,12,4,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,40,2,0,65,23,117,34,20,65,1,72,13,1,11,2,64,2,64,2,64,32,13,13,0,65,0,33,21,32,25,65,224,3,106,33,2,32,14,33,13,3,64,32,2,40,2,0,33,22,65,255,255,255,7,33,23,2,64,2,64,32,21,13,0,2,64,32,22,13,0,65,0,33,21,12,2,11,65,128,128,128,8,33,23,65,1,33,21,11,32,2,32,23,32,22,107,54,2,0,11,32,2,65,4,106,33,2,32,13,65,127,106,34,13,13,0,11,32,17,13,2,12,1,11,65,0,33,21,32,17,13,1,11,2,64,2,64,32,24,65,1,70,13,0,32,24,65,2,71,13,2,65,255,255,255,1,33,22,12,1,11,65,255,255,255,3,33,22,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,32,22,113,54,2,0,11,32,19,65,1,106,33,19,32,20,65,2,71,13,0,68,0,0,0,0,0,0,240,63,32,28,161,33,28,65,2,33,20,32,21,69,13,0,32,28,68,0,0,0,0,0,0,240,63,32,24,16,23,161,33,28,11,32,28,68,0,0,0,0,0,0,0,0,98,13,1,11,2,64,32,14,32,5,76,13,0,32,10,32,14,65,2,116,106,33,2,65,0,33,22,32,14,33,23,3,64,32,2,40,2,0,32,22,114,33,22,32,2,65,124,106,33,2,32,23,65,127,106,34,23,32,5,74,13,0,11,32,22,13,3,11,65,0,33,22,32,11,33,2,3,64,32,22,65,1,106,33,22,32,2,40,2,0,33,23,32,2,65,124,106,33,2,32,23,69,13,0,11,32,14,32,22,106,33,19,32,22,65,1,72,13,1,2,64,32,18,69,13,0,32,14,65,1,106,33,2,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,21,3,64,32,25,65,192,2,106,32,14,32,3,106,65,3,116,106,32,2,34,13,32,6,106,65,2,116,65,208,1,106,40,2,0,183,57,3,0,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,21,33,22,32,3,33,23,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,21,65,8,106,33,21,32,13,65,1,106,33,2,32,13,33,14,32,13,32,19,72,13,0,12,3,11,0,11,32,12,32,16,106,33,2,32,6,32,14,106,65,2,116,65,212,1,106,33,22,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,23,3,64,32,2,66,0,55,3,0,32,23,32,22,40,2,0,183,57,3,0,32,22,65,4,106,33,22,32,2,65,8,106,33,2,32,23,65,8,106,33,23,32,14,65,1,106,34,14,32,19,72,13,0,12,2,11,0,11,11,2,64,2,64,32,28,65,0,32,24,107,16,23,34,28,68,0,0,0,0,0,0,112,65,99,32,28,32,28,98,114,69,13,0,32,28,33,26,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,14,65,1,106,33,14,32,15,33,24,11,32,25,65,224,3,106,32,14,65,2,116,106,32,26,170,54,2,0,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,33,2,3,64,32,14,65,127,106,33,14,32,24,65,104,106,33,24,32,2,40,2,0,33,22,32,2,65,124,106,33,2,32,22,69,13,0,11,11,68,0,0,0,0,0,0,240,63,32,24,16,23,33,28,2,64,32,14,65,0,72,13,0,32,14,65,1,106,33,23,32,25,32,14,65,3,116,106,33,2,32,25,65,224,3,106,32,14,65,2,116,106,33,22,3,64,32,2,32,28,32,22,40,2,0,183,162,57,3,0,32,2,65,120,106,33,2,32,22,65,124,106,33,22,32,28,68,0,0,0,0,0,0,112,62,162,33,28,32,23,65,127,106,34,23,65,0,74,13,0,11,32,14,65,0,72,13,0,32,25,32,14,65,3,116,106,33,13,32,14,33,2,3,64,32,14,32,2,34,3,107,33,21,68,0,0,0,0,0,0,0,0,33,28,65,0,33,2,65,0,33,22,2,64,3,64,32,28,32,2,65,160,23,106,43,3,0,32,13,32,2,106,43,3,0,162,160,33,28,32,22,32,5,78,13,1,32,2,65,8,106,33,2,32,22,32,21,72,33,23,32,22,65,1,106,33,22,32,23,13,0,11,11,32,25,65,160,1,106,32,21,65,3,116,106,32,28,57,3,0,32,13,65,120,106,33,13,32,3,65,127,106,33,2,32,3,65,0,74,13,0,11,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,127,106,65,2,73,13,0,32,4,69,13,1,32,4,65,3,71,13,9,68,0,0,0,0,0,0,0,0,33,29,2,64,32,14,65,1,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,1,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,2,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,29,3,64,32,29,32,2,43,3,0,160,33,29,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,2,74,13,0,11,11,32,25,43,3,160,1,33,28,32,20,69,13,4,32,1,32,28,154,57,3,0,32,1,32,25,43,3,168,1,154,57,3,8,32,29,154,33,29,12,5,11,32,14,65,0,72,13,1,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,3,11,0,11,32,14,65,0,72,13,4,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,6,11,0,11,68,0,0,0,0,0,0,0,0,33,28,11,32,1,32,28,154,32,28,32,20,27,57,3,0,32,25,43,3,160,1,32,28,161,33,28,2,64,32,14,65,1,72,13,0,32,25,65,160,1,106,65,8,114,33,2,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,8,106,33,2,32,14,65,127,106,34,14,13,0,11,11,32,28,154,32,28,32,20,27,33,29,32,1,65,8,106,33,1,12,4,11,32,1,32,28,57,3,0,32,1,32,25,41,3,168,1,55,3,8,11,32,1,65,16,106,33,1,12,2,11,68,0,0,0,0,0,0,0,0,33,28,11,32,28,154,32,28,32,20,27,33,29,11,32,1,32,29,57,3,0,11,65,0,32,25,65,176,4,106,54,2,4,32,19,65,7,113,11,11,181,129,128,128,0,0,2,124,2,64,2,64,2,64,2,64,32,1,65,128,8,72,13,0,32,0,68,0,0,0,0,0,0,224,127,162,33,0,32,1,65,255,15,72,13,1,32,1,65,130,112,106,34,1,65,255,7,32,1,65,255,7,72,27,33,1,32,0,68,0,0,0,0,0,0,224,127,162,33,0,12,3,11,32,1,65,129,120,74,13,2,32,0,68,0,0,0,0,0,0,96,3,162,33,0,32,1,65,184,112,74,13,1,32,1,65,146,15,106,34,1,65,130,120,32,1,65,130,120,74,27,33,1,32,0,68,0,0,0,0,0,0,96,3,162,33,0,12,2,11,32,1,65,129,120,106,33,1,12,1,11,32,1,65,201,7,106,33,1,11,32,0,32,1,65,255,7,106,173,66,52,134,191,162,11,11,184,129,128,128,0,3,3,127,1,126,1,124,2,124,65,0,40,2,4,65,16,107,33,3,2,64,32,0,68,0,0,0,0,0,0,0,0,97,13,0,32,0,189,34,4,66,52,136,167,65,255,15,113,34,1,65,178,8,75,13,0,68,0,0,0,0,0,0,48,67,68,0,0,0,0,0,0,48,195,32,4,66,0,83,34,2,27,68,0,0,0,0,0,0,48,195,68,0,0,0,0,0,0,48,67,32,2,27,32,0,160,160,32,0,161,33,5,2,64,32,1,65,254,7,75,13,0,32,3,32,5,57,3,8,32,4,66,63,135,167,183,15,11,32,5,32,0,160,33,0,32,5,68,0,0,0,0,0,0,0,0,101,32,5,32,5,98,114,13,0,32,0,68,0,0,0,0,0,0,240,191,160,33,0,11,32,0,11,11,237,184,128,128,0,1,13,127,2,127,65,0,65,0,40,2,4,65,16,107,34,13,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,244,1,75,13,0,65,0,40,2,224,23,34,7,65,16,32,0,65,11,106,65,120,113,32,0,65,11,73,27,34,6,65,3,118,34,10,118,34,0,65,3,113,69,13,1,32,0,65,127,115,65,1,113,32,10,106,34,11,65,3,116,34,6,65,144,24,106,40,2,0,34,10,40,2,8,34,0,32,6,65,136,24,106,34,6,70,13,2,65,0,40,2,240,23,32,0,75,13,39,32,0,40,2,12,32,10,71,13,39,32,6,65,8,106,32,0,54,2,0,32,0,65,12,106,32,6,54,2,0,12,3,11,65,127,33,6,32,0,65,191,127,75,13,15,32,0,65,11,106,34,0,65,120,113,33,6,65,0,40,2,228,23,34,3,69,13,15,65,0,33,8,2,64,32,0,65,8,118,34,0,69,13,0,65,31,33,8,32,6,65,255,255,255,7,75,13,0,32,6,65,14,32,0,32,0,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,0,65,128,224,31,106,65,16,118,65,4,113,34,11,32,10,114,32,0,32,11,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,8,11,65,0,32,6,107,33,11,32,8,65,2,116,65,144,26,106,40,2,0,34,10,69,13,3,32,6,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,9,65,0,33,0,65,0,33,12,3,64,2,64,32,10,40,2,4,65,120,113,32,6,107,34,7,32,11,79,13,0,32,7,33,11,32,10,33,12,32,7,69,13,8,11,32,0,32,10,65,20,106,40,2,0,34,7,32,7,32,10,32,9,65,29,118,65,4,113,106,65,16,106,40,2,0,34,10,70,27,32,0,32,7,27,33,0,32,9,32,10,65,0,71,116,33,9,32,10,13,0,11,32,0,32,12,114,69,13,4,12,12,11,32,6,65,0,40,2,232,23,34,3,77,13,14,32,0,69,13,4,32,0,32,10,116,65,2,32,10,116,34,0,65,0,32,0,107,114,113,34,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,34,11,65,3,116,34,12,65,144,24,106,40,2,0,34,0,40,2,8,34,10,32,12,65,136,24,106,34,12,70,13,6,65,0,40,2,240,23,32,10,75,13,37,32,10,40,2,12,32,0,71,13,37,32,12,65,8,106,32,10,54,2,0,32,10,65,12,106,32,12,54,2,0,12,7,11,65,0,32,7,65,126,32,11,119,113,54,2,224,23,11,32,10,65,8,106,33,0,32,10,32,11,65,3,116,34,11,65,3,114,54,2,4,32,10,32,11,106,34,10,32,10,40,2,4,65,1,114,54,2,4,12,34,11,65,0,33,0,65,0,33,12,65,0,65,0,114,13,8,11,65,0,33,12,32,3,65,2,32,8,116,34,0,65,0,32,0,107,114,113,34,0,69,13,10,32,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,9,32,0,114,32,10,32,9,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,0,13,8,12,9,11,65,0,40,2,228,23,34,5,69,13,9,32,5,65,0,32,5,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,11,40,2,4,65,120,113,32,6,107,33,10,2,64,32,11,65,16,106,32,11,40,2,16,69,65,2,116,106,40,2,0,34,0,69,13,0,3,64,32,0,40,2,4,65,120,113,32,6,107,34,12,32,10,32,12,32,10,73,34,12,27,33,10,32,0,32,11,32,12,27,33,11,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,12,33,0,32,12,13,0,11,11,65,0,40,2,240,23,34,1,32,11,75,13,32,32,11,32,6,106,34,2,32,11,77,13,32,32,11,40,2,24,33,4,32,11,40,2,12,34,9,32,11,70,13,3,32,1,32,11,40,2,8,34,0,75,13,32,32,0,40,2,12,32,11,71,13,32,32,9,40,2,8,32,11,71,13,32,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,4,13,4,12,5,11,65,0,33,11,32,10,33,12,32,10,33,0,12,6,11,65,0,32,7,65,126,32,11,119,113,34,7,54,2,224,23,11,32,0,32,6,65,3,114,54,2,4,32,0,32,6,106,34,12,32,11,65,3,116,34,10,32,6,107,34,11,65,1,114,54,2,4,32,0,32,10,106,32,11,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,9,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,10,2,64,2,64,32,7,65,1,32,9,116,34,9,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,9,77,13,1,12,32,11,65,0,32,7,32,9,114,54,2,224,23,32,6,33,9,11,32,9,32,10,54,2,12,32,6,65,8,106,32,10,54,2,0,32,10,32,6,54,2,12,32,10,32,9,54,2,8,11,32,0,65,8,106,33,0,65,0,32,12,54,2,244,23,65,0,32,11,54,2,232,23,12,28,11,2,64,2,64,32,11,65,20,106,34,12,40,2,0,34,0,13,0,32,11,40,2,16,34,0,69,13,1,32,11,65,16,106,33,12,11,3,64,32,12,33,8,32,0,34,9,65,20,106,34,12,40,2,0,34,0,13,0,32,9,65,16,106,33,12,32,9,40,2,16,34,0,13,0,11,32,1,32,8,75,13,29,32,8,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,9,32,4,69,13,1,11,2,64,2,64,2,64,32,11,32,11,40,2,28,34,12,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,4,75,13,30,32,4,65,16,106,32,4,40,2,16,32,11,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,12,32,9,75,13,28,32,9,32,4,54,2,24,2,64,32,11,40,2,16,34,0,69,13,0,32,12,32,0,75,13,29,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,11,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,28,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,5,65,126,32,12,119,113,54,2,228,23,11,2,64,2,64,32,10,65,15,75,13,0,32,11,32,10,32,6,106,34,0,65,3,114,54,2,4,32,11,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,11,32,6,65,3,114,54,2,4,32,2,32,10,65,1,114,54,2,4,32,2,32,10,106,32,10,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,12,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,0,2,64,2,64,32,7,65,1,32,12,116,34,12,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,12,77,13,1,12,30,11,65,0,32,7,32,12,114,54,2,224,23,32,6,33,12,11,32,12,32,0,54,2,12,32,6,65,8,106,32,0,54,2,0,32,0,32,6,54,2,12,32,0,32,12,54,2,8,11,65,0,32,2,54,2,244,23,65,0,32,10,54,2,232,23,11,32,11,65,8,106,33,0,12,25,11,32,0,69,13,1,11,3,64,32,0,40,2,4,65,120,113,32,6,107,34,10,32,11,32,10,32,11,73,34,10,27,33,11,32,0,32,12,32,10,27,33,12,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,10,33,0,32,10,13,0,11,11,32,12,69,13,0,32,11,65,0,40,2,232,23,32,6,107,79,13,0,65,0,40,2,240,23,34,4,32,12,75,13,23,32,12,32,6,106,34,8,32,12,77,13,23,32,12,40,2,24,33,5,32,12,40,2,12,34,9,32,12,70,13,1,32,4,32,12,40,2,8,34,0,75,13,23,32,0,40,2,12,32,12,71,13,23,32,9,40,2,8,32,12,71,13,23,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,5,13,20,12,21,11,2,64,2,64,2,64,2,64,2,64,2,64,65,0,40,2,232,23,34,0,32,6,79,13,0,65,0,40,2,236,23,34,12,32,6,77,13,1,65,0,40,2,248,23,34,0,32,6,106,34,10,32,12,32,6,107,34,11,65,1,114,54,2,4,65,0,32,11,54,2,236,23,65,0,32,10,54,2,248,23,32,0,32,6,65,3,114,54,2,4,32,0,65,8,106,33,0,12,27,11,65,0,40,2,244,23,33,10,32,0,32,6,107,34,11,65,16,73,13,1,32,10,32,6,106,34,12,32,11,65,1,114,54,2,4,32,10,32,0,106,32,11,54,2,0,65,0,32,11,54,2,232,23,65,0,32,12,54,2,244,23,32,10,32,6,65,3,114,54,2,4,12,2,11,65,0,40,2,184,27,69,13,2,65,0,40,2,192,27,33,10,12,3,11,32,10,32,0,65,3,114,54,2,4,32,10,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,65,0,65,0,54,2,244,23,65,0,65,0,54,2,232,23,11,32,10,65,8,106,33,0,12,23,11,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,13,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,65,128,128,4,33,10,11,65,0,33,0,32,10,32,6,65,47,106,34,3,106,34,7,65,0,32,10,107,34,8,113,34,9,32,6,77,13,21,65,0,33,0,2,64,65,0,40,2,152,27,34,10,69,13,0,65,0,40,2,144,27,34,11,32,9,106,34,5,32,11,77,13,22,32,5,32,10,75,13,22,11,65,0,45,0,156,27,65,4,113,13,8,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,32,10,75,13,4,11,32,0,40,2,8,34,0,13,0,11,11,65,0,16,27,34,12,65,127,70,13,7,32,9,33,7,2,64,65,0,40,2,188,27,34,0,65,127,106,34,10,32,12,113,69,13,0,32,9,32,12,107,32,10,32,12,106,65,0,32,0,107,113,106,33,7,11,32,7,32,6,77,13,7,32,7,65,254,255,255,255,7,75,13,7,2,64,65,0,40,2,152,27,34,0,69,13,0,65,0,40,2,144,27,34,10,32,7,106,34,11,32,10,77,13,8,32,11,32,0,75,13,8,11,32,7,16,27,34,0,32,12,71,13,2,12,9,11,2,64,32,12,65,20,106,34,10,40,2,0,34,0,13,0,32,12,40,2,16,34,0,69,13,3,32,12,65,16,106,33,10,11,3,64,32,10,33,7,32,0,34,9,65,20,106,34,10,40,2,0,34,0,13,0,32,9,65,16,106,33,10,32,9,40,2,16,34,0,13,0,11,32,4,32,7,75,13,21,32,7,65,0,54,2,0,32,5,69,13,19,12,18,11,32,7,32,12,107,32,8,113,34,7,65,254,255,255,255,7,75,13,5,32,7,16,27,34,12,32,0,40,2,0,32,0,65,4,106,40,2,0,106,70,13,3,32,12,33,0,11,32,0,33,12,32,6,65,48,106,32,7,77,13,1,32,7,65,254,255,255,255,7,75,13,1,32,12,65,127,70,13,1,32,3,32,7,107,65,0,40,2,192,27,34,0,106,65,0,32,0,107,113,34,0,65,254,255,255,255,7,75,13,6,32,0,16,27,65,127,70,13,3,32,0,32,7,106,33,7,12,6,11,65,0,33,9,32,5,13,15,12,16,11,32,12,65,127,71,13,4,12,2,11,32,12,65,127,71,13,3,12,1,11,65,0,32,7,107,16,27,26,11,65,0,65,0,40,2,156,27,65,4,114,54,2,156,27,11,32,9,65,254,255,255,255,7,75,13,1,32,9,16,27,34,12,65,0,16,27,34,0,79,13,1,32,12,65,127,70,13,1,32,0,65,127,70,13,1,32,0,32,12,107,34,7,32,6,65,40,106,77,13,1,11,65,0,65,0,40,2,144,27,32,7,106,34,0,54,2,144,27,2,64,32,0,65,0,40,2,148,27,77,13,0,65,0,32,0,54,2,148,27,11,2,64,2,64,2,64,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,32,12,32,0,40,2,0,34,11,32,0,40,2,4,34,9,106,70,13,2,32,0,40,2,8,34,0,13,0,12,3,11,0,11,2,64,2,64,65,0,40,2,240,23,34,0,69,13,0,32,12,32,0,79,13,1,11,65,0,32,12,54,2,240,23,11,65,0,32,7,54,2,164,27,65,0,32,12,54,2,160,27,65,0,65,127,54,2,128,24,65,0,65,136,24,54,2,148,24,65,0,65,136,24,54,2,144,24,65,0,65,144,24,54,2,156,24,65,0,65,144,24,54,2,152,24,65,0,65,152,24,54,2,164,24,65,0,65,152,24,54,2,160,24,65,0,65,160,24,54,2,172,24,65,0,65,160,24,54,2,168,24,65,0,65,168,24,54,2,180,24,65,0,65,168,24,54,2,176,24,65,0,65,176,24,54,2,188,24,65,0,65,176,24,54,2,184,24,65,0,65,184,24,54,2,196,24,65,0,65,0,40,2,184,27,54,2,132,24,65,0,65,0,54,2,172,27,65,0,65,192,24,54,2,204,24,65,0,65,184,24,54,2,192,24,65,0,65,192,24,54,2,200,24,65,0,65,200,24,54,2,212,24,65,0,65,200,24,54,2,208,24,65,0,65,208,24,54,2,220,24,65,0,65,208,24,54,2,216,24,65,0,65,216,24,54,2,228,24,65,0,65,216,24,54,2,224,24,65,0,65,224,24,54,2,236,24,65,0,65,224,24,54,2,232,24,65,0,65,232,24,54,2,244,24,65,0,65,232,24,54,2,240,24,65,0,65,240,24,54,2,252,24,65,0,65,240,24,54,2,248,24,65,0,65,248,24,54,2,132,25,65,0,65,248,24,54,2,128,25,65,0,65,128,25,54,2,140,25,65,0,65,128,25,54,2,136,25,65,0,65,136,25,54,2,144,25,65,0,65,136,25,54,2,148,25,65,0,65,144,25,54,2,156,25,65,0,65,144,25,54,2,152,25,65,0,65,152,25,54,2,164,25,65,0,65,152,25,54,2,160,25,65,0,65,160,25,54,2,172,25,65,0,65,160,25,54,2,168,25,65,0,65,168,25,54,2,180,25,65,0,65,168,25,54,2,176,25,65,0,65,176,25,54,2,188,25,65,0,65,176,25,54,2,184,25,65,0,65,184,25,54,2,196,25,65,0,65,184,25,54,2,192,25,65,0,65,192,25,54,2,204,25,65,0,65,192,25,54,2,200,25,65,0,65,200,25,54,2,212,25,65,0,65,200,25,54,2,208,25,65,0,65,208,25,54,2,220,25,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,10,32,7,65,88,106,34,11,32,0,107,34,0,65,1,114,54,2,4,65,0,65,216,25,54,2,228,25,65,0,65,208,25,54,2,216,25,65,0,65,216,25,54,2,224,25,65,0,65,224,25,54,2,236,25,65,0,65,224,25,54,2,232,25,65,0,65,232,25,54,2,244,25,65,0,65,232,25,54,2,240,25,65,0,65,240,25,54,2,252,25,65,0,65,240,25,54,2,248,25,65,0,65,248,25,54,2,132,26,65,0,65,248,25,54,2,128,26,65,0,65,128,26,54,2,140,26,65,0,65,128,26,54,2,136,26,65,0,32,10,54,2,248,23,65,0,32,0,54,2,236,23,32,12,32,11,106,65,40,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,12,2,11,32,0,45,0,12,65,8,113,13,0,32,12,32,10,77,13,0,32,11,32,10,75,13,0,32,10,65,120,32,10,107,65,7,113,65,0,32,10,65,8,106,65,7,113,27,34,11,106,34,12,65,0,40,2,236,23,32,7,106,34,8,32,11,107,34,11,65,1,114,54,2,4,32,0,65,4,106,32,9,32,7,106,54,2,0,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,11,54,2,236,23,65,0,32,12,54,2,248,23,32,10,32,8,106,65,40,54,2,4,12,1,11,2,64,32,12,65,0,40,2,240,23,34,9,79,13,0,65,0,32,12,54,2,240,23,32,12,33,9,11,32,12,32,7,106,33,11,65,160,27,33,0,2,64,2,64,2,64,2,64,2,64,2,64,2,64,3,64,32,0,40,2,0,32,11,70,13,1,32,0,40,2,8,34,0,13,0,12,2,11,0,11,32,0,45,0,12,65,8,113,13,0,32,0,32,12,54,2,0,32,0,32,0,40,2,4,32,7,106,54,2,4,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,106,34,8,32,6,65,3,114,54,2,4,32,11,65,120,32,11,107,65,7,113,65,0,32,11,65,8,106,65,7,113,27,106,34,12,32,8,107,32,6,107,33,0,32,8,32,6,106,33,11,32,10,32,12,70,13,1,65,0,40,2,244,23,32,12,70,13,8,32,12,40,2,4,34,5,65,3,113,65,1,71,13,14,32,5,65,255,1,75,13,9,32,12,40,2,12,33,10,2,64,32,12,40,2,8,34,6,32,5,65,3,118,34,3,65,3,116,65,136,24,106,34,7,70,13,0,32,9,32,6,75,13,20,32,6,40,2,12,32,12,71,13,20,11,32,10,32,6,70,13,10,2,64,32,10,32,7,70,13,0,32,9,32,10,75,13,20,32,10,40,2,8,32,12,71,13,20,11,32,6,32,10,54,2,12,32,10,65,8,106,32,6,54,2,0,12,13,11,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,34,11,32,10,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,8,32,7,65,88,106,34,9,32,0,107,34,0,65,1,114,54,2,4,32,12,32,9,106,65,40,54,2,4,32,10,32,11,65,39,32,11,107,65,7,113,65,0,32,11,65,89,106,65,7,113,27,106,65,81,106,34,9,32,9,32,10,65,16,106,73,27,34,9,65,27,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,0,54,2,236,23,65,0,32,8,54,2,248,23,32,9,65,16,106,65,0,40,2,168,27,54,2,0,32,9,65,12,106,65,0,40,2,164,27,54,2,0,32,9,65,0,40,2,160,27,54,2,8,32,9,65,20,106,65,0,40,2,172,27,54,2,0,65,0,32,12,54,2,160,27,65,0,32,7,54,2,164,27,65,0,32,9,65,8,106,54,2,168,27,65,0,65,0,54,2,172,27,32,9,65,28,106,33,0,3,64,32,0,65,7,54,2,0,32,0,65,4,106,34,0,32,11,73,13,0,11,32,9,32,10,70,13,5,32,9,65,4,106,34,0,32,0,40,2,0,65,126,113,54,2,0,32,9,32,9,32,10,107,34,7,54,2,0,32,10,32,7,65,1,114,54,2,4,2,64,32,7,65,255,1,75,13,0,32,7,65,3,118,34,11,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,12,65,1,32,11,116,34,11,113,69,13,2,65,0,40,2,240,23,32,0,40,2,8,34,11,77,13,3,12,19,11,65,0,33,0,2,64,32,7,65,8,118,34,11,69,13,0,65,31,33,0,32,7,65,255,255,255,7,75,13,0,32,7,65,14,32,11,32,11,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,11,65,128,224,31,106,65,16,118,65,4,113,34,12,32,0,114,32,11,32,12,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,11,114,107,32,0,32,11,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,11,32,10,66,0,55,2,16,32,10,65,28,106,32,0,54,2,0,32,0,65,2,116,65,144,26,106,33,11,65,0,40,2,228,23,34,12,65,1,32,0,116,34,9,113,69,13,3,32,7,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,11,40,2,0,33,12,3,64,32,12,34,11,40,2,4,65,120,113,32,7,70,13,5,32,0,65,29,118,33,12,32,0,65,1,116,33,0,32,11,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,18,32,9,32,10,54,2,0,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,12,32,10,32,10,54,2,8,12,5,11,65,0,32,11,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,11,32,0,65,1,114,54,2,4,12,13,11,65,0,32,12,32,11,114,54,2,224,23,32,0,33,11,11,32,11,32,10,54,2,12,32,0,65,8,106,32,10,54,2,0,32,10,32,0,54,2,12,32,10,32,11,54,2,8,12,2,11,32,11,32,10,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,8,32,10,32,10,54,2,12,12,1,11,65,0,40,2,240,23,34,12,32,11,40,2,8,34,0,75,13,13,32,12,32,11,75,13,13,32,0,32,10,54,2,12,32,11,65,8,106,32,10,54,2,0,32,10,32,11,54,2,12,32,10,65,24,106,65,0,54,2,0,32,10,32,0,54,2,8,11,65,0,40,2,236,23,34,0,32,6,77,13,0,65,0,40,2,248,23,34,10,32,6,106,34,11,32,0,32,6,107,34,0,65,1,114,54,2,4,65,0,32,0,54,2,236,23,65,0,32,11,54,2,248,23,32,10,32,6,65,3,114,54,2,4,32,10,65,8,106,33,0,12,11,11,16,28,65,12,54,2,0,65,0,33,0,12,10,11,32,11,65,0,40,2,232,23,32,0,106,34,0,65,1,114,54,2,4,65,0,32,11,54,2,244,23,65,0,32,0,54,2,232,23,32,11,32,0,106,32,0,54,2,0,12,6,11,32,12,40,2,24,33,4,32,12,40,2,12,34,7,32,12,70,13,1,32,9,32,12,40,2,8,34,10,75,13,9,32,10,40,2,12,32,12,71,13,9,32,7,40,2,8,32,12,71,13,9,32,7,65,8,106,32,10,54,2,0,32,10,65,12,106,32,7,54,2,0,32,4,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,3,119,113,54,2,224,23,12,2,11,2,64,2,64,32,12,65,20,106,34,6,40,2,0,34,10,13,0,32,12,65,16,106,34,6,40,2,0,34,10,69,13,1,11,3,64,32,6,33,3,32,10,34,7,65,20,106,34,6,40,2,0,34,10,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,10,13,0,11,32,9,32,3,75,13,8,32,3,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,7,32,4,69,13,1,11,2,64,2,64,2,64,32,12,40,2,28,34,6,65,2,116,65,144,26,106,34,10,40,2,0,32,12,70,13,0,65,0,40,2,240,23,32,4,75,13,9,32,4,65,16,106,32,4,40,2,16,32,12,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,10,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,7,32,7,32,4,54,2,24,2,64,32,12,40,2,16,34,10,69,13,0,32,6,32,10,75,13,8,32,7,32,10,54,2,16,32,10,32,7,54,2,24,11,32,12,65,20,106,40,2,0,34,10,69,13,1,65,0,40,2,240,23,32,10,75,13,7,32,7,65,20,106,32,10,54,2,0,32,10,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,5,65,120,113,34,10,32,0,106,33,0,32,12,32,10,106,33,12,11,32,12,32,12,40,2,4,65,126,113,54,2,4,32,11,32,0,65,1,114,54,2,4,32,11,32,0,106,32,0,54,2,0,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,9,32,0,65,8,106,33,6,12,2,11,65,0,33,10,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,10,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,12,32,10,114,32,6,32,12,116,34,10,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,10,32,6,116,65,15,118,106,34,10,65,7,106,118,65,1,113,32,10,65,1,116,114,33,10,11,32,11,32,10,54,2,28,32,11,66,0,55,2,16,32,10,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,12,65,1,32,10,116,34,9,113,69,13,2,32,0,65,0,65,25,32,10,65,1,118,107,32,10,65,31,70,27,116,33,10,32,6,40,2,0,33,12,3,64,32,12,34,6,40,2,4,65,120,113,32,0,70,13,4,32,10,65,29,118,33,12,32,10,65,1,116,33,10,32,6,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,8,32,9,32,11,54,2,0,32,11,32,6,54,2,24,32,11,32,11,54,2,12,32,11,32,11,54,2,8,12,4,11,65,0,32,6,32,10,114,54,2,224,23,32,0,65,8,106,33,6,32,0,33,10,11,32,10,32,11,54,2,12,32,6,32,11,54,2,0,32,11,32,0,54,2,12,32,11,32,10,54,2,8,12,2,11,32,6,32,11,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,11,32,6,54,2,24,32,11,32,11,54,2,8,32,11,32,11,54,2,12,12,1,11,65,0,40,2,240,23,34,10,32,6,40,2,8,34,0,75,13,4,32,10,32,6,75,13,4,32,0,32,11,54,2,12,32,6,65,8,106,32,11,54,2,0,32,11,65,0,54,2,24,32,11,32,6,54,2,12,32,11,32,0,54,2,8,11,32,8,65,8,106,33,0,12,2,11,2,64,2,64,2,64,32,12,32,12,40,2,28,34,10,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,5,75,13,5,32,5,65,16,106,32,5,40,2,16,32,12,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,10,32,9,75,13,3,32,9,32,5,54,2,24,2,64,32,12,40,2,16,34,0,69,13,0,32,10,32,0,75,13,4,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,12,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,3,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,3,65,126,32,10,119,113,34,3,54,2,228,23,11,2,64,2,64,32,11,65,15,75,13,0,32,12,32,11,32,6,106,34,0,65,3,114,54,2,4,32,12,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,12,32,6,65,3,114,54,2,4,32,8,32,11,65,1,114,54,2,4,32,8,32,11,106,32,11,54,2,0,2,64,2,64,2,64,2,64,2,64,32,11,65,255,1,75,13,0,32,11,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,11,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,7,32,0,65,8,106,33,11,12,2,11,32,11,65,8,118,34,10,69,13,2,65,31,33,0,32,11,65,255,255,255,7,75,13,3,32,11,65,14,32,10,32,10,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,10,65,128,224,31,106,65,16,118,65,4,113,34,6,32,0,114,32,10,32,6,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,12,3,11,65,0,32,11,32,10,114,54,2,224,23,32,0,65,8,106,33,11,32,0,33,10,11,32,10,32,8,54,2,12,32,11,32,8,54,2,0,32,8,32,0,54,2,12,32,8,32,10,54,2,8,12,2,11,65,0,33,0,11,32,8,32,0,54,2,28,32,8,66,0,55,2,16,32,0,65,2,116,65,144,26,106,33,10,2,64,2,64,32,3,65,1,32,0,116,34,6,113,69,13,0,32,11,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,10,40,2,0,33,6,3,64,32,6,34,10,40,2,4,65,120,113,32,11,70,13,2,32,0,65,29,118,33,6,32,0,65,1,116,33,0,32,10,32,6,65,4,113,106,65,16,106,34,9,40,2,0,34,6,13,0,11,65,0,40,2,240,23,32,9,75,13,4,32,9,32,8,54,2,0,32,8,32,10,54,2,24,32,8,32,8,54,2,12,32,8,32,8,54,2,8,12,2,11,32,10,32,8,54,2,0,65,0,32,3,32,6,114,54,2,228,23,32,8,32,10,54,2,24,32,8,32,8,54,2,8,32,8,32,8,54,2,12,12,1,11,65,0,40,2,240,23,34,11,32,10,40,2,8,34,0,75,13,2,32,11,32,10,75,13,2,32,0,32,8,54,2,12,32,10,65,8,106,32,8,54,2,0,32,8,65,0,54,2,24,32,8,32,10,54,2,12,32,8,32,0,54,2,8,11,32,12,65,8,106,33,0,11,65,0,32,13,65,16,106,54,2,4,32,0,15,11,16,26,0,11,11,137,128,128,128,0,0,16,28,40,2,0,16,0,11,128,129,128,128,0,1,3,127,2,127,2,64,2,64,2,64,2,64,32,0,65,0,72,13,0,63,0,65,16,116,33,1,65,0,40,2,212,27,34,2,32,0,79,13,1,32,0,65,127,106,32,2,107,65,16,118,65,1,106,64,0,69,13,3,16,1,65,0,63,0,65,16,116,34,3,32,1,107,65,0,40,2,212,27,106,34,2,54,2,212,27,12,2,11,65,127,15,11,32,1,33,3,11,65,0,32,2,32,0,107,54,2,212,27,32,3,32,2,107,15,11,16,28,65,12,54,2,0,16,26,0,11,11,133,128,128,128,0,0,65,208,27,11,232,144,128,128,0,1,8,127,2,64,2,64,2,64,2,64,32,0,69,13,0,2,64,2,64,2,64,2,64,32,0,65,120,106,34,3,65,0,40,2,240,23,34,5,73,13,0,32,0,65,124,106,40,2,0,34,8,65,3,113,34,6,65,1,70,13,0,32,3,32,8,65,120,113,34,0,106,33,1,2,64,2,64,32,8,65,1,113,13,0,32,6,69,13,6,32,3,32,3,40,2,0,34,8,107,34,3,32,5,73,13,2,32,8,32,0,106,33,0,2,64,2,64,2,64,2,64,2,64,65,0,40,2,244,23,32,3,70,13,0,32,8,65,255,1,75,13,1,32,3,40,2,12,33,6,2,64,32,3,40,2,8,34,7,32,8,65,3,118,34,4,65,3,116,65,136,24,106,34,8,70,13,0,32,5,32,7,75,13,14,32,7,40,2,12,32,3,71,13,14,11,32,6,32,7,70,13,2,2,64,32,6,32,8,70,13,0,32,5,32,6,75,13,14,32,6,40,2,8,32,3,71,13,14,11,32,7,32,6,54,2,12,32,6,65,8,106,32,7,54,2,0,32,3,32,1,73,13,6,12,7,11,32,1,40,2,4,34,8,65,3,113,65,3,71,13,4,32,1,65,4,106,32,8,65,126,113,54,2,0,32,3,32,0,65,1,114,54,2,4,65,0,32,0,54,2,232,23,32,3,32,0,106,32,0,54,2,0,15,11,32,3,40,2,24,33,2,32,3,40,2,12,34,7,32,3,70,13,1,32,5,32,3,40,2,8,34,8,75,13,11,32,8,40,2,12,32,3,71,13,11,32,7,40,2,8,32,3,71,13,11,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,4,119,113,54,2,224,23,32,3,32,1,73,13,3,12,4,11,2,64,2,64,32,3,65,20,106,34,8,40,2,0,34,6,13,0,32,3,65,16,106,34,8,40,2,0,34,6,69,13,1,11,3,64,32,8,33,4,32,6,34,7,65,20,106,34,8,40,2,0,34,6,13,0,32,7,65,16,106,33,8,32,7,40,2,16,34,6,13,0,11,32,5,32,4,75,13,10,32,4,65,0,54,2,0,32,2,69,13,2,12,1,11,65,0,33,7,32,2,69,13,1,11,2,64,2,64,2,64,32,3,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,3,70,13,0,65,0,40,2,240,23,32,2,75,13,11,32,2,65,16,106,32,2,40,2,16,32,3,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,9,32,7,32,2,54,2,24,2,64,32,3,40,2,16,34,8,69,13,0,32,6,32,8,75,13,10,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,3,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,9,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,32,3,32,1,73,13,2,12,3,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,1,79,13,1,11,32,1,40,2,4,34,4,65,1,113,69,13,0,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,2,113,13,0,65,0,40,2,248,23,32,1,70,13,1,65,0,40,2,244,23,32,1,70,13,2,32,4,65,255,1,75,13,3,32,1,40,2,12,33,8,2,64,32,1,40,2,8,34,6,32,4,65,3,118,34,5,65,3,116,65,136,24,106,34,7,70,13,0,65,0,40,2,240,23,32,6,75,13,13,32,6,40,2,12,32,1,71,13,13,11,32,8,32,6,70,13,4,2,64,32,8,32,7,70,13,0,65,0,40,2,240,23,32,8,75,13,13,32,8,40,2,8,32,1,71,13,13,11,32,6,32,8,54,2,12,32,8,65,8,106,32,6,54,2,0,12,8,11,32,1,65,4,106,32,4,65,126,113,54,2,0,32,3,32,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,12,8,11,65,0,32,3,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,3,32,0,65,1,114,54,2,4,2,64,32,3,65,0,40,2,244,23,71,13,0,65,0,65,0,54,2,232,23,65,0,65,0,54,2,244,23,11,32,0,65,0,40,2,252,23,77,13,8,65,0,16,30,26,15,11,65,0,32,3,54,2,244,23,65,0,65,0,40,2,232,23,32,0,106,34,0,54,2,232,23,32,3,32,0,65,1,114,54,2,4,32,3,32,0,106,32,0,54,2,0,15,11,32,1,40,2,24,33,2,32,1,40,2,12,34,7,32,1,70,13,1,65,0,40,2,240,23,32,1,40,2,8,34,8,75,13,8,32,8,40,2,12,32,1,71,13,8,32,7,40,2,8,32,1,71,13,8,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,3,12,4,11,65,0,65,0,40,2,224,23,65,126,32,5,119,113,54,2,224,23,12,3,11,2,64,2,64,32,1,65,20,106,34,6,40,2,0,34,8,13,0,32,1,65,16,106,34,6,40,2,0,34,8,69,13,1,11,3,64,32,6,33,5,32,8,34,7,65,20,106,34,6,40,2,0,34,8,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,8,13,0,11,65,0,40,2,240,23,32,5,75,13,7,32,5,65,0,54,2,0,32,2,69,13,3,12,2,11,65,0,33,7,32,2,13,1,12,2,11,16,28,26,16,28,65,14,54,2,0,16,26,0,11,2,64,2,64,2,64,32,1,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,1,70,13,0,65,0,40,2,240,23,32,2,75,13,7,32,2,65,16,106,32,2,40,2,16,32,1,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,5,32,7,32,2,54,2,24,2,64,32,1,40,2,16,34,8,69,13,0,32,6,32,8,75,13,6,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,1,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,5,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,4,65,120,113,32,0,106,34,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,32,3,65,0,40,2,244,23,71,13,0,65,0,32,0,54,2,232,23,15,11,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,8,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,8,116,34,8,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,8,77,13,2,12,8,11,65,0,33,8,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,8,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,8,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,7,32,8,114,32,6,32,7,116,34,8,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,8,32,6,116,65,15,118,106,34,8,65,7,106,118,65,1,113,32,8,65,1,116,114,33,8,11,32,3,66,0,55,2,16,32,3,65,28,106,32,8,54,2,0,32,8,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,7,65,1,32,8,116,34,1,113,69,13,2,32,0,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,8,32,6,40,2,0,33,7,3,64,32,7,34,6,40,2,4,65,120,113,32,0,70,13,4,32,8,65,29,118,33,7,32,8,65,1,116,33,8,32,6,32,7,65,4,113,106,65,16,106,34,1,40,2,0,34,7,13,0,11,65,0,40,2,240,23,32,1,75,13,7,32,1,32,3,54,2,0,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,12,32,3,32,3,54,2,8,12,4,11,65,0,32,6,32,8,114,54,2,224,23,32,0,33,8,11,32,8,32,3,54,2,12,32,0,65,8,106,32,3,54,2,0,32,3,32,0,54,2,12,32,3,32,8,54,2,8,15,11,32,6,32,3,54,2,0,65,0,32,7,32,1,114,54,2,228,23,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,8,32,3,32,3,54,2,12,12,1,11,65,0,40,2,240,23,34,8,32,6,40,2,8,34,0,75,13,3,32,8,32,6,75,13,3,32,0,32,3,54,2,12,32,6,65,8,106,32,3,54,2,0,32,3,32,6,54,2,12,32,3,65,24,106,65,0,54,2,0,32,3,32,0,54,2,8,11,65,0,65,0,40,2,128,24,65,127,106,34,3,54,2,128,24,32,3,69,13,1,11,15,11,65,168,27,33,3,3,64,32,3,40,2,0,34,0,65,8,106,33,3,32,0,13,0,11,65,0,65,127,54,2,128,24,15,11,16,26,0,0,11,0,11,240,131,128,128,0,1,7,127,2,127,65,0,65,0,40,2,4,65,16,107,34,7,54,2,4,65,0,33,6,2,64,65,0,40,2,184,27,13,0,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,7,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,11,2,64,32,0,65,191,127,75,13,0,65,0,33,6,65,0,40,2,248,23,34,1,69,13,0,65,0,33,6,2,64,65,0,40,2,236,23,34,4,32,0,65,40,106,77,13,0,65,88,32,0,107,32,4,106,65,0,40,2,192,27,34,2,106,65,127,106,32,2,110,65,127,106,33,3,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,4,32,1,75,13,0,32,4,32,0,40,2,4,106,32,1,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,0,45,0,12,65,8,113,13,0,65,0,16,27,34,1,32,0,40,2,0,32,0,65,4,106,40,2,0,106,71,13,0,65,0,65,128,128,128,128,120,32,2,107,32,3,32,2,108,34,4,32,4,65,254,255,255,255,7,75,27,107,16,27,33,2,65,0,16,27,33,4,32,2,65,127,70,13,0,32,4,32,1,79,13,0,32,1,32,4,107,34,1,69,13,0,65,1,33,6,65,0,40,2,248,23,34,4,65,120,32,4,107,65,7,113,65,0,32,4,65,8,106,65,7,113,27,34,2,106,34,3,65,0,40,2,236,23,32,1,107,34,5,32,2,107,34,2,65,1,114,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,65,0,40,2,144,27,32,1,107,54,2,144,27,32,0,65,4,106,34,0,32,0,40,2,0,32,1,107,54,2,0,65,0,32,2,54,2,236,23,65,0,32,3,54,2,248,23,32,4,32,5,106,65,40,54,2,4,12,1,11,65,0,40,2,236,23,65,0,40,2,252,23,77,13,0,65,0,33,6,65,0,65,127,54,2,252,23,11,65,0,32,7,65,16,106,54,2,4,32,6,11,11,194,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,3,148,32,0,67,0,0,128,123,146,32,1,65,128,128,128,4,73,27,56,2,4,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,227,151,219,128,4,75,13,2,32,2,69,13,6,32,4,68,24,45,68,84,251,33,249,63,160,16,19,140,33,0,12,11,11,32,0,187,16,20,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,0,187,33,4,32,1,65,223,219,191,133,4,75,13,2,32,2,69,13,5,32,4,68,210,33,51,127,124,217,18,64,160,16,19,33,0,12,9,11,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,154,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,4,160,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,20,33,0,12,5,11,32,4,68,24,45,68,84,251,33,249,191,160,16,19,33,0,12,4,11,32,4,68,210,33,51,127,124,217,18,192,160,16,19,140,33,0,12,3,11,32,3,43,3,8,154,16,20,33,0,12,2,11,32,3,43,3,8,16,19,33,0,12,1,11,32,3,43,3,8,16,19,140,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,11,160,152,128,128,0,17,0,65,4,11,4,240,52,0,0,0,65,12,11,4,0,0,0,0,0,65,16,11,4,2,0,0,0,0,65,36,11,4,0,0,0,0,0,65,40,11,4,0,0,0,0,0,65,44,11,4,0,0,0,0,0,65,48,11,4,0,0,0,0,0,65,52,11,4,0,0,0,0,0,65,192,0,11,32,210,33,51,127,124,217,2,64,210,33,51,127,124,217,2,192,24,45,68,84,251,33,233,63,24,45,68,84,251,33,233,191,0,65,224,0,11,32,24,45,68,84,251,33,9,64,24,45,68,84,251,33,9,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,65,128,1,11,32,79,187,97,5,103,172,221,63,24,45,68,84,251,33,233,63,155,246,129,210,11,115,239,63,24,45,68,84,251,33,249,63,0,65,160,1,11,32,226,101,47,34,127,43,122,60,7,92,20,51,38,166,129,60,189,203,240,122,136,7,112,60,7,92,20,51,38,166,145,60,0,65,192,1,11,16,3,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,0,65,208,1,11,200,21,131,249,162,0,68,78,110,0,252,41,21,0,209,87,39,0,221,52,245,0,98,219,192,0,60,153,149,0,65,144,67,0,99,81,254,0,187,222,171,0,183,97,197,0,58,110,36,0,210,77,66,0,73,6,224,0,9,234,46,0,28,146,209,0,235,29,254,0,41,177,28,0,232,62,167,0,245,53,130,0,68,187,46,0,156,233,132,0,180,38,112,0,65,126,95,0,214,145,57,0,83,131,57,0,156,244,57,0,139,95,132,0,40,249,189,0,248,31,59,0,222,255,151,0,15,152,5,0,17,47,239,0,10,90,139,0,109,31,109,0,207,126,54,0,9,203,39,0,70,79,183,0,158,102,63,0,45,234,95,0,186,39,117,0,229,235,199,0,61,123,241,0,247,57,7,0,146,82,138,0,251,107,234,0,31,177,95,0,8,93,141,0,48,3,86,0,123,252,70,0,240,171,107,0,32,188,207,0,54,244,154,0,227,169,29,0,94,97,145,0,8,27,230,0,133,153,101,0,160,20,95,0,141,64,104,0,128,216,255,0,39,115,77,0,6,6,49,0,202,86,21,0,201,168,115,0,123,226,96,0,107,140,192,0,25,196,71,0,205,103,195,0,9,232,220,0,89,131,42,0,139,118,196,0,166,28,150,0,68,175,221,0,25,87,209,0,165,62,5,0,5,7,255,0,51,126,63,0,194,50,232,0,152,79,222,0,187,125,50,0,38,61,195,0,30,107,239,0,159,248,94,0,53,31,58,0,127,242,202,0,241,135,29,0,124,144,33,0,106,36,124,0,213,110,250,0,48,45,119,0,21,59,67,0,181,20,198,0,195,25,157,0,173,196,194,0,44,77,65,0,12,0,93,0,134,125,70,0,227,113,45,0,155,198,154,0,51,98,0,0,180,210,124,0,180,167,151,0,55,85,213,0,215,62,246,0,163,16,24,0,77,118,252,0,100,157,42,0,112,215,171,0,99,124,248,0,122,176,87,0,23,21,231,0,192,73,86,0,59,214,217,0,167,132,56,0,36,35,203,0,214,138,119,0,90,84,35,0,0,31,185,0,241,10,27,0,25,206,223,0,159,49,255,0,102,30,106,0,153,87,97,0,172,251,71,0,126,127,216,0,34,101,183,0,50,232,137,0,230,191,96,0,239,196,205,0,108,54,9,0,93,63,212,0,22,222,215,0,88,59,222,0,222,155,146,0,210,34,40,0,40,134,232,0,226,88,77,0,198,202,50,0,8,227,22,0,224,125,203,0,23,192,80,0,243,29,167,0,24,224,91,0,46,19,52,0,131,18,98,0,131,72,1,0,245,142,91,0,173,176,127,0,30,233,242,0,72,74,67,0,16,103,211,0,170,221,216,0,174,95,66,0,106,97,206,0,10,40,164,0,211,153,180,0,6,166,242,0,92,119,127,0,163,194,131,0,97,60,136,0,138,115,120,0,175,140,90,0,111,215,189,0,45,166,99,0,244,191,203,0,141,129,239,0,38,193,103,0,85,202,69,0,202,217,54,0,40,168,210,0,194,97,141,0,18,201,119,0,4,38,20,0,18,70,155,0,196,89,196,0,200,197,68,0,77,178,145,0,0,23,243,0,212,67,173,0,41,73,229,0,253,213,16,0,0,190,252,0,30,148,204,0,112,206,238,0,19,62,245,0,236,241,128,0,179,231,195,0,199,248,40,0,147,5,148,0,193,113,62,0,46,9,179,0,11,69,243,0,136,18,156,0,171,32,123,0,46,181,159,0,71,146,194,0,123,50,47,0,12,85,109,0,114,167,144,0,107,231,31,0,49,203,150,0,121,22,74,0,65,121,226,0,244,223,137,0,232,148,151,0,226,230,132,0,153,49,151,0,136,237,107,0,95,95,54,0,187,253,14,0,72,154,180,0,103,164,108,0,113,114,66,0,141,93,50,0,159,21,184,0,188,229,9,0,141,49,37,0,247,116,57,0,48,5,28,0,13,12,1,0,75,8,104,0,44,238,88,0,71,170,144,0,116,231,2,0,189,214,36,0,247,125,166,0,110,72,114,0,159,22,239,0,142,148,166,0,180,145,246,0,209,83,81,0,207,10,242,0,32,152,51,0,245,75,126,0,178,99,104,0,221,62,95,0,64,93,3,0,133,137,127,0,85,82,41,0,55,100,192,0,109,216,16,0,50,72,50,0,91,76,117,0,78,113,212,0,69,84,110,0,11,9,193,0,42,245,105,0,20,102,213,0,39,7,157,0,93,4,80,0,180,59,219,0,234,118,197,0,135,249,23,0,73,107,125,0,29,39,186,0,150,105,41,0,198,204,172,0,173,20,84,0,144,226,106,0,136,217,137,0,44,114,80,0,4,164,190,0,119,7,148,0,243,48,112,0,0,252,39,0,234,113,168,0,102,194,73,0,100,224,61,0,151,221,131,0,163,63,151,0,67,148,253,0,13,134,140,0,49,65,222,0,146,57,157,0,221,112,140,0,23,183,231,0,8,223,59,0,21,55,43,0,92,128,160,0,90,128,147,0,16,17,146,0,15,232,216,0,108,128,175,0,219,255,75,0,56,144,15,0,89,24,118,0,98,165,21,0,97,203,187,0,199,137,185,0,16,64,189,0,210,242,4,0,73,117,39,0,235,182,246,0,219,34,187,0,10,20,170,0,137,38,47,0,100,131,118,0,9,59,51,0,14,148,26,0,81,58,170,0,29,163,194,0,175,237,174,0,92,38,18,0,109,194,77,0,45,122,156,0,192,86,151,0,3,63,131,0,9,240,246,0,43,64,140,0,109,49,153,0,57,180,7,0,12,32,21,0,216,195,91,0,245,146,196,0,198,173,75,0,78,202,165,0,167,55,205,0,230,169,54,0,171,146,148,0,221,66,104,0,25,99,222,0,118,140,239,0,104,139,82,0,252,219,55,0,174,161,171,0,223,21,49,0,0,174,161,0,12,251,218,0,100,77,102,0,237,5,183,0,41,101,48,0,87,86,191,0,71,255,58,0,106,249,185,0,117,190,243,0,40,147,223,0,171,128,48,0,102,140,246,0,4,203,21,0,250,34,6,0,217,228,29,0,61,179,164,0,87,27,143,0,54,205,9,0,78,66,233,0,19,190,164,0,51,35,181,0,240,170,26,0,79,101,168,0,210,193,165,0,11,63,15,0,91,120,205,0,35,249,118,0,123,139,4,0,137,23,114,0,198,166,83,0,111,110,226,0,239,235,0,0,155,74,88,0,196,218,183,0,170,102,186,0,118,207,207,0,209,2,29,0,177,241,45,0,140,153,193,0,195,173,119,0,134,72,218,0,247,93,160,0,198,128,244,0,172,240,47,0,221,236,154,0,63,92,188,0,208,222,109,0,144,199,31,0,42,219,182,0,163,37,58,0,0,175,154,0,173,83,147,0,182,87,4,0,41,45,180,0,75,128,126,0,218,7,167,0,118,170,14,0,123,89,161,0,22,18,42,0,220,183,45,0,250,229,253,0,137,219,254,0,137,190,253,0,228,118,108,0,6,169,252,0,62,128,112,0,133,110,21,0,253,135,255,0,40,62,7,0,97,103,51,0,42,24,134,0,77,189,234,0,179,231,175,0,143,109,110,0,149,103,57,0,49,191,91,0,132,215,72,0,48,223,22,0,199,45,67,0,37,97,53,0,201,112,206,0,48,203,184,0,191,108,253,0,164,0,162,0,5,108,228,0,90,221,160,0,33,111,71,0,98,18,210,0,185,92,132,0,112,97,73,0,107,86,224,0,153,82,1,0,80,85,55,0,30,213,183,0,51,241,196,0,19,110,95,0,93,48,228,0,133,46,169,0,29,178,195,0,161,50,54,0,8,183,164,0,234,177,212,0,22,247,33,0,143,105,228,0,39,255,119,0,12,3,128,0,141,64,45,0,79,205,160,0,32,165,153,0,179,162,211,0,47,93,10,0,180,249,66,0,17,218,203,0,125,190,208,0,155,219,193,0,171,23,189,0,202,162,129,0,8,106,92,0,46,85,23,0,39,0,85,0,127,20,240,0,225,7,134,0,20,11,100,0,150,65,141,0,135,190,222,0,218,253,42,0,107,37,182,0,123,137,52,0,5,243,254,0,185,191,158,0,104,106,79,0,74,42,168,0,79,196,90,0,45,248,188,0,215,90,152,0,244,199,149,0,13,77,141,0,32,58,166,0,164,87,95,0,20,63,177,0,128,56,149,0,204,32,1,0,113,221,134,0,201,222,182,0,191,96,245,0,77,101,17,0,1,7,107,0,140,176,172,0,178,192,208,0,81,85,72,0,30,251,14,0,149,114,195,0,163,6,59,0,192,64,53,0,6,220,123,0,224,69,204,0,78,41,250,0,214,202,200,0,232,243,65,0,124,100,222,0,155,100,216,0,217,190,49,0,164,151,195,0,119,88,212,0,105,227,197,0,240,218,19,0,186,58,60,0,70,24,70,0,85,117,95,0,210,189,245,0,110,146,198,0,172,46,93,0,14,68,237,0,28,62,66,0,97,196,135,0,41,253,233,0,231,214,243,0,34,124,202,0,111,145,53,0,8,224,197,0,255,215,141,0,110,106,226,0,176,253,198,0,147,8,193,0,124,93,116,0,107,173,178,0,205,110,157,0,62,114,123,0,198,17,106,0,247,207,169,0,41,115,223,0,181,201,186,0,183,0,81,0,226,178,13,0,116,186,36,0,229,125,96,0,116,216,138,0,13,21,44,0,129,24,12,0,126,102,148,0,1,41,22,0,159,122,118,0,253,253,190,0,86,69,239,0,217,126,54,0,236,217,19,0,139,186,185,0,196,151,252,0,49,168,39,0,241,110,195,0,148,197,54,0,216,168,86,0,180,168,181,0,207,204,14,0,18,137,45,0,111,87,52,0,44,86,137,0,153,206,227,0,214,32,185,0,107,94,170,0,62,42,156,0,17,95,204,0,253,11,74,0,225,244,251,0,142,59,109,0,226,134,44,0,233,212,132,0,252,180,169,0,239,238,209,0,46,53,201,0,47,57,97,0,56,33,68,0,27,217,200,0,129,252,10,0,251,74,106,0,47,28,216,0,83,180,132,0,78,153,140,0,84,34,204,0,42,85,220,0,192,198,214,0,11,25,150,0,26,112,184,0,105,149,100,0,38,90,96,0,63,82,238,0,127,17,15,0,244,181,17,0,252,203,245,0,52,188,45,0,52,188,238,0,232,93,204,0,221,94,96,0,103,142,155,0,146,51,239,0,201,23,184,0,97,88,155,0,225,87,188,0,81,131,198,0,216,62,16,0,221,113,72,0,45,28,221,0,175,24,161,0,33,44,70,0,89,243,215,0,217,122,152,0,158,84,192,0,79,134,250,0,86,6,252,0,229,121,174,0,137,34,54,0,56,173,34,0,103,147,220,0,85,232,170,0,130,38,56,0,202,231,155,0,81,13,164,0,153,51,177,0,169,215,14,0,105,5,72,0,101,178,240,0,127,136,167,0,136,76,151,0,249,209,54,0,33,146,179,0,123,130,74,0,152,207,33,0,64,159,220,0,220,71,85,0,225,116,58,0,103,235,66,0,254,157,223,0,94,212,95,0,123,103,164,0,186,172,122,0,85,246,162,0,43,136,35,0,65,186,85,0,89,110,8,0,33,42,134,0,57,71,131,0,137,227,230,0,229,158,212,0,73,251,64,0,255,86,233,0,28,15,202,0,197,89,138,0,148,250,43,0,211,193,197,0,15,197,207,0,219,90,174,0,71,197,134,0,133,67,98,0,33,134,59,0,44,121,148,0,16,97,135,0,42,76,123,0,128,44,26,0,67,191,18,0,136,38,144,0,120,60,137,0,168,196,228,0,229,219,123,0,196,58,194,0,38,244,234,0,247,103,138,0,13,146,191,0,101,163,43,0,61,147,177,0,189,124,11,0,164,81,220,0,39,221,99,0,105,225,221,0,154,148,25,0,168,41,149,0,104,206,40,0,9,237,180,0,68,159,32,0,78,152,202,0,112,130,99,0,126,124,35,0,15,185,50,0,167,245,142,0,20,86,231,0,33,241,8,0,181,157,42,0,111,126,77,0,165,25,81,0,181,249,171,0,130,223,214,0,150,221,97,0,22,54,2,0,196,58,159,0,131,162,161,0,114,237,109,0,57,141,122,0,130,184,169,0,107,50,92,0,70,39,91,0,0,52,237,0,210,0,119,0,252,244,85,0,1,89,77,0,224,113,128,0,0,65,160,23,11,64,0,0,0,64,251,33,249,63,0,0,0,0,45,68,116,62,0,0,0,128,152,70,248,60,0,0,0,96,81,204,120,59,0,0,0,128,131,27,240,57,0,0,0,64,32,37,122,56,0,0,0,128,34,130,227,54,0,0,0,0,29,243,105,53,0,65,208,27,11,4,0,0,0,0,0,65,212,27,11,4,0,0,0,0]); 3 | export default binary; 4 | -------------------------------------------------------------------------------- /dist/bundle.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | function roundTo(a, b) { 5 | var n = 1 / b; 6 | return (Math.round(a * n) / n); 7 | } 8 | 9 | function load(buffer, options) { 10 | 11 | options || (options = {}); 12 | 13 | var imports = options.imports || {}; 14 | 15 | var memory = imports.memory; 16 | if (!memory) { 17 | var opts = { initial: options.initialMemory || 1 }; 18 | if (options.maximumMemory) 19 | { opts.maximum = options.maximumMemory; } 20 | memory = new WebAssembly.Memory(opts); 21 | memory.initial = options.initialMemory || 1; 22 | memory.maximum = options.maximumMemory; 23 | } 24 | 25 | var table = imports.table; 26 | if (!table) 27 | { table = new WebAssembly.Table({ initial: 0, element: "anyfunc" }); } 28 | 29 | function grow() { 30 | var buf = memory.buffer; 31 | memory.U8 = new Uint8Array (buf); 32 | memory.S32 = new Int32Array (buf); 33 | memory.U32 = new Uint32Array (buf); 34 | memory.F32 = new Float32Array(buf); 35 | memory.F64 = new Float64Array(buf); 36 | if (imports.ongrow) { imports.ongrow(); } 37 | } 38 | 39 | grow(); 40 | 41 | function getInt(ptr) { 42 | return memory.S32[ptr >> 2]; 43 | } 44 | 45 | memory.getInt = getInt; 46 | 47 | function getUint(ptr) { 48 | return memory.U32[ptr >> 2]; 49 | } 50 | 51 | memory.getUint = getUint; 52 | 53 | function getFloat(ptr) { 54 | return memory.F32[ptr >> 2]; 55 | } 56 | 57 | memory.getFloat = getFloat; 58 | 59 | function getDouble(ptr) { 60 | return memory.F64[ptr >> 3]; 61 | } 62 | 63 | memory.getDouble = getDouble; 64 | 65 | function getString(ptr) { 66 | var start = (ptr >>>= 0); 67 | while (memory.U8[ptr++]){ } 68 | getString.bytes = ptr - start; 69 | return String.fromCharCode.apply(null, memory.U8.subarray(start, ptr - 1)); 70 | } 71 | 72 | memory.getString = getString; 73 | 74 | var env = {}; 75 | 76 | env.memoryBase = imports.memoryBase || 0; 77 | env.memory = memory; 78 | env.tableBase = imports.tableBase || 0; 79 | env.table = table; 80 | 81 | function sprintf(ptr, base) { 82 | var s = getString(ptr); 83 | return base 84 | ? s.replace(/%([dfisu]|lf)/g, function ($0, $1) { 85 | var val; 86 | return base += 87 | $1 === "u" ? (val = getUint(base), 4) 88 | : $1 === "f" ? (val = getFloat(base), 4) 89 | : $1 === "s" ? (val = getString(getUint(base)), 4) 90 | : $1 === "lf" ? (val = getDouble(base), 8) 91 | : (val = getInt(base), 4) 92 | , val; 93 | }) 94 | : s; 95 | } 96 | 97 | Object.getOwnPropertyNames(console).forEach(function (key) { 98 | if (typeof console[key] === "function") 99 | { env["console_" + key] = function (ptr, base) { 100 | console[key](sprintf(ptr, base)); 101 | }; } 102 | }); 103 | 104 | Object.getOwnPropertyNames(Math).forEach(function (key) { 105 | if (typeof Math[key] === "function") 106 | { env["Math_" + key] = Math[key]; } 107 | }); 108 | 109 | Object.keys(imports).forEach(function (key) { return env[key] = imports[key]; }); 110 | 111 | if (!env._abort) 112 | { env._abort = function (errno) { throw Error("abnormal abort in " + file + ": " + errno); }; } 113 | if (!env._exit) 114 | { env._exit = function (code) { if (code) { throw Error("abnormal exit in " + file + ": " + code); } }; } 115 | 116 | env._grow = grow; 117 | 118 | return WebAssembly.instantiate(buffer, { env: env }) 119 | .then(function (module) { 120 | var instance = module.instance; 121 | instance.imports = imports; 122 | instance.memory = memory; 123 | instance.env = env; 124 | return instance; 125 | }); 126 | } 127 | 128 | function compileShader(gl, type, source) { 129 | var shader = gl.createShader(type); 130 | gl.shaderSource(shader, source); 131 | gl.compileShader(shader); 132 | return shader; 133 | } 134 | 135 | function initRender (ptSize) { 136 | 137 | var gl = canvas.getContext("webgl", { 138 | antialias: false, 139 | alpha: true, 140 | depth: false, 141 | stencil: false 142 | }); 143 | 144 | gl.depthMask(false); 145 | gl.disable(gl.DEPTH_TEST); 146 | gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); 147 | 148 | var program = gl.createProgram(); 149 | 150 | gl.attachShader(program, compileShader(gl, gl.VERTEX_SHADER, 151 | "\n attribute vec3 aColor;\n attribute vec3 aPosition;\n varying vec3 vColor;\n uniform vec2 res;\n uniform int time;\n void main(void) {\n vColor = aColor / 255.0;\n vec2 circle = aPosition.xy / res * vec2(2, -2) - vec2(1, -1);\n gl_Position = vec4(circle, 0, 1);\n gl_PointSize = 1.0;\n }\n ")); 152 | gl.attachShader(program, compileShader(gl, gl.FRAGMENT_SHADER, 153 | "precision lowp float;\n varying vec3 vColor;\n void main(void) {\n gl_FragColor = vec4(vColor.r, vColor.g, vColor.b, 1.0);\n }\n ")); 154 | 155 | gl.linkProgram(program); 156 | gl.useProgram(program); 157 | 158 | var resLoc = gl.getUniformLocation(program, "res"); 159 | gl.uniform2f(resLoc, canvas.width, canvas.height); 160 | 161 | gl.viewport(0, 0, canvas.width, canvas.height); 162 | 163 | var coordBuffer = gl.createBuffer(); 164 | var colorBuffer = gl.createBuffer(); 165 | 166 | var coordLoc = gl.getAttribLocation(program, "aPosition"); 167 | gl.enableVertexAttribArray(coordLoc); 168 | 169 | var colorLoc = gl.getAttribLocation(program, "aColor"); 170 | gl.enableVertexAttribArray(colorLoc); 171 | 172 | return { 173 | gl: gl, program: program, 174 | coordBuffer: coordBuffer, colorBuffer: colorBuffer, 175 | coordLoc: coordLoc, colorLoc: colorLoc 176 | }; 177 | 178 | } 179 | 180 | var binary = new Uint8Array([0,97,115,109,1,0,0,0,1,210,128,128,128,0,15,96,0,1,125,96,0,1,127,96,0,0,96,1,127,0,96,2,127,127,0,96,2,127,127,1,127,96,5,127,127,127,127,127,0,96,2,124,124,1,124,96,1,124,1,124,96,1,125,1,125,96,1,124,1,125,96,2,125,127,1,127,96,5,127,127,127,127,127,1,127,96,2,124,127,1,124,96,1,127,1,127,2,196,128,128,128,0,5,3,101,110,118,6,95,97,98,111,114,116,0,3,3,101,110,118,5,95,103,114,111,119,0,2,3,101,110,118,7,103,101,116,84,105,109,101,0,1,3,101,110,118,7,114,97,110,100,111,109,102,0,0,3,101,110,118,6,109,101,109,111,114,121,2,0,1,3,157,128,128,128,0,28,1,1,1,1,4,4,5,3,6,2,2,7,8,8,9,10,10,11,12,13,8,14,2,14,1,3,14,9,4,132,128,128,128,0,1,112,0,0,7,172,129,128,128,0,10,16,103,101,116,80,97,114,116,105,99,108,101,67,111,117,110,116,0,4,19,103,101,116,80,97,114,116,105,99,108,101,66,121,116,101,83,105,122,101,0,5,22,103,101,116,80,97,114,116,105,99,108,101,67,111,108,111,114,79,102,102,115,101,116,0,6,25,103,101,116,80,97,114,116,105,99,108,101,80,111,115,105,116,105,111,110,79,102,102,115,101,116,0,7,11,117,112,100,97,116,101,77,111,117,115,101,0,8,4,105,110,105,116,0,9,15,97,108,108,111,99,97,116,101,84,101,120,116,117,114,101,0,10,14,100,101,115,116,114,111,121,84,101,120,116,117,114,101,0,11,11,100,114,97,119,84,101,120,116,117,114,101,0,12,4,116,105,99,107,0,14,9,129,128,128,128,0,0,10,230,255,128,128,0,28,135,128,128,128,0,0,65,0,40,2,12,11,132,128,128,128,0,0,65,12,11,135,128,128,128,0,0,65,0,40,2,44,11,135,128,128,128,0,0,65,0,40,2,48,11,149,128,128,128,0,0,2,64,65,0,32,1,178,56,2,24,65,0,32,0,178,56,2,20,11,11,158,130,128,128,0,2,3,127,3,125,2,64,65,0,32,1,54,2,40,65,0,32,0,54,2,36,65,0,32,1,32,0,108,34,1,65,0,40,2,16,109,34,2,54,2,12,65,0,32,1,65,12,108,34,1,16,25,54,2,48,65,0,32,1,16,25,54,2,52,65,0,32,1,16,25,54,2,44,65,0,33,1,65,0,33,4,2,64,3,64,32,4,32,2,78,13,1,65,0,40,2,16,33,2,16,3,33,5,65,0,40,2,48,32,1,106,32,5,65,0,40,2,36,178,148,56,2,0,16,3,33,5,65,0,40,2,48,32,1,106,65,4,106,32,5,65,0,40,2,40,178,34,6,148,56,2,0,65,0,40,2,52,32,1,106,34,3,32,2,32,4,32,0,111,108,178,34,5,56,2,0,32,3,65,4,106,32,2,32,4,32,0,109,108,178,34,7,56,2,0,65,0,40,2,44,32,1,106,34,2,65,8,106,65,128,128,128,152,4,54,2,0,32,2,32,5,65,0,40,2,36,34,0,178,149,67,0,0,127,67,148,56,2,0,32,2,65,4,106,32,7,32,6,149,67,0,0,127,67,148,56,2,0,32,1,65,12,106,33,1,32,4,65,1,106,33,4,65,0,40,2,12,33,2,12,0,11,0,11,11,11,201,128,128,128,0,1,2,127,2,127,32,1,32,0,108,34,1,65,2,116,33,2,32,1,65,4,116,16,25,34,3,33,0,65,0,33,1,2,64,3,64,32,1,32,2,78,13,1,32,0,65,0,54,2,0,32,0,65,4,106,33,0,32,1,65,1,106,33,1,12,0,11,0,11,32,3,11,11,137,128,128,128,0,0,32,0,40,2,0,16,29,11,173,129,128,128,0,1,5,127,2,64,32,4,32,3,108,33,5,65,0,40,2,44,33,6,65,0,33,4,2,64,3,64,32,4,32,5,78,13,1,2,64,32,0,65,12,106,40,2,0,69,13,0,32,4,32,3,111,33,8,32,4,32,3,109,32,2,106,34,9,65,0,40,2,40,78,13,0,32,8,32,1,106,34,8,65,0,40,2,36,34,7,78,13,0,32,9,32,7,108,32,8,106,34,8,65,0,72,13,0,32,6,32,8,65,12,108,106,34,8,32,0,40,2,0,178,56,2,0,32,8,32,0,65,4,106,40,2,0,178,56,2,4,32,8,32,0,65,8,106,40,2,0,178,56,2,8,11,32,0,65,16,106,33,0,32,4,65,1,106,33,4,12,0,11,0,11,11,11,131,128,128,128,0,0,1,11,243,129,128,128,0,2,6,127,5,125,2,64,16,2,26,65,0,40,2,52,65,0,40,2,12,34,5,65,12,108,34,4,106,65,4,106,33,3,65,0,40,2,48,32,4,106,65,4,106,33,4,65,0,42,2,24,33,7,65,0,42,2,20,33,6,2,64,3,64,32,5,65,0,76,13,1,32,4,32,4,42,2,0,34,9,32,3,42,2,0,32,9,147,67,205,204,76,61,148,146,34,9,56,2,0,32,4,65,124,106,34,0,32,0,42,2,0,34,8,32,3,65,124,106,42,2,0,32,8,147,67,205,204,76,61,148,146,34,8,56,2,0,2,64,32,7,32,9,147,168,34,2,32,2,108,32,6,32,8,147,168,34,1,32,1,108,106,65,211,225,0,75,13,0,32,4,32,9,32,2,183,32,1,183,16,15,182,34,10,16,31,67,0,0,158,65,148,147,56,2,0,32,0,32,8,32,10,16,18,67,0,0,158,65,148,147,56,2,0,11,32,3,65,116,106,33,3,32,4,65,116,106,33,4,32,5,65,127,106,33,5,12,0,11,0,11,11,11,242,131,128,128,0,3,6,127,2,126,1,124,2,124,2,64,2,64,32,1,189,34,8,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,0,32,0,189,34,9,66,255,255,255,255,255,255,255,255,255,0,131,66,129,128,128,128,128,128,128,248,255,0,84,13,1,11,32,0,32,1,160,15,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,8,66,32,136,167,34,2,65,128,128,192,128,124,106,32,8,167,34,3,114,69,13,0,32,8,66,62,136,167,65,2,113,34,5,32,9,66,63,136,167,34,4,114,33,6,32,9,66,32,136,167,65,255,255,255,255,7,113,34,7,32,9,167,114,69,13,1,32,2,65,255,255,255,255,7,113,34,2,32,3,114,69,13,2,32,2,65,128,128,192,255,7,71,13,3,32,6,65,2,115,65,3,113,33,2,32,7,65,128,128,192,255,7,71,13,4,32,2,65,3,116,65,192,0,106,43,3,0,15,11,32,0,16,16,15,11,32,6,65,3,113,34,2,65,3,70,13,4,32,2,65,2,70,13,5,32,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,32,7,65,128,128,192,255,7,70,13,1,32,2,65,128,128,128,32,106,32,7,73,13,1,2,64,2,64,32,5,69,13,0,68,0,0,0,0,0,0,0,0,33,10,32,7,65,128,128,128,32,106,32,2,73,13,1,11,32,0,32,1,163,16,17,16,16,33,10,11,32,6,65,3,113,34,2,69,13,4,32,2,65,2,70,13,5,32,2,65,1,71,13,6,32,10,154,15,11,32,2,65,3,116,65,224,0,106,43,3,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,68,24,45,68,84,251,33,9,192,15,11,68,24,45,68,84,251,33,9,64,15,11,32,10,15,11,68,24,45,68,84,251,33,9,64,32,10,68,7,92,20,51,38,166,161,188,160,161,15,11,32,10,68,7,92,20,51,38,166,161,188,160,68,24,45,68,84,251,33,9,192,160,11,11,203,132,128,128,0,3,4,127,1,126,3,124,2,124,65,0,65,0,40,2,4,65,16,107,34,4,54,2,4,32,0,189,34,5,66,63,136,167,33,1,2,64,2,64,32,5,66,32,136,167,65,255,255,255,255,7,113,34,2,65,128,128,192,160,4,73,13,0,32,5,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,1,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,1,27,33,0,12,1,11,2,64,2,64,32,2,65,255,255,239,254,3,75,13,0,65,127,33,3,32,2,65,255,255,255,241,3,75,13,1,32,2,65,255,255,63,75,13,2,32,4,32,0,182,56,2,12,12,2,11,32,0,16,17,33,0,2,64,2,64,2,64,32,2,65,255,255,203,255,3,75,13,0,32,2,65,255,255,151,255,3,75,13,1,32,0,32,0,160,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,0,64,160,163,33,0,65,0,33,3,12,3,11,32,2,65,255,255,141,128,4,75,13,1,32,0,68,0,0,0,0,0,0,248,191,160,32,0,68,0,0,0,0,0,0,248,63,162,68,0,0,0,0,0,0,240,63,160,163,33,0,65,2,33,3,12,2,11,32,0,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,240,63,160,163,33,0,65,1,33,3,12,1,11,68,0,0,0,0,0,0,240,191,32,0,163,33,0,65,3,33,3,11,32,0,32,0,162,34,7,32,7,162,34,8,32,8,32,8,32,8,32,8,68,47,108,106,44,68,180,162,191,162,68,154,253,222,82,45,222,173,191,160,162,68,109,154,116,175,242,176,179,191,160,162,68,113,22,35,254,198,113,188,191,160,162,68,196,235,152,153,153,153,201,191,160,162,33,6,32,7,32,8,32,8,32,8,32,8,32,8,68,17,218,34,227,58,173,144,63,162,68,235,13,118,36,75,123,169,63,160,162,68,81,61,208,160,102,13,177,63,160,162,68,110,32,76,197,205,69,183,63,160,162,68,255,131,0,146,36,73,194,63,160,162,68,13,85,85,85,85,85,213,63,160,162,33,8,2,64,32,3,65,127,76,13,0,32,3,65,3,116,34,2,65,128,1,106,43,3,0,32,0,32,6,32,8,160,162,32,2,65,160,1,106,43,3,0,161,32,0,161,161,34,0,154,32,0,32,1,27,33,0,12,1,11,32,0,32,0,32,6,32,8,160,162,161,33,0,11,65,0,32,4,65,16,106,54,2,4,32,0,11,11,146,128,128,128,0,0,32,0,189,66,255,255,255,255,255,255,255,255,255,0,131,191,11,180,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,123,146,56,2,4,67,0,0,128,63,33,0,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,228,151,219,128,4,73,13,2,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,16,19,140,33,0,12,11,11,32,0,187,16,19,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,1,65,224,219,191,133,4,73,13,2,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,0,187,160,16,19,33,0,12,9,11,32,2,69,13,3,32,4,68,24,45,68,84,251,33,249,63,160,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,32,2,69,13,2,68,210,33,51,127,124,217,18,192,32,0,187,161,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,19,33,0,12,5,11,68,24,45,68,84,251,33,249,63,32,4,161,16,20,33,0,12,4,11,32,0,187,68,210,33,51,127,124,217,18,192,160,16,20,33,0,12,3,11,32,3,43,3,8,16,19,140,33,0,12,2,11,32,3,43,3,8,154,16,20,33,0,12,1,11,32,3,43,3,8,16,20,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,207,128,128,128,0,1,1,124,32,0,32,0,162,34,0,68,129,94,12,253,255,255,223,191,162,68,0,0,0,0,0,0,240,63,160,32,0,32,0,162,34,1,68,66,58,5,225,83,85,165,63,162,160,32,0,32,1,162,32,0,68,105,80,238,224,66,147,249,62,162,68,39,30,15,232,135,192,86,191,160,162,160,182,11,203,128,128,128,0,1,2,124,32,0,32,0,162,34,1,32,0,162,34,2,32,1,32,1,162,162,32,1,68,167,70,59,140,135,205,198,62,162,68,116,231,202,226,249,0,42,191,160,162,32,2,32,1,68,178,251,110,137,16,17,129,63,162,68,119,172,203,84,85,85,197,191,160,162,32,0,160,160,182,11,253,129,128,128,0,2,4,127,1,124,2,127,65,0,65,0,40,2,4,65,16,107,34,5,54,2,4,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,4,65,218,159,164,238,4,75,13,0,32,1,32,0,187,34,6,32,6,68,131,200,201,109,48,95,228,63,162,68,0,0,0,0,0,0,56,67,160,68,0,0,0,0,0,0,56,195,160,34,6,68,0,0,0,80,251,33,249,191,162,160,32,6,68,99,98,26,97,180,16,81,190,162,160,57,3,0,32,6,170,33,4,12,1,11,2,64,32,4,65,128,128,128,252,7,73,13,0,32,1,32,0,32,0,147,187,57,3,0,65,0,33,4,12,1,11,32,5,32,4,32,4,65,23,118,65,234,126,106,34,3,65,23,116,107,190,187,57,3,8,32,5,65,8,106,32,5,32,3,65,1,65,0,16,22,33,4,32,5,43,3,0,33,6,2,64,32,2,65,127,76,13,0,32,1,32,6,57,3,0,12,1,11,32,1,32,6,154,57,3,0,65,0,32,4,107,33,4,11,65,0,32,5,65,16,106,54,2,4,32,4,11,11,252,147,128,128,0,2,21,127,4,124,2,127,65,0,65,0,40,2,4,65,176,4,107,34,25,54,2,4,32,2,32,2,65,125,106,65,24,109,34,22,65,0,32,22,65,0,74,27,34,6,65,104,108,106,33,15,2,64,32,4,65,2,116,65,192,1,106,40,2,0,34,5,32,3,65,127,106,34,14,106,65,0,72,13,0,32,5,32,3,106,33,13,32,6,32,14,107,34,2,65,2,116,65,208,1,106,33,23,32,25,65,192,2,106,33,22,3,64,2,64,2,64,32,2,65,0,72,13,0,32,23,40,2,0,183,33,28,12,1,11,68,0,0,0,0,0,0,0,0,33,28,11,32,22,32,28,57,3,0,32,22,65,8,106,33,22,32,23,65,4,106,33,23,32,2,65,1,106,33,2,32,13,65,127,106,34,13,13,0,11,11,32,15,65,104,106,33,24,2,64,2,64,32,3,65,0,76,13,0,32,25,65,192,2,106,32,14,65,3,116,106,33,14,65,0,33,13,3,64,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,3,33,23,32,14,33,22,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,14,65,8,106,33,14,32,13,32,5,72,33,2,32,13,65,1,106,33,13,32,2,13,0,12,2,11,0,11,65,127,33,22,32,25,33,2,3,64,32,2,66,0,55,3,0,32,2,65,8,106,33,2,32,22,65,1,106,34,22,32,5,72,13,0,11,11,65,23,32,24,107,33,8,65,24,32,24,107,33,7,32,25,65,224,3,106,32,5,65,2,116,106,65,124,106,33,11,32,25,65,8,114,33,12,32,25,65,224,3,106,65,124,106,33,10,32,25,65,120,106,33,9,32,3,65,0,74,33,18,32,5,33,19,2,64,2,64,3,64,32,25,32,19,34,14,65,3,116,34,16,106,43,3,0,33,28,2,64,32,14,65,1,72,34,13,13,0,32,14,65,1,106,33,23,32,9,32,16,106,33,2,32,25,65,224,3,106,33,22,3,64,32,22,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,22,65,4,106,33,22,32,2,43,3,0,32,26,160,33,28,32,2,65,120,106,33,2,32,23,65,127,106,34,23,65,1,74,13,0,11,11,2,64,32,28,32,24,16,23,34,28,32,28,68,0,0,0,0,0,0,192,63,162,16,24,68,0,0,0,0,0,0,32,192,162,160,34,28,32,28,170,34,19,183,161,33,28,2,64,2,64,2,64,2,64,32,24,65,1,72,34,17,13,0,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,34,2,32,2,32,7,117,34,2,32,7,116,107,34,22,54,2,0,32,2,32,19,106,33,19,32,22,32,8,117,34,20,65,1,78,13,1,12,2,11,2,64,32,24,69,13,0,65,2,33,20,32,28,68,0,0,0,0,0,0,224,63,99,32,28,32,28,98,114,69,13,1,65,0,33,20,32,28,68,0,0,0,0,0,0,0,0,97,13,3,12,4,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,40,2,0,65,23,117,34,20,65,1,72,13,1,11,2,64,2,64,2,64,32,13,13,0,65,0,33,21,32,25,65,224,3,106,33,2,32,14,33,13,3,64,32,2,40,2,0,33,22,65,255,255,255,7,33,23,2,64,2,64,32,21,13,0,2,64,32,22,13,0,65,0,33,21,12,2,11,65,128,128,128,8,33,23,65,1,33,21,11,32,2,32,23,32,22,107,54,2,0,11,32,2,65,4,106,33,2,32,13,65,127,106,34,13,13,0,11,32,17,13,2,12,1,11,65,0,33,21,32,17,13,1,11,2,64,2,64,32,24,65,1,70,13,0,32,24,65,2,71,13,2,65,255,255,255,1,33,22,12,1,11,65,255,255,255,3,33,22,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,32,22,113,54,2,0,11,32,19,65,1,106,33,19,32,20,65,2,71,13,0,68,0,0,0,0,0,0,240,63,32,28,161,33,28,65,2,33,20,32,21,69,13,0,32,28,68,0,0,0,0,0,0,240,63,32,24,16,23,161,33,28,11,32,28,68,0,0,0,0,0,0,0,0,98,13,1,11,2,64,32,14,32,5,76,13,0,32,10,32,14,65,2,116,106,33,2,65,0,33,22,32,14,33,23,3,64,32,2,40,2,0,32,22,114,33,22,32,2,65,124,106,33,2,32,23,65,127,106,34,23,32,5,74,13,0,11,32,22,13,3,11,65,0,33,22,32,11,33,2,3,64,32,22,65,1,106,33,22,32,2,40,2,0,33,23,32,2,65,124,106,33,2,32,23,69,13,0,11,32,14,32,22,106,33,19,32,22,65,1,72,13,1,2,64,32,18,69,13,0,32,14,65,1,106,33,2,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,21,3,64,32,25,65,192,2,106,32,14,32,3,106,65,3,116,106,32,2,34,13,32,6,106,65,2,116,65,208,1,106,40,2,0,183,57,3,0,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,21,33,22,32,3,33,23,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,21,65,8,106,33,21,32,13,65,1,106,33,2,32,13,33,14,32,13,32,19,72,13,0,12,3,11,0,11,32,12,32,16,106,33,2,32,6,32,14,106,65,2,116,65,212,1,106,33,22,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,23,3,64,32,2,66,0,55,3,0,32,23,32,22,40,2,0,183,57,3,0,32,22,65,4,106,33,22,32,2,65,8,106,33,2,32,23,65,8,106,33,23,32,14,65,1,106,34,14,32,19,72,13,0,12,2,11,0,11,11,2,64,2,64,32,28,65,0,32,24,107,16,23,34,28,68,0,0,0,0,0,0,112,65,99,32,28,32,28,98,114,69,13,0,32,28,33,26,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,14,65,1,106,33,14,32,15,33,24,11,32,25,65,224,3,106,32,14,65,2,116,106,32,26,170,54,2,0,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,33,2,3,64,32,14,65,127,106,33,14,32,24,65,104,106,33,24,32,2,40,2,0,33,22,32,2,65,124,106,33,2,32,22,69,13,0,11,11,68,0,0,0,0,0,0,240,63,32,24,16,23,33,28,2,64,32,14,65,0,72,13,0,32,14,65,1,106,33,23,32,25,32,14,65,3,116,106,33,2,32,25,65,224,3,106,32,14,65,2,116,106,33,22,3,64,32,2,32,28,32,22,40,2,0,183,162,57,3,0,32,2,65,120,106,33,2,32,22,65,124,106,33,22,32,28,68,0,0,0,0,0,0,112,62,162,33,28,32,23,65,127,106,34,23,65,0,74,13,0,11,32,14,65,0,72,13,0,32,25,32,14,65,3,116,106,33,13,32,14,33,2,3,64,32,14,32,2,34,3,107,33,21,68,0,0,0,0,0,0,0,0,33,28,65,0,33,2,65,0,33,22,2,64,3,64,32,28,32,2,65,160,23,106,43,3,0,32,13,32,2,106,43,3,0,162,160,33,28,32,22,32,5,78,13,1,32,2,65,8,106,33,2,32,22,32,21,72,33,23,32,22,65,1,106,33,22,32,23,13,0,11,11,32,25,65,160,1,106,32,21,65,3,116,106,32,28,57,3,0,32,13,65,120,106,33,13,32,3,65,127,106,33,2,32,3,65,0,74,13,0,11,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,127,106,65,2,73,13,0,32,4,69,13,1,32,4,65,3,71,13,9,68,0,0,0,0,0,0,0,0,33,29,2,64,32,14,65,1,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,1,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,2,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,29,3,64,32,29,32,2,43,3,0,160,33,29,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,2,74,13,0,11,11,32,25,43,3,160,1,33,28,32,20,69,13,4,32,1,32,28,154,57,3,0,32,1,32,25,43,3,168,1,154,57,3,8,32,29,154,33,29,12,5,11,32,14,65,0,72,13,1,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,3,11,0,11,32,14,65,0,72,13,4,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,6,11,0,11,68,0,0,0,0,0,0,0,0,33,28,11,32,1,32,28,154,32,28,32,20,27,57,3,0,32,25,43,3,160,1,32,28,161,33,28,2,64,32,14,65,1,72,13,0,32,25,65,160,1,106,65,8,114,33,2,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,8,106,33,2,32,14,65,127,106,34,14,13,0,11,11,32,28,154,32,28,32,20,27,33,29,32,1,65,8,106,33,1,12,4,11,32,1,32,28,57,3,0,32,1,32,25,41,3,168,1,55,3,8,11,32,1,65,16,106,33,1,12,2,11,68,0,0,0,0,0,0,0,0,33,28,11,32,28,154,32,28,32,20,27,33,29,11,32,1,32,29,57,3,0,11,65,0,32,25,65,176,4,106,54,2,4,32,19,65,7,113,11,11,181,129,128,128,0,0,2,124,2,64,2,64,2,64,2,64,32,1,65,128,8,72,13,0,32,0,68,0,0,0,0,0,0,224,127,162,33,0,32,1,65,255,15,72,13,1,32,1,65,130,112,106,34,1,65,255,7,32,1,65,255,7,72,27,33,1,32,0,68,0,0,0,0,0,0,224,127,162,33,0,12,3,11,32,1,65,129,120,74,13,2,32,0,68,0,0,0,0,0,0,96,3,162,33,0,32,1,65,184,112,74,13,1,32,1,65,146,15,106,34,1,65,130,120,32,1,65,130,120,74,27,33,1,32,0,68,0,0,0,0,0,0,96,3,162,33,0,12,2,11,32,1,65,129,120,106,33,1,12,1,11,32,1,65,201,7,106,33,1,11,32,0,32,1,65,255,7,106,173,66,52,134,191,162,11,11,184,129,128,128,0,3,3,127,1,126,1,124,2,124,65,0,40,2,4,65,16,107,33,3,2,64,32,0,68,0,0,0,0,0,0,0,0,97,13,0,32,0,189,34,4,66,52,136,167,65,255,15,113,34,1,65,178,8,75,13,0,68,0,0,0,0,0,0,48,67,68,0,0,0,0,0,0,48,195,32,4,66,0,83,34,2,27,68,0,0,0,0,0,0,48,195,68,0,0,0,0,0,0,48,67,32,2,27,32,0,160,160,32,0,161,33,5,2,64,32,1,65,254,7,75,13,0,32,3,32,5,57,3,8,32,4,66,63,135,167,183,15,11,32,5,32,0,160,33,0,32,5,68,0,0,0,0,0,0,0,0,101,32,5,32,5,98,114,13,0,32,0,68,0,0,0,0,0,0,240,191,160,33,0,11,32,0,11,11,237,184,128,128,0,1,13,127,2,127,65,0,65,0,40,2,4,65,16,107,34,13,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,244,1,75,13,0,65,0,40,2,224,23,34,7,65,16,32,0,65,11,106,65,120,113,32,0,65,11,73,27,34,6,65,3,118,34,10,118,34,0,65,3,113,69,13,1,32,0,65,127,115,65,1,113,32,10,106,34,11,65,3,116,34,6,65,144,24,106,40,2,0,34,10,40,2,8,34,0,32,6,65,136,24,106,34,6,70,13,2,65,0,40,2,240,23,32,0,75,13,39,32,0,40,2,12,32,10,71,13,39,32,6,65,8,106,32,0,54,2,0,32,0,65,12,106,32,6,54,2,0,12,3,11,65,127,33,6,32,0,65,191,127,75,13,15,32,0,65,11,106,34,0,65,120,113,33,6,65,0,40,2,228,23,34,3,69,13,15,65,0,33,8,2,64,32,0,65,8,118,34,0,69,13,0,65,31,33,8,32,6,65,255,255,255,7,75,13,0,32,6,65,14,32,0,32,0,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,0,65,128,224,31,106,65,16,118,65,4,113,34,11,32,10,114,32,0,32,11,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,8,11,65,0,32,6,107,33,11,32,8,65,2,116,65,144,26,106,40,2,0,34,10,69,13,3,32,6,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,9,65,0,33,0,65,0,33,12,3,64,2,64,32,10,40,2,4,65,120,113,32,6,107,34,7,32,11,79,13,0,32,7,33,11,32,10,33,12,32,7,69,13,8,11,32,0,32,10,65,20,106,40,2,0,34,7,32,7,32,10,32,9,65,29,118,65,4,113,106,65,16,106,40,2,0,34,10,70,27,32,0,32,7,27,33,0,32,9,32,10,65,0,71,116,33,9,32,10,13,0,11,32,0,32,12,114,69,13,4,12,12,11,32,6,65,0,40,2,232,23,34,3,77,13,14,32,0,69,13,4,32,0,32,10,116,65,2,32,10,116,34,0,65,0,32,0,107,114,113,34,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,34,11,65,3,116,34,12,65,144,24,106,40,2,0,34,0,40,2,8,34,10,32,12,65,136,24,106,34,12,70,13,6,65,0,40,2,240,23,32,10,75,13,37,32,10,40,2,12,32,0,71,13,37,32,12,65,8,106,32,10,54,2,0,32,10,65,12,106,32,12,54,2,0,12,7,11,65,0,32,7,65,126,32,11,119,113,54,2,224,23,11,32,10,65,8,106,33,0,32,10,32,11,65,3,116,34,11,65,3,114,54,2,4,32,10,32,11,106,34,10,32,10,40,2,4,65,1,114,54,2,4,12,34,11,65,0,33,0,65,0,33,12,65,0,65,0,114,13,8,11,65,0,33,12,32,3,65,2,32,8,116,34,0,65,0,32,0,107,114,113,34,0,69,13,10,32,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,9,32,0,114,32,10,32,9,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,0,13,8,12,9,11,65,0,40,2,228,23,34,5,69,13,9,32,5,65,0,32,5,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,11,40,2,4,65,120,113,32,6,107,33,10,2,64,32,11,65,16,106,32,11,40,2,16,69,65,2,116,106,40,2,0,34,0,69,13,0,3,64,32,0,40,2,4,65,120,113,32,6,107,34,12,32,10,32,12,32,10,73,34,12,27,33,10,32,0,32,11,32,12,27,33,11,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,12,33,0,32,12,13,0,11,11,65,0,40,2,240,23,34,1,32,11,75,13,32,32,11,32,6,106,34,2,32,11,77,13,32,32,11,40,2,24,33,4,32,11,40,2,12,34,9,32,11,70,13,3,32,1,32,11,40,2,8,34,0,75,13,32,32,0,40,2,12,32,11,71,13,32,32,9,40,2,8,32,11,71,13,32,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,4,13,4,12,5,11,65,0,33,11,32,10,33,12,32,10,33,0,12,6,11,65,0,32,7,65,126,32,11,119,113,34,7,54,2,224,23,11,32,0,32,6,65,3,114,54,2,4,32,0,32,6,106,34,12,32,11,65,3,116,34,10,32,6,107,34,11,65,1,114,54,2,4,32,0,32,10,106,32,11,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,9,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,10,2,64,2,64,32,7,65,1,32,9,116,34,9,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,9,77,13,1,12,32,11,65,0,32,7,32,9,114,54,2,224,23,32,6,33,9,11,32,9,32,10,54,2,12,32,6,65,8,106,32,10,54,2,0,32,10,32,6,54,2,12,32,10,32,9,54,2,8,11,32,0,65,8,106,33,0,65,0,32,12,54,2,244,23,65,0,32,11,54,2,232,23,12,28,11,2,64,2,64,32,11,65,20,106,34,12,40,2,0,34,0,13,0,32,11,40,2,16,34,0,69,13,1,32,11,65,16,106,33,12,11,3,64,32,12,33,8,32,0,34,9,65,20,106,34,12,40,2,0,34,0,13,0,32,9,65,16,106,33,12,32,9,40,2,16,34,0,13,0,11,32,1,32,8,75,13,29,32,8,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,9,32,4,69,13,1,11,2,64,2,64,2,64,32,11,32,11,40,2,28,34,12,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,4,75,13,30,32,4,65,16,106,32,4,40,2,16,32,11,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,12,32,9,75,13,28,32,9,32,4,54,2,24,2,64,32,11,40,2,16,34,0,69,13,0,32,12,32,0,75,13,29,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,11,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,28,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,5,65,126,32,12,119,113,54,2,228,23,11,2,64,2,64,32,10,65,15,75,13,0,32,11,32,10,32,6,106,34,0,65,3,114,54,2,4,32,11,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,11,32,6,65,3,114,54,2,4,32,2,32,10,65,1,114,54,2,4,32,2,32,10,106,32,10,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,12,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,0,2,64,2,64,32,7,65,1,32,12,116,34,12,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,12,77,13,1,12,30,11,65,0,32,7,32,12,114,54,2,224,23,32,6,33,12,11,32,12,32,0,54,2,12,32,6,65,8,106,32,0,54,2,0,32,0,32,6,54,2,12,32,0,32,12,54,2,8,11,65,0,32,2,54,2,244,23,65,0,32,10,54,2,232,23,11,32,11,65,8,106,33,0,12,25,11,32,0,69,13,1,11,3,64,32,0,40,2,4,65,120,113,32,6,107,34,10,32,11,32,10,32,11,73,34,10,27,33,11,32,0,32,12,32,10,27,33,12,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,10,33,0,32,10,13,0,11,11,32,12,69,13,0,32,11,65,0,40,2,232,23,32,6,107,79,13,0,65,0,40,2,240,23,34,4,32,12,75,13,23,32,12,32,6,106,34,8,32,12,77,13,23,32,12,40,2,24,33,5,32,12,40,2,12,34,9,32,12,70,13,1,32,4,32,12,40,2,8,34,0,75,13,23,32,0,40,2,12,32,12,71,13,23,32,9,40,2,8,32,12,71,13,23,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,5,13,20,12,21,11,2,64,2,64,2,64,2,64,2,64,2,64,65,0,40,2,232,23,34,0,32,6,79,13,0,65,0,40,2,236,23,34,12,32,6,77,13,1,65,0,40,2,248,23,34,0,32,6,106,34,10,32,12,32,6,107,34,11,65,1,114,54,2,4,65,0,32,11,54,2,236,23,65,0,32,10,54,2,248,23,32,0,32,6,65,3,114,54,2,4,32,0,65,8,106,33,0,12,27,11,65,0,40,2,244,23,33,10,32,0,32,6,107,34,11,65,16,73,13,1,32,10,32,6,106,34,12,32,11,65,1,114,54,2,4,32,10,32,0,106,32,11,54,2,0,65,0,32,11,54,2,232,23,65,0,32,12,54,2,244,23,32,10,32,6,65,3,114,54,2,4,12,2,11,65,0,40,2,184,27,69,13,2,65,0,40,2,192,27,33,10,12,3,11,32,10,32,0,65,3,114,54,2,4,32,10,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,65,0,65,0,54,2,244,23,65,0,65,0,54,2,232,23,11,32,10,65,8,106,33,0,12,23,11,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,13,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,65,128,128,4,33,10,11,65,0,33,0,32,10,32,6,65,47,106,34,3,106,34,7,65,0,32,10,107,34,8,113,34,9,32,6,77,13,21,65,0,33,0,2,64,65,0,40,2,152,27,34,10,69,13,0,65,0,40,2,144,27,34,11,32,9,106,34,5,32,11,77,13,22,32,5,32,10,75,13,22,11,65,0,45,0,156,27,65,4,113,13,8,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,32,10,75,13,4,11,32,0,40,2,8,34,0,13,0,11,11,65,0,16,27,34,12,65,127,70,13,7,32,9,33,7,2,64,65,0,40,2,188,27,34,0,65,127,106,34,10,32,12,113,69,13,0,32,9,32,12,107,32,10,32,12,106,65,0,32,0,107,113,106,33,7,11,32,7,32,6,77,13,7,32,7,65,254,255,255,255,7,75,13,7,2,64,65,0,40,2,152,27,34,0,69,13,0,65,0,40,2,144,27,34,10,32,7,106,34,11,32,10,77,13,8,32,11,32,0,75,13,8,11,32,7,16,27,34,0,32,12,71,13,2,12,9,11,2,64,32,12,65,20,106,34,10,40,2,0,34,0,13,0,32,12,40,2,16,34,0,69,13,3,32,12,65,16,106,33,10,11,3,64,32,10,33,7,32,0,34,9,65,20,106,34,10,40,2,0,34,0,13,0,32,9,65,16,106,33,10,32,9,40,2,16,34,0,13,0,11,32,4,32,7,75,13,21,32,7,65,0,54,2,0,32,5,69,13,19,12,18,11,32,7,32,12,107,32,8,113,34,7,65,254,255,255,255,7,75,13,5,32,7,16,27,34,12,32,0,40,2,0,32,0,65,4,106,40,2,0,106,70,13,3,32,12,33,0,11,32,0,33,12,32,6,65,48,106,32,7,77,13,1,32,7,65,254,255,255,255,7,75,13,1,32,12,65,127,70,13,1,32,3,32,7,107,65,0,40,2,192,27,34,0,106,65,0,32,0,107,113,34,0,65,254,255,255,255,7,75,13,6,32,0,16,27,65,127,70,13,3,32,0,32,7,106,33,7,12,6,11,65,0,33,9,32,5,13,15,12,16,11,32,12,65,127,71,13,4,12,2,11,32,12,65,127,71,13,3,12,1,11,65,0,32,7,107,16,27,26,11,65,0,65,0,40,2,156,27,65,4,114,54,2,156,27,11,32,9,65,254,255,255,255,7,75,13,1,32,9,16,27,34,12,65,0,16,27,34,0,79,13,1,32,12,65,127,70,13,1,32,0,65,127,70,13,1,32,0,32,12,107,34,7,32,6,65,40,106,77,13,1,11,65,0,65,0,40,2,144,27,32,7,106,34,0,54,2,144,27,2,64,32,0,65,0,40,2,148,27,77,13,0,65,0,32,0,54,2,148,27,11,2,64,2,64,2,64,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,32,12,32,0,40,2,0,34,11,32,0,40,2,4,34,9,106,70,13,2,32,0,40,2,8,34,0,13,0,12,3,11,0,11,2,64,2,64,65,0,40,2,240,23,34,0,69,13,0,32,12,32,0,79,13,1,11,65,0,32,12,54,2,240,23,11,65,0,32,7,54,2,164,27,65,0,32,12,54,2,160,27,65,0,65,127,54,2,128,24,65,0,65,136,24,54,2,148,24,65,0,65,136,24,54,2,144,24,65,0,65,144,24,54,2,156,24,65,0,65,144,24,54,2,152,24,65,0,65,152,24,54,2,164,24,65,0,65,152,24,54,2,160,24,65,0,65,160,24,54,2,172,24,65,0,65,160,24,54,2,168,24,65,0,65,168,24,54,2,180,24,65,0,65,168,24,54,2,176,24,65,0,65,176,24,54,2,188,24,65,0,65,176,24,54,2,184,24,65,0,65,184,24,54,2,196,24,65,0,65,0,40,2,184,27,54,2,132,24,65,0,65,0,54,2,172,27,65,0,65,192,24,54,2,204,24,65,0,65,184,24,54,2,192,24,65,0,65,192,24,54,2,200,24,65,0,65,200,24,54,2,212,24,65,0,65,200,24,54,2,208,24,65,0,65,208,24,54,2,220,24,65,0,65,208,24,54,2,216,24,65,0,65,216,24,54,2,228,24,65,0,65,216,24,54,2,224,24,65,0,65,224,24,54,2,236,24,65,0,65,224,24,54,2,232,24,65,0,65,232,24,54,2,244,24,65,0,65,232,24,54,2,240,24,65,0,65,240,24,54,2,252,24,65,0,65,240,24,54,2,248,24,65,0,65,248,24,54,2,132,25,65,0,65,248,24,54,2,128,25,65,0,65,128,25,54,2,140,25,65,0,65,128,25,54,2,136,25,65,0,65,136,25,54,2,144,25,65,0,65,136,25,54,2,148,25,65,0,65,144,25,54,2,156,25,65,0,65,144,25,54,2,152,25,65,0,65,152,25,54,2,164,25,65,0,65,152,25,54,2,160,25,65,0,65,160,25,54,2,172,25,65,0,65,160,25,54,2,168,25,65,0,65,168,25,54,2,180,25,65,0,65,168,25,54,2,176,25,65,0,65,176,25,54,2,188,25,65,0,65,176,25,54,2,184,25,65,0,65,184,25,54,2,196,25,65,0,65,184,25,54,2,192,25,65,0,65,192,25,54,2,204,25,65,0,65,192,25,54,2,200,25,65,0,65,200,25,54,2,212,25,65,0,65,200,25,54,2,208,25,65,0,65,208,25,54,2,220,25,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,10,32,7,65,88,106,34,11,32,0,107,34,0,65,1,114,54,2,4,65,0,65,216,25,54,2,228,25,65,0,65,208,25,54,2,216,25,65,0,65,216,25,54,2,224,25,65,0,65,224,25,54,2,236,25,65,0,65,224,25,54,2,232,25,65,0,65,232,25,54,2,244,25,65,0,65,232,25,54,2,240,25,65,0,65,240,25,54,2,252,25,65,0,65,240,25,54,2,248,25,65,0,65,248,25,54,2,132,26,65,0,65,248,25,54,2,128,26,65,0,65,128,26,54,2,140,26,65,0,65,128,26,54,2,136,26,65,0,32,10,54,2,248,23,65,0,32,0,54,2,236,23,32,12,32,11,106,65,40,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,12,2,11,32,0,45,0,12,65,8,113,13,0,32,12,32,10,77,13,0,32,11,32,10,75,13,0,32,10,65,120,32,10,107,65,7,113,65,0,32,10,65,8,106,65,7,113,27,34,11,106,34,12,65,0,40,2,236,23,32,7,106,34,8,32,11,107,34,11,65,1,114,54,2,4,32,0,65,4,106,32,9,32,7,106,54,2,0,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,11,54,2,236,23,65,0,32,12,54,2,248,23,32,10,32,8,106,65,40,54,2,4,12,1,11,2,64,32,12,65,0,40,2,240,23,34,9,79,13,0,65,0,32,12,54,2,240,23,32,12,33,9,11,32,12,32,7,106,33,11,65,160,27,33,0,2,64,2,64,2,64,2,64,2,64,2,64,2,64,3,64,32,0,40,2,0,32,11,70,13,1,32,0,40,2,8,34,0,13,0,12,2,11,0,11,32,0,45,0,12,65,8,113,13,0,32,0,32,12,54,2,0,32,0,32,0,40,2,4,32,7,106,54,2,4,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,106,34,8,32,6,65,3,114,54,2,4,32,11,65,120,32,11,107,65,7,113,65,0,32,11,65,8,106,65,7,113,27,106,34,12,32,8,107,32,6,107,33,0,32,8,32,6,106,33,11,32,10,32,12,70,13,1,65,0,40,2,244,23,32,12,70,13,8,32,12,40,2,4,34,5,65,3,113,65,1,71,13,14,32,5,65,255,1,75,13,9,32,12,40,2,12,33,10,2,64,32,12,40,2,8,34,6,32,5,65,3,118,34,3,65,3,116,65,136,24,106,34,7,70,13,0,32,9,32,6,75,13,20,32,6,40,2,12,32,12,71,13,20,11,32,10,32,6,70,13,10,2,64,32,10,32,7,70,13,0,32,9,32,10,75,13,20,32,10,40,2,8,32,12,71,13,20,11,32,6,32,10,54,2,12,32,10,65,8,106,32,6,54,2,0,12,13,11,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,34,11,32,10,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,8,32,7,65,88,106,34,9,32,0,107,34,0,65,1,114,54,2,4,32,12,32,9,106,65,40,54,2,4,32,10,32,11,65,39,32,11,107,65,7,113,65,0,32,11,65,89,106,65,7,113,27,106,65,81,106,34,9,32,9,32,10,65,16,106,73,27,34,9,65,27,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,0,54,2,236,23,65,0,32,8,54,2,248,23,32,9,65,16,106,65,0,40,2,168,27,54,2,0,32,9,65,12,106,65,0,40,2,164,27,54,2,0,32,9,65,0,40,2,160,27,54,2,8,32,9,65,20,106,65,0,40,2,172,27,54,2,0,65,0,32,12,54,2,160,27,65,0,32,7,54,2,164,27,65,0,32,9,65,8,106,54,2,168,27,65,0,65,0,54,2,172,27,32,9,65,28,106,33,0,3,64,32,0,65,7,54,2,0,32,0,65,4,106,34,0,32,11,73,13,0,11,32,9,32,10,70,13,5,32,9,65,4,106,34,0,32,0,40,2,0,65,126,113,54,2,0,32,9,32,9,32,10,107,34,7,54,2,0,32,10,32,7,65,1,114,54,2,4,2,64,32,7,65,255,1,75,13,0,32,7,65,3,118,34,11,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,12,65,1,32,11,116,34,11,113,69,13,2,65,0,40,2,240,23,32,0,40,2,8,34,11,77,13,3,12,19,11,65,0,33,0,2,64,32,7,65,8,118,34,11,69,13,0,65,31,33,0,32,7,65,255,255,255,7,75,13,0,32,7,65,14,32,11,32,11,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,11,65,128,224,31,106,65,16,118,65,4,113,34,12,32,0,114,32,11,32,12,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,11,114,107,32,0,32,11,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,11,32,10,66,0,55,2,16,32,10,65,28,106,32,0,54,2,0,32,0,65,2,116,65,144,26,106,33,11,65,0,40,2,228,23,34,12,65,1,32,0,116,34,9,113,69,13,3,32,7,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,11,40,2,0,33,12,3,64,32,12,34,11,40,2,4,65,120,113,32,7,70,13,5,32,0,65,29,118,33,12,32,0,65,1,116,33,0,32,11,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,18,32,9,32,10,54,2,0,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,12,32,10,32,10,54,2,8,12,5,11,65,0,32,11,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,11,32,0,65,1,114,54,2,4,12,13,11,65,0,32,12,32,11,114,54,2,224,23,32,0,33,11,11,32,11,32,10,54,2,12,32,0,65,8,106,32,10,54,2,0,32,10,32,0,54,2,12,32,10,32,11,54,2,8,12,2,11,32,11,32,10,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,8,32,10,32,10,54,2,12,12,1,11,65,0,40,2,240,23,34,12,32,11,40,2,8,34,0,75,13,13,32,12,32,11,75,13,13,32,0,32,10,54,2,12,32,11,65,8,106,32,10,54,2,0,32,10,32,11,54,2,12,32,10,65,24,106,65,0,54,2,0,32,10,32,0,54,2,8,11,65,0,40,2,236,23,34,0,32,6,77,13,0,65,0,40,2,248,23,34,10,32,6,106,34,11,32,0,32,6,107,34,0,65,1,114,54,2,4,65,0,32,0,54,2,236,23,65,0,32,11,54,2,248,23,32,10,32,6,65,3,114,54,2,4,32,10,65,8,106,33,0,12,11,11,16,28,65,12,54,2,0,65,0,33,0,12,10,11,32,11,65,0,40,2,232,23,32,0,106,34,0,65,1,114,54,2,4,65,0,32,11,54,2,244,23,65,0,32,0,54,2,232,23,32,11,32,0,106,32,0,54,2,0,12,6,11,32,12,40,2,24,33,4,32,12,40,2,12,34,7,32,12,70,13,1,32,9,32,12,40,2,8,34,10,75,13,9,32,10,40,2,12,32,12,71,13,9,32,7,40,2,8,32,12,71,13,9,32,7,65,8,106,32,10,54,2,0,32,10,65,12,106,32,7,54,2,0,32,4,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,3,119,113,54,2,224,23,12,2,11,2,64,2,64,32,12,65,20,106,34,6,40,2,0,34,10,13,0,32,12,65,16,106,34,6,40,2,0,34,10,69,13,1,11,3,64,32,6,33,3,32,10,34,7,65,20,106,34,6,40,2,0,34,10,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,10,13,0,11,32,9,32,3,75,13,8,32,3,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,7,32,4,69,13,1,11,2,64,2,64,2,64,32,12,40,2,28,34,6,65,2,116,65,144,26,106,34,10,40,2,0,32,12,70,13,0,65,0,40,2,240,23,32,4,75,13,9,32,4,65,16,106,32,4,40,2,16,32,12,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,10,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,7,32,7,32,4,54,2,24,2,64,32,12,40,2,16,34,10,69,13,0,32,6,32,10,75,13,8,32,7,32,10,54,2,16,32,10,32,7,54,2,24,11,32,12,65,20,106,40,2,0,34,10,69,13,1,65,0,40,2,240,23,32,10,75,13,7,32,7,65,20,106,32,10,54,2,0,32,10,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,5,65,120,113,34,10,32,0,106,33,0,32,12,32,10,106,33,12,11,32,12,32,12,40,2,4,65,126,113,54,2,4,32,11,32,0,65,1,114,54,2,4,32,11,32,0,106,32,0,54,2,0,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,9,32,0,65,8,106,33,6,12,2,11,65,0,33,10,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,10,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,12,32,10,114,32,6,32,12,116,34,10,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,10,32,6,116,65,15,118,106,34,10,65,7,106,118,65,1,113,32,10,65,1,116,114,33,10,11,32,11,32,10,54,2,28,32,11,66,0,55,2,16,32,10,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,12,65,1,32,10,116,34,9,113,69,13,2,32,0,65,0,65,25,32,10,65,1,118,107,32,10,65,31,70,27,116,33,10,32,6,40,2,0,33,12,3,64,32,12,34,6,40,2,4,65,120,113,32,0,70,13,4,32,10,65,29,118,33,12,32,10,65,1,116,33,10,32,6,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,8,32,9,32,11,54,2,0,32,11,32,6,54,2,24,32,11,32,11,54,2,12,32,11,32,11,54,2,8,12,4,11,65,0,32,6,32,10,114,54,2,224,23,32,0,65,8,106,33,6,32,0,33,10,11,32,10,32,11,54,2,12,32,6,32,11,54,2,0,32,11,32,0,54,2,12,32,11,32,10,54,2,8,12,2,11,32,6,32,11,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,11,32,6,54,2,24,32,11,32,11,54,2,8,32,11,32,11,54,2,12,12,1,11,65,0,40,2,240,23,34,10,32,6,40,2,8,34,0,75,13,4,32,10,32,6,75,13,4,32,0,32,11,54,2,12,32,6,65,8,106,32,11,54,2,0,32,11,65,0,54,2,24,32,11,32,6,54,2,12,32,11,32,0,54,2,8,11,32,8,65,8,106,33,0,12,2,11,2,64,2,64,2,64,32,12,32,12,40,2,28,34,10,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,5,75,13,5,32,5,65,16,106,32,5,40,2,16,32,12,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,10,32,9,75,13,3,32,9,32,5,54,2,24,2,64,32,12,40,2,16,34,0,69,13,0,32,10,32,0,75,13,4,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,12,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,3,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,3,65,126,32,10,119,113,34,3,54,2,228,23,11,2,64,2,64,32,11,65,15,75,13,0,32,12,32,11,32,6,106,34,0,65,3,114,54,2,4,32,12,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,12,32,6,65,3,114,54,2,4,32,8,32,11,65,1,114,54,2,4,32,8,32,11,106,32,11,54,2,0,2,64,2,64,2,64,2,64,2,64,32,11,65,255,1,75,13,0,32,11,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,11,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,7,32,0,65,8,106,33,11,12,2,11,32,11,65,8,118,34,10,69,13,2,65,31,33,0,32,11,65,255,255,255,7,75,13,3,32,11,65,14,32,10,32,10,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,10,65,128,224,31,106,65,16,118,65,4,113,34,6,32,0,114,32,10,32,6,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,12,3,11,65,0,32,11,32,10,114,54,2,224,23,32,0,65,8,106,33,11,32,0,33,10,11,32,10,32,8,54,2,12,32,11,32,8,54,2,0,32,8,32,0,54,2,12,32,8,32,10,54,2,8,12,2,11,65,0,33,0,11,32,8,32,0,54,2,28,32,8,66,0,55,2,16,32,0,65,2,116,65,144,26,106,33,10,2,64,2,64,32,3,65,1,32,0,116,34,6,113,69,13,0,32,11,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,10,40,2,0,33,6,3,64,32,6,34,10,40,2,4,65,120,113,32,11,70,13,2,32,0,65,29,118,33,6,32,0,65,1,116,33,0,32,10,32,6,65,4,113,106,65,16,106,34,9,40,2,0,34,6,13,0,11,65,0,40,2,240,23,32,9,75,13,4,32,9,32,8,54,2,0,32,8,32,10,54,2,24,32,8,32,8,54,2,12,32,8,32,8,54,2,8,12,2,11,32,10,32,8,54,2,0,65,0,32,3,32,6,114,54,2,228,23,32,8,32,10,54,2,24,32,8,32,8,54,2,8,32,8,32,8,54,2,12,12,1,11,65,0,40,2,240,23,34,11,32,10,40,2,8,34,0,75,13,2,32,11,32,10,75,13,2,32,0,32,8,54,2,12,32,10,65,8,106,32,8,54,2,0,32,8,65,0,54,2,24,32,8,32,10,54,2,12,32,8,32,0,54,2,8,11,32,12,65,8,106,33,0,11,65,0,32,13,65,16,106,54,2,4,32,0,15,11,16,26,0,11,11,137,128,128,128,0,0,16,28,40,2,0,16,0,11,128,129,128,128,0,1,3,127,2,127,2,64,2,64,2,64,2,64,32,0,65,0,72,13,0,63,0,65,16,116,33,1,65,0,40,2,212,27,34,2,32,0,79,13,1,32,0,65,127,106,32,2,107,65,16,118,65,1,106,64,0,69,13,3,16,1,65,0,63,0,65,16,116,34,3,32,1,107,65,0,40,2,212,27,106,34,2,54,2,212,27,12,2,11,65,127,15,11,32,1,33,3,11,65,0,32,2,32,0,107,54,2,212,27,32,3,32,2,107,15,11,16,28,65,12,54,2,0,16,26,0,11,11,133,128,128,128,0,0,65,208,27,11,232,144,128,128,0,1,8,127,2,64,2,64,2,64,2,64,32,0,69,13,0,2,64,2,64,2,64,2,64,32,0,65,120,106,34,3,65,0,40,2,240,23,34,5,73,13,0,32,0,65,124,106,40,2,0,34,8,65,3,113,34,6,65,1,70,13,0,32,3,32,8,65,120,113,34,0,106,33,1,2,64,2,64,32,8,65,1,113,13,0,32,6,69,13,6,32,3,32,3,40,2,0,34,8,107,34,3,32,5,73,13,2,32,8,32,0,106,33,0,2,64,2,64,2,64,2,64,2,64,65,0,40,2,244,23,32,3,70,13,0,32,8,65,255,1,75,13,1,32,3,40,2,12,33,6,2,64,32,3,40,2,8,34,7,32,8,65,3,118,34,4,65,3,116,65,136,24,106,34,8,70,13,0,32,5,32,7,75,13,14,32,7,40,2,12,32,3,71,13,14,11,32,6,32,7,70,13,2,2,64,32,6,32,8,70,13,0,32,5,32,6,75,13,14,32,6,40,2,8,32,3,71,13,14,11,32,7,32,6,54,2,12,32,6,65,8,106,32,7,54,2,0,32,3,32,1,73,13,6,12,7,11,32,1,40,2,4,34,8,65,3,113,65,3,71,13,4,32,1,65,4,106,32,8,65,126,113,54,2,0,32,3,32,0,65,1,114,54,2,4,65,0,32,0,54,2,232,23,32,3,32,0,106,32,0,54,2,0,15,11,32,3,40,2,24,33,2,32,3,40,2,12,34,7,32,3,70,13,1,32,5,32,3,40,2,8,34,8,75,13,11,32,8,40,2,12,32,3,71,13,11,32,7,40,2,8,32,3,71,13,11,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,4,119,113,54,2,224,23,32,3,32,1,73,13,3,12,4,11,2,64,2,64,32,3,65,20,106,34,8,40,2,0,34,6,13,0,32,3,65,16,106,34,8,40,2,0,34,6,69,13,1,11,3,64,32,8,33,4,32,6,34,7,65,20,106,34,8,40,2,0,34,6,13,0,32,7,65,16,106,33,8,32,7,40,2,16,34,6,13,0,11,32,5,32,4,75,13,10,32,4,65,0,54,2,0,32,2,69,13,2,12,1,11,65,0,33,7,32,2,69,13,1,11,2,64,2,64,2,64,32,3,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,3,70,13,0,65,0,40,2,240,23,32,2,75,13,11,32,2,65,16,106,32,2,40,2,16,32,3,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,9,32,7,32,2,54,2,24,2,64,32,3,40,2,16,34,8,69,13,0,32,6,32,8,75,13,10,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,3,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,9,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,32,3,32,1,73,13,2,12,3,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,1,79,13,1,11,32,1,40,2,4,34,4,65,1,113,69,13,0,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,2,113,13,0,65,0,40,2,248,23,32,1,70,13,1,65,0,40,2,244,23,32,1,70,13,2,32,4,65,255,1,75,13,3,32,1,40,2,12,33,8,2,64,32,1,40,2,8,34,6,32,4,65,3,118,34,5,65,3,116,65,136,24,106,34,7,70,13,0,65,0,40,2,240,23,32,6,75,13,13,32,6,40,2,12,32,1,71,13,13,11,32,8,32,6,70,13,4,2,64,32,8,32,7,70,13,0,65,0,40,2,240,23,32,8,75,13,13,32,8,40,2,8,32,1,71,13,13,11,32,6,32,8,54,2,12,32,8,65,8,106,32,6,54,2,0,12,8,11,32,1,65,4,106,32,4,65,126,113,54,2,0,32,3,32,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,12,8,11,65,0,32,3,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,3,32,0,65,1,114,54,2,4,2,64,32,3,65,0,40,2,244,23,71,13,0,65,0,65,0,54,2,232,23,65,0,65,0,54,2,244,23,11,32,0,65,0,40,2,252,23,77,13,8,65,0,16,30,26,15,11,65,0,32,3,54,2,244,23,65,0,65,0,40,2,232,23,32,0,106,34,0,54,2,232,23,32,3,32,0,65,1,114,54,2,4,32,3,32,0,106,32,0,54,2,0,15,11,32,1,40,2,24,33,2,32,1,40,2,12,34,7,32,1,70,13,1,65,0,40,2,240,23,32,1,40,2,8,34,8,75,13,8,32,8,40,2,12,32,1,71,13,8,32,7,40,2,8,32,1,71,13,8,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,3,12,4,11,65,0,65,0,40,2,224,23,65,126,32,5,119,113,54,2,224,23,12,3,11,2,64,2,64,32,1,65,20,106,34,6,40,2,0,34,8,13,0,32,1,65,16,106,34,6,40,2,0,34,8,69,13,1,11,3,64,32,6,33,5,32,8,34,7,65,20,106,34,6,40,2,0,34,8,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,8,13,0,11,65,0,40,2,240,23,32,5,75,13,7,32,5,65,0,54,2,0,32,2,69,13,3,12,2,11,65,0,33,7,32,2,13,1,12,2,11,16,28,26,16,28,65,14,54,2,0,16,26,0,11,2,64,2,64,2,64,32,1,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,1,70,13,0,65,0,40,2,240,23,32,2,75,13,7,32,2,65,16,106,32,2,40,2,16,32,1,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,5,32,7,32,2,54,2,24,2,64,32,1,40,2,16,34,8,69,13,0,32,6,32,8,75,13,6,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,1,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,5,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,4,65,120,113,32,0,106,34,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,32,3,65,0,40,2,244,23,71,13,0,65,0,32,0,54,2,232,23,15,11,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,8,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,8,116,34,8,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,8,77,13,2,12,8,11,65,0,33,8,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,8,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,8,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,7,32,8,114,32,6,32,7,116,34,8,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,8,32,6,116,65,15,118,106,34,8,65,7,106,118,65,1,113,32,8,65,1,116,114,33,8,11,32,3,66,0,55,2,16,32,3,65,28,106,32,8,54,2,0,32,8,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,7,65,1,32,8,116,34,1,113,69,13,2,32,0,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,8,32,6,40,2,0,33,7,3,64,32,7,34,6,40,2,4,65,120,113,32,0,70,13,4,32,8,65,29,118,33,7,32,8,65,1,116,33,8,32,6,32,7,65,4,113,106,65,16,106,34,1,40,2,0,34,7,13,0,11,65,0,40,2,240,23,32,1,75,13,7,32,1,32,3,54,2,0,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,12,32,3,32,3,54,2,8,12,4,11,65,0,32,6,32,8,114,54,2,224,23,32,0,33,8,11,32,8,32,3,54,2,12,32,0,65,8,106,32,3,54,2,0,32,3,32,0,54,2,12,32,3,32,8,54,2,8,15,11,32,6,32,3,54,2,0,65,0,32,7,32,1,114,54,2,228,23,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,8,32,3,32,3,54,2,12,12,1,11,65,0,40,2,240,23,34,8,32,6,40,2,8,34,0,75,13,3,32,8,32,6,75,13,3,32,0,32,3,54,2,12,32,6,65,8,106,32,3,54,2,0,32,3,32,6,54,2,12,32,3,65,24,106,65,0,54,2,0,32,3,32,0,54,2,8,11,65,0,65,0,40,2,128,24,65,127,106,34,3,54,2,128,24,32,3,69,13,1,11,15,11,65,168,27,33,3,3,64,32,3,40,2,0,34,0,65,8,106,33,3,32,0,13,0,11,65,0,65,127,54,2,128,24,15,11,16,26,0,0,11,0,11,240,131,128,128,0,1,7,127,2,127,65,0,65,0,40,2,4,65,16,107,34,7,54,2,4,65,0,33,6,2,64,65,0,40,2,184,27,13,0,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,7,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,11,2,64,32,0,65,191,127,75,13,0,65,0,33,6,65,0,40,2,248,23,34,1,69,13,0,65,0,33,6,2,64,65,0,40,2,236,23,34,4,32,0,65,40,106,77,13,0,65,88,32,0,107,32,4,106,65,0,40,2,192,27,34,2,106,65,127,106,32,2,110,65,127,106,33,3,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,4,32,1,75,13,0,32,4,32,0,40,2,4,106,32,1,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,0,45,0,12,65,8,113,13,0,65,0,16,27,34,1,32,0,40,2,0,32,0,65,4,106,40,2,0,106,71,13,0,65,0,65,128,128,128,128,120,32,2,107,32,3,32,2,108,34,4,32,4,65,254,255,255,255,7,75,27,107,16,27,33,2,65,0,16,27,33,4,32,2,65,127,70,13,0,32,4,32,1,79,13,0,32,1,32,4,107,34,1,69,13,0,65,1,33,6,65,0,40,2,248,23,34,4,65,120,32,4,107,65,7,113,65,0,32,4,65,8,106,65,7,113,27,34,2,106,34,3,65,0,40,2,236,23,32,1,107,34,5,32,2,107,34,2,65,1,114,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,65,0,40,2,144,27,32,1,107,54,2,144,27,32,0,65,4,106,34,0,32,0,40,2,0,32,1,107,54,2,0,65,0,32,2,54,2,236,23,65,0,32,3,54,2,248,23,32,4,32,5,106,65,40,54,2,4,12,1,11,65,0,40,2,236,23,65,0,40,2,252,23,77,13,0,65,0,33,6,65,0,65,127,54,2,252,23,11,65,0,32,7,65,16,106,54,2,4,32,6,11,11,194,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,3,148,32,0,67,0,0,128,123,146,32,1,65,128,128,128,4,73,27,56,2,4,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,227,151,219,128,4,75,13,2,32,2,69,13,6,32,4,68,24,45,68,84,251,33,249,63,160,16,19,140,33,0,12,11,11,32,0,187,16,20,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,0,187,33,4,32,1,65,223,219,191,133,4,75,13,2,32,2,69,13,5,32,4,68,210,33,51,127,124,217,18,64,160,16,19,33,0,12,9,11,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,154,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,4,160,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,20,33,0,12,5,11,32,4,68,24,45,68,84,251,33,249,191,160,16,19,33,0,12,4,11,32,4,68,210,33,51,127,124,217,18,192,160,16,19,140,33,0,12,3,11,32,3,43,3,8,154,16,20,33,0,12,2,11,32,3,43,3,8,16,19,33,0,12,1,11,32,3,43,3,8,16,19,140,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,11,160,152,128,128,0,17,0,65,4,11,4,240,52,0,0,0,65,12,11,4,0,0,0,0,0,65,16,11,4,2,0,0,0,0,65,36,11,4,0,0,0,0,0,65,40,11,4,0,0,0,0,0,65,44,11,4,0,0,0,0,0,65,48,11,4,0,0,0,0,0,65,52,11,4,0,0,0,0,0,65,192,0,11,32,210,33,51,127,124,217,2,64,210,33,51,127,124,217,2,192,24,45,68,84,251,33,233,63,24,45,68,84,251,33,233,191,0,65,224,0,11,32,24,45,68,84,251,33,9,64,24,45,68,84,251,33,9,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,65,128,1,11,32,79,187,97,5,103,172,221,63,24,45,68,84,251,33,233,63,155,246,129,210,11,115,239,63,24,45,68,84,251,33,249,63,0,65,160,1,11,32,226,101,47,34,127,43,122,60,7,92,20,51,38,166,129,60,189,203,240,122,136,7,112,60,7,92,20,51,38,166,145,60,0,65,192,1,11,16,3,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,0,65,208,1,11,200,21,131,249,162,0,68,78,110,0,252,41,21,0,209,87,39,0,221,52,245,0,98,219,192,0,60,153,149,0,65,144,67,0,99,81,254,0,187,222,171,0,183,97,197,0,58,110,36,0,210,77,66,0,73,6,224,0,9,234,46,0,28,146,209,0,235,29,254,0,41,177,28,0,232,62,167,0,245,53,130,0,68,187,46,0,156,233,132,0,180,38,112,0,65,126,95,0,214,145,57,0,83,131,57,0,156,244,57,0,139,95,132,0,40,249,189,0,248,31,59,0,222,255,151,0,15,152,5,0,17,47,239,0,10,90,139,0,109,31,109,0,207,126,54,0,9,203,39,0,70,79,183,0,158,102,63,0,45,234,95,0,186,39,117,0,229,235,199,0,61,123,241,0,247,57,7,0,146,82,138,0,251,107,234,0,31,177,95,0,8,93,141,0,48,3,86,0,123,252,70,0,240,171,107,0,32,188,207,0,54,244,154,0,227,169,29,0,94,97,145,0,8,27,230,0,133,153,101,0,160,20,95,0,141,64,104,0,128,216,255,0,39,115,77,0,6,6,49,0,202,86,21,0,201,168,115,0,123,226,96,0,107,140,192,0,25,196,71,0,205,103,195,0,9,232,220,0,89,131,42,0,139,118,196,0,166,28,150,0,68,175,221,0,25,87,209,0,165,62,5,0,5,7,255,0,51,126,63,0,194,50,232,0,152,79,222,0,187,125,50,0,38,61,195,0,30,107,239,0,159,248,94,0,53,31,58,0,127,242,202,0,241,135,29,0,124,144,33,0,106,36,124,0,213,110,250,0,48,45,119,0,21,59,67,0,181,20,198,0,195,25,157,0,173,196,194,0,44,77,65,0,12,0,93,0,134,125,70,0,227,113,45,0,155,198,154,0,51,98,0,0,180,210,124,0,180,167,151,0,55,85,213,0,215,62,246,0,163,16,24,0,77,118,252,0,100,157,42,0,112,215,171,0,99,124,248,0,122,176,87,0,23,21,231,0,192,73,86,0,59,214,217,0,167,132,56,0,36,35,203,0,214,138,119,0,90,84,35,0,0,31,185,0,241,10,27,0,25,206,223,0,159,49,255,0,102,30,106,0,153,87,97,0,172,251,71,0,126,127,216,0,34,101,183,0,50,232,137,0,230,191,96,0,239,196,205,0,108,54,9,0,93,63,212,0,22,222,215,0,88,59,222,0,222,155,146,0,210,34,40,0,40,134,232,0,226,88,77,0,198,202,50,0,8,227,22,0,224,125,203,0,23,192,80,0,243,29,167,0,24,224,91,0,46,19,52,0,131,18,98,0,131,72,1,0,245,142,91,0,173,176,127,0,30,233,242,0,72,74,67,0,16,103,211,0,170,221,216,0,174,95,66,0,106,97,206,0,10,40,164,0,211,153,180,0,6,166,242,0,92,119,127,0,163,194,131,0,97,60,136,0,138,115,120,0,175,140,90,0,111,215,189,0,45,166,99,0,244,191,203,0,141,129,239,0,38,193,103,0,85,202,69,0,202,217,54,0,40,168,210,0,194,97,141,0,18,201,119,0,4,38,20,0,18,70,155,0,196,89,196,0,200,197,68,0,77,178,145,0,0,23,243,0,212,67,173,0,41,73,229,0,253,213,16,0,0,190,252,0,30,148,204,0,112,206,238,0,19,62,245,0,236,241,128,0,179,231,195,0,199,248,40,0,147,5,148,0,193,113,62,0,46,9,179,0,11,69,243,0,136,18,156,0,171,32,123,0,46,181,159,0,71,146,194,0,123,50,47,0,12,85,109,0,114,167,144,0,107,231,31,0,49,203,150,0,121,22,74,0,65,121,226,0,244,223,137,0,232,148,151,0,226,230,132,0,153,49,151,0,136,237,107,0,95,95,54,0,187,253,14,0,72,154,180,0,103,164,108,0,113,114,66,0,141,93,50,0,159,21,184,0,188,229,9,0,141,49,37,0,247,116,57,0,48,5,28,0,13,12,1,0,75,8,104,0,44,238,88,0,71,170,144,0,116,231,2,0,189,214,36,0,247,125,166,0,110,72,114,0,159,22,239,0,142,148,166,0,180,145,246,0,209,83,81,0,207,10,242,0,32,152,51,0,245,75,126,0,178,99,104,0,221,62,95,0,64,93,3,0,133,137,127,0,85,82,41,0,55,100,192,0,109,216,16,0,50,72,50,0,91,76,117,0,78,113,212,0,69,84,110,0,11,9,193,0,42,245,105,0,20,102,213,0,39,7,157,0,93,4,80,0,180,59,219,0,234,118,197,0,135,249,23,0,73,107,125,0,29,39,186,0,150,105,41,0,198,204,172,0,173,20,84,0,144,226,106,0,136,217,137,0,44,114,80,0,4,164,190,0,119,7,148,0,243,48,112,0,0,252,39,0,234,113,168,0,102,194,73,0,100,224,61,0,151,221,131,0,163,63,151,0,67,148,253,0,13,134,140,0,49,65,222,0,146,57,157,0,221,112,140,0,23,183,231,0,8,223,59,0,21,55,43,0,92,128,160,0,90,128,147,0,16,17,146,0,15,232,216,0,108,128,175,0,219,255,75,0,56,144,15,0,89,24,118,0,98,165,21,0,97,203,187,0,199,137,185,0,16,64,189,0,210,242,4,0,73,117,39,0,235,182,246,0,219,34,187,0,10,20,170,0,137,38,47,0,100,131,118,0,9,59,51,0,14,148,26,0,81,58,170,0,29,163,194,0,175,237,174,0,92,38,18,0,109,194,77,0,45,122,156,0,192,86,151,0,3,63,131,0,9,240,246,0,43,64,140,0,109,49,153,0,57,180,7,0,12,32,21,0,216,195,91,0,245,146,196,0,198,173,75,0,78,202,165,0,167,55,205,0,230,169,54,0,171,146,148,0,221,66,104,0,25,99,222,0,118,140,239,0,104,139,82,0,252,219,55,0,174,161,171,0,223,21,49,0,0,174,161,0,12,251,218,0,100,77,102,0,237,5,183,0,41,101,48,0,87,86,191,0,71,255,58,0,106,249,185,0,117,190,243,0,40,147,223,0,171,128,48,0,102,140,246,0,4,203,21,0,250,34,6,0,217,228,29,0,61,179,164,0,87,27,143,0,54,205,9,0,78,66,233,0,19,190,164,0,51,35,181,0,240,170,26,0,79,101,168,0,210,193,165,0,11,63,15,0,91,120,205,0,35,249,118,0,123,139,4,0,137,23,114,0,198,166,83,0,111,110,226,0,239,235,0,0,155,74,88,0,196,218,183,0,170,102,186,0,118,207,207,0,209,2,29,0,177,241,45,0,140,153,193,0,195,173,119,0,134,72,218,0,247,93,160,0,198,128,244,0,172,240,47,0,221,236,154,0,63,92,188,0,208,222,109,0,144,199,31,0,42,219,182,0,163,37,58,0,0,175,154,0,173,83,147,0,182,87,4,0,41,45,180,0,75,128,126,0,218,7,167,0,118,170,14,0,123,89,161,0,22,18,42,0,220,183,45,0,250,229,253,0,137,219,254,0,137,190,253,0,228,118,108,0,6,169,252,0,62,128,112,0,133,110,21,0,253,135,255,0,40,62,7,0,97,103,51,0,42,24,134,0,77,189,234,0,179,231,175,0,143,109,110,0,149,103,57,0,49,191,91,0,132,215,72,0,48,223,22,0,199,45,67,0,37,97,53,0,201,112,206,0,48,203,184,0,191,108,253,0,164,0,162,0,5,108,228,0,90,221,160,0,33,111,71,0,98,18,210,0,185,92,132,0,112,97,73,0,107,86,224,0,153,82,1,0,80,85,55,0,30,213,183,0,51,241,196,0,19,110,95,0,93,48,228,0,133,46,169,0,29,178,195,0,161,50,54,0,8,183,164,0,234,177,212,0,22,247,33,0,143,105,228,0,39,255,119,0,12,3,128,0,141,64,45,0,79,205,160,0,32,165,153,0,179,162,211,0,47,93,10,0,180,249,66,0,17,218,203,0,125,190,208,0,155,219,193,0,171,23,189,0,202,162,129,0,8,106,92,0,46,85,23,0,39,0,85,0,127,20,240,0,225,7,134,0,20,11,100,0,150,65,141,0,135,190,222,0,218,253,42,0,107,37,182,0,123,137,52,0,5,243,254,0,185,191,158,0,104,106,79,0,74,42,168,0,79,196,90,0,45,248,188,0,215,90,152,0,244,199,149,0,13,77,141,0,32,58,166,0,164,87,95,0,20,63,177,0,128,56,149,0,204,32,1,0,113,221,134,0,201,222,182,0,191,96,245,0,77,101,17,0,1,7,107,0,140,176,172,0,178,192,208,0,81,85,72,0,30,251,14,0,149,114,195,0,163,6,59,0,192,64,53,0,6,220,123,0,224,69,204,0,78,41,250,0,214,202,200,0,232,243,65,0,124,100,222,0,155,100,216,0,217,190,49,0,164,151,195,0,119,88,212,0,105,227,197,0,240,218,19,0,186,58,60,0,70,24,70,0,85,117,95,0,210,189,245,0,110,146,198,0,172,46,93,0,14,68,237,0,28,62,66,0,97,196,135,0,41,253,233,0,231,214,243,0,34,124,202,0,111,145,53,0,8,224,197,0,255,215,141,0,110,106,226,0,176,253,198,0,147,8,193,0,124,93,116,0,107,173,178,0,205,110,157,0,62,114,123,0,198,17,106,0,247,207,169,0,41,115,223,0,181,201,186,0,183,0,81,0,226,178,13,0,116,186,36,0,229,125,96,0,116,216,138,0,13,21,44,0,129,24,12,0,126,102,148,0,1,41,22,0,159,122,118,0,253,253,190,0,86,69,239,0,217,126,54,0,236,217,19,0,139,186,185,0,196,151,252,0,49,168,39,0,241,110,195,0,148,197,54,0,216,168,86,0,180,168,181,0,207,204,14,0,18,137,45,0,111,87,52,0,44,86,137,0,153,206,227,0,214,32,185,0,107,94,170,0,62,42,156,0,17,95,204,0,253,11,74,0,225,244,251,0,142,59,109,0,226,134,44,0,233,212,132,0,252,180,169,0,239,238,209,0,46,53,201,0,47,57,97,0,56,33,68,0,27,217,200,0,129,252,10,0,251,74,106,0,47,28,216,0,83,180,132,0,78,153,140,0,84,34,204,0,42,85,220,0,192,198,214,0,11,25,150,0,26,112,184,0,105,149,100,0,38,90,96,0,63,82,238,0,127,17,15,0,244,181,17,0,252,203,245,0,52,188,45,0,52,188,238,0,232,93,204,0,221,94,96,0,103,142,155,0,146,51,239,0,201,23,184,0,97,88,155,0,225,87,188,0,81,131,198,0,216,62,16,0,221,113,72,0,45,28,221,0,175,24,161,0,33,44,70,0,89,243,215,0,217,122,152,0,158,84,192,0,79,134,250,0,86,6,252,0,229,121,174,0,137,34,54,0,56,173,34,0,103,147,220,0,85,232,170,0,130,38,56,0,202,231,155,0,81,13,164,0,153,51,177,0,169,215,14,0,105,5,72,0,101,178,240,0,127,136,167,0,136,76,151,0,249,209,54,0,33,146,179,0,123,130,74,0,152,207,33,0,64,159,220,0,220,71,85,0,225,116,58,0,103,235,66,0,254,157,223,0,94,212,95,0,123,103,164,0,186,172,122,0,85,246,162,0,43,136,35,0,65,186,85,0,89,110,8,0,33,42,134,0,57,71,131,0,137,227,230,0,229,158,212,0,73,251,64,0,255,86,233,0,28,15,202,0,197,89,138,0,148,250,43,0,211,193,197,0,15,197,207,0,219,90,174,0,71,197,134,0,133,67,98,0,33,134,59,0,44,121,148,0,16,97,135,0,42,76,123,0,128,44,26,0,67,191,18,0,136,38,144,0,120,60,137,0,168,196,228,0,229,219,123,0,196,58,194,0,38,244,234,0,247,103,138,0,13,146,191,0,101,163,43,0,61,147,177,0,189,124,11,0,164,81,220,0,39,221,99,0,105,225,221,0,154,148,25,0,168,41,149,0,104,206,40,0,9,237,180,0,68,159,32,0,78,152,202,0,112,130,99,0,126,124,35,0,15,185,50,0,167,245,142,0,20,86,231,0,33,241,8,0,181,157,42,0,111,126,77,0,165,25,81,0,181,249,171,0,130,223,214,0,150,221,97,0,22,54,2,0,196,58,159,0,131,162,161,0,114,237,109,0,57,141,122,0,130,184,169,0,107,50,92,0,70,39,91,0,0,52,237,0,210,0,119,0,252,244,85,0,1,89,77,0,224,113,128,0,0,65,160,23,11,64,0,0,0,64,251,33,249,63,0,0,0,0,45,68,116,62,0,0,0,128,152,70,248,60,0,0,0,96,81,204,120,59,0,0,0,128,131,27,240,57,0,0,0,64,32,37,122,56,0,0,0,128,34,130,227,54,0,0,0,0,29,243,105,53,0,65,208,27,11,4,0,0,0,0,0,65,212,27,11,4,0,0,0,0]); 181 | 182 | canvas.width = roundTo(window.innerWidth, 2); 183 | canvas.height = roundTo(window.innerHeight, 2); 184 | 185 | var width = canvas.width; 186 | var height = canvas.height; 187 | 188 | var mx = 0; var my = 0; 189 | 190 | var FLOAT_BYTES = Float32Array.BYTES_PER_ELEMENT; 191 | 192 | 193 | 194 | 195 | window.addEventListener("contextmenu", function(e) { 196 | e.preventDefault(); 197 | }); 198 | 199 | window.addEventListener("mousemove", function(e) { 200 | if (program === null) { return; } 201 | mx = e.clientX; 202 | my = e.clientY; 203 | program.updateMouse(mx, my); 204 | }); 205 | 206 | window.program = null; 207 | var instance = null; 208 | var imports = { 209 | initialMemory: 512, 210 | imports: { 211 | printi: console.log.bind(console), 212 | printfl: console.log.bind(console), 213 | printxy: console.log.bind(console), 214 | powf: Math.pow, 215 | randomf: Math.random, 216 | getTime: Date.now 217 | } 218 | }; 219 | load(binary, imports).then(function (inst) { 220 | instance = inst; 221 | program = instance.exports; 222 | console.log("Initialising..."); 223 | program.init(width, height); 224 | var last = performance.now(); 225 | var frames = 0; 226 | var ptCount = program.getParticleCount(); 227 | var ptBytes = program.getParticleByteSize(); 228 | var ptSize = (ptBytes / FLOAT_BYTES); 229 | var ptColorOffset = program.getParticleColorOffset(); 230 | var ptPositionOffset = program.getParticlePositionOffset(); 231 | var ptColor = null; 232 | var ptPosition = null; 233 | var totalPtBytes = ptCount * ptBytes * FLOAT_BYTES; 234 | var usedKb = (totalPtBytes * 0.001) | 0; 235 | var initKb = (imports.initialMemory * 0x40) | 0; 236 | console.log(("Allocated " + ptCount + " particles")); 237 | document.querySelector(".lbl").innerHTML = ptCount + " Particles á " + ptBytes + " byte"; 238 | console.log(("Memory: Used: " + usedKb + "kB/" + initKb + "kB Left: " + (initKb-usedKb) + "kB")); 239 | var webgl = initRender(ptSize); 240 | var gl = webgl.gl; 241 | var prog = webgl.program; 242 | var xx = 64; var yy = 64; 243 | var timeLoc = gl.getUniformLocation(prog, "time"); 244 | var count = 0; 245 | console.log(("Particle size of " + ptSize + "/" + ptBytes + "byte")); 246 | inst.imports.ongrow = function() { 247 | // keep track of point data after each memory mutation 248 | ptColor = new Float32Array(instance.memory.buffer, ptColorOffset, ptCount * ptSize); 249 | ptPosition = new Float32Array(instance.memory.buffer, ptPositionOffset, ptCount * ptSize); 250 | }; 251 | inst.imports.ongrow(); 252 | (function drawLoop() { 253 | requestAnimationFrame(drawLoop); 254 | program.tick(); 255 | var now = performance.now(); 256 | var dt = (now - last); 257 | 258 | //console.log(`Update took ${then - now}ms`); 259 | gl.uniform1i(timeLoc, (Date.now())); 260 | 261 | // colors 262 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.colorBuffer); 263 | gl.bufferData(gl.ARRAY_BUFFER, ptColor, gl.DYNAMIC_DRAW); 264 | gl.vertexAttribPointer(webgl.colorLoc, 3, gl.FLOAT, false, ptSize * 4, 0); 265 | 266 | // points 267 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.coordBuffer); 268 | gl.bufferData(gl.ARRAY_BUFFER, ptPosition, gl.DYNAMIC_DRAW); 269 | gl.vertexAttribPointer(webgl.coordLoc, 3, gl.FLOAT, false, ptSize * 4, 0); 270 | 271 | gl.drawArrays(gl.POINTS, 0, ptCount); 272 | 273 | var then = performance.now(); 274 | //console.log(`Update took ${then - now}ms`); 275 | 276 | last = now; 277 | frames++; 278 | })(); 279 | }); 280 | 281 | }()); 282 | --------------------------------------------------------------------------------