diff options
| -rw-r--r-- | .envrc | 1 | ||||
| -rw-r--r-- | .eslintrc.js | 7 | ||||
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | .prettierrc | 8 | ||||
| -rw-r--r-- | TODO.norg | 33 | ||||
| -rw-r--r-- | flake.lock | 26 | ||||
| -rw-r--r-- | flake.nix | 34 | ||||
| -rw-r--r-- | justfile | 14 | ||||
| -rw-r--r-- | package.json | 13 | ||||
| -rw-r--r-- | pnpm-lock.yaml | 1018 | ||||
| -rw-r--r-- | sketches/01/bqn.js | 850 | ||||
| -rw-r--r-- | sketches/01/index.html | 38 | ||||
| -rw-r--r-- | sketches/01/mandelbrot.bqn | 23 | ||||
| -rw-r--r-- | sketches/01/mandelbrot.frag | 55 | ||||
| -rw-r--r-- | sketches/01/script.js | 36 | ||||
| -rw-r--r-- | sketches/02/newton.frag | 58 | ||||
| -rw-r--r-- | sketches/03/flow.frag | 32 | ||||
| -rw-r--r-- | sketches/03/test.png | bin | 0 -> 428196 bytes | |||
| -rw-r--r-- | sketches/04/polka.frag | 32 |
19 files changed, 2281 insertions, 0 deletions
@@ -0,0 +1 @@ +use flake diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..80b4a05 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: ['plugin:prettier/recommended'], +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bd1b7a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +*.log +*.map diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..5d209aa --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "printWidth": 100, + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false +} diff --git a/TODO.norg b/TODO.norg new file mode 100644 index 0000000..28d69d4 --- /dev/null +++ b/TODO.norg @@ -0,0 +1,33 @@ +* Week + - (x) Mandelbrot | BQN + Glsl + - (x) Newton's fractals | Glsl + - ( ) Flow | Glsl + - ( ) {http://quil.info/sketches/local/04058d1f6e2628d8c71b4fd7c850b8937c0d12b8c48cfb2383b24fbdf41ae8c1} | Glsl + +* Ideas + - Flow fields on image + - Newton's fractals + - Iterate over messytones + - Spinning poin + - Mandelbrot + - Buddhabrot + - Siperski triangle + - 3d game of life + - Webcam effects + - Hilbert curve + +* Tools + - HTML5 canvas + - p5.js + - Uiua + - {https://github.com/sleexyz/hylogen} + - Clojure {http://quil.info/} + - Desmos + - Desmos 3D + - Processing + - webgl shaders + - X11 (Xlib) + - glslViewer + - Pixi.js + - Godot + - nannou (doesn't run on my machine) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..f5a0e36 --- /dev/null +++ b/flake.lock @@ -0,0 +1,26 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1698134075, + "narHash": "sha256-foCD+nuKzfh49bIoiCBur4+Fx1nozo+4C/6k8BYk4sg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8efd5d1e283604f75a808a20e6cde0ef313d07d4", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..50d3c9a --- /dev/null +++ b/flake.nix @@ -0,0 +1,34 @@ +{ + inputs = { + nixpkgs.url = "nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs }: + let + supportedSystems = [ "x86_64-linux" ]; + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; + nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; }); + + shell = pkgs: with pkgs; + mkShell { + buildInputs = [ + just + nodejs-18_x + nodePackages.pnpm + uiua + glslviewer + nodePackages.live-server + # cbqn + ]; + }; + in + { + devShells = forAllSystems (system: + let + pkgs = import nixpkgs { inherit system; }; + in + { + default = shell pkgs; + }); + }; +} diff --git a/justfile b/justfile new file mode 100644 index 0000000..2d1f299 --- /dev/null +++ b/justfile @@ -0,0 +1,14 @@ +sketch name *args: + cd sketches/{{name}} && {{args}} + +s1: (sketch "01" "glslViewer" "mandelbrot.frag") +s1_bqn: (sketch "01" "live-server" "--port=3000" "--no-browser" ".") +s2: (sketch "02" "glslViewer" "newton.frag") +s3: (sketch "03" "glslViewer" "flow.frag" "-testImage" "test.png") +s4: (sketch "04" "glslViewer" "polka.frag") + + +# week1: +# npx nodemon -e ua -x 'clear && just sketch week1 uiua run --no-format' + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..c6697ed --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "creative-coding-playground", + "version": "0.0.0", + "description": "Playground for my creative coding experiments", + "author": "Akshay Nair <phenax5@gmail.com>", + "license": "MIT", + "devDependencies": { + "eslint": "^8.52.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.1", + "prettier": "^3.0.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..9094a38 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1018 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + eslint: + specifier: ^8.52.0 + version: 8.52.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.52.0) + eslint-plugin-prettier: + specifier: ^5.0.1 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.52.0)(prettier@3.0.3) + prettier: + specifier: ^3.0.3 + version: 3.0.3 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.52.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier@9.0.0(eslint@8.52.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.52.0 + dev: true + + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.52.0)(prettier@3.0.3): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.52.0 + eslint-config-prettier: 9.0.0(eslint@8.52.0) + prettier: 3.0.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/sketches/01/bqn.js b/sketches/01/bqn.js new file mode 100644 index 0000000..0a354f7 --- /dev/null +++ b/sketches/01/bqn.js @@ -0,0 +1,850 @@ +"use strict"; +// Virtual machine +let has = x => x!==undefined; +let isnum = x => typeof x === "number" +let isfunc = x => typeof x === "function" +let call = (f,x,w) => { + if (x===undefined) return x; + if (!isfunc(f)) return f; + if (f.m) throw Error("Runtime: Cannot call modifier as function"); + return f(x, w); +} + +let getrev = names => { + let m=names.rev; + if (m) return m; + m={}; names.forEach((s,i)=>m[s]=i); + return names.rev=m; +} +let nsget = x => { + let rev = getrev(x.ns.names); + return s => (i=>has(i)?x[x.ns[i]]:i)(rev[s]); +} +let findkey = (ns, names, i) => { + let nn=ns.names; + return ns[nn===names ? i : getrev(nn)[names[i]]]; +} +let readns_sub = (v, names, i) => { + let ni = findkey(v.ns, names, i); + if (!has(ni)) throw Error("Unknown namespace key: "+names[i]); + return v[ni]; +} +let readns_assign = (v, vid, i) => readns_sub(v, vid.names, vid[i]); +let readns = (v, vid, i) => { + if (!v.ns) throw Error("Key lookup in non-namespace"); + return readns_sub(v, vid.names, i); +} +let makens = (keys, vals) => { + let n = Array(keys.length).fill().map((_,i)=>i); + n.names=keys.map(k=>k.toLowerCase()); vals.ns=n; return vals; +} +let listkeys = x => { + let s=x.ns, k=Object.keys(s).filter(n=>!isNaN(n)); + return k.map(n=>s.names[+n]).sort(); +} + +let getv= (a,i) => { let v=a[i]; if (v===null) throw Error("Runtime: Variable referenced before definition"); return v; } +let get = x => x.e ? getv(x.e,x.p) : arr(x.map(c=>get(c)), x.sh); +let preview = false; +let inpreview = () => preview; + +let setc = (d, id, v) => { + if (preview && seteff(id)) + throw {kind: 'previewError', message: 'side effects are not allowed'}; + return set(d, id, v); +} + +let seteff = (id) => { + if (id.e) return !id.e.inpreview; + else if (id.match) return false; + else if (Array.isArray(id)) return id.some(id => id.m ? seteff(id.m) : seteff(id)); + else return false; +} + +let set = (d, id, v) => { + let eq = (a,b) => a.length===b.length && a.every((e,i)=>e===b[i]); + if (id.e) { + if (!d && id.e[id.p]===null) throw Error("↩: Variable modified before definition"); + id.e[id.p] = v; + } else if (id.match) { + if (has(id.v) && !call(runtime[18],id.v,v)) throw Error(); + } else if (id.merge) { + if (!v.sh||v.sh.length<1) throw Error("[…]← or ↩: Value must have rank 1 or more"); + if (id.sh[0]!==v.sh[0]) throw Error("[…]← or ↩: Target and value lengths don't match"); + let cs=v.sh.slice(1); let c=cs.reduce((a,b)=>a*b,1); + let cell = j => arr(v.slice(c*j,c*j+c),cs,v.fill); + id.map((n,j)=>set(d,n,cell(j))); + } else if (id.m) { + throw Error("← or ↩: Can't use alias in list destructuring"); + } else { + if (v.sh) { + if (!eq(id.sh,v.sh)) throw Error("← or ↩: Target and value shapes don't match"); + id.map((n,j)=>set(d,n,v[j])); + } else if (v.ns) { + id.map(n=>{ + if (n.e) { + let vid=n.e.vid; set(d,n,readns_assign(v, vid, n.p)); + } else if (n.m) { + set(d, n.m, readns(v, n.vid, n.a)); + } else { + throw Error("← or ↩: Cannot extract non-name from namespace"); + } + }); + } else { + throw Error("← or ↩: Multiple targets but atomic value"); + } + } + return v; +} + +let merge = x => { return call(runtime[13],x); } + +let chkM = (v,m) => { if (m.m!==v) throw Error("Runtime: Only a "+v+"-modifier can be called as a "+v+"-modifier"); } +let genjs = (B, p, L, isRepl) => { // Bytecode -> Javascript compiler + let rD = 0; + let r = L?"let l=0;try{":""; + let set = L?"setc":"set" + let fin = L?"}catch(er){let s=L.map(p=>p[l]);s.sh=[1,2];let m=[s,er.message];m.loc=1;m.src=e.vid.src;m.sh=[2];er.message=m;throw er;}":""; + let szM = 1; + let rV = n => { szM=Math.max(szM,n+1); return 'v'+n; }; + let rP = val => rV(rD++) + "="+val+";"; + let rG = () => rV(--rD); + let num = () => { return B[p++]; } + let ge = n => "e"+".p".repeat(n); + loop: while(true) { r+="\n"; + if (p>B.length) throw Error("Internal compiler error: Unclosed function"); + if (L) r+="l="+p+";"; + switch(B[p++]) { + case 0: { r+= rP("O["+num()+"]"); break; } + case 1: { r+= rP("D["+num()+"](e)"); break; } + case 6: { rD--; break; } + case 7: { if(rD!==1) throw Error("Internal compiler error: Wrong stack size"); r+= "return v0;"; break loop; } + case 8: { if(isRepl) throw Error("Can't make namespace as REPL result"); r+= "e.ns=e.vid.ns;return e;"; break loop; } + case 11:case 12: + case 13:case 14: { let o=B[p-1]; let n=num(); rD-=n; let l="llst(["+(new Array(n).fill().map((_,i)=>rV(rD+i)).join(","))+"])"; + r+=rP(o==13?"merge("+l+")":l); if(o==14)r+=rV(rD-1)+".merge=1;"; break; } + case 16:case 18: { let f=rG(),x=rG(); r+=rP("call("+f+","+x +")"); break; } + case 17:case 19: { let w=rG(),f=rG(),x=rG(); r+=rP("call("+f+","+x+","+w+")"); break; } + case 20: { let g=rG(),h=rG(); r+=rP("train2(" +g+","+h+")"); break; } + case 21:case 23: { let f=rG(),g=rG(),h=rG(); r+=rP("train3("+f+","+g+","+h+")"); break; } + case 26: { let f=rG(),m=rG(); r+="chkM(1,"+m+");"+rP(m+"("+f +")"); break; } + case 27: { let f=rG(),m=rG(),g=rG(); r+="chkM(2,"+m+");"+rP(m+"("+f+","+g+")"); break; } + case 22: { r+= "if(undefined==="+rV(rD-1)+")throw Error('Left argument required');"; break; } + case 32:case 34: { r+= rP("getv("+ge(num())+","+num()+")"); break; } + case 33: { r+= rP("{e:"+ge(num())+",p:"+num()+"}"); break; } + case 42: { let p=rG(); r+="if(1!=="+p+"){if(0!=="+p+")throw Error('Predicate value must be 0 or 1');break;}"; break; } + case 43: { let m=rG(); r+=rP("{match:1,v:"+m+"}"); break; } + case 44: { r+=rP("{match:1}"); break; } + case 47: { let i=rG(), v=rG(); r+="try{set(1,"+i+","+v+");}catch(e){break;}"; break; } + case 48: { let i=rG(), v=rG(); r+=rP(set+"(1,"+i+","+v +")"); break; } + case 49: { let i=rG(), v=rG(); r+=rP(set+"(0,"+i+","+v +")"); break; } + case 50: { let i=rG(),f=rG(),x=rG(); r+=rP(set+"(0,"+i+",call("+f+","+x+",get("+i+")))"); break; } + case 51: { let i=rG(),f=rG() ; r+=rP(set+"(0,"+i+",call("+f+ ",get("+i+")))"); break; } + case 66: { let m=rG(); r+=rP("{vid:e.vid,m:"+m+",a:"+num()+"}"); break; } + case 64: { let v=rG(); r+=rP("readns("+v+",e.vid,"+num()+")"); break; } + } + } + return "let "+new Array(szM).fill().map((_,i)=>rV(i)).join(',')+";"+r+fin; +} +let run = (B,O,F,S,L,T,src,env) => { // Bytecode, Objects, Blocks, Bodies, Locations, Tokenization, source + let train2=( g,h)=>{ let t=(x,w)=>call(g,call(h,x,w)); t.repr=()=>[2, g,h];return t;} + let train3=(f,g,h)=>{if(!has(f))return train2(g,h);let t=(x,w)=>call(g,call(h,x,w),call(f,x,w));t.repr=()=>[3,f,g,h];return t;} + let repdf = ["","4,f,mod","5,f,mod,g"].map(s=>s?"fn.repr=()=>["+s+"];":s); + + let D = F.map(([type,imm,ind],i) => { + let I = imm ? 0 : 3; // Operand start + let sp = (type===0?0:type+1) + I; + let useenv = i===0 && env; + let gen = j => { + let [pos,varam,vid,vex] = S[j]; + let ns = {}; if (vex) vex.forEach((e,j)=>{if(e)ns[vid[j]]=j+sp;}); + vid = (new Array(sp).fill(null)).concat(vid); vid.src=src; vid.ns=ns; + if (T) ns.names = vid.names = T[2][0].map(s=>s.join("")); + return [genjs(B, pos, L, has(env)), vid]; + } + + let ginpreview = e => L ? (e + ".inpreview=inpreview()") : ""; + let c,vid,def; + if (isnum(ind)) { + [c,vid] = gen(ind); + c="do {"+c+"} while (0);\nthrow Error('No matching case');\n"; + if (useenv) { c = "const e=env;"+c; env.vid=vid; } + else if (imm) c = "const e=[...e2];"+ginpreview('e')+";e.vid=vid;e.p=oe;"+c; + else c = "const fn=(x, w)=>{const e=[...e2];"+ginpreview('e')+";e.vid=vid;e.p=oe;e[0]=fn;e[1]=x;e[2]=w;"+c+"};"+repdf[type]+"return fn;"; + def = useenv ? "env" : ("new Array("+vid.length+").fill(null)"); + } else { + if (imm !== +(ind.length<2)) throw "Internal error: malformed block info"; + let cache=[]; // Avoid generating a shared case twice + vid=[]; let g = j => { + let [c,v] = cache[j] || (cache[j] = gen(j)); + c = "const e=[...e1];"+ginpreview('e')+";e.vid=vid["+vid.length+"];e.p=oe;e.length="+v.length+";e.fill(null,"+sp+");"+c; + vid.push(v); + return "do {"+c+"} while (0);\n" + } + if (ind.length===3) ind[3]=[]; + let cases = ind.map((js,i) => { + let e = js.length?"No matching case":"Left argument "+(i?"not allowed":"required"); + return js.map(g).concat(["throw Error('"+e+"');\n"]).join(""); + }); + let fn = b => "(x, w)=>{const e1=[...e2];"+ginpreview('e1')+";e1[0]=fn;e1[1]=x;e1[2]=w;\n"+b+"\n};"; + let combine = ([mon,dy]) => + fn("if (w===undefined) {\n"+mon+"} else {\n"+dy+"}"); + def = "new Array("+sp+").fill(null)"; + if (imm) c = "const e1=[...e2];"+ginpreview('e1')+";"+cases[0]; + else { + c = "const fn="+combine(cases)+repdf[type]; + if (cases.length > 2) { + c += "fn.inverse="+combine(cases.slice(2)); + if (cases[4]) c += "fn.sinverse="+fn("if(!has(w))throw Error('No matching case');"+cases[4]); + } + c += "return fn;"; + } + } + + let de2 = "let e2="+def+";"+ginpreview('e2')+";" + if (type===0) c = de2+c; + if (type===1) c = "const mod=(f ) => {"+de2+" e2["+I+"]=mod;e2["+(I+1)+"]=f;" +c+"}; mod.m=1;return mod;"; + if (type===2) c = "const mod=(f,g) => {"+de2+" e2["+I+"]=mod;e2["+(I+1)+"]=f;e2["+(I+2)+"]=g;"+c+"}; mod.m=2;return mod;"; + return Function("'use strict'; return (chkM,has,call,getv,get,set,setc,llst,merge,train2,train3,readns,O,L,env,vid,inpreview) => D => oe => {"+c+"};")() + (chkM,has,call,getv,get,set,setc,llst,merge,train2,train3,readns,O,L,env,vid,inpreview); + }); + D.forEach((d,i) => {D[i]=d(D)}); + return D[0]([]); +} + +// Runtime +let assertFn = pre => (x,w) => { + if (x!==1) throw {kind:pre, message:has(w)?w:x}; return x; +} +let arr = (r,sh,fill) => {r.sh=sh;r.fill=fill;return r;} +let list = (l,fill) => arr(l,[l.length],fill); +let llst = l => list(l, l.length>0&&l.every(isnum)?0:undefined); +let str = s => list(Array.from(s), ' '); +let unstr = s => s.join(""); +let setrepr = (r,f) => {f.repr=r; return f;} +let m1 = m=>{let r= f =>setrepr(()=>[4,f,r ], m(f )); r.m=1; return r;} +let m2 = m=>{let r=(f,g)=>setrepr(()=>[5,f,r,g], m(f,g)); r.m=2; return r;} +let ctrans = (c,t) => String.fromCodePoint(c.codePointAt(0)+t); +let plus = (x,w) => { + if (!has(w)) { + if (!isnum(x)) throw Error("+: Argument must be a number"); + return x; + } + let s=typeof w, t=typeof x; + if (s==="number" && t==="number") return w+x; + if (s==="number" && t==="string") return ctrans(x,w); + if (s==="string" && t==="number") return ctrans(w,x); + if (s==="string" && t==="string") throw Error("+: Cannot add two characters"); + throw Error("+: Cannot add non-data values"); +} +let minus = (x,w) => { + if (!isnum(x)) { + if (has(w)&&typeof w==="string") return w.codePointAt(0)-x.codePointAt(0); + throw Error("-: Can only negate numbers"); + } + if (!has(w)) return -x; + let s=typeof w; + if (s==="number") return w-x; + if (s==="string") return ctrans(w,-x); + throw Error("-: Cannot subtract from non-data value"); +} +let times = (x,w) => { + if (isnum(x)&&isnum(w)) return x*w; + throw Error("×: Arguments must be numbers"); +} +let divide = (x,w) => { + if (isnum(x)&&(!has(w)||isnum(w))) return (has(w)?w:1)/(x===0?0:x); + throw Error("÷: Arguments must be numbers"); +} +let power = (x,w) => { + if (isnum(x)) { + if (!has(w)) return Math.exp(x); + if (isnum(w)) { + // JS is incompatible with IEEE; go with IEEE + if (!isFinite(x) && Math.abs(w)===1) return w===-1 && x!=x ? x : 1; + else return Math.pow(w===0?0:w,x); + } + } + throw Error("⋆: Arguments must be numbers"); +} +let log = (x,w) => { + if (isnum(x)) { + if (!has(w)) return Math.log(x); + if (isnum(w)) return Math.log(x)/Math.log(w); + } + throw Error("⋆⁼: Arguments must be numbers"); +} +let fc = (dy,mon,gl) => (x,w) => { + if (has(w)) return dy(w,x); + if (isnum(x)) return mon(x); + throw Error(gl+"𝕩: Argument must be a number"); +} +let floor = fc(Math.min,Math.floor,"⌊"); +let ceil = fc(Math.max,Math.ceil ,"⌈"); +let abs = (x,w) => { + if (isnum(x)) return Math.abs(x); + throw Error("|𝕩: Argument must be a number"); +} +let abs_mod = (x,w) => { + if (!has(w)) return abs(x,w); + if (isnum(x)&&isnum(w)) { + let r = x%w; + return ((x<0)!=(w<0) && r!=0) ? r+w : r; + } + throw Error("𝕨|𝕩: Arguments must be numbers"); +} +let lesseq = (x,w) => { + let s=typeof w, t=typeof x; + if (s==="function"||t==="function") throw Error("𝕨≤𝕩: Cannot compare operations"); + if (w.ns||x.ns) throw Error("𝕨≤𝕩: Cannot compare namespaces"); + return +(s!==t ? s<=t : s==="string" ? w.codePointAt(0)<=x.codePointAt(0) : w<=x); +} +let equals = (x,w) => { + let a,b; + if (typeof(w)!=="function" || !(a=w.repr)) return x===w; + if (typeof(x)!=="function" || !(b=x.repr)) return false; + b=b(); return a().every((e,i)=>call(runtime[18],e,b[i])); // ≡ +} +let table = m1(f => (x,w) => !has(w) + ? arr(x.map(e=>call(f,e)),x.sh) + : arr(w.map(d=>x.map(e=>call(f,e,d))).flat(),w.sh.concat(x.sh))); +let scan = m1(f => (x,w) => { + let s=x.sh; + if (!s||s.length===0) throw Error("`: 𝕩 must have rank at least 1"); + if (has(w)) { + let r=w.sh, wr=r?r.length:0; + if (1+wr!==s.length) throw Error("`: rank of 𝕨 must be cell rank of 𝕩"); + if (!r) w=[w]; + else if (!r.every((l,a)=>l===s[1+a])) throw Error("`: shape of 𝕨 must be cell shape of 𝕩"); + } + let l=x.length,r=Array(l); + if (l>0) { + let c=1;for(let i=1;i<s.length;i++)c*=s[i]; + let i=0; + if (!has(w)) { for(;i<c;i++) r[i]=x[i]; } + else { for(;i<c;i++) r[i]=call(f,x[i],w[i]); } + for(;i<l;i++) r[i]=call(f,x[i],r[i-c]); + } + return arr(r,s,x.fill); +}); +let cases = m2((f,g) => (x,w)=>has(w)?call(g,x,w):call(f,x,w)); +let save_error; +let catches = m2((f,g) => (x,w) => { + try { + return call(f,x,w); + } catch (e) { + let c = save_error; save_error = e; + try { return call(g,x,w); } + finally { save_error = c; } + } +}); +let group_len = (x,w) => { // ≠¨⊔ for a valid list argument + let l=x.reduce((a,b)=>Math.max(a,b),(w||0)-1); + let r=Array(l+1).fill(0); + x.map(e=>{if(e>=0)r[e]+=1;}); + return list(r,0); +} +let group_ord = (x,w) => { // ∾⊔x assuming w=group_len(x) + let l=0,s=w.map(n=>{let l0=l;l+=n;return l0;}); + let r=Array(l); + x.map((e,i)=>{if(e>=0)r[s[e]++]=i;}); + return list(r,x.fill); +} +let type = x => isfunc(x) ? 3+(x.m||0) : x.sh ? 0 : x.ns ? 6 : 2-isnum(x); +let tofill = x => isfunc(x) ? undefined + : x.sh ? arr(x.map(tofill),x.sh,x.fill) + : isnum(x)?0 : ' '; +let fill = (x,w) => { + if (has(w)) { + return arr(x.slice(),x.sh,tofill(w)); + } else { + let f = x.fill; + if (!has(f)) throw Error("Fill does not exist"); + return f; + } +} +let fill_by = (f,g) => (x,w) => { + let r = f(x,w); + let a2fill = x => isfunc(x)?x:isnum(x)?0:' '; + let xf=x.sh?x.fill:a2fill(x); + if (r.sh&&has(xf)) { + r = arr(r.slice(),r.sh); + try { + let wf = !has(w) ? w + : !w.sh ? a2fill(w) + : has(w.fill) ? w.fill : runtime[43]; + r.fill=tofill(g(xf,wf)); + } catch(e){ + r.fill=undefined; + } + } + return r; +} +fill_by.m=2; + +let provide = [ + type // Type + ,fill // Fill + ,log // Log + ,group_len // GroupLen + ,group_ord // GroupOrd + ,assertFn("") // ! + ,plus // + + ,minus // - + ,times // × + ,divide // ÷ + ,power // ⋆ + ,floor // ⌊ + ,(x,w) => has(w)?+equals(x,w):x.sh?x.sh.length:0 // = + ,lesseq // ≤ + ,(x,w) => list(x.sh,0) // ≢ + ,(x,w) => arr(x.slice(),has(w)?w:[x.length],x.fill) // ⥊ + ,(x,w) => x[w] // ⊑ + ,(x,w) => list(Array(x).fill().map((_,i)=>i),0) // ↕ + ,table // ⌜ + ,scan // ` + ,fill_by // _fillBy_ + ,cases // ⊘ + ,catches // ⎊ +]; + +let select = (x,w) => { + let s=x.sh, k=s.length, f=x.fill, t=w.sh, c=1; + if (k!==1) {for(let i=1;i<k;i++)c*=s[i];t=t.concat(s.slice(1));} + let r=Array(w.length*c); + let j=0; + w.forEach(i=>{for(let k=0;k<c;k++)r[j++]=x[i*c+k];}); + return arr(r,t,f); +} +let fold = f => (x,w) => { + let l=x.sh[0]; + let r=has(w)?w:x[l=l-1]; + for (let i=l;i--;) r=call(f,r,x[i]); + return r; +} +let runtime_0 = [ + floor // ⌊ + ,ceil // ⌈ + ,abs // | + ,(x,w)=>has(w)?1-lesseq(w,x):arr([x],[],tofill(x)) // < + ,(x,w)=>1-lesseq(x,w) // > + ,(x,w)=>x.sh&&x.sh.length?x.sh[0]:1 // ≠ + ,(x,w)=> lesseq(w,x) // ≥ + ,(x,w)=>x // ⊢ + ,(x,w)=>has(w)?w:x // ⊣ + ,(x,w)=>arr(w.concat(x),[w.sh[0]+x.sh[0]]) // ∾ + ,(x,w)=>list(has(w)?[w,x]:[x]) // ⋈ + ,(x,w)=>arr(x.slice(0,w),[w]) // ↑ + ,(x,w)=>arr(x.slice(w),[x.sh[0]-w]) // ↓ + ,select // ⊏ + ,m1(f=>(x,w)=>f) // ˙ + ,m1(f=>(x,w)=>call(f,has(w)?w:x,x)) // ˜ + ,m1(f=>(x,w)=>arr(x.map((e,i)=>call(f,e,w[i])),x.sh)) // ¨ + ,m1(fold) // ´ + ,m2((f,g)=>(x,w)=>call(f,call(g,x,w))) // ∘ + ,m2((f,g)=>(x,w)=>call(f,call(g,x),has(w)?call(g,w):w)) // ○ + ,m2((f,g)=>(x,w)=>call(g,x,call(f,has(w)?w:x))) // ⊸ + ,m2((f,g)=>(x,w)=>call(f,call(g,x),has(w)?w:x)) // ⟜ + ,m2((f,g)=>(x,w)=>call(g[call(f,x,w)],x,w)) // ◶ + ,m2((f,g)=>(x,w)=>call(g,x,w)?call(f,x,w):x) // ⍟ +]; + +let [runtime,setPrims,setInv] = run( + [0,100,33,0,0,48,6,1,1,33,0,1,48,6,0,30,0,42,32,0,1,27,0,38,34,0,1,27,33,0,2,48,6,1,2,33,0,3,48,6,1,3,33,0,4,48,6,1,4,33,0,5,48,6,1,5,33,0,6,48,6,0,0,0,12,0,46,21,33,0,7,48,6,0,0,0,13,0,47,21,33,0,8,48,6,0,46,0,12,0,42,0,11,27,11,2,0,44,0,0,0,12,0,47,21,27,33,0,9,48,6,0,46,0,12,0,42,0,11,0,40,0,19,27,27,11,2,0,44,0,0,0,12,0,47,21,27,33,0,10,48,6,32,0,8,0,45,0,20,27,33,0,11,48,6,0,31,32,0,8,26,0,36,0,8,26,0,47,21,33,0,12,48,6,1,6,0,15,11,2,0,44,32,0,7,27,33,0,13,48,6,0,14,0,43,0,29,27,33,0,14,48,6,0,35,0,12,26,0,36,0,8,26,0,47,21,33,0,15,48,6,0,4,0,42,0,31,0,47,26,27,33,0,16,48,6,1,7,33,0,17,48,6,1,8,33,0,18,48,6,1,9,33,0,19,48,6,32,0,19,0,56,26,33,0,20,48,6,32,0,19,0,57,26,33,0,21,48,6,0,46,0,16,0,42,0,49,27,32,0,19,0,58,26,20,11,2,0,44,0,16,0,42,0,46,27,0,12,0,48,21,27,33,0,22,48,6,0,46,0,16,0,42,0,49,27,32,0,19,0,59,26,20,11,2,0,44,0,16,0,42,0,46,27,0,12,0,48,21,27,33,0,23,48,6,1,10,33,0,24,48,6,1,11,33,0,25,48,6,0,61,0,46,0,62,0,46,0,63,0,47,0,64,0,47,0,65,0,47,0,66,0,47,0,67,0,50,0,68,0,51,0,69,0,46,0,70,0,47,0,71,0,46,0,72,0,47,0,73,0,46,0,74,0,47,11,28,32,0,25,0,60,27,33,0,26,48,6,1,12,33,0,27,48,6,1,13,33,0,28,48,6,1,14,33,0,29,48,6,1,15,33,0,30,48,6,1,16,33,0,31,48,6,0,13,0,13,0,24,0,34,0,12,26,20,0,13,0,50,0,43,0,13,27,21,21,33,0,32,48,6,32,0,32,0,7,0,34,32,0,32,26,21,33,0,33,48,6,0,47,0,15,0,16,0,46,21,0,43,0,13,0,8,0,49,21,0,7,0,47,21,1,17,11,2,0,44,0,24,0,40,32,0,7,27,27,27,11,2,0,44,0,24,0,40,0,14,27,0,36,0,8,26,0,47,21,0,20,0,46,21,27,33,0,34,48,6,1,18,33,0,35,48,6,1,19,33,0,36,48,6,32,0,33,32,0,34,0,34,32,0,34,26,0,7,20,11,2,0,44,0,25,0,40,32,0,7,27,27,1,20,11,3,0,44,32,0,7,0,41,0,6,27,27,33,0,37,48,6,1,21,33,0,38,48,6,32,0,38,0,46,26,33,0,39,48,6,34,0,38,0,47,26,33,0,40,48,6,1,22,33,0,41,48,6,1,23,33,0,42,48,6,32,0,11,0,41,1,24,27,33,0,43,48,6,1,25,33,0,44,48,6,1,26,33,0,45,48,6,32,0,42,0,24,0,32,0,6,26,0,52,21,0,34,0,30,26,0,34,32,0,2,0,40,32,0,39,0,40,32,0,16,27,27,26,21,26,33,0,46,48,6,32,0,42,0,35,0,8,26,0,32,0,18,26,20,0,35,0,7,26,0,25,21,0,42,0,22,0,40,0,17,27,27,26,33,0,47,48,6,32,0,11,0,24,0,37,1,27,27,11,2,0,44,0,12,0,20,0,47,21,27,33,0,48,48,6,1,28,0,45,0,24,0,37,1,29,27,27,33,0,49,48,6,1,30,33,0,50,48,6,1,31,33,0,51,48,6,0,24,32,0,50,34,0,51,27,33,0,52,48,6,32,0,16,34,0,50,1,32,27,33,0,53,48,6,1,33,33,0,54,48,6,1,34,33,0,55,48,6,32,0,9,0,5,0,121,21,0,122,11,2,0,12,0,42,0,11,27,0,5,0,123,21,0,124,11,2,11,2,0,31,1,35,26,16,33,0,56,33,0,57,12,2,48,6,1,36,33,0,58,48,6,32,0,11,0,43,1,37,27,33,0,59,48,6,1,38,34,0,59,11,2,0,44,0,25,0,40,0,47,0,15,32,0,12,20,11,2,0,44,32,0,7,27,27,27,33,0,60,48,6,34,0,58,32,0,60,11,2,0,44,0,25,0,40,32,0,7,27,27,33,0,61,48,6,1,39,33,0,62,48,6,1,40,33,0,63,48,6,32,0,11,0,41,32,0,62,0,136,0,15,0,31,0,0,0,12,0,47,21,26,20,0,36,0,8,26,0,47,21,0,47,0,46,0,24,0,30,1,41,21,1,42,11,6,26,27,33,0,64,48,6,0,24,0,15,0,137,0,40,0,5,27,0,16,0,42,0,46,27,11,2,0,44,0,22,0,20,0,46,21,27,20,11,2,0,44,32,0,7,27,33,0,65,48,6,1,43,33,0,66,48,6,1,44,33,0,67,48,6,0,28,0,26,0,29,21,33,0,68,48,6,0,24,0,30,0,22,0,17,20,0,43,32,0,68,27,21,32,0,68,11,2,0,44,0,24,0,40,0,12,27,0,12,0,47,21,27,33,0,69,48,6,0,24,0,37,32,0,11,0,43,32,0,62,0,141,34,0,8,0,46,0,46,0,24,0,40,0,22,27,0,20,0,46,21,0,45,0,24,34,0,69,0,22,0,43,32,0,67,27,21,27,0,24,0,17,20,34,0,68,34,0,67,21,11,6,26,27,27,33,0,70,48,6,1,45,1,46,1,47,11,3,0,44,0,25,0,40,0,12,27,0,11,0,49,21,27,33,0,71,48,6,0,24,0,37,32,0,11,0,41,34,0,62,0,145,0,15,0,40,0,31,0,0,0,12,0,47,21,26,0,36,0,8,26,0,22,0,20,0,46,21,21,27,0,47,0,47,0,24,0,30,0,22,0,43,32,0,71,27,21,34,0,71,11,6,26,27,27,33,0,72,48,6,1,48,33,0,73,48,6,0,47,0,47,0,16,0,42,0,53,27,0,15,20,0,31,32,0,73,26,20,0,36,0,8,26,0,47,21,11,2,0,44,0,16,0,42,0,49,27,34,0,19,0,75,26,20,27,11,2,0,44,0,16,0,42,0,46,27,0,12,0,55,21,27,33,0,74,48,6,0,24,1,49,11,2,0,31,1,50,26,0,26,0,24,21,16,0,31,1,51,26,16,33,0,75,48,6,1,52,0,42,34,0,75,0,30,0,47,0,47,0,49,0,53,0,46,11,5,17,32,0,18,0,146,27,27,33,0,76,48,6,1,53,33,0,77,48,6,1,54,33,0,78,48,6,1,55,33,0,79,48,6,32,0,7,0,41,0,12,27,0,46,11,2,0,24,0,40,32,0,7,27,0,12,11,2,0,12,0,41,0,12,27,0,46,11,2,0,14,0,41,32,0,15,27,0,46,11,2,1,56,11,5,0,36,1,57,26,16,33,0,80,48,6,0,46,1,58,11,2,0,44,32,0,7,27,33,0,81,48,6,1,59,33,0,82,48,6,1,60,33,0,83,48,6,32,0,80,0,38,32,0,81,27,33,0,84,48,6,32,0,80,0,7,0,47,21,0,38,0,46,0,17,16,0,14,11,2,0,44,32,0,7,27,27,33,0,85,48,6,32,0,84,0,40,0,5,27,0,25,0,24,21,33,0,86,48,6,0,15,0,40,0,1,0,37,0,24,27,0,36,32,0,11,0,43,32,0,86,0,37,0,24,27,27,26,11,2,0,44,0,22,0,20,0,46,21,27,27,33,0,87,48,6,0,46,0,17,16,0,43,0,25,0,40,0,0,27,0,13,0,53,21,0,45,0,60,27,0,37,0,24,27,27,0,1,20,0,12,0,46,21,33,0,88,48,6,1,61,33,0,89,48,6,32,0,7,0,45,0,26,32,0,89,1,62,27,27,33,0,90,48,6,32,0,86,0,37,32,0,11,0,41,0,15,0,41,0,26,27,1,63,11,2,0,44,0,12,0,41,0,18,27,0,20,0,47,21,27,27,27,33,0,91,48,6,1,64,33,0,92,48,6,32,0,66,32,0,92,0,8,26,0,47,21,32,0,66,20,33,0,93,48,6,1,65,33,0,94,48,6,32,0,7,0,5,0,175,21,0,25,1,66,34,0,89,32,0,90,32,0,94,32,0,82,11,2,0,44,0,31,0,12,0,23,0,47,21,26,0,36,0,8,26,0,47,21,27,34,0,94,11,3,0,44,0,12,0,11,0,49,21,27,27,21,33,0,95,48,6,1,67,33,0,96,48,6,32,0,96,0,46,26,33,0,97,48,6,34,0,96,0,47,26,33,0,98,48,6,1,68,33,0,99,48,6,32,0,86,0,38,0,24,27,0,37,1,69,27,33,0,100,48,6,32,0,86,0,38,0,24,27,0,37,1,70,27,33,0,101,48,6,32,0,10,0,5,0,185,21,33,0,102,48,6,32,0,102,0,25,0,17,21,1,71,11,2,0,44,32,0,7,27,33,0,103,48,6,1,72,33,0,104,48,6,1,73,33,0,105,48,6,0,24,0,20,20,32,0,105,0,24,0,20,0,37,0,31,0,20,26,27,20,11,3,0,44,0,12,0,43,0,23,27,0,6,0,47,21,0,8,0,46,0,43,0,21,27,21,27,33,0,106,48,6,1,74,33,0,107,48,6,1,75,33,0,108,48,6,0,55,0,17,16,32,0,18,0,194,27,33,0,109,48,6,1,76,33,0,110,48,6,1,77,33,0,111,48,6,1,78,33,0,112,48,6,32,0,11,0,41,1,79,27,33,0,113,48,6,1,80,33,0,114,48,6,1,81,33,0,115,48,6,1,82,33,0,116,48,6,1,83,33,0,117,48,6,1,84,33,0,118,48,6,1,85,33,0,119,48,6,1,86,33,0,120,48,6,1,87,33,0,121,48,6,1,88,33,0,122,48,6,32,0,31,0,9,26,33,0,123,48,6,32,0,31,0,10,26,33,0,124,48,6,0,34,32,0,123,0,43,32,0,124,27,26,0,38,0,49,32,0,123,16,0,43,32,0,124,27,27,33,0,125,48,6,32,0,31,1,89,0,21,0,42,0,46,27,0,20,0,42,0,46,27,11,2,0,44,0,46,0,43,0,20,27,27,0,45,0,6,27,11,2,0,44,0,19,0,41,0,21,27,27,0,38,0,19,27,26,33,0,126,48,6,32,0,31,0,20,0,45,0,25,27,0,38,0,11,27,26,33,0,127,48,6,32,0,31,0,21,0,45,0,25,27,0,38,0,7,0,40,32,0,127,0,40,0,7,27,27,27,26,33,0,128,48,6,32,0,31,0,8,26,0,38,0,30,0,42,32,0,39,27,27,33,0,129,48,6,32,0,31,0,8,0,7,0,6,21,26,0,38,0,30,0,42,32,0,40,27,27,33,0,130,48,6,32,0,31,0,8,0,38,0,21,0,7,0,20,21,0,42,0,46,27,27,26,33,0,131,48,6,32,0,31,0,23,0,7,0,47,21,26,0,38,0,20,27,33,0,132,48,6,32,0,31,0,13,0,7,0,47,21,26,0,38,32,0,90,27,33,0,133,48,6,32,0,31,0,12,0,7,0,47,21,26,0,38,0,22,27,33,0,134,48,6,32,0,31,0,12,26,0,38,0,12,27,33,0,135,48,6,32,0,31,0,23,26,0,38,0,213,0,40,0,5,27,27,33,0,136,48,6,32,0,31,0,13,26,0,38,0,214,0,40,0,5,27,27,33,0,137,48,6,32,0,31,0,6,26,33,0,138,48,6,32,0,31,0,7,26,33,0,139,48,6,32,0,139,32,0,138,0,47,21,33,0,140,48,6,32,0,41,0,47,26,0,38,34,0,46,27,33,0,141,48,6,1,90,0,1,0,46,21,33,0,142,48,6,1,91,33,0,143,48,6,0,47,0,24,1,92,0,40,32,0,22,27,20,11,2,0,44,0,0,32,0,137,0,53,21,27,33,0,144,48,6,1,93,0,41,1,94,27,33,0,145,48,6,1,95,33,0,146,48,6,1,96,0,24,0,16,0,42,0,47,27,1,97,20,0,33,0,217,0,40,0,5,27,26,0,16,0,42,0,49,27,32,0,145,0,16,0,42,0,47,27,21,34,0,146,0,16,0,42,0,49,27,1,98,0,43,1,99,27,0,16,0,42,0,47,27,21,0,16,0,42,0,49,27,1,100,0,43,1,101,27,0,30,0,42,0,47,0,53,11,2,27,21,11,6,0,44,0,25,27,0,16,0,42,0,46,27,21,20,33,0,147,48,6,1,102,32,0,147,0,218,0,40,0,5,27,11,3,32,0,2,0,53,0,47,0,49,11,3,17,0,44,0,0,27,33,0,148,48,6,0,5,0,42,0,219,27,33,0,149,48,6,0,5,0,42,0,220,27,33,0,150,48,6,0,33,0,46,26,0,5,0,221,21,33,0,151,48,6,1,103,33,0,152,48,6,34,0,104,0,38,32,0,103,27,33,0,153,48,6,0,24,0,37,34,0,64,0,38,34,0,63,27,27,33,0,154,48,6,34,0,70,0,38,32,0,66,27,33,0,155,48,6,34,0,97,0,38,34,0,54,27,33,0,156,48,6,34,0,98,0,38,34,0,55,27,33,0,157,48,6,1,104,33,0,158,48,6,0,61,0,34,32,0,139,26,0,38,32,0,138,27,0,62,32,0,139,0,63,0,34,32,0,123,26,0,38,32,0,131,32,0,152,0,24,27,27,0,64,32,0,123,0,65,32,0,31,0,2,26,0,76,0,34,32,0,124,26,0,38,0,34,32,0,131,26,27,0,70,0,34,32,0,123,26,0,38,32,0,129,32,0,152,0,24,27,27,0,69,0,25,32,0,139,0,47,21,32,0,123,0,34,32,0,139,26,21,0,38,32,0,130,32,0,152,0,24,27,27,0,66,32,0,140,0,71,32,0,31,1,105,26,0,77,0,46,0,40,32,0,149,27,0,38,1,106,27,0,78,0,24,0,79,32,0,84,0,40,32,0,150,27,0,25,0,24,21,0,38,0,24,27,0,56,32,0,158,32,0,156,32,0,157,32,0,154,11,3,26,0,38,0,46,0,40,32,0,149,27,27,0,80,1,107,0,38,1,108,27,0,81,1,109,0,38,1,110,27,0,82,0,46,0,40,32,0,149,27,0,38,32,0,156,32,0,152,0,16,0,42,0,52,27,27,27,0,83,0,46,0,40,32,0,149,27,0,38,32,0,157,32,0,152,0,16,0,42,0,46,27,27,27,0,84,0,46,0,40,32,0,149,27,0,38,32,0,153,34,0,152,32,0,85,27,27,0,85,0,24,0,40,32,0,7,0,40,32,0,150,27,27,0,25,32,0,155,0,42,32,0,139,27,21,0,38,32,0,155,27,0,86,34,0,53,0,38,34,0,49,27,0,87,0,46,0,40,32,0,149,27,0,38,34,0,45,27,0,88,34,0,117,0,38,34,0,116,27,11,46,32,0,25,32,0,151,27,33,0,159,48,6,0,61,0,34,32,0,139,26,0,38,0,49,0,43,32,0,123,27,27,0,62,32,0,138,0,38,0,46,0,40,32,0,149,27,27,0,63,0,34,32,0,123,26,0,38,32,0,125,27,0,64,32,0,131,0,38,0,46,0,40,32,0,149,27,27,0,65,32,0,125,0,38,0,46,0,40,32,0,149,27,27,0,76,0,2,32,0,123,20,0,38,0,46,0,40,32,0,149,27,27,0,70,0,34,32,0,123,26,0,38,32,0,125,27,0,69,0,25,32,0,139,0,47,21,32,0,123,0,34,32,0,139,26,21,0,38,32,0,140,0,40,32,0,125,27,32,0,140,20,27,0,66,0,33,0,47,26,32,0,139,32,0,138,21,0,38,0,46,0,40,32,0,149,27,27,0,56,34,0,158,32,0,156,0,42,32,0,139,27,32,0,157,0,42,32,0,139,27,0,24,32,0,154,0,33,0,47,26,32,0,139,32,0,134,21,21,11,3,26,0,38,1,111,27,0,80,1,112,0,38,1,113,27,0,81,1,114,0,38,1,115,27,11,24,32,0,25,32,0,151,27,33,0,160,48,6,34,0,147,1,116,32,0,160,21,33,0,161,48,6,1,117,33,0,162,48,6,34,0,79,33,0,163,48,6,32,0,78,33,0,164,48,6,34,0,91,0,38,32,0,95,27,33,0,165,48,6,34,0,100,33,0,166,48,6,34,0,101,33,0,167,48,6,0,89,0,24,0,59,1,118,0,90,1,119,0,57,1,120,0,91,1,121,0,92,1,122,0,40,1,123,27,11,12,32,0,25,0,33,32,0,151,26,27,33,0,168,48,6,34,0,122,33,0,169,48,6,34,0,83,33,0,170,48,6,0,93,34,0,145,0,94,1,124,0,95,1,125,0,96,0,33,0,46,0,40,32,0,149,27,26,1,126,11,2,0,44,0,24,0,40,32,0,9,27,27,0,97,1,127,0,98,1,128,1,129,0,24,11,2,0,44,0,25,27,0,25,0,40,32,0,144,27,21,0,99,1,130,11,14,34,0,25,0,33,32,0,151,26,27,33,0,171,48,6,34,0,29,33,0,172,48,6,34,0,108,33,0,173,48,6,1,131,33,0,174,48,6,34,0,107,33,0,175,48,6,34,0,61,0,38,34,0,65,27,33,0,176,48,6,1,132,33,0,177,48,6,34,0,120,33,0,178,48,6,34,0,121,33,0,179,48,6,32,0,110,0,38,32,0,13,27,33,0,180,48,6,32,0,86,0,38,0,24,27,0,37,0,27,0,40,32,0,133,27,27,33,0,181,48,6,32,0,132,0,41,34,0,86,0,37,32,0,176,0,41,0,27,27,27,27,0,38,1,133,27,33,0,182,48,6,34,0,115,0,38,34,0,112,27,33,0,183,48,6,34,0,52,0,38,34,0,48,27,33,0,184,48,6,0,34,34,0,41,0,46,26,26,0,38,34,0,42,0,24,26,27,33,0,185,48,6,34,0,43,0,38,32,0,2,0,42,32,0,185,27,27,33,0,186,48,6,34,0,142,0,38,32,0,47,27,33,0,187,48,6,34,0,72,0,38,34,0,44,27,33,0,188,48,6,34,0,138,32,0,139,32,0,131,32,0,123,34,0,124,34,0,125,32,0,127,34,0,128,34,0,126,32,0,140,32,0,129,32,0,130,32,0,132,34,0,133,32,0,134,32,0,135,32,0,137,34,0,136,32,0,84,32,0,85,0,25,0,24,34,0,180,32,0,165,34,0,181,34,0,182,32,0,156,32,0,157,34,0,153,34,0,167,32,0,166,34,0,155,34,0,184,34,0,188,32,0,39,32,0,40,32,0,154,32,0,176,32,0,141,34,0,187,34,0,185,34,0,186,34,0,183,0,5,0,33,0,34,32,0,175,32,0,164,32,0,163,34,0,174,34,0,172,32,0,173,0,32,0,40,0,41,0,42,0,43,32,0,170,0,38,34,0,177,34,0,179,34,0,178,32,0,169,0,39,11,64,1,134,16,7,34,0,1,0,32,0,6,26,16,0,3,16,0,28,0,42,0,33,0,47,26,0,7,0,22,21,0,18,0,46,21,27,16,0,32,0,6,26,16,0,1,0,46,17,7,0,46,34,0,1,11,2,7,34,0,1,7,34,0,1,33,1,3,33,1,4,12,2,49,7,34,0,2,1,135,18,6,34,0,1,33,1,148,51,7,32,0,1,11,1,0,1,34,0,1,17,7,0,20,0,31,0,12,0,7,0,47,21,26,34,0,1,21,0,32,0,8,26,20,0,36,0,6,26,20,7,0,33,32,1,0,0,31,32,1,17,34,0,1,26,0,34,0,16,26,34,0,2,21,26,16,26,0,16,1,136,21,7,1,137,0,12,34,0,1,32,1,17,32,1,0,26,16,21,7,0,49,0,9,32,0,1,0,22,16,17,0,17,16,0,31,0,8,0,42,0,49,27,26,16,33,0,3,48,6,32,0,1,0,30,32,0,3,17,34,0,1,0,30,34,0,3,0,31,0,6,0,42,0,47,27,26,16,17,11,2,7,34,0,2,32,1,24,16,33,0,3,33,0,4,12,2,48,6,34,0,1,11,1,0,26,34,0,4,17,32,1,18,34,0,3,27,7,34,0,1,32,1,3,16,0,60,0,16,0,42,0,47,27,32,1,26,20,11,2,0,44,0,46,0,16,0,42,0,49,27,32,1,21,20,11,2,0,44,0,16,0,42,0,46,27,0,12,0,48,21,27,27,16,33,0,3,48,6,32,0,3,0,21,0,60,17,0,5,0,101,17,6,34,0,3,0,20,16,7,32,0,1,32,1,26,16,32,1,110,0,38,0,24,27,0,33,34,0,1,26,32,1,27,20,11,2,0,44,0,12,0,42,0,60,27,27,34,0,2,19,7,32,0,1,0,12,16,0,12,0,47,17,0,5,0,102,17,6,34,0,1,0,33,32,0,4,26,32,1,28,20,0,36,34,0,4,26,11,2,0,44,0,47,0,38,0,22,0,20,0,46,21,27,27,34,0,2,19,7,1,138,33,0,2,48,6,1,139,33,0,3,48,6,32,0,3,32,0,1,26,0,34,34,0,3,0,34,32,0,1,26,26,26,11,2,0,44,0,12,0,41,0,21,27,27,34,0,2,34,0,1,26,11,2,0,44,0,12,0,41,0,12,27,27,7,34,0,1,1,140,0,37,1,141,1,142,11,2,0,44,32,1,7,0,41,0,21,27,27,0,38,1,143,27,27,1,144,0,37,1,145,27,11,3,0,44,32,1,7,0,41,0,6,27,27,33,0,2,48,7,34,0,1,32,1,34,34,0,2,19,7,32,0,1,0,31,0,20,0,42,0,46,27,26,0,36,0,8,26,0,47,21,0,41,0,27,27,32,0,2,19,33,0,3,48,0,36,0,7,26,16,33,0,4,48,6,34,0,1,32,0,4,0,46,11,2,1,146,11,2,0,44,0,46,0,12,34,0,4,17,27,34,0,2,19,7,34,0,4,33,0,5,48,6,0,46,0,25,32,0,2,19,33,0,6,48,6,34,0,1,33,0,7,48,6,1,147,33,0,8,48,6,34,0,8,32,0,7,0,12,0,47,17,0,45,0,33,32,0,5,26,1,148,0,38,0,24,27,34,0,2,23,27,16,7,32,0,1,0,14,0,41,32,1,35,27,32,0,2,17,33,0,3,48,6,34,0,3,0,36,32,1,36,34,0,1,0,15,16,0,43,0,16,27,0,43,32,1,37,0,42,34,0,2,0,15,16,0,43,0,16,27,27,27,26,26,16,33,0,4,48,6,0,46,0,34,34,0,4,26,16,7,32,0,1,33,0,2,48,6,32,1,37,32,1,33,0,33,0,46,26,0,13,32,1,37,21,32,1,32,11,4,34,0,1,0,45,0,31,1,149,26,27,16,33,0,3,48,6,1,150,33,0,4,48,6,1,151,0,38,1,152,27,0,1,0,46,21,7,32,0,1,33,0,2,48,6,0,36,0,8,26,0,7,0,47,21,0,32,0,8,26,0,36,0,6,26,20,11,2,0,16,34,0,1,17,33,0,3,48,6,32,1,11,0,43,1,153,27,0,1,0,46,21,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,111,17,6,32,0,1,32,1,39,16,33,0,5,48,6,32,0,1,32,1,14,0,47,17,0,36,0,8,26,0,47,17,33,0,6,48,6,32,0,6,32,1,36,32,0,1,0,15,16,0,43,0,16,27,0,41,32,1,80,0,7,0,47,21,27,26,16,33,0,7,48,6,34,0,1,0,22,16,0,17,16,0,31,0,47,0,24,32,0,5,0,31,0,8,0,42,34,0,6,27,26,16,0,43,0,16,27,0,41,34,0,7,27,0,47,0,43,0,7,27,21,11,2,0,44,0,20,0,42,0,46,27,27,26,16,34,0,4,32,0,5,17,0,30,34,0,5,32,1,16,16,17,0,1,0,46,17,7,32,0,2,0,12,16,33,0,3,48,6,34,0,3,0,7,32,0,1,0,12,16,17,33,0,4,48,6,32,0,4,0,13,0,46,17,0,5,0,112,17,6,0,46,0,20,16,33,0,5,48,6,32,0,1,0,14,16,33,0,6,48,0,28,32,0,4,17,0,24,0,36,0,8,26,0,47,21,0,17,20,0,43,0,15,27,16,33,0,7,48,6,34,0,6,0,29,34,0,4,17,0,35,1,154,26,32,0,2,0,14,16,17,6,32,0,7,0,31,0,20,0,31,0,6,26,32,0,5,21,0,34,0,30,26,34,0,1,0,15,16,21,32,1,80,34,0,2,21,26,16,0,1,0,46,17,7,32,0,1,0,12,16,0,12,0,47,17,0,5,0,113,17,6,32,0,1,0,31,32,1,10,26,16,0,36,0,8,26,0,47,17,0,5,0,114,17,6,34,0,1,32,1,2,16,7,32,0,1,0,12,16,0,12,0,47,17,32,1,149,16,6,32,0,1,0,31,32,1,10,26,16,0,36,0,8,26,0,47,17,32,1,149,16,6,34,0,1,0,3,16,7,32,0,1,0,22,16,33,0,3,48,6,32,0,1,32,1,14,0,47,17,33,0,4,48,0,36,0,8,26,0,47,17,33,0,5,48,6,34,0,3,0,17,16,0,31,0,8,0,42,32,0,5,27,0,43,0,6,27,26,34,0,5,0,17,16,0,15,34,0,4,17,17,0,34,0,30,26,34,0,1,0,15,16,17,7,32,0,1,32,1,7,16,32,1,150,16,6,34,0,1,0,12,16,0,20,0,47,17,7,32,0,1,0,12,16,0,34,0,7,26,0,47,17,33,0,3,48,6,32,0,1,0,14,16,33,0,4,48,6,32,0,4,0,16,32,0,3,17,33,0,5,48,6,34,0,4,0,28,34,0,3,17,33,0,6,48,6,32,0,6,0,36,0,8,26,0,47,17,0,17,16,0,15,34,0,6,17,0,31,0,8,0,42,32,0,5,27,0,43,0,6,27,26,34,0,5,0,17,16,17,0,34,0,30,26,34,0,1,0,15,16,17,7,32,0,2,0,12,16,0,23,0,47,17,0,5,0,115,17,6,32,0,2,32,1,13,16,33,0,2,49,6,32,0,1,32,1,11,16,33,0,1,49,6,32,0,1,0,12,16,33,0,6,48,0,13,32,0,2,0,22,16,17,0,5,0,116,17,6,32,0,2,0,31,32,0,6,0,43,0,20,27,32,1,129,32,1,10,21,26,16,0,36,32,1,129,26,0,47,17,0,5,0,117,17,6,32,0,2,0,3,16,33,0,7,48,34,0,4,33,0,6,50,6,34,0,7,0,31,0,12,0,42,0,46,27,26,16,32,1,2,16,0,26,34,0,2,17,34,0,5,16,33,0,8,48,0,22,16,33,0,9,48,6,32,0,1,0,14,16,0,29,0,27,0,28,21,34,0,9,17,33,0,10,33,0,11,12,2,48,6,32,0,10,32,1,93,0,43,0,27,27,16,0,31,32,1,113,0,42,34,0,8,27,26,16,33,0,12,33,0,13,12,2,48,6,34,0,1,0,15,16,0,15,0,42,32,0,11,0,43,0,26,27,27,0,24,0,15,34,0,11,0,26,34,0,10,0,36,0,8,26,0,47,17,11,1,17,21,0,30,0,25,0,35,0,17,0,43,0,31,0,8,26,0,42,0,36,0,6,26,0,20,20,27,27,26,34,0,13,21,0,36,0,31,0,6,26,26,0,46,0,20,16,21,21,11,2,0,44,0,24,0,40,0,22,27,0,20,0,46,21,27,34,0,12,0,31,0,36,0,11,26,26,16,17,7,32,0,1,0,31,0,47,0,43,0,7,27,0,18,0,46,21,26,16,0,36,0,6,26,0,46,17,0,7,34,0,2,19,33,0,3,48,6,32,0,3,0,13,34,0,1,0,22,16,17,0,5,0,118,17,6,34,0,3,7,34,0,1,0,36,0,18,26,0,46,17,0,23,0,47,17,32,1,149,16,6,34,0,2,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,119,17,6,32,0,1,0,22,16,0,6,0,47,17,0,17,16,0,31,34,0,1,0,43,0,30,0,42,0,17,27,27,26,16,0,1,0,42,0,16,0,42,0,46,27,27,16,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,120,17,6,32,0,1,0,22,16,33,0,3,48,6,32,0,3,0,6,0,47,17,0,17,16,0,31,34,0,1,0,43,0,30,0,42,1,155,27,27,26,16,0,1,0,42,0,16,0,42,32,0,3,27,27,16,7,34,0,1,33,0,3,33,0,4,12,2,48,6,1,156,33,0,5,48,6,0,24,0,40,34,0,3,27,0,25,0,6,32,0,5,0,13,0,42,0,46,27,26,20,34,0,5,0,21,26,11,2,0,44,0,13,0,42,0,46,27,27,21,7,32,0,1,0,12,16,0,12,0,47,17,0,5,0,125,17,6,34,0,2,32,1,56,32,0,1,0,22,16,17,0,34,0,16,26,34,0,1,17,7,32,0,2,0,12,18,0,12,0,47,19,0,5,0,126,19,6,32,0,1,0,14,16,33,0,3,48,0,22,0,41,0,12,27,32,0,2,19,0,5,0,127,17,6,0,46,33,0,4,48,6,34,0,3,0,35,1,157,26,34,0,2,19,6,34,0,1,0,15,16,0,16,32,0,4,17,7,34,0,2,0,31,34,0,1,0,43,32,1,60,27,26,16,7,34,0,1,33,0,2,33,0,3,33,0,4,33,0,5,33,0,6,33,0,7,12,6,48,6,0,129,0,26,34,0,2,17,0,26,0,128,17,33,0,8,48,6,0,130,0,26,32,0,8,17,33,0,9,48,6,0,131,0,26,32,0,8,17,33,0,10,48,6,0,132,0,26,32,0,8,17,33,0,11,48,6,0,133,0,26,34,0,8,17,33,0,12,48,6,0,24,0,31,34,0,5,0,31,0,0,0,12,0,47,21,26,0,15,20,0,36,0,8,26,0,47,21,11,2,0,44,32,1,7,27,26,0,15,20,0,36,0,8,26,0,47,21,0,5,34,0,12,21,11,2,0,16,34,0,4,17,33,0,13,48,6,1,158,1,159,11,2,0,44,0,25,0,40,34,0,3,27,27,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,134,17,6,32,0,1,0,22,16,0,20,0,46,17,0,5,0,135,17,6,34,0,1,0,30,0,46,0,20,16,17,7,34,0,2,0,31,32,1,57,0,42,34,0,1,0,22,16,27,26,16,7,34,0,2,0,31,32,1,57,0,42,34,0,1,27,26,16,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,138,17,6,32,0,1,0,22,16,33,0,3,48,6,34,0,1,0,30,32,0,3,0,17,16,0,31,0,7,0,42,0,47,0,7,34,0,3,17,27,26,16,17,7,32,0,2,32,1,9,18,0,5,0,139,19,6,32,0,1,0,12,0,46,17,0,6,33,0,1,50,6,32,0,1,0,9,32,0,2,19,0,11,16,0,8,32,0,1,17,0,7,34,0,2,19,33,0,3,48,6,34,0,1,0,20,32,0,3,17,0,5,0,140,17,6,34,0,3,7,32,0,2,32,1,7,0,45,0,15,0,16,0,46,21,27,16,33,0,2,49,6,32,0,2,32,1,10,16,0,5,0,142,17,6,34,0,2,33,0,3,48,33,0,4,48,6,34,0,1,0,8,32,0,3,17,0,17,16,0,32,0,34,1,160,0,45,1,161,27,26,26,16,7,32,0,2,0,22,16,0,12,34,0,1,17,0,5,0,143,17,6,32,0,2,0,31,0,12,0,42,0,11,0,40,0,19,27,27,26,16,0,36,0,8,26,0,47,17,0,5,0,142,17,6,34,0,2,32,1,2,16,7,0,33,0,46,26,0,5,0,144,21,7,34,0,1,32,1,3,16,33,0,3,48,6,32,0,3,0,16,0,46,17,0,46,0,43,0,13,27,0,33,34,0,3,26,0,29,0,42,0,47,27,0,31,34,0,0,26,20,0,36,0,8,26,32,1,74,21,20,11,2,0,44,0,13,0,42,0,49,27,27,16,7,34,0,1,1,162,34,0,2,21,7,0,34,34,0,1,26,7,1,163,0,24,11,2,0,36,34,0,1,26,16,7,34,0,1,34,0,2,16,7,34,0,1,1,164,0,25,32,1,73,20,0,45,1,165,27,11,2,0,44,0,25,0,40,0,0,27,0,13,0,53,21,27,34,0,2,17,7,34,0,1,32,1,11,0,41,32,0,4,32,1,77,32,1,30,32,0,4,26,0,38,0,31,34,0,4,26,27,27,27,34,0,2,19,7,34,0,1,32,1,11,0,41,32,0,4,32,1,77,0,31,34,0,4,26,27,27,34,0,2,19,7,34,0,1,0,35,32,1,80,26,34,0,2,19,0,15,16,0,36,0,8,26,0,47,17,7,32,0,2,0,16,0,47,17,34,0,1,11,2,0,44,34,0,2,0,16,0,46,17,27,7,34,0,1,0,15,16,0,31,32,1,81,26,16,0,36,0,18,26,0,46,17,0,6,0,47,17,7,32,0,1,0,31,0,12,26,16,0,36,0,6,26,0,46,17,0,20,0,46,17,0,5,0,147,17,6,0,52,33,0,3,48,33,0,4,48,6,11,0,33,0,5,48,6,32,0,1,33,0,6,48,6,34,0,1,0,31,0,22,26,16,32,1,2,16,0,31,1,166,26,16,7,1,167,33,0,0,48,6,0,46,0,12,0,42,0,33,32,0,0,26,27,11,2,0,44,0,0,0,12,0,53,21,27,33,0,1,48,6,0,33,32,0,0,26,33,0,2,48,6,1,168,33,0,3,48,6,0,0,0,23,0,53,21,0,45,32,0,3,32,0,1,26,27,33,0,4,48,6,0,24,0,16,0,49,21,32,1,7,20,0,43,0,21,27,0,45,1,169,27,33,0,5,48,6,1,170,33,0,6,48,6,1,171,33,0,7,48,6,1,172,0,46,0,16,0,42,0,49,27,0,12,0,33,32,0,7,26,21,11,2,0,44,0,16,0,42,0,46,27,0,12,0,48,21,27,33,0,8,48,20,33,0,9,48,6,34,0,3,32,0,9,26,33,0,10,48,6,1,173,33,0,11,48,6,1,174,33,0,12,48,6,1,175,33,0,13,48,6,1,176,33,0,14,48,6,1,177,33,0,15,48,6,1,178,33,0,16,48,6,1,179,33,0,17,48,6,1,180,33,0,18,48,6,1,181,33,0,19,48,6,1,182,33,0,20,48,6,0,149,0,24,0,150,1,183,0,151,32,0,19,0,47,0,46,11,2,26,0,152,32,0,19,0,46,0,49,11,2,26,0,153,1,184,0,46,0,49,11,2,26,0,154,32,0,19,0,47,0,47,11,2,26,0,155,32,0,20,0,47,0,47,11,2,26,0,156,34,0,20,0,47,0,49,11,2,26,0,157,32,0,18,0,47,0,47,11,2,26,0,158,1,185,0,159,32,0,18,0,47,0,49,11,2,26,0,160,34,0,19,0,49,0,47,11,2,26,0,161,1,186,0,49,0,47,11,2,26,0,162,1,187,0,163,1,188,0,164,0,33,32,0,16,26,0,165,0,33,34,0,17,26,11,34,32,1,24,16,33,0,21,33,0,22,12,2,48,6,32,0,10,1,189,1,190,11,3,0,44,0,33,0,53,26,0,7,0,0,21,27,33,0,23,48,6,34,0,23,11,1,0,26,34,0,22,32,1,2,0,42,0,31,0,22,26,27,32,0,21,17,17,32,1,18,34,0,21,32,1,82,16,27,33,0,24,48,6,0,24,0,24,0,24,0,36,1,191,26,20,1,192,1,193,1,194,11,6,0,44,0,25,27,33,0,25,48,6,34,0,25,0,33,32,0,2,26,11,2,0,44,0,16,0,42,0,53,0,43,0,23,27,27,0,12,0,33,32,0,2,26,21,27,33,0,26,48,6,1,195,0,43,0,24,0,16,0,47,21,1,196,20,32,0,4,20,0,33,32,0,2,26,1,197,34,0,26,0,16,0,42,0,46,27,21,32,0,4,20,1,198,11,2,0,44,32,1,22,27,0,24,0,16,0,47,21,34,0,4,20,11,4,0,44,0,24,0,16,0,46,21,0,40,0,53,0,24,0,49,11,2,0,44,0,13,0,42,0,49,27,27,11,2,0,44,0,13,0,42,0,46,27,27,27,27,27,33,0,27,48,6,0,24,32,1,7,20,0,12,0,41,0,12,27,0,14,0,41,32,1,15,27,11,3,0,36,1,199,26,16,33,0,28,48,6,0,24,0,40,32,0,1,27,0,7,0,47,21,0,45,1,200,27,33,0,29,48,6,1,201,33,0,30,48,6,1,202,33,0,31,48,6,1,203,7,32,1,88,0,45,0,1,0,43,0,24,0,37,0,33,11,0,26,0,15,32,1,85,0,41,34,0,2,27,21,27,27,27,32,1,87,0,24,0,37,0,25,27,34,0,1,21,11,2,0,44,0,15,0,40,0,22,27,0,20,0,46,21,27,7,32,0,1,0,15,16,0,16,0,46,17,32,1,85,16,33,0,3,48,6,32,0,1,0,15,16,0,31,32,1,85,0,46,32,1,15,11,2,0,44,0,22,0,41,0,12,27,27,32,0,3,21,0,5,0,168,21,26,16,6,32,0,3,0,36,0,8,26,0,47,17,0,17,16,0,15,34,0,3,17,0,31,0,34,0,16,26,26,34,0,1,0,31,32,1,13,26,16,17,7,32,0,1,0,12,0,41,0,18,27,32,0,2,19,0,34,0,7,26,0,47,17,33,0,3,48,6,32,0,1,32,1,85,0,41,0,27,27,32,0,2,19,33,0,4,48,6,32,0,4,0,31,0,22,0,13,32,0,3,21,26,16,0,36,0,8,26,0,47,17,0,5,0,169,17,6,32,0,4,0,31,0,29,0,42,0,33,32,0,3,26,0,7,0,22,21,27,26,16,33,0,5,48,6,32,0,5,0,36,32,1,15,26,16,0,5,0,170,17,6,34,0,4,0,31,0,47,0,24,0,16,0,46,21,11,2,0,44,0,22,0,20,34,0,3,21,27,26,16,0,36,0,6,26,0,46,17,33,0,6,48,6,34,0,1,0,15,0,41,0,26,27,34,0,2,19,0,15,34,0,5,0,16,0,46,17,0,26,34,0,6,11,1,17,17,7,34,0,2,33,0,5,48,6,34,0,4,33,0,6,48,6,34,0,1,0,31,1,204,26,16,7,32,0,1,0,15,16,33,0,3,48,0,22,16,33,0,4,48,6,32,0,3,0,31,32,1,85,26,16,33,0,5,48,6,32,0,1,0,12,16,33,0,6,48,6,34,0,1,32,1,85,16,33,0,7,48,6,0,47,33,0,8,48,6,0,46,0,20,16,33,0,9,48,33,0,10,48,33,0,11,48,6,34,0,6,0,17,16,0,35,1,205,26,32,0,7,32,1,93,16,17,6,32,0,9,0,15,16,33,0,9,49,0,16,0,46,17,0,7,32,0,3,0,16,0,46,17,0,12,16,17,33,0,12,48,6,32,0,3,0,31,0,33,32,0,12,26,0,7,0,12,21,26,16,32,1,15,32,0,9,17,0,5,0,173,17,6,0,35,1,206,32,0,3,0,31,32,1,13,26,16,26,26,33,0,13,48,6,32,0,10,32,0,13,1,207,11,2,0,44,32,0,12,0,20,0,46,17,27,32,0,11,17,7,32,0,2,0,22,16,33,0,3,48,6,32,0,1,0,22,16,33,0,4,48,6,32,0,3,0,23,32,0,4,17,0,5,0,174,17,6,34,0,1,0,35,0,8,0,42,34,0,2,0,43,0,16,27,27,0,24,11,2,0,44,0,25,0,13,34,0,3,21,27,26,34,0,4,0,17,16,17,7,32,0,1,0,7,0,47,17,33,0,2,48,6,0,176,0,177,11,2,0,16,32,0,1,17,33,0,3,48,6,0,19,0,43,0,12,27,0,7,0,47,21,0,12,0,42,0,46,27,0,7,0,47,21,11,2,0,16,32,0,1,17,33,0,4,48,6,1,208,1,209,11,2,0,16,34,0,1,17,33,0,5,48,6,0,178,0,26,34,0,3,17,0,26,0,128,17,33,0,6,48,6,0,179,0,26,32,0,6,17,33,0,7,48,6,0,180,0,26,34,0,6,17,33,0,8,48,6,32,1,11,0,43,0,24,0,37,1,210,1,211,11,2,0,44,0,25,0,40,32,1,7,27,27,27,27,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,181,17,6,32,0,1,32,1,14,0,47,17,33,0,3,48,6,32,0,2,0,12,0,41,0,7,27,32,0,1,19,1,212,32,0,2,19,6,32,0,3,0,36,0,8,26,34,0,1,1,213,0,38,0,47,27,34,0,2,19,17,7,32,0,1,32,1,99,32,0,2,19,33,0,3,48,6,32,0,1,0,15,16,33,0,4,48,0,22,16,33,0,5,48,0,11,34,0,3,17,33,0,6,48,6,34,0,4,0,28,32,0,6,0,7,32,0,5,17,17,0,26,34,0,6,0,34,32,1,13,0,43,0,28,27,26,0,38,32,0,1,0,43,34,0,5,0,20,0,46,17,0,45,1,214,27,27,27,34,0,2,19,17,0,15,34,0,1,32,1,85,16,17,7,32,0,1,32,1,99,32,0,2,19,33,0,3,48,6,32,0,1,0,15,16,33,0,4,48,0,22,16,33,0,5,48,0,11,32,0,3,17,33,0,6,48,6,32,0,6,0,34,32,1,13,0,43,0,29,0,42,0,7,0,42,34,0,3,27,27,27,26,0,38,32,0,1,0,43,34,0,5,0,20,0,46,17,0,45,1,215,27,27,27,34,0,2,19,0,26,34,0,4,0,29,34,0,6,17,17,0,15,34,0,1,32,1,85,16,17,7,32,0,1,0,12,16,0,12,0,47,17,0,5,0,186,17,6,32,0,1,0,31,32,1,102,26,16,6,32,0,1,11,0,0,43,0,15,27,0,31,0,17,26,0,36,0,31,0,26,0,42,0,27,27,26,26,11,0,0,20,16,21,11,2,0,44,0,24,0,36,0,8,26,0,47,21,0,20,0,46,21,27,16,0,31,0,1,0,42,0,46,27,26,16,0,1,34,0,1,0,31,0,46,26,16,17,7,32,0,2,0,12,16,0,23,0,47,17,0,5,0,187,17,6,32,0,2,32,1,13,16,33,0,2,49,0,22,16,33,0,3,48,6,32,0,1,32,1,11,16,33,0,1,49,6,34,0,1,32,0,3,0,20,0,46,17,0,45,0,24,0,37,1,216,27,27,34,0,2,17,7,32,0,1,32,1,85,16,0,28,32,0,2,19,33,0,3,48,6,32,0,1,32,1,14,34,0,2,19,33,0,4,48,0,36,0,8,26,0,47,17,33,0,5,48,6,34,0,1,0,15,16,33,0,6,48,6,32,0,5,0,17,16,0,15,34,0,4,17,33,0,7,48,6,32,0,3,0,36,0,8,26,0,47,17,0,17,16,0,31,1,217,26,16,33,0,8,48,6,0,46,0,17,16,0,25,0,0,0,13,0,53,21,0,45,0,46,27,20,0,37,0,24,27,32,0,6,17,0,1,16,33,0,9,48,6,34,0,8,0,15,34,0,3,17,0,1,32,0,7,0,31,0,33,34,0,9,26,26,16,0,34,0,24,0,37,0,25,27,26,32,0,6,17,17,7,34,0,4,33,0,5,48,6,1,218,33,0,6,48,6,1,219,33,0,7,48,6,34,0,1,32,0,5,0,20,20,1,220,1,221,34,0,7,11,4,0,44,0,12,0,20,0,46,21,0,41,0,6,0,42,0,8,0,42,0,49,27,27,27,27,34,0,2,19,32,1,90,16,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,192,17,6,34,0,4,33,0,5,48,6,1,222,33,0,6,48,6,34,0,1,34,0,6,1,223,11,2,0,44,0,47,0,38,0,22,0,20,0,46,21,27,27,34,0,2,19,7,32,0,2,0,12,16,0,23,0,47,17,0,5,0,195,17,6,34,0,2,32,1,13,16,33,0,3,48,6,32,0,3,0,31,0,47,0,12,0,42,0,50,27,11,2,0,44,32,1,10,27,26,16,33,0,4,48,0,36,0,6,26,0,46,17,33,0,5,48,6,32,0,5,0,23,0,47,17,0,5,0,196,17,6,34,0,1,32,1,13,16,33,0,6,48,0,22,16,33,0,7,48,6,32,0,3,0,24,0,36,0,8,26,0,47,21,1,224,11,2,0,44,34,0,5,27,16,33,0,8,48,6,32,0,6,32,0,7,0,12,32,0,8,17,0,7,0,47,17,0,45,0,24,0,37,1,225,27,27,16,0,15,32,0,3,17,7,32,0,1,0,31,32,1,9,26,16,0,36,0,8,26,0,47,17,0,5,0,201,17,6,32,0,1,0,31,0,13,0,42,0,52,27,26,16,0,36,0,8,26,0,47,17,0,5,0,202,17,6,0,3,33,0,5,48,6,32,0,1,0,25,0,38,0,46,27,0,45,0,24,1,226,0,22,0,43,0,34,0,7,26,27,21,27,34,0,2,19,33,0,1,49,6,32,0,1,0,4,34,0,1,32,0,5,16,33,0,6,48,17,33,0,7,48,6,0,46,33,0,8,48,6,34,0,6,0,31,1,227,0,34,0,30,26,34,0,7,21,34,0,4,20,26,16,7,32,0,1,0,12,16,0,12,0,47,17,0,5,0,203,17,6,32,1,111,0,24,26,33,0,3,48,6,34,0,1,32,0,3,0,1,0,46,0,40,0,17,27,21,0,31,32,1,11,0,40,1,228,27,26,0,36,0,31,0,31,0,26,26,26,26,11,0,0,20,16,0,20,16,21,0,1,0,31,0,46,26,11,0,0,43,0,15,27,0,1,0,24,21,20,21,11,2,0,44,32,1,84,0,20,0,47,21,27,16,7,32,0,2,0,12,16,33,0,3,48,6,32,0,1,0,12,16,0,13,32,0,3,17,0,5,0,204,17,6,32,0,1,32,1,85,16,33,0,4,48,0,28,32,0,3,17,0,35,0,7,26,32,0,2,32,1,85,16,17,33,0,5,48,6,32,0,5,0,46,0,16,0,42,0,46,27,0,12,0,47,21,11,2,0,44,32,0,3,0,12,0,47,17,27,16,33,0,6,48,6,34,0,5,0,31,0,12,0,42,0,46,27,26,0,36,0,8,26,0,47,21,0,47,11,2,0,44,32,0,6,27,16,0,5,0,205,17,6,32,0,1,0,43,0,24,0,37,0,25,0,40,32,0,1,0,15,16,1,229,1,230,11,2,0,44,34,0,1,0,12,16,0,12,32,0,3,17,27,16,27,27,27,33,0,7,48,6,34,0,2,0,15,16,32,1,111,32,0,7,26,34,0,6,17,0,1,11,0,34,0,7,16,17,7,32,0,2,0,12,16,0,12,0,47,17,0,5,0,206,17,6,32,0,2,0,31,0,12,26,16,33,0,3,48,0,36,0,6,26,0,46,17,33,0,4,48,6,32,0,1,0,12,16,0,13,32,0,4,17,0,5,0,207,17,6,32,0,1,32,1,85,16,0,28,32,0,4,17,0,35,0,7,26,32,0,2,0,31,32,1,85,26,16,32,1,82,16,17,33,0,5,48,6,32,0,3,0,31,0,12,0,42,0,47,27,26,16,32,1,2,32,0,3,17,0,35,0,13,0,8,0,25,0,13,0,46,21,21,26,32,0,5,17,0,36,0,8,26,0,47,17,0,5,0,205,17,6,0,46,11,1,0,26,34,0,5,17,0,30,32,0,3,32,1,92,0,6,26,0,46,17,17,0,35,0,11,26,34,0,3,17,33,0,6,48,6,32,0,2,0,31,32,1,13,26,16,33,0,2,49,0,35,0,22,0,43,0,34,0,7,26,27,26,32,0,6,17,33,0,7,48,6,0,33,32,0,1,26,32,1,110,34,0,1,32,1,14,34,0,4,17,0,43,0,26,27,21,33,0,8,48,6,32,0,7,0,36,0,8,26,0,47,17,11,1,32,0,8,16,0,43,0,30,27,33,0,9,48,6,32,0,2,0,16,0,42,0,46,27,0,41,32,1,111,32,0,9,26,27,0,35,32,1,111,0,24,26,26,0,35,1,231,26,34,0,7,32,1,93,16,21,0,36,0,31,0,31,0,6,26,26,26,20,0,31,34,0,9,26,20,11,2,0,44,0,24,0,40,0,22,27,0,22,0,47,21,27,34,0,6,17,0,1,34,0,2,0,31,0,46,26,16,34,0,8,16,17,7,32,0,1,32,1,7,16,0,5,0,208,17,6,34,0,1,32,1,113,32,1,114,11,2,0,44,32,0,2,32,1,84,16,0,13,0,49,17,27,34,0,2,17,7,32,0,1,0,12,16,0,12,0,47,17,32,1,149,16,6,32,0,1,0,31,0,12,0,12,0,47,21,26,16,0,36,0,8,26,0,47,17,32,1,150,16,6,32,0,1,32,1,82,16,33,0,3,48,6,32,0,3,0,31,0,12,0,22,0,47,21,26,16,0,36,0,8,26,0,47,17,32,1,149,16,6,32,0,3,0,31,32,1,10,26,16,0,36,0,8,26,0,47,17,32,1,150,16,6,32,0,1,0,31,0,22,0,20,0,46,21,0,45,0,36,1,232,26,27,26,16,6,32,0,3,0,3,16,33,0,4,48,6,32,0,4,0,31,0,47,0,43,0,13,27,26,16,0,36,0,8,26,0,47,17,32,1,150,16,6,34,0,4,0,31,0,7,0,42,0,47,27,26,16,32,1,2,16,33,0,5,48,6,32,0,5,0,31,0,52,26,16,0,26,34,0,1,0,31,0,22,26,16,32,1,2,16,17,0,30,34,0,5,0,26,34,0,3,17,32,1,16,16,17,7,32,0,2,0,12,16,0,12,0,47,17,32,1,149,16,6,32,0,2,0,31,32,1,10,26,16,0,36,0,8,26,0,47,17,32,1,149,16,6,32,0,2,0,3,16,33,0,3,48,6,32,0,1,0,22,0,41,0,12,27,32,0,3,17,32,1,150,16,6,32,0,1,0,31,0,22,26,16,32,1,15,32,0,3,17,32,1,150,16,6,34,0,1,32,1,95,16,0,30,34,0,2,0,4,34,0,3,17,32,1,16,16,17,7,32,0,1,0,12,16,0,23,0,47,17,0,5,0,209,17,6,32,0,1,32,1,13,16,33,0,1,49,6,32,0,1,0,22,16,0,53,0,43,0,13,27,0,8,0,13,0,42,0,47,27,21,16,0,5,0,210,17,6,32,0,1,0,31,32,1,9,26,16,0,36,0,8,26,0,47,17,0,5,0,211,17,6,34,0,2,0,31,0,25,0,8,0,34,0,9,0,40,0,11,27,26,21,0,34,0,7,26,0,47,21,0,6,0,7,21,0,42,32,0,1,0,22,16,27,26,16,0,34,0,30,26,34,0,1,17,7,34,0,1,32,1,118,0,47,0,46,11,2,0,38,0,49,11,1,27,21,7,32,0,1,32,1,119,34,0,5,26,32,0,2,19,33,0,6,48,0,31,0,21,0,42,0,46,27,26,16,33,0,7,48,6,34,0,4,33,0,8,48,6,1,233,0,38,1,234,27,33,0,9,48,6,0,46,33,0,10,48,6,1,235,33,0,11,48,6,1,236,33,0,12,48,6,1,237,33,0,13,48,6,1,238,33,0,14,48,6,34,0,1,32,0,14,34,0,6,26,34,0,2,19,7,0,24,0,25,11,2,0,44,0,20,27,33,0,6,48,6,32,0,1,32,1,119,34,0,5,26,0,35,0,7,0,43,32,0,6,27,34,0,6,0,7,0,25,21,11,2,0,44,0,24,0,13,0,46,21,27,26,0,12,0,41,0,27,27,21,32,0,2,19,33,0,7,48,6,34,0,1,32,1,106,32,0,7,0,16,0,42,0,22,0,34,0,7,26,0,47,21,27,16,17,32,1,78,34,0,4,26,34,0,2,32,1,106,34,0,7,0,16,0,46,17,19,19,32,1,90,16,7,34,0,4,33,0,6,48,6,0,46,1,239,0,38,0,33,1,240,26,27,32,0,2,19,33,0,7,48,6,32,0,1,34,0,5,34,0,2,19,33,0,8,48,6,1,241,33,0,9,48,6,34,0,1,34,0,9,1,242,11,2,0,44,32,0,8,32,1,10,16,27,16,7,32,0,2,32,1,123,32,0,1,17,0,11,16,0,8,34,0,2,17,0,7,34,0,1,17,7,32,0,2,32,1,135,16,0,34,32,1,139,26,0,47,17,33,0,3,48,6,32,0,3,32,1,137,0,46,17,0,5,0,215,17,6,32,0,1,32,1,135,16,32,1,137,34,0,3,17,0,5,0,216,17,6,34,0,1,32,1,141,0,42,32,0,2,27,0,15,0,40,32,1,47,27,0,15,32,1,85,21,0,43,0,35,0,27,26,27,20,0,41,32,1,141,27,34,0,2,17,7,34,0,1,32,1,148,16,7,34,0,1,32,1,3,16,7,34,0,1,32,1,148,16,7,32,0,2,0,43,32,0,1,27,0,38,34,0,2,34,0,1,20,27,7,34,0,1,33,0,3,33,0,4,33,0,5,33,0,6,12,4,48,6,32,1,144,32,1,140,20,33,0,7,48,6,34,0,6,1,243,1,244,0,33,32,1,151,26,11,2,0,44,0,24,0,40,32,0,7,27,27,11,2,0,44,0,25,0,40,34,0,7,27,27,34,0,4,17,7,34,0,1,32,1,3,16,7,34,0,1,32,1,159,16,7,34,0,1,32,1,168,16,7,34,0,2,34,0,1,16,7,34,0,1,32,1,171,16,7,34,0,2,0,36,34,0,1,26,16,7,0,24,32,1,84,0,40,32,1,150,27,34,0,1,21,0,25,0,24,21,7,32,0,1,34,0,4,32,0,2,19,33,0,6,48,6,32,0,6,34,0,5,34,0,2,19,32,1,84,34,0,1,17,32,1,150,16,6,34,0,6,7,34,0,1,33,0,2,33,0,3,33,0,4,12,3,48,6,1,245,7,32,1,135,0,42,0,47,27,32,1,130,32,1,135,0,42,0,46,27,21,33,0,3,48,6,32,0,1,32,0,3,16,32,1,150,16,6,32,0,2,34,0,3,16,32,1,149,16,6,34,0,2,32,1,134,34,0,1,17,7,32,0,1,32,1,7,16,32,1,150,16,6,32,0,1,32,1,135,16,32,1,135,0,46,17,32,1,150,16,6,34,0,1,0,15,16,0,16,0,46,17,7,32,0,1,32,1,134,16,32,1,135,0,49,17,32,1,150,16,6,32,0,1,32,1,154,16,32,1,84,34,0,2,32,1,11,18,19,32,1,150,16,6,34,0,1,32,1,154,0,47,17,7,32,0,1,32,1,134,16,32,1,135,0,47,17,32,1,150,16,6,34,0,1,32,1,154,16,7,32,0,1,32,1,85,16,32,1,84,0,49,11,1,17,32,1,150,16,6,32,0,1,0,16,0,46,17,32,1,84,34,0,2,19,32,1,150,16,6,34,0,1,0,16,0,47,17,7,32,0,1,32,1,85,16,32,1,84,0,47,11,1,17,32,1,150,16,6,34,0,1,0,16,0,46,17,7,32,0,1,32,1,135,16,32,1,137,0,47,17,32,1,150,16,6,32,0,1,32,1,134,16,33,0,3,48,0,34,32,1,123,26,0,49,17,32,1,127,16,33,0,4,48,6,32,0,4,32,1,131,0,49,17,32,1,135,34,0,3,17,32,1,150,16,6,34,0,1,32,1,157,32,1,84,0,40,32,1,150,27,0,25,0,24,21,32,1,156,21,34,0,4,17,7,32,0,1,32,1,134,16,32,1,135,0,49,17,32,1,150,16,6,32,0,1,32,1,154,0,47,17,32,1,84,34,0,2,32,1,11,18,19,32,1,150,16,6,34,0,1,32,1,154,16,7,32,0,1,32,1,134,16,32,1,135,0,49,17,32,1,150,16,6,32,0,1,32,1,173,32,1,84,26,16,32,1,150,16,6,34,0,1,32,1,154,16,7,32,0,1,32,1,85,16,32,1,84,0,49,11,1,17,32,1,150,16,6,32,0,1,0,16,0,47,17,32,1,84,34,0,2,19,32,1,150,16,6,34,0,1,0,16,0,46,17,7,32,0,1,32,1,85,16,32,1,84,0,49,11,1,17,32,1,150,16,6,32,0,1,0,36,32,1,84,26,16,32,1,150,16,6,34,0,1,0,16,0,46,17,7,34,0,1,0,38,34,0,2,27,7,32,0,1,32,1,3,16,0,33,34,0,1,26,32,1,160,20,0,16,0,42,0,47,27,32,1,161,20,11,2,0,44,32,1,23,27,16,7,34,0,1,32,1,162,16,7,0,24,0,40,32,1,84,27,32,1,132,0,46,21,32,1,150,20,0,25,32,1,164,32,1,143,34,0,1,26,26,21,7,0,24,0,40,32,1,84,27,32,1,132,0,46,21,32,1,150,20,0,25,0,46,0,40,32,1,149,27,0,38,32,1,163,32,1,143,34,0,1,26,26,27,21,7,0,24,0,40,32,1,135,27,32,1,132,0,46,21,32,1,150,20,0,25,32,1,175,32,1,143,34,0,1,26,0,24,0,42,32,1,7,0,40,32,1,150,27,27,20,26,21,7,32,1,164,32,1,143,34,0,1,26,26,7,0,24,0,40,32,1,135,27,32,1,132,0,46,21,32,1,150,20,0,25,0,24,32,0,1,32,1,166,21,0,38,32,1,134,32,1,132,0,47,21,0,45,32,1,157,0,42,0,47,27,34,0,1,32,1,157,0,42,0,52,27,21,32,1,165,32,1,154,21,27,27,21,7,32,1,143,34,0,2,26,33,0,3,48,6,32,0,3,0,42,32,0,1,27,0,38,34,0,3,27,32,1,143,34,0,1,26,20,7,34,0,1,32,1,170,32,1,143,34,0,2,26,27,7,34,0,1,32,1,139,16,32,1,169,34,0,2,27,7,32,1,143,34,0,1,26,0,38,32,1,143,34,0,2,26,27,7,32,1,143,34,0,1,26,0,42,34,0,2,27,7,34,0,1,0,38,32,1,151,27,7,32,1,143,32,0,2,26,32,1,143,32,0,1,26,20,0,38,34,0,1,0,33,0,46,0,40,32,1,149,27,26,1,246,11,2,0,44,0,24,0,40,32,1,144,27,27,34,0,2,17,27,7,34,0,4,32,1,148,16,33,0,5,48,6,34,0,1,34,0,5,34,0,2,19,7,32,0,1,1,247,34,0,5,32,1,176,34,0,1,34,0,4,32,0,2,19,17,26,34,0,2,19,7,32,0,1,11,1,0,1,34,0,1,17,7,32,1,132,32,1,141,32,0,1,21,32,1,176,20,33,1,4,49,6,34,0,1,32,1,5,32,1,6,11,3,7,34,0,1,33,2,162,51,7,34,0,1,32,2,4,16,7,34,0,1,32,2,4,16,7,32,0,1,0,14,0,41,32,2,15,27,32,0,2,19,0,5,0,103,17,6,34,0,1,0,35,34,0,4,26,34,0,2,19,7,32,0,2,0,14,16,33,0,5,48,6,32,0,2,0,12,16,33,0,6,48,6,32,0,1,0,14,16,33,0,7,48,6,32,0,7,0,28,32,0,6,17,32,2,15,34,0,5,17,0,5,0,104,17,6,32,0,7,0,29,34,0,6,17,0,36,0,8,26,0,47,17,33,0,8,48,6,34,0,2,0,15,16,33,0,9,48,0,22,16,33,0,10,48,6,34,0,1,0,15,16,33,0,11,48,6,0,46,0,21,32,0,10,17,0,8,32,0,8,17,0,17,0,41,0,31,0,33,34,0,11,26,0,16,0,6,0,42,0,8,0,42,34,0,8,27,27,21,34,0,4,34,0,9,0,43,0,16,27,21,26,27,34,0,10,17,0,15,34,0,7,17,7,34,0,1,32,1,2,34,0,2,19,7,34,0,1,0,31,32,1,2,0,42,0,33,34,0,2,26,27,26,16,7,34,0,2,0,31,0,33,34,0,1,26,0,43,32,1,2,27,26,16,7,34,0,1,0,31,32,1,2,26,16,7,34,0,1,32,1,2,34,0,2,19,7,34,0,1,32,2,30,32,1,2,26,34,0,2,19,7,0,27,0,16,0,23,21,0,27,32,2,33,21,33,0,3,48,6,32,0,1,0,22,0,41,32,0,3,27,32,0,2,19,33,0,4,33,0,5,12,2,48,6,34,0,1,1,248,0,41,1,249,27,34,0,2,19,33,0,6,48,6,32,0,4,34,0,6,11,2,7,34,0,2,33,0,3,48,6,34,0,1,33,0,4,48,6,1,250,32,1,6,11,2,0,44,0,12,0,42,32,1,7,27,27,33,0,5,48,6,0,46,32,0,5,16,7,34,0,1,0,12,0,42,0,46,27,0,45,34,0,2,27,20,7,0,34,34,0,1,26,7,32,1,3,0,16,32,0,1,17,34,0,4,16,0,47,0,13,34,0,1,17,0,45,1,251,34,0,5,26,27,34,0,2,19,7,32,0,2,0,12,16,0,34,0,7,26,0,47,17,33,0,3,48,0,7,32,0,1,0,12,16,17,33,0,4,48,6,34,0,3,0,13,0,46,17,0,5,0,106,17,6,32,0,4,0,13,0,46,17,0,5,0,107,17,6,32,0,2,32,2,14,0,47,17,33,0,5,48,6,32,0,2,0,22,16,33,0,6,48,6,32,0,1,32,2,11,16,33,0,1,49,6,32,0,1,32,2,14,32,0,4,17,33,0,7,48,6,32,0,1,0,14,16,0,28,34,0,4,17,33,0,8,48,0,36,0,8,26,0,47,17,33,0,9,48,6,34,0,1,0,15,0,41,1,252,1,253,11,2,0,44,32,0,6,0,20,0,46,17,27,27,34,0,2,17,0,15,34,0,8,17,7,32,0,1,0,12,16,0,13,0,47,17,0,5,0,105,17,6,32,0,1,0,22,16,33,0,3,48,6,34,0,1,32,0,3,0,40,0,17,27,1,254,11,2,0,44,32,0,3,0,13,0,49,17,27,16,7,32,0,2,0,12,16,0,34,0,7,26,0,47,17,33,0,3,48,6,32,0,3,0,13,0,46,17,0,5,0,109,17,6,32,0,1,0,12,16,0,13,32,0,3,17,0,5,0,110,17,6,32,0,2,0,22,16,33,0,4,48,6,32,0,2,32,2,14,0,47,17,33,0,5,48,0,36,0,8,26,0,47,17,33,0,6,48,6,32,0,1,0,12,16,0,34,0,7,26,34,0,3,17,33,0,7,48,6,32,0,1,0,14,16,0,28,32,0,7,17,33,0,8,48,0,36,0,8,26,0,47,17,33,0,9,48,6,34,0,1,1,255,1,256,11,2,0,44,0,46,32,2,14,0,42,34,0,7,27,32,2,15,34,0,5,21,11,2,0,44,32,0,6,0,8,32,0,4,17,0,20,0,46,17,33,0,10,48,27,27,34,0,2,17,0,15,34,0,8,17,7,0,17,0,43,0,31,0,6,26,0,42,0,31,32,0,1,0,43,0,8,27,26,27,27,33,0,3,48,6,32,0,2,32,0,3,33,1,5,50,6,34,0,2,0,7,34,0,1,17,0,6,0,47,17,0,18,0,46,17,34,0,3,33,1,7,50,7,32,0,1,0,7,32,1,3,17,0,17,16,0,31,0,6,0,42,34,0,1,27,26,16,7,34,0,1,0,5,32,1,4,21,0,25,0,24,21,7,32,1,4,0,8,32,0,1,17,0,6,34,0,2,32,2,56,34,0,1,19,19,33,1,4,49,7,32,0,2,0,12,16,0,23,0,47,17,0,5,32,1,10,17,6,32,0,2,32,1,13,16,6,32,0,2,0,15,16,33,0,2,49,0,22,16,33,0,3,48,6,32,0,1,0,12,16,0,13,32,0,3,17,0,5,32,1,11,17,6,32,0,1,0,14,16,33,0,4,48,0,28,32,0,3,17,33,0,5,48,0,35,32,1,7,26,34,0,2,17,33,0,6,48,6,32,0,5,1,257,1,258,11,2,0,44,32,0,6,0,31,0,15,0,40,0,22,27,26,16,0,36,0,8,26,0,47,17,0,20,0,46,17,27,34,0,6,17,33,0,7,48,6,34,0,1,0,15,34,0,4,0,29,34,0,3,17,0,26,34,0,5,0,36,0,8,26,0,47,17,11,1,17,17,0,30,34,0,7,17,7,32,0,1,0,12,16,0,13,0,47,17,0,5,32,1,9,17,6,34,0,1,32,1,6,34,0,2,19,7,34,0,2,0,12,32,1,4,17,7,32,1,3,0,6,33,1,4,50,6,34,0,1,0,6,0,47,17,7,34,0,1,0,38,34,0,2,27,7,34,0,1,0,1,0,46,21,7,34,0,1,0,1,34,0,2,23,7,32,0,2,0,37,34,0,1,32,2,76,34,0,2,17,27,7,34,0,1,0,12,0,42,32,1,4,27,0,7,0,47,21,0,45,1,259,27,16,6,32,1,5,0,16,0,47,0,6,32,1,3,17,33,1,3,49,17,7,34,0,1,7,0,33,32,1,0,26,34,0,1,11,2,0,44,34,0,4,0,7,0,47,21,0,41,0,8,0,38,0,24,27,27,27,7,34,0,1,33,0,3,33,0,4,33,0,5,33,0,6,12,4,48,6,34,0,4,0,15,16,0,16,32,0,5,17,33,0,7,48,6,34,0,3,11,0,34,0,5,11,1,0,43,0,26,27,11,2,0,44,32,2,7,27,16,32,0,7,34,0,7,0,46,0,14,0,40,0,24,0,36,0,8,26,0,47,21,0,17,20,0,43,0,15,27,27,0,1,0,60,21,11,2,0,44,32,2,7,27,16,34,0,6,11,4,7,34,0,1,33,0,3,33,0,4,33,0,5,33,0,6,12,4,48,6,1,260,33,0,7,48,6,34,0,5,0,31,1,261,32,2,3,0,16,0,47,21,11,2,0,44,32,1,9,27,32,1,5,0,47,21,34,0,7,20,26,16,33,0,8,48,6,11,0,0,60,34,0,8,0,47,0,47,11,2,11,4,7,34,0,1,33,0,5,33,0,6,33,0,7,12,2,12,2,48,6,34,0,4,32,1,5,32,0,6,0,20,0,46,17,17,34,0,6,0,12,0,49,17,0,45,32,1,6,27,16,33,0,8,33,0,9,33,0,10,33,0,11,33,0,12,12,2,12,4,48,6,34,0,10,34,0,5,34,0,2,19,32,0,7,0,20,0,46,17,0,45,32,1,9,0,7,0,47,21,0,45,1,262,27,27,16,7,34,0,1,32,2,3,16,7,32,1,7,0,52,34,0,1,11,1,0,46,0,46,0,46,11,2,11,4,26,7,0,46,33,0,3,48,6,0,46,33,0,4,48,6,1,263,33,0,5,48,6,34,0,1,32,2,31,0,25,32,1,8,20,0,45,1,264,1,265,11,2,0,44,0,25,0,16,0,46,21,0,22,20,0,20,0,46,21,27,0,42,0,16,0,42,0,47,27,27,27,0,42,32,2,3,27,26,16,33,0,6,48,6,32,1,7,11,0,0,60,34,0,6,32,0,3,32,0,4,11,2,11,4,26,7,34,0,1,33,0,3,33,0,4,33,0,5,33,0,6,12,4,48,6,34,0,5,0,31,1,266,26,16,7,34,0,2,34,0,1,11,2,0,31,32,2,3,0,16,0,47,21,32,1,5,0,47,21,26,16,33,0,5,48,0,31,0,16,0,42,0,46,27,26,16,33,0,6,33,0,7,12,2,48,0,31,0,22,26,16,0,36,0,18,0,27,0,11,21,26,16,33,0,8,33,0,9,12,2,48,6,34,0,8,0,17,16,0,31,34,0,7,0,43,0,16,27,0,12,34,0,6,0,43,0,16,27,21,26,16,0,32,0,8,26,16,0,36,0,6,26,0,46,17,33,0,10,48,6,34,0,5,0,36,32,1,13,0,41,32,0,4,27,32,1,12,20,0,24,0,16,0,53,21,0,41,0,35,0,18,26,27,0,27,0,16,0,42,0,49,27,0,41,34,0,4,27,21,0,26,0,24,0,28,0,49,21,21,1,267,20,11,2,0,44,34,0,9,0,12,34,0,10,17,27,26,16,7,32,0,1,32,1,9,0,45,32,2,3,0,16,0,47,21,32,1,5,0,47,21,0,40,32,1,13,27,27,0,41,34,0,1,27,32,1,12,20,11,2,0,44,32,1,9,0,41,0,6,27,0,20,0,46,21,27,7,0,46,0,17,16,33,0,6,48,6,1,268,33,0,7,48,6,1,269,33,0,8,48,6,1,270,33,0,9,48,6,34,0,1,32,1,9,34,0,7,20,0,45,32,2,3,0,16,0,47,21,32,1,5,0,47,21,27,0,41,34,0,5,34,0,9,34,0,4,27,27,34,0,2,19,7,32,0,1,32,2,119,34,0,5,26,32,0,2,19,33,0,6,48,6,34,0,4,33,0,7,48,6,1,271,0,38,1,272,27,33,0,8,48,6,32,0,6,0,31,0,21,0,42,0,46,27,32,2,130,0,12,0,42,0,50,27,21,26,16,0,36,0,8,26,0,47,17,0,5,0,148,17,6,1,273,33,0,9,48,6,1,274,33,0,10,48,6,1,275,1,276,34,0,10,11,3,33,0,11,48,6,1,277,33,0,12,48,6,34,0,1,32,0,12,34,0,6,26,34,0,2,19,7,32,0,1,1,278,34,0,1,34,0,4,11,2,26,11,2,0,44,0,24,32,1,9,20,27,7,32,0,1,32,1,10,16,0,38,34,0,1,32,1,18,34,0,4,26,16,27,7,32,0,1,32,1,18,34,0,4,26,16,0,38,34,0,1,32,1,10,16,27,7,34,0,1,33,0,3,48,6,1,279,7,32,0,1,32,1,2,0,38,1,280,32,0,1,34,0,4,11,2,26,27,34,0,1,32,1,12,20,11,3,0,44,32,1,9,0,41,0,6,27,27,7,32,0,1,32,1,18,0,47,0,47,11,2,26,16,0,38,34,0,1,32,1,18,0,47,0,49,11,2,26,16,27,7,32,0,1,32,1,2,0,38,1,281,32,0,1,34,0,4,11,2,26,27,32,1,14,34,0,1,26,11,3,0,44,32,1,9,0,41,0,6,27,27,7,34,0,1,33,0,3,48,6,1,282,7,34,0,1,6,1,283,7,34,0,1,33,0,3,48,6,1,284,7,34,0,1,33,0,3,48,6,1,285,7,34,0,1,34,0,2,20,7,34,0,1,33,0,3,33,0,4,33,0,5,12,3,48,6,34,0,5,34,0,4,34,0,3,21,7,34,0,1,33,0,3,33,0,4,12,2,48,6,34,0,4,34,0,3,26,7,34,0,1,33,0,3,33,0,4,33,0,5,12,3,48,6,34,0,5,34,0,4,34,0,3,27,7,34,0,1,32,2,3,16,7,32,0,1,32,1,24,16,33,0,3,48,6,34,0,1,34,0,3,16,7,34,0,1,0,29,0,47,17,0,31,32,1,27,26,16,7,0,33,34,0,1,0,16,0,47,17,26,7,0,46,34,0,1,11,2,0,44,34,0,2,27,7,34,0,2,33,0,3,33,0,4,12,2,48,6,0,47,33,0,5,48,6,0,46,0,47,1,286,0,36,0,18,26,0,46,21,0,6,0,47,21,11,2,0,44,34,0,4,27,11,2,0,44,32,2,7,27,33,0,6,48,6,32,0,1,32,0,6,16,33,0,7,48,6,34,0,3,0,27,0,41,0,27,27,0,33,32,1,0,26,0,15,0,41,0,27,27,11,2,0,44,32,1,28,27,1,287,11,3,0,44,34,0,7,0,11,0,49,17,27,34,0,1,17,7,34,0,1,34,0,5,0,45,32,1,31,32,0,4,26,27,16,33,0,6,33,0,7,12,2,48,6,34,0,4,33,0,8,33,0,9,12,2,48,6,1,288,33,0,10,48,6,1,289,33,0,11,48,6,1,290,0,42,0,46,27,33,0,12,48,6,34,0,9,0,33,32,0,7,26,0,16,0,46,21,34,0,12,11,2,0,44,32,0,8,0,40,32,2,7,27,27,16,7,34,0,4,33,0,5,33,0,6,12,2,48,6,34,0,1,33,0,7,48,6,32,0,7,0,16,0,46,17,0,31,32,2,3,0,16,0,47,21,0,16,0,46,21,0,16,0,46,21,0,52,11,2,0,44,0,0,0,12,0,47,21,27,26,16,33,0,8,48,0,3,16,33,0,9,48,6,32,0,7,0,31,0,30,0,42,32,0,8,0,4,32,0,9,17,27,26,16,33,0,10,33,0,11,12,2,48,6,0,46,33,0,12,48,6,34,0,10,0,31,32,2,3,0,16,0,47,21,0,40,0,24,0,16,0,49,21,0,24,0,29,0,47,21,0,26,0,24,0,16,0,46,21,0,29,0,47,21,0,27,20,21,1,291,20,11,2,0,44,0,24,0,16,0,46,21,0,22,20,0,20,0,47,21,27,27,26,16,33,0,13,48,6,0,46,33,0,14,48,6,1,292,33,0,15,48,6,32,0,9,0,31,0,20,0,42,0,46,27,26,16,32,2,2,16,0,31,34,0,9,0,43,0,16,27,34,0,15,20,1,293,34,0,6,0,15,16,0,43,0,16,27,21,0,27,0,24,21,26,16,33,0,16,48,6,34,0,7,0,31,0,30,0,42,34,0,8,0,31,0,12,0,42,0,52,27,26,16,32,2,2,16,27,26,16,33,0,17,48,6,0,49,0,17,16,0,31,1,294,26,16,7,32,0,1,32,0,5,0,41,34,0,4,27,34,0,2,19,33,0,6,48,6,32,0,1,32,1,11,16,1,295,0,42,32,1,27,27,32,0,5,17,33,0,7,48,6,34,0,7,0,46,32,1,0,0,46,0,46,11,2,11,3,32,2,3,0,16,0,47,21,0,30,0,46,0,49,0,53,11,3,21,11,2,0,44,32,1,9,27,16,33,0,8,33,0,9,33,0,10,33,0,11,12,2,12,3,48,6,34,0,9,32,1,29,32,0,6,34,0,10,11,2,17,34,0,11,32,1,30,34,0,8,34,0,1,11,2,27,0,33,34,0,5,26,32,2,148,20,1,296,20,11,2,0,44,32,1,1,27,16,7,32,1,5,33,0,3,48,6,34,0,1,32,1,6,33,1,5,50,6,34,0,3,7,34,0,2,33,0,3,48,6,32,1,7,0,16,34,0,1,17,33,0,4,48,6,32,0,4,0,17,16,0,31,0,8,0,42,32,0,3,27,26,16,0,34,0,30,26,32,1,3,17,0,31,0,12,26,16,33,0,5,48,0,31,34,0,5,0,36,0,18,26,0,46,17,0,34,0,7,26,0,47,17,0,43,0,7,27,26,16,33,0,6,48,6,32,0,6,0,31,0,13,0,42,0,46,27,26,16,0,36,0,8,26,0,47,17,0,5,0,171,17,6,32,0,6,32,2,2,16,0,31,0,8,0,42,32,0,3,27,26,16,33,0,7,48,0,22,16,33,0,8,48,6,32,0,3,0,17,16,0,31,0,6,26,34,0,7,17,0,31,0,6,26,32,1,8,0,17,16,0,31,0,8,0,42,32,0,3,0,8,32,0,4,17,27,26,16,17,0,15,16,0,34,0,30,26,32,1,5,17,33,0,9,48,6,32,0,3,0,8,32,0,8,17,0,17,16,0,31,0,25,26,32,1,9,17,0,15,16,33,0,10,48,6,32,0,9,0,35,0,22,0,43,0,20,27,26,32,0,10,17,0,36,0,8,26,0,47,17,0,5,0,171,17,6,34,0,9,0,35,0,16,26,34,0,10,17,33,0,11,48,6,34,0,8,0,17,16,0,31,0,8,0,42,32,0,3,27,26,16,0,34,0,30,26,32,0,11,17,33,0,12,48,6,34,0,3,0,17,16,0,31,0,25,26,32,0,12,17,0,31,0,24,26,32,1,8,0,17,16,17,0,15,16,32,2,15,34,0,11,17,0,5,0,172,17,6,1,297,33,0,13,48,32,2,2,16,33,0,14,48,6,32,0,13,32,2,92,0,6,26,0,46,17,0,30,32,0,14,17,0,35,0,7,26,32,0,14,0,22,16,0,17,16,17,33,0,15,48,6,32,0,6,0,31,0,6,26,32,1,9,17,33,1,9,49,6,34,0,15,0,31,0,24,26,32,1,11,17,0,35,0,6,26,34,0,13,0,30,32,0,14,17,0,31,0,8,26,32,1,11,17,17,33,1,11,49,6,34,0,14,0,31,0,6,0,42,32,0,4,0,43,0,8,27,27,26,32,1,10,17,33,1,10,49,6,34,0,4,0,8,33,1,8,50,7,34,0,4,0,16,34,0,1,17,0,16,34,0,2,19,7,0,29,0,42,0,33,32,1,12,26,0,7,0,22,21,27,33,0,3,48,6,32,1,5,0,16,0,46,17,32,0,3,16,33,0,4,48,6,32,1,5,0,31,34,0,3,32,2,15,32,0,4,21,26,16,0,36,0,8,26,0,47,17,0,5,0,173,17,6,32,0,4,0,36,0,8,26,16,33,0,5,48,0,17,16,0,15,34,0,4,17,33,0,6,48,6,32,0,6,0,31,0,25,26,34,0,1,17,32,1,13,34,0,6,0,31,0,6,0,42,0,8,0,42,34,0,5,27,27,26,34,0,2,19,17,7,32,0,1,0,19,16,33,0,5,48,0,20,0,42,32,0,2,27,0,45,34,0,4,27,16,6,34,0,5,0,17,16,0,31,32,0,1,0,6,32,0,2,17,0,43,0,6,27,26,0,31,0,46,0,43,0,20,27,0,45,0,51,27,26,20,0,31,0,13,0,42,34,0,2,27,0,45,0,51,27,26,11,2,0,44,34,0,1,0,20,0,46,17,27,16,7,34,0,1,6,0,6,0,18,0,46,21,0,17,20,0,7,0,18,0,46,21,0,17,20,0,31,0,6,26,0,24,0,40,0,20,27,21,11,2,0,44,0,20,0,42,0,46,27,27,7,32,0,2,32,2,9,16,0,5,32,1,8,17,6,32,0,2,0,13,0,46,17,33,0,3,48,6,32,0,1,0,22,16,0,6,0,18,0,46,21,0,11,11,2,0,44,32,0,3,27,32,0,2,17,33,0,4,48,6,1,298,32,0,1,26,33,0,5,48,6,0,47,33,0,6,48,6,0,24,33,0,7,48,6,32,0,1,0,12,0,20,0,47,21,0,45,1,299,0,42,32,0,2,27,27,16,6,32,0,1,0,15,16,0,29,0,28,11,2,0,44,32,0,3,0,12,32,1,2,17,27,32,0,6,0,8,34,0,4,17,17,32,1,2,0,45,0,24,0,46,0,43,0,21,27,0,45,1,300,27,34,0,1,0,40,0,22,27,0,7,34,0,2,0,40,0,19,27,21,21,27,16,32,0,7,16,7,32,0,2,0,12,16,0,23,0,47,17,0,5,32,1,7,17,6,32,0,2,0,15,16,33,0,2,49,6,32,0,2,0,31,32,2,9,26,16,0,36,0,8,26,0,47,17,0,5,32,1,8,17,6,32,0,2,0,22,16,33,0,3,48,6,32,0,1,32,2,85,16,0,22,0,43,0,21,27,0,45,1,301,27,32,0,3,17,33,0,4,48,6,1,302,33,0,5,48,6,0,46,0,20,16,33,0,6,48,6,0,47,33,0,7,48,6,1,303,33,0,8,48,6,0,46,33,0,9,48,6,34,0,2,0,35,1,304,32,1,5,1,305,26,34,0,8,0,25,21,11,2,0,44,32,1,4,27,26,32,0,4,0,28,32,0,3,17,17,33,0,10,48,6,34,0,1,0,15,0,42,32,0,4,27,1,306,11,2,0,44,32,0,6,0,12,16,0,20,0,46,17,27,16,7,32,0,1,0,13,0,46,17,0,5,0,182,17,6,32,0,1,0,23,0,47,17,0,5,0,183,17,6,34,0,2,32,2,85,16,0,29,34,0,1,0,7,0,47,17,17,32,2,15,32,1,3,17,0,5,0,184,17,7,34,0,2,0,47,0,22,11,2,0,44,0,24,0,12,0,41,0,13,27,34,0,1,21,27,16,7,34,0,2,0,17,16,0,31,34,0,1,0,1,16,26,16,7,34,0,2,0,17,16,0,31,34,0,1,0,1,16,26,16,7,32,0,1,0,12,16,0,13,32,1,3,17,0,5,0,188,17,6,32,0,2,0,31,32,2,10,26,16,0,36,0,8,26,16,0,5,0,189,17,6,32,0,1,32,2,85,16,33,0,3,48,6,32,0,2,0,35,0,7,0,6,0,47,21,26,32,0,3,0,28,32,1,3,17,17,33,0,4,48,6,32,0,4,0,31,0,13,0,42,0,46,27,26,16,0,36,0,8,26,16,0,5,0,190,17,6,32,0,3,0,29,32,1,3,17,33,0,5,48,0,36,0,8,26,0,47,17,33,0,6,48,6,1,307,33,0,7,48,6,34,0,1,1,308,34,0,7,11,2,0,44,0,25,0,36,0,8,26,32,0,4,0,36,0,8,26,32,0,6,17,21,0,20,0,46,21,27,34,0,2,17,7,32,1,7,0,31,0,6,0,42,34,0,1,0,8,32,1,5,17,27,26,16,0,34,0,30,26,32,1,6,17,7,32,2,105,0,42,0,47,27,0,41,32,0,1,32,2,77,0,35,32,0,1,26,0,38,0,31,34,0,1,26,27,27,27,7,32,0,2,0,22,0,41,0,12,27,32,0,1,19,0,5,0,191,19,6,34,0,1,32,1,6,32,1,5,26,34,0,2,19,7,34,0,1,32,1,6,32,1,5,0,42,0,33,34,0,2,26,27,26,16,7,34,0,2,32,1,6,0,33,34,0,1,26,0,43,32,1,5,27,26,16,7,32,0,1,32,2,85,16,0,29,0,47,17,33,0,3,48,6,1,309,33,0,4,48,6,32,1,5,0,33,34,0,1,26,0,15,34,0,4,21,32,2,28,11,2,0,44,0,24,0,40,32,2,20,27,0,7,0,47,21,27,34,0,3,17,7,34,0,1,32,2,105,0,47,17,0,36,32,1,5,26,34,0,2,19,7,34,0,1,0,35,0,24,0,47,11,2,0,44,0,25,27,26,32,1,4,17,0,36,0,8,26,0,47,17,33,0,3,48,6,32,0,3,0,20,0,46,17,0,5,0,197,17,6,32,1,4,0,22,16,0,17,16,0,35,0,8,26,32,1,4,17,0,36,0,6,26,0,46,17,33,0,4,48,6,32,1,3,0,16,34,0,4,17,32,2,109,16,33,0,5,48,6,0,48,0,20,32,0,5,17,0,5,0,198,17,6,0,12,0,42,0,11,27,0,5,0,199,21,0,25,0,24,21,33,0,6,48,6,32,0,3,0,9,32,1,7,17,34,0,6,0,11,0,18,11,3,0,44,32,0,5,0,11,0,49,17,27,16,33,0,7,48,6,32,1,3,0,35,0,24,32,0,7,11,2,0,44,0,25,27,26,32,1,4,17,33,1,3,49,6,34,0,7,0,8,34,0,3,17,34,0,5,0,12,0,53,17,0,45,0,20,0,42,32,1,7,27,0,45,1,310,27,27,16,7,32,1,7,0,20,0,46,17,0,5,0,200,17,6,34,0,1,0,28,1,311,0,42,0,49,0,43,0,9,27,27,0,24,0,28,0,22,0,43,0,7,27,21,0,26,0,24,21,0,25,21,11,2,0,44,0,22,0,43,0,21,27,27,32,1,8,17,7,0,24,32,1,5,32,0,1,0,16,32,0,2,19,0,18,0,46,17,21,33,1,5,49,6,34,0,1,0,28,34,0,2,19,7,32,0,1,0,17,16,0,31,0,6,0,42,32,1,8,27,26,16,0,24,34,0,1,0,6,33,1,8,50,17,7,32,0,1,0,15,16,32,1,3,16,0,31,34,0,1,32,2,85,16,32,2,103,16,0,15,16,0,43,0,30,27,26,16,7,32,1,4,0,29,32,1,3,17,33,0,3,48,0,36,0,8,26,0,47,17,33,0,4,48,6,32,0,4,0,17,16,0,15,34,0,3,17,0,43,0,31,0,6,0,42,0,8,0,42,34,0,4,27,27,26,27,0,34,0,30,26,34,0,1,21,7,34,0,1,0,43,0,30,27,7,34,0,1,0,31,0,31,0,8,0,42,34,0,2,27,26,26,16,7,34,0,1,0,20,32,0,2,17,32,2,150,16,6,34,0,2,7,34,0,1,0,42,0,33,34,0,2,26,27,7,34,0,1,7,34,0,1,6,0,46,33,1,11,49,6,1,312,1,313,11,2,0,16,32,1,8,0,47,32,2,73,11,2,0,44,0,0,0,13,0,53,21,27,16,17,33,1,10,49,7,32,0,1,32,1,10,0,31,34,0,1,26,27,7,32,0,1,32,1,10,32,2,30,34,0,1,26,27,7,0,46,33,0,2,48,6,1,314,32,0,1,26,33,0,3,48,6,34,0,1,0,35,1,315,26,32,1,7,17,0,22,0,21,0,49,21,0,45,0,26,0,42,0,46,11,1,27,27,16,33,0,4,33,0,5,12,2,48,6,32,1,8,1,316,1,317,1,318,11,4,0,44,34,0,5,0,43,0,6,0,42,34,0,4,0,8,0,49,21,27,27,27,7,1,319,0,33,34,0,2,26,26,7,0,25,34,0,1,20,7,0,46,33,0,3,48,33,0,4,48,6,32,1,8,32,2,31,1,320,26,16,6,34,0,1,11,1,33,0,5,48,6,1,321,0,42,32,1,7,27,33,0,6,48,6,32,0,3,32,0,6,32,1,6,17,33,0,7,48,6,32,0,4,0,7,16,32,0,5,34,0,6,0,42,32,2,148,27,11,2,0,44,0,20,0,42,0,46,27,27,32,1,6,17,33,0,8,48,6,32,1,8,32,2,31,0,33,34,0,7,34,0,8,11,2,26,0,16,0,46,0,43,0,20,27,21,0,16,0,19,21,26,16,7,32,1,8,0,17,16,0,36,0,24,0,40,32,1,6,32,1,7,16,27,26,34,0,1,17,7,0,24,32,2,143,32,1,5,26,34,0,2,23,1,322,32,2,143,34,0,1,26,27,7,0,24,1,323,32,1,5,26,34,0,1,21,32,2,143,34,0,2,26,20,7,32,0,2,32,2,135,0,41,32,2,139,27,32,0,1,17,33,0,3,48,6,32,0,3,0,47,0,43,32,2,137,27,32,2,129,32,2,137,0,42,0,46,27,21,16,32,2,150,16,6,32,0,2,32,2,134,0,47,11,2,0,44,32,0,3,27,16,33,0,4,48,6,32,0,1,32,2,134,16,32,2,137,32,0,4,17,32,2,150,16,6,32,0,1,32,1,2,0,42,32,0,4,27,32,1,4,11,2,0,44,34,0,3,27,16,32,2,84,34,0,2,32,2,11,16,17,32,2,150,16,6,34,0,1,32,1,3,34,0,4,17,7,0,24,1,324,34,0,2,26,34,0,1,21,7,34,0,1,7,32,1,5,0,17,16,0,31,0,7,0,42,32,0,1,0,22,16,0,6,0,52,17,27,26,16,0,34,0,30,26,34,0,1,17,7,32,0,1,0,35,0,12,26,32,0,2,17,0,32,0,8,26,16,0,36,0,6,26,0,46,17,33,0,3,48,6,32,0,2,0,30,0,42,0,17,27,32,0,3,17,0,36,0,8,26,32,2,3,0,36,0,8,26,16,17,33,0,4,48,6,34,0,3,0,21,0,42,32,1,5,27,0,45,0,33,34,0,2,34,0,1,11,2,26,0,31,0,16,26,0,20,21,0,40,1,325,27,27,16,6,32,0,4,7,32,1,4,0,6,0,42,32,0,1,27,0,41,32,2,5,27,32,1,3,17,0,12,0,42,0,46,27,0,45,34,0,1,0,6,0,47,17,0,40,32,1,5,27,27,16,7,0,33,0,46,26,0,13,34,0,4,32,3,36,34,0,1,26,34,0,2,19,21,7,34,0,1,6,32,1,9,0,17,16,0,31,0,46,26,16,7,32,0,2,32,3,12,16,33,0,3,48,6,34,0,2,0,43,0,16,27,33,0,4,48,6,32,1,5,0,36,0,8,26,0,47,17,33,0,5,48,6,32,0,5,0,12,0,47,17,0,8,0,49,17,0,6,32,0,3,17,32,0,5,32,2,4,1,326,27,16,33,0,6,48,6,0,47,0,7,32,1,6,17,0,17,16,0,31,0,8,0,42,32,0,5,27,0,40,0,6,0,42,32,0,5,27,0,43,34,0,6,27,27,26,16,0,36,0,8,26,0,47,17,0,5,0,108,17,6,34,0,3,0,24,0,45,0,8,0,42,32,0,1,0,40,32,3,12,27,27,27,16,33,0,7,48,6,34,0,1,0,43,0,16,27,33,0,8,48,6,32,1,7,32,3,35,32,1,5,17,33,0,9,33,0,10,12,2,48,6,32,0,10,0,12,0,47,17,0,8,0,49,17,0,6,34,0,7,17,34,0,10,32,2,4,1,327,27,34,0,9,17,33,0,11,48,6,34,0,11,0,42,0,8,0,42,34,0,5,27,27,33,0,12,48,6,1,328,33,0,13,48,6,32,1,9,0,17,16,0,31,0,8,0,42,32,1,7,0,36,0,8,26,0,47,17,27,34,0,13,20,26,16,7,32,0,1,32,3,14,0,47,17,0,36,0,8,26,0,47,17,33,0,3,48,0,12,0,47,17,33,0,4,48,6,32,0,1,0,15,16,33,0,1,49,6,0,47,33,0,5,48,6,0,46,33,0,6,48,6,32,0,1,0,31,0,0,0,40,1,329,27,26,16,6,32,0,4,0,8,0,49,17,0,6,32,0,5,17,33,0,7,48,6,1,330,33,0,8,48,6,0,46,33,0,9,48,33,0,10,48,6,1,331,33,0,11,48,6,32,0,1,0,46,0,46,1,332,11,2,0,44,0,31,0,12,0,42,0,11,27,26,0,36,0,8,26,0,47,21,27,11,2,0,44,32,1,3,0,12,32,0,6,17,0,8,32,0,7,0,12,0,53,17,17,27,16,33,0,12,48,6,34,0,1,34,0,8,34,0,11,11,2,0,44,34,0,12,27,16,7,34,0,1,6,32,1,9,0,17,16,0,31,32,1,10,0,8,32,1,4,17,0,21,0,42,32,1,4,27,0,24,11,2,0,44,32,2,2,27,16,26,16,7,32,1,6,32,3,36,32,0,1,0,15,16,0,43,0,16,27,0,43,32,3,80,0,7,0,47,21,0,42,32,0,2,0,15,16,0,43,0,16,27,27,27,26,16,33,0,3,48,6,34,0,1,1,333,1,334,11,2,0,44,0,15,0,40,0,22,27,0,20,0,54,21,0,41,0,8,27,27,34,0,2,17,7,34,0,2,0,31,0,14,26,16,32,3,82,16,0,34,0,15,26,11,0,17,7,0,46,0,20,16,33,0,3,48,6,34,0,1,0,35,1,335,26,34,0,2,19,6,32,0,3,7,34,0,1,33,2,4,49,0,34,0,16,26,32,2,6,17,32,3,13,16,33,2,5,49,6,0,52,33,2,3,49,7,34,0,1,33,0,3,33,0,4,33,0,5,33,0,6,12,4,48,6,34,0,5,32,3,7,0,7,0,47,21,0,45,0,20,27,16,32,0,3,0,22,16,0,20,0,46,17,0,45,0,31,32,2,9,0,7,0,47,21,0,45,1,336,27,26,27,16,7,32,1,3,32,1,4,34,0,1,32,1,6,11,4,7,32,2,7,32,1,8,32,1,9,34,0,1,32,1,7,0,20,0,47,17,0,18,32,1,11,17,32,1,12,11,2,11,4,26,7,32,0,1,32,3,7,16,0,18,33,1,3,50,6,34,0,1,7,32,0,2,0,16,0,53,17,0,16,0,47,17,0,18,33,1,4,50,6,34,0,2,0,16,0,49,17,32,1,5,16,7,0,47,33,1,4,49,6,34,0,1,7,32,2,7,32,1,3,32,1,4,34,0,1,32,1,6,11,4,26,7,32,2,7,34,0,1,26,7,32,0,1,11,1,0,26,33,1,6,50,6,34,0,1,7,34,0,1,33,0,2,48,6,1,337,7,0,24,0,25,11,2,0,44,0,20,27,33,0,6,48,6,0,0,0,13,0,53,21,0,45,1,338,27,33,0,5,51,6,32,0,1,32,3,119,34,0,5,26,0,35,0,7,0,43,32,0,6,27,34,0,6,0,7,0,25,21,11,2,0,44,0,24,0,13,0,46,21,27,26,32,1,8,0,46,26,0,45,0,16,0,42,0,49,27,27,0,12,20,0,41,0,27,27,21,32,0,2,19,33,0,7,48,6,32,1,6,0,36,0,6,26,16,0,20,0,46,17,33,0,8,48,6,32,3,106,1,339,11,2,0,44,32,1,8,0,46,26,27,33,0,9,48,6,34,0,1,32,0,9,32,0,7,0,16,0,42,0,22,0,34,0,7,26,0,47,21,27,16,17,32,3,78,34,0,4,26,34,0,2,34,0,9,34,0,7,0,16,0,46,17,19,19,32,3,90,32,2,12,0,40,1,340,27,11,2,0,44,34,0,8,27,16,7,34,0,1,0,42,0,33,34,0,2,26,27,7,34,0,1,7,32,2,15,0,31,34,0,1,26,26,7,32,2,15,32,3,30,34,0,1,26,26,7,34,0,1,32,1,9,34,0,4,32,1,8,34,0,2,19,26,16,7,34,0,2,32,1,9,0,33,34,0,1,26,0,43,34,0,4,27,26,16,7,32,0,1,0,31,0,21,0,42,0,46,27,26,16,0,36,0,6,0,42,0,8,0,42,0,49,27,27,26,16,33,0,2,48,6,32,1,7,32,0,2,0,20,0,46,17,0,45,1,341,34,0,1,26,27,16,7,34,0,4,34,0,1,34,0,2,19,7,32,2,2,32,1,3,34,0,1,26,11,2,0,44,0,24,0,40,32,3,7,27,27,7,34,0,4,34,0,1,16,7,34,0,4,34,0,1,16,7,32,2,15,32,1,3,34,0,1,26,26,7,0,52,32,2,16,34,0,1,27,7,0,46,0,33,32,1,3,34,0,1,26,26,16,32,2,10,16,7,0,46,0,33,34,0,2,32,1,3,34,0,1,27,26,16,32,2,10,16,7,34,0,1,0,15,16,33,0,3,48,0,22,16,0,6,0,52,17,0,6,33,1,5,50,6,34,0,3,0,31,32,1,6,26,16,7,1,342,33,0,3,48,6,0,27,32,0,3,1,343,11,2,0,44,0,24,0,40,0,36,32,2,28,26,27,27,11,2,0,44,0,24,0,16,0,46,21,32,3,7,20,27,33,0,4,48,6,34,0,2,34,0,1,11,2,32,0,4,0,46,17,33,0,5,48,6,32,1,5,0,17,16,0,31,1,344,26,16,33,0,6,48,6,34,0,6,0,31,0,16,0,42,0,47,27,26,0,27,0,31,0,16,0,42,0,46,27,26,21,0,33,32,2,0,26,11,2,0,44,34,0,3,0,12,32,0,5,17,27,16,7,32,0,1,32,3,11,16,33,0,1,49,6,32,0,1,0,14,16,33,0,3,48,6,34,0,1,0,15,16,33,0,4,48,0,22,16,33,0,5,48,6,32,1,6,0,31,0,21,0,42,0,60,27,26,16,0,36,32,3,129,26,0,47,17,0,5,0,166,17,6,32,1,6,0,3,32,0,5,17,33,0,6,48,6,32,1,6,0,4,32,0,6,17,0,34,0,30,26,33,1,7,50,6,0,46,33,0,7,48,6,0,33,32,1,7,26,0,16,1,345,21,33,0,8,48,6,32,3,80,0,5,0,167,21,33,0,9,48,6,34,0,6,0,35,34,0,4,0,43,0,16,27,32,0,8,0,24,1,346,34,0,8,21,11,3,0,44,0,11,0,42,0,49,27,27,26,34,0,5,0,17,16,17,0,15,34,0,3,17,7,32,0,1,0,35,0,25,0,12,32,0,1,34,0,5,16,21,0,45,34,0,4,27,26,34,0,1,0,22,16,0,17,16,17,7,34,0,1,0,24,0,37,0,15,0,40,0,33,32,1,8,26,0,16,32,0,2,21,32,1,11,34,0,0,0,42,32,0,2,0,6,0,47,17,27,27,27,0,15,0,14,21,32,1,10,11,2,0,44,32,1,8,0,22,16,0,23,34,0,2,17,27,27,16,7,0,47,33,1,12,49,6,32,2,7,34,0,1,26,7,32,1,13,0,30,0,42,32,0,1,0,17,16,0,31,0,6,0,42,32,1,14,27,26,16,27,0,41,32,2,29,0,42,0,47,0,43,0,27,27,27,27,32,1,11,17,0,24,34,0,1,0,6,33,1,14,50,17,7,34,0,1,32,2,1,0,7,0,47,21,0,45,32,1,12,32,2,30,11,0,34,0,2,11,2,27,27,16,7,32,1,17,0,16,32,0,1,17,0,26,32,1,16,0,31,0,16,0,42,34,0,1,27,26,16,17,7,34,0,1,34,0,2,16,7,32,1,6,34,0,1,16,7,0,52,33,0,0,48,6,32,1,6,0,31,0,47,1,347,11,2,0,44,0,24,27,26,16,7,34,0,1,0,17,16,0,31,0,33,34,0,4,0,1,16,26,26,16,7,32,0,1,32,3,14,0,47,17,33,0,3,48,0,36,0,8,26,33,1,6,50,6,0,15,0,42,34,0,3,0,26,34,0,2,0,19,16,32,2,2,0,7,0,47,17,0,45,0,24,0,7,34,0,1,0,22,16,21,0,18,0,46,21,27,16,11,1,17,27,33,1,7,49,7,32,1,6,0,8,34,0,2,19,32,1,5,16,0,34,0,26,26,0,26,11,2,0,44,32,1,3,27,34,0,1,17,7,32,0,1,0,26,34,0,1,0,22,16,0,7,34,0,2,19,0,17,0,40,0,31,0,47,26,27,16,17,7,34,0,1,0,31,0,6,26,34,0,2,0,31,34,0,4,0,43,0,8,27,26,18,19,7,32,0,1,0,47,0,43,0,12,27,0,7,0,47,21,0,45,32,1,5,32,0,2,26,0,42,0,17,27,27,32,1,7,17,32,1,5,34,0,2,0,8,32,1,7,17,26,33,1,6,50,6,0,47,33,1,7,49,6,34,0,1,0,22,16,7,32,0,2,0,8,33,1,7,50,6,34,0,2,7,34,0,1,6,0,47,33,1,9,49,7,32,1,4,0,29,32,1,3,17,33,0,3,48,0,26,33,1,10,50,6,34,0,3,0,36,0,8,26,32,1,7,17,0,12,0,42,0,47,27,0,7,0,47,21,0,45,1,348,27,16,6,32,0,1,0,15,16,0,43,0,16,27,33,0,4,48,6,32,1,9,0,24,0,45,1,349,27,34,0,1,17,6,32,1,6,0,15,32,1,10,17,0,31,32,0,4,26,16,7,0,47,0,7,32,2,3,17,1,350,16,0,34,0,30,26,32,1,3,17,0,26,32,1,6,11,1,17,0,32,0,8,26,16,32,3,66,16,33,0,3,48,6,34,0,2,0,24,0,35,1,351,26,34,0,3,21,0,36,0,31,0,6,26,26,20,0,41,0,31,0,6,26,27,32,1,4,17,32,1,5,0,22,16,0,20,0,46,17,0,45,0,34,0,17,0,15,32,1,5,21,0,43,0,31,0,6,26,27,26,27,32,1,6,17,0,34,0,30,26,34,0,1,0,15,16,17,7,32,1,5,0,26,34,0,2,19,0,26,32,1,4,17,0,34,0,15,26,11,0,17,7,32,0,2,0,22,16,0,20,0,46,17,0,5,0,193,17,6,32,0,2,0,22,16,0,17,16,0,35,0,20,0,42,0,46,27,0,43,0,8,27,26,34,0,2,17,7,32,2,7,0,7,34,0,1,17,0,17,16,0,31,32,2,6,0,1,16,26,16,0,26,33,2,6,50,6,32,2,7,7,34,0,1,0,22,0,43,0,21,27,0,45,0,34,0,26,26,0,43,34,0,0,27,27,34,0,2,19,7,34,0,2,6,34,0,1,7,34,0,2,0,37,34,0,1,27,7,34,0,1,32,2,11,16,6,0,46,33,1,3,49,6,32,2,14,32,2,7,0,35,0,6,26,34,0,4,17,26,33,1,2,49,7,32,3,84,0,20,32,0,1,0,18,0,46,17,21,0,46,11,2,0,16,34,0,1,0,13,0,46,17,0,8,34,0,2,19,17,7,0,46,32,1,3,16,6,34,0,1,32,2,12,32,1,2,32,2,9,34,0,2,19,26,16,7,0,46,32,1,3,16,6,34,0,2,32,2,12,0,33,34,0,1,26,0,43,32,1,2,27,26,16,7,0,46,32,1,3,16,6,34,0,1,32,2,13,32,1,2,26,34,0,2,19,7,0,25,34,0,1,34,0,4,21,7,32,0,1,32,3,9,16,0,5,0,212,17,6,32,0,1,0,11,33,1,4,50,6,34,0,1,0,18,33,1,3,50,7,34,0,1,0,17,16,0,26,32,1,5,17,0,32,34,0,2,26,16,7,34,0,1,34,0,5,16,34,0,4,34,0,2,19,7,34,0,1,32,3,162,16,7,34,0,1,32,3,162,16,7,34,0,1,0,36,32,2,3,26,16,33,0,3,33,0,4,12,2,48,6,34,0,3,33,2,4,49,6,34,0,4,0,8,33,1,4,50,7,32,1,4,0,41,34,0,1,27,7,32,1,8,0,43,34,0,1,0,42,32,1,4,27,27,7,34,0,1,0,43,32,1,12,27,33,0,3,48,6,0,47,0,43,0,21,27,0,45,1,352,27,33,0,4,48,6,0,52,32,0,4,0,47,0,6,32,2,6,17,17,0,6,0,47,17,7,32,0,1,0,13,0,47,17,0,8,33,1,5,50,6,34,0,1,0,6,33,1,6,50,7,32,1,7,32,1,3,32,3,4,1,353,34,0,1,26,27,16,33,0,3,48,6,0,24,32,2,3,11,2,0,44,0,13,0,42,32,2,3,27,27,33,0,4,48,6,0,46,0,12,32,2,3,17,0,6,32,2,3,17,0,2,0,49,17,0,18,16,33,0,5,48,0,17,16,0,31,0,24,0,6,0,47,21,0,7,34,0,5,21,0,10,0,49,21,26,16,0,36,1,354,26,32,2,3,0,17,16,17,7,34,0,1,0,31,32,1,10,0,43,0,7,27,0,7,0,42,32,1,9,27,11,2,0,16,32,3,2,17,26,16,0,4,0,42,0,3,27,16,7,32,2,3,0,8,0,49,17,0,13,32,0,1,0,36,0,11,26,16,33,1,10,49,0,7,34,0,1,0,36,0,18,26,16,33,1,9,49,17,17,7,34,0,1,6,32,2,4,32,2,9,11,2,0,31,0,17,0,31,0,8,0,42,32,2,6,27,26,20,26,16,33,0,3,33,0,4,12,2,48,6,34,0,4,0,31,1,355,26,16,7,32,0,2,32,4,40,16,32,4,66,16,33,0,3,48,6,34,0,1,32,4,39,34,0,2,0,30,32,0,3,17,17,0,15,16,0,31,0,47,0,43,0,7,27,0,18,0,46,21,26,16,0,34,0,30,26,34,0,3,17,33,0,4,48,6,0,7,0,42,0,47,27,0,8,0,42,32,2,4,0,43,0,7,27,27,0,7,0,25,21,11,2,0,16,32,3,2,17,33,0,5,48,6,32,2,9,0,17,16,0,35,0,8,0,42,32,2,6,27,0,41,32,1,3,27,34,0,5,0,25,21,26,34,0,4,17,7,34,0,2,0,31,0,6,26,34,0,1,0,20,16,0,31,0,8,26,32,1,3,17,17,33,1,3,49,7,32,3,7,32,1,3,32,1,4,34,0,1,32,1,6,11,4,26,7,34,0,1,6,32,2,6,0,16,32,1,2,17,0,24,0,47,0,6,33,1,2,50,17,7,32,2,8,0,46,26,0,45,1,356,27,0,41,34,0,1,27,7,34,0,1,33,0,3,33,0,4,33,0,5,33,0,6,12,4,48,6,34,0,5,32,4,106,34,0,2,19,0,31,1,357,26,16,7,32,4,90,0,49,0,47,11,2,11,2,34,0,1,16,7,34,0,1,6,32,2,11,0,16,0,47,0,7,32,1,2,17,17,33,0,5,48,6,34,0,5,32,2,12,34,0,4,0,31,0,47,0,43,0,6,27,26,16,26,26,7,34,0,0,0,46,11,2,7,34,0,2,33,0,3,48,6,34,0,1,0,31,0,15,26,16,33,0,4,48,0,16,0,46,17,0,22,16,33,0,5,48,6,0,52,33,0,6,48,6,1,358,0,43,32,1,4,27,33,0,7,48,6,1,359,7,34,0,1,32,1,5,16,33,0,3,33,0,4,12,2,48,6,34,0,3,33,1,5,49,6,34,0,4,7,0,47,0,7,34,0,1,0,6,33,1,7,50,17,7,0,47,0,7,32,0,1,17,0,17,16,0,31,0,33,32,2,7,26,0,16,0,6,0,42,34,0,1,0,7,32,1,7,17,27,21,32,1,9,32,0,2,21,26,16,6,34,0,2,7,32,2,12,0,16,34,0,1,0,6,33,1,0,50,17,7,32,0,1,0,17,16,32,2,5,34,0,1,26,33,2,6,50,7,0,33,34,0,2,0,1,16,26,32,1,4,11,2,0,44,0,13,0,42,0,46,27,27,33,1,4,49,7,32,0,1,0,17,16,0,31,0,7,0,42,34,0,1,27,26,16,7,34,0,1,0,17,16,0,31,0,8,0,42,34,0,2,27,26,16,7,0,49,0,9,32,0,2,19,0,11,16,33,0,3,48,0,6,32,0,1,17,33,0,4,48,32,1,3,16,33,0,5,48,6,34,0,1,34,0,4,11,2,0,16,32,0,5,17,32,1,4,32,0,3,0,8,0,49,17,0,7,34,0,2,19,0,8,34,0,5,17,0,6,34,0,3,17,17,7,34,0,4,0,43,0,16,27,0,41,34,0,1,27,7,34,0,2,33,0,3,48,0,7,16,33,0,4,48,6,0,46,33,0,5,48,33,0,6,48,33,0,7,48,6,0,53,33,0,8,48,6,32,0,1,32,2,4,0,7,0,47,17,0,45,0,31,0,8,0,42,32,2,3,27,26,27,16,0,43,0,16,27,0,41,32,1,3,27,33,0,9,48,6,32,0,9,0,7,0,47,21,0,46,0,47,0,49,11,4,33,0,10,48,6,0,6,1,360,11,2,0,16,32,0,3,0,13,0,54,17,17,33,0,11,48,6,1,361,33,0,12,48,6,1,362,1,363,34,0,12,11,3,0,44,1,364,27,33,0,13,48,6,32,0,1,0,31,34,0,1,0,43,1,365,27,26,16,7,32,1,3,0,31,34,0,1,0,43,32,2,3,27,26,16,32,4,3,16,7,32,4,7,34,0,1,26,7,32,4,7,32,1,3,32,1,4,34,0,1,32,1,6,11,4,26,7,32,1,4,0,31,0,16,0,42,34,0,1,27,26,16,7,0,47,0,6,33,1,6,50,6,32,1,6,32,1,7,0,42,0,33,34,0,0,26,27,0,33,32,1,3,26,11,2,0,44,0,13,0,42,32,1,5,27,27,16,33,0,3,48,6,0,46,34,0,3,16,7,32,0,1,32,1,8,0,7,0,47,17,0,45,32,1,9,0,45,1,366,27,27,0,47,0,7,34,0,1,17,17,7,34,0,2,0,6,32,1,3,17,33,1,4,49,6,34,0,1,0,6,32,1,3,17,33,1,7,49,32,2,4,16,33,1,6,49,0,6,32,1,3,17,32,2,4,16,33,1,5,49,6,32,1,7,0,13,32,4,3,17,33,1,8,49,6,32,1,6,32,1,11,16,6,32,1,7,32,1,13,32,1,4,17,7,32,0,2,0,6,0,47,17,33,1,4,49,0,12,32,1,6,17,0,8,0,49,17,0,6,33,1,8,50,6,34,0,2,7,32,0,1,0,6,0,47,17,33,1,7,49,0,12,32,1,5,17,0,6,33,1,8,50,6,34,0,1,7,34,0,1,32,1,10,0,44,32,1,8,27,34,0,2,19,7,34,0,1,0,16,32,1,7,32,1,13,32,1,4,17,17,7,0,49,33,2,8,49,6,32,2,4,33,2,7,49,6,34,0,1,33,2,4,49,7] + ,[provide[0],provide[1],provide[2],provide[3],provide[4],provide[5],provide[6],provide[7],provide[8],provide[9],provide[10],runtime_0[0],provide[12],provide[13],provide[14],provide[15],provide[16],provide[17],runtime_0[1],runtime_0[2],runtime_0[3],runtime_0[4],runtime_0[5],runtime_0[6],runtime_0[7],runtime_0[8],runtime_0[9],runtime_0[10],runtime_0[11],runtime_0[12],runtime_0[13],provide[18],provide[19],runtime_0[14],runtime_0[15],runtime_0[16],runtime_0[17],provide[20],provide[21],provide[22],runtime_0[18],runtime_0[19],runtime_0[20],runtime_0[21],runtime_0[22],runtime_0[23],0,1,4,2,Infinity,-Infinity,-1,3,8,5,'∾','⌜','˙','˜','\0','+','-','×','÷','⋆','¬','⌊','⌈','∨','∧','≠','=','>','≥','◶','√','<','⊢','⊣','≍','⋈','↑','↓','↕','⌽','⍉','/','⊔','⁼','¨','˘','`','∘','○','⌾','⍟','⊘','⊸','⟜',str("+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!˙˜˘¨⌜⁼´˝`∘○⊸⟜⌾⊘◶⎉⚇⍟⎊%"),str("´: Identity not found"),str("´: 𝕩 must be a list"),str("Mapping: Equal-rank argument shapes don\'t agree"),str("Mapping: Argument shape prefixes don\'t agree"),str("⍋𝕩: 𝕩 must have rank at least 1"),str("⍋ or ⍒: Rank of 𝕨 must be at least 1"),str("⍋ or ⍒: Rank of 𝕩 must be at least cell rank of 𝕨"),str("⍋ or ⍒: 𝕨 must be sorted"),str("p⊐𝕩 or 𝕨∊p: p must have rank at least 1"),str("p⊐n or n∊p: Rank of n must be at least cell rank of p"),str("∊𝕩 or ⊐𝕩: 𝕩 must have rank at least 1"),str("𝕨⍷𝕩: Rank of 𝕨 cannot exceed rank of 𝕩"),str("/𝕩: 𝕩 must have rank 1"),str("/𝕩: 𝕩 must consist of natural numbers"),str("𝕨⍉𝕩: 𝕨 must have rank at most 1"),str("𝕨⍉𝕩: Length of 𝕨 must not exceed rank of 𝕩"),str("𝕨⍉𝕩: 𝕨 must consist of valid axis indices"),str("𝕨⍉𝕩: Skipped result axis"),str("↑𝕩: 𝕩 must have rank at least 1"),str("↓𝕩: 𝕩 must have rank at least 1"),str("𝕨⊑𝕩: Indices in 𝕨 must consist of integers"),str("𝕨⊑𝕩: Index out of range"),str("𝕨⊏𝕩: Indices in 𝕨 must be integers"),str("𝕨⊏𝕩: Indices out of range"),str("𝕨⊑𝕩: 𝕩 must be a list when 𝕨 is a number"),str("𝕨⊑𝕩: Indices in compound 𝕨 must be lists"),str("𝕨⊑𝕩: Index length in 𝕨 must match rank of 𝕩"),str("𝕨"),str("𝕩: "),str("𝕩 must have rank at least 1 for simple 𝕨"),str("Compound 𝕨 must have rank at most 1"),str("Length of compound 𝕨 must be at most rank of 𝕩"),str("𝕨 must be an array of numbers or list of such arrays"),str("⊏𝕩: 𝕩 must have rank at least 1"),str("⊏𝕩: 𝕩 cannot have length 0"),str("⊏"),str("⊑𝕩: 𝕩 can\'t be empty"),str("⌽𝕩: 𝕩 must have rank at least 1"),str("𝕨⌽𝕩: 𝕨 must consist of integers"),str("𝕨⌽𝕩: 𝕨 too large"),str("⌽"),str("𝕨/𝕩: 𝕨 must consist of natural numbers"),str("𝕨/𝕩: Lengths of components of 𝕨 must match 𝕩"),str("𝕨/𝕩: Components of 𝕨 must have rank 0 or 1"),str("/"),str("=≠≡≢"),str("∾𝕩: 𝕩 must have an element with rank at least =𝕩"),str("Under ⚇: depths must be less than 0, or ∞"),str("⊢⊣˜∘○⊸⟜⊘◶"),str("´˝"),str("=≠≢"),str("<"),str("⋈"),str("≍"),str("↕/»«"),str("⊔"),str("⥊⌽⍉⊏"),str("↑↓"),str("⊑"),str(">"),str("∾"),str("¨⌜"),str("˘"),str("⎉"),str("⚇"),str("Cannot modify fill with Structural Under"),str("⌾: Incompatible result elements in structural Under"),str(">𝕩: Elements of 𝕩 must have matching shapes"),str("𝕨∾𝕩: Rank of 𝕨 and 𝕩 must differ by at most 1"),str("𝕨∾𝕩: Cell shapes of 𝕨 and 𝕩 must match"),str("∾𝕩: Incompatible element ranks"),str("∾𝕩: 𝕩 element shapes must be compatible"),str("∾𝕩: 𝕩 element trailing shapes must match"),str("∾𝕩: empty 𝕩 fill rank must be at least argument rank"),str("∾𝕩: 𝕩 must be an array"),str("↑"),str("↓"),str("𝕩: 𝕨 must "),str("have rank at most 1"),str("consist of integers"),str("« or »: 𝕩 must have rank at least 1"),str("« or »: 𝕨 must not have higher rank than 𝕩"),str("« or »: Rank of 𝕨 must be at least rank of 𝕩 minus 1"),str("« or »: 𝕨 must share 𝕩\'s major cell shape"),str("↕𝕩: 𝕩 must consist of natural numbers"),str("↕𝕩: 𝕩 must be a number or list"),str("𝕨↕𝕩: 𝕨 must have rank at most 1"),str("𝕨↕𝕩: Length of 𝕨 must be at most rank of 𝕩"),str("𝕨↕𝕩: 𝕨 must consist of natural numbers"),str("𝕨↕𝕩: Window length 𝕨 must be at most axis length plus one"),str("˘: Argument lengths don\'t agree"),str("˝: 𝕩 must have rank at least 1"),str("˝: Identity does not exist"),str("∘⌊⌽↑"),str("𝕨⥊𝕩: 𝕨 must have rank at most 1"),str("𝕨⥊𝕩: 𝕨 must consist of natural numbers"),str("𝕨⥊𝕩: Can\'t compute axis length when rest of shape is empty"),str("𝕨⥊𝕩: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑"),str("𝕨⥊𝕩: Shape must be exact when reshaping with ∘"),str("𝕨⥊𝕩: Can\'t produce non-empty array from empty 𝕩"),str("⊔: Grouping argument must consist of integers"),str("⊔: Grouping argument values cannot be less than ¯1"),str("⊔𝕩: 𝕩 must be a list"),str("𝕨⊔𝕩: Rank of simple 𝕨 must be at most rank of 𝕩"),str("𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component"),str("𝕨⊔𝕩: Compound 𝕨 must be a list"),str("𝕨⊔𝕩: Total rank of 𝕨 must be at most rank of 𝕩"),str("𝕨⊔𝕩: 𝕩 must be an array"),str("⎉ or ⚇: 𝔾 result must have rank at most 1"),str("⎉ or ⚇: 𝔾 result must have 1 to 3 elements"),str("⎉ or ⚇: 𝔾 result must consist of integers"),str("⍟: 𝕨𝔾𝕩 must consist of integers"),str("≥: Needs two arguments"),str("≤: Needs two arguments"),str("⊒: Rank of 𝕨 must be at least 1"),str("⊒: Rank of 𝕩 must be at least cell rank of 𝕨"),str("Can\'t invert blocks (add an undo header?)"),str("Cannot invert modifier"),str("⁼: Inverse failed"),str("⁼: Inverse does not exist"),str("⁼: Inverse not found")] + ,[[0,1,0],[0,0,1],[0,0,2],[0,0,3],[0,0,4],[0,0,5],[0,0,6],[1,1,7],[2,1,8],[1,1,9],[0,0,10],[2,1,11],[0,0,12],[0,0,13],[1,0,14],[1,1,15],[1,1,16],[0,0,17],[0,0,18],[1,0,19],[0,0,[[],[20]]],[1,1,21],[1,1,22],[1,0,23],[0,0,[[],[24]]],[0,0,25],[0,0,26],[0,0,27],[0,0,28],[0,0,29],[2,0,[[],[30]]],[0,0,31],[0,0,[[],[32]]],[0,0,33],[0,0,34],[0,0,35],[0,0,[[],[36]]],[0,0,37],[0,0,[[],[38]]],[1,1,39],[0,0,40],[0,0,[[],[41]]],[0,0,[[],[42]]],[0,0,43],[0,0,44],[0,0,[[],[45]]],[0,0,[[],[46]]],[0,1,47],[0,0,48],[0,0,[[],[49]]],[0,0,50],[0,0,51],[0,0,[[],[52]]],[2,1,53],[1,0,54],[1,0,55],[0,0,56],[0,0,[[],[57]]],[0,0,58],[0,0,59],[0,1,60],[2,1,61],[0,0,62],[0,0,63],[1,0,[[],[64]]],[0,0,65],[0,0,[[],[66]]],[1,1,67],[0,0,68],[0,0,69],[0,0,70],[0,0,71],[0,0,[[],[72]]],[0,0,73],[1,0,74],[1,0,75],[0,0,[[],[76]]],[1,0,77],[0,0,78],[0,0,[[],[79]]],[0,0,[[],[80]]],[0,0,[[],[81]]],[0,0,82],[0,0,[[],[83]]],[0,0,[[],[84]]],[1,1,85],[2,0,86],[2,0,87],[2,0,88],[0,0,[[],[89]]],[0,0,[[],[90]]],[1,1,91],[0,0,92],[0,0,93],[0,0,[[],[94]]],[0,0,95],[0,0,96],[0,0,97],[0,0,98],[0,0,[[],[99]]],[0,0,100],[0,0,[[],[101]]],[0,0,102],[2,0,103],[1,1,104],[0,0,[[],[105]]],[0,0,106],[0,0,107],[0,0,108],[0,0,109],[0,0,110],[0,0,111],[0,0,112],[0,0,113],[0,0,114],[0,0,115],[0,0,[[],[116]]],[0,0,117],[0,0,118],[0,0,119],[0,0,120],[0,0,121],[0,0,122],[0,0,123],[0,0,[[],[124]]],[0,0,[[],[125]]],[0,0,[[],[126]]],[0,0,[[],[127]]],[0,0,[[],[128]]],[0,0,129],[0,0,[[],[130]]],[1,0,131],[2,0,132],[0,0,133],[0,0,134],[0,0,135],[0,0,136],[0,0,137],[1,0,138],[1,0,[[],[139]]],[0,0,140],[0,0,[[],[141]]],[0,0,[[],[142]]],[0,0,143],[0,0,144],[0,0,145],[0,0,146],[0,0,[[],[147]]],[0,0,[[],[148]]],[0,0,149],[2,0,150],[0,0,[[],[151]]],[0,0,152],[0,0,[[],[153]]],[0,0,[[],[154]]],[0,0,155],[1,1,156],[0,0,157],[0,0,[[],[158]]],[0,0,159],[0,0,[[],[160]]],[0,0,161],[0,0,[[],[162]]],[0,0,163],[0,0,164],[0,0,[[],[165]]],[0,0,166],[0,0,167],[1,0,168],[0,0,169],[0,0,170],[1,0,171],[0,0,172],[0,0,173],[0,0,174],[0,0,175],[1,0,[[],[176]]],[1,1,177],[2,0,178],[2,0,179],[1,0,180],[1,0,181],[1,0,182],[0,0,183],[1,0,184],[0,0,185],[1,0,186],[0,0,187],[0,0,188],[0,0,189],[0,0,190],[0,0,[[],[191]]],[0,0,192],[0,0,193],[0,0,194],[0,0,195],[0,0,196],[0,0,197],[0,0,198],[0,0,[[],[199]]],[0,0,[[],[200]]],[2,0,201],[1,0,202],[2,0,203],[0,0,204],[0,0,[[],[205]]],[1,0,206],[0,0,207],[1,0,[[],[208]]],[1,1,209],[0,0,[[],[210]]],[0,0,[[],[211]]],[0,0,[[],[212]]],[0,0,[[],[213]]],[0,0,[[],[214]]],[0,0,[[],[215]]],[0,0,[[],[216]]],[0,0,217],[1,1,218],[0,0,219],[0,0,[[],[220]]],[0,0,[[],[221]]],[0,0,222],[0,0,223],[0,0,224],[0,0,225],[0,0,226],[0,0,227],[0,0,228],[0,0,229],[0,0,230],[0,0,[[],[231]]],[0,0,[[],[232]]],[0,0,[[],[233]]],[0,0,234],[0,0,235],[1,1,236],[1,1,237],[1,1,238],[0,0,[[],[239]]],[0,0,240],[0,0,241],[0,0,242],[0,0,243],[0,0,[[],[244]]],[0,0,[[],[245]]],[0,0,[[],[246]]],[1,1,247],[0,0,248],[0,0,[[],[249]]],[0,0,250],[1,0,251],[0,0,252],[0,0,[[],[253]]],[0,0,254],[0,0,255],[0,0,[[],[256]]],[0,0,[[],[257]]],[0,0,258],[0,0,259],[0,0,260],[0,0,261],[0,0,262],[0,0,263],[0,0,[[],[264]]],[0,0,265],[0,0,266],[0,0,267],[0,0,268],[1,1,269],[2,0,270],[0,0,[[],[271]]],[0,0,272],[1,1,273],[1,1,274],[1,0,275],[1,0,[[],[276]]],[1,1,277],[1,0,278],[1,1,279],[1,0,280],[1,0,281],[1,1,282],[1,1,283],[1,1,284],[2,1,285],[0,0,286],[0,0,[[],[287]]],[0,0,288],[2,0,289],[0,0,[[],[290]]],[0,0,291],[0,0,292],[0,0,[[],[293]]],[0,0,294],[0,0,[[],[295]]],[0,0,296],[0,1,297],[1,0,298],[0,0,[[],[299]]],[0,0,300],[0,0,301],[1,0,302],[0,0,[[],[303]]],[0,0,[[],[304]]],[0,0,305],[0,0,306],[0,0,[[],[307]]],[0,0,308],[0,0,[[],[309]]],[0,0,310],[0,0,311],[2,1,312],[2,1,313],[1,0,314],[0,0,315],[0,0,316],[0,0,[[],[317]]],[0,0,318],[1,0,319],[0,0,320],[0,0,[[],[321]]],[2,0,322],[1,1,323],[1,1,324],[0,0,325],[0,0,326],[0,0,327],[0,0,328],[0,0,329],[0,0,330],[0,0,331],[0,0,332],[0,0,333],[0,0,[[],[334]]],[0,0,[[],[335]]],[0,0,336],[0,0,337],[0,0,338],[0,0,339],[0,0,340],[1,0,341],[0,0,342],[0,0,[[],[343]]],[0,0,344],[0,0,345],[0,0,[[],[346]]],[0,0,347],[0,0,348],[0,0,[[],[349]]],[0,0,350],[0,0,[[],[351]]],[0,0,352],[1,0,353],[0,0,[[],[354]]],[0,0,355],[0,0,356],[0,0,357],[0,0,358],[0,0,359],[0,0,360],[0,0,[[],[361]]],[0,0,[[],[362]]],[0,0,363],[0,0,364],[0,0,365],[0,0,366]] + ,[[0,189],[4298,3],[4343,3],[4351,3],[4355,3],[4368,3],[4383,3],[4395,2],[4424,3],[4456,2],[4473,4],[4535,5],[4571,4],[4653,3],[4695,5],[4753,4],[4819,3],[4874,3],[4885,5],[4960,9],[5029,5],[5106,5],[5173,4],[5229,8],[5401,8],[5558,3],[5607,3],[5653,6],[5738,3],[5762,7],[5876,14],[6220,4],[6280,3],[6305,3],[6367,4],[6438,6],[6502,3],[6542,5],[6619,3],[6636,14],[6816,3],[6862,3],[6882,3],[6899,4],[6957,4],[7033,5],[7107,3],[7166,0],[7177,4],[7248,3],[7258,3],[7265,3],[7279,3],[7287,3],[7325,5],[7362,5],[7389,3],[7414,3],[7439,3],[7466,7],[7540,32],[8282,3],[8347,4],[8447,7],[8643,7],[8669,14],[8882,5],[8961,9],[9118,4],[9194,7],[9306,7],[9423,3],[9530,4],[9604,10],[9779,8],[9853,7],[9915,9],[10082,9],[10230,4],[10341,8],[10555,10],[10939,3],[10983,6],[11214,4],[11328,3],[11465,2],[11486,15],[11590,8],[11718,10],[11791,3],[11817,4],[11919,2],[11927,3],[11935,3],[11943,3],[11963,8],[12038,3],[12046,3],[12054,3],[12062,3],[12070,3],[12078,3],[12089,3],[12110,7],[12151,5],[12170,4],[12230,3],[12272,3],[12323,3],[12349,3],[12398,3],[12427,5],[12524,3],[12575,3],[12617,3],[12666,3],[12710,3],[12720,3],[12758,3],[12766,3],[12799,3],[12843,3],[12891,3],[12903,3],[12976,4],[13012,3],[13027,3],[13042,3],[13060,3],[13074,3],[13084,3],[13136,6],[13159,6],[13187,3],[13199,3],[13230,3],[13238,3],[13246,3],[13254,5],[13289,12],[13462,3],[13473,3],[13493,3],[13513,3],[13524,3],[13535,3],[13550,7],[13621,6],[13667,3],[13685,3],[13692,6],[13727,10],[13904,4],[13960,11],[14161,4],[14228,3],[14253,2],[14268,3],[14295,8],[14479,3],[14508,3],[14518,3],[14537,3],[14547,3],[14556,3],[14566,3],[14583,3],[14625,3],[14629,5],[14662,8],[14773,9],[14855,13],[14960,3],[14968,3],[14990,7],[15095,7],[15124,11],[15328,2],[15386,10],[15462,13],[15590,5],[15616,5],[15638,5],[15660,4],[15671,5],[15712,3],[15744,5],[15785,4],[15796,3],[15803,4],[15814,4],[15825,3],[15833,6],[15860,5],[15881,6],[15908,3],[15916,4],[15936,3],[15952,3],[15964,3],[15978,8],[16101,13],[16200,18],[16512,12],[16672,4],[16695,16],[17209,5],[17225,7],[17361,6],[17457,2],[17507,8],[17694,11],[17899,3],[17958,3],[17985,3],[18002,3],[18019,8],[18201,3],[18232,2],[18266,3],[18301,3],[18322,3],[18343,5],[18408,3],[18428,8],[18658,3],[18726,3],[18761,3],[18792,3],[18826,5],[18893,3],[18902,3],[18921,3],[18939,3],[18952,3],[18956,3],[19002,2],[19016,2],[19031,6],[19125,3],[19135,3],[19142,9],[19276,3],[19302,3],[19326,3],[19347,5],[19489,3],[19502,2],[19506,3],[19542,5],[19651,3],[19698,5],[19721,3],[19738,14],[20022,13],[20219,3],[20262,4],[20345,3],[20367,4],[20394,3],[20426,7],[20494,3],[20509,3],[20544,3],[20562,3],[20595,3],[20606,3],[20625,3],[20633,3],[20649,3],[20660,10],[20878,3],[20891,3],[20895,2],[20906,2],[20918,5],[20937,5],[20958,3],[21015,5],[21026,2],[21050,5],[21058,5],[21066,2],[21078,2],[21088,2],[21106,3],[21127,4],[21163,7],[21298,10],[21488,6],[21523,3],[21593,3],[21608,3],[21667,3],[21697,3],[21725,3],[21733,3],[21741,1],[21767,5],[21787,4],[21862,3],[21895,3],[21925,5],[21950,3],[22016,3],[22030,3],[22041,5],[22140,4],[22268,3],[22292,3],[22338,3],[22371,3],[22400,3],[22408,3],[22418,5],[22454,3],[22490,3],[22516,3],[22544,3],[22566,5],[22576,3],[22609,3],[22629,6],[22644,2],[22652,2],[22660,5],[22698,3],[22708,3],[22724,5],[22775,3],[22800,6],[22909,3],[22949,3],[22990,5],[23040,6],[23177,3],[23206,3],[23225,3],[23250,3],[23268,7],[23304,3],[23320,6],[23366,3],[23374,8],[23431,5],[23460,3],[23475,3],[23525,3],[23541,3],[23559,3],[23588,3],[23607,3],[23626,6],[23705,5],[23720,14],[23884,3],[23905,3],[23913,3],[23932,3],[23948,4],[24004,3],[24036,3],[24119,3],[24153,3],[24182,3],[24199,3],[24216,3]] +); + +// Use high-precision modulus (⚇0) +abs_mod.prim=8; runtime[8] = runtime[61](abs_mod,0); + +// Cache inverse calls and handle block inverses +setInv( + inv => f => !isfunc(f) ? inv(f) : f.inverse || (f.inverse=inv(f)), + snv => f => !isfunc(f) ? snv(f) : f.sinverse|| (f.sinverse=snv(f)) +); + +let rtAssert = runtime[43] = assertFn("!"); +runtime.map((r,i) => { r.prim = i; }); +let decompose = x => list(!isfunc(x) ? [-1,x] : has(x.prim) ? [0,x] + : x.repr ? x.repr() : [1,x]); +setPrims(list([decompose, x=>has(x.prim)?x.prim:runtime.length])); +let glyphs = ["+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!", "˙˜˘¨⌜⁼´˝`", "∘○⊸⟜⌾⊘◶⎉⚇⍟⎊"]; +let gl = glyphs.join(""); +let glyph = x => { + let g = gl[x.prim]; + if (!has(g)) throw Error("•Glyph 𝕩: 𝕩 must be a primitive"); + return g; +} + +// Compiler +runtime[43] = assertFn("Compiler"); +let compgen_raw = run( + [1,1,7,34,0,1,33,0,3,33,0,4,33,0,5,12,3,48,6,0,63,0,27,16,0,0,0,62,17,0,22,0,61,0,27,16,17,0,47,0,0,26,0,104,17,0,45,0,22,26,0,60,0,27,16,0,47,0,0,26,0,103,17,17,33,0,6,48,0,18,16,0,36,0,59,17,33,0,7,48,6,0,64,0,65,11,2,0,0,0,97,17,33,0,8,48,6,34,0,3,32,0,4,34,0,5,32,0,8,0,22,0,105,17,0,106,0,107,0,108,0,109,0,110,0,111,0,21,0,66,0,51,11,2,17,0,45,0,35,26,0,59,17,0,112,0,64,0,27,16,0,0,0,98,17,34,0,6,0,21,16,0,44,0,22,26,0,113,17,0,67,0,0,0,97,17,0,22,0,116,17,0,22,0,115,0,26,0,59,17,17,0,22,0,114,17,0,117,11,15,0,46,0,13,26,0,24,0,22,21,16,33,0,9,33,0,10,12,2,48,6,32,0,10,0,50,0,0,26,0,29,0,68,21,0,54,0,44,0,46,0,24,26,26,27,16,33,0,11,33,0,12,33,0,13,33,0,14,33,0,15,33,0,16,33,0,17,33,0,18,33,0,19,33,0,20,33,0,21,33,0,22,33,0,23,33,0,24,33,0,25,12,15,48,6,0,36,0,54,0,1,27,0,12,0,9,0,15,0,53,0,68,27,21,0,36,0,53,0,69,27,21,33,0,26,48,6,32,0,14,0,36,16,33,0,27,48,6,32,0,15,0,36,16,0,0,0,70,17,33,0,28,48,6,0,71,0,1,0,54,0,24,27,16,0,0,32,0,20,17,33,0,29,48,6,32,0,20,0,36,16,0,0,0,72,17,33,0,30,48,6,0,13,0,11,0,69,21,0,44,0,32,26,0,118,21,0,54,0,22,27,33,0,31,48,6,1,2,33,0,32,48,6,1,3,32,0,9,26,33,0,33,48,6,0,123,0,32,0,53,34,0,4,0,54,0,39,27,27,16,32,0,33,16,33,0,34,48,6,32,0,21,0,36,16,33,0,35,48,0,0,0,69,17,33,0,36,48,6,0,69,0,70,0,75,0,59,0,59,0,76,0,59,0,68,11,2,0,77,0,68,0,71,0,78,11,2,0,32,16,0,8,16,11,10,0,43,34,0,10,26,0,25,0,13,21,0,54,0,44,0,46,0,21,26,26,27,16,0,22,16,0,44,0,22,26,0,74,17,33,0,37,48,6,0,2,0,50,0,6,26,20,33,0,38,48,6,32,0,38,0,53,0,13,0,51,0,27,27,27,33,0,39,48,6,32,0,38,0,53,0,13,0,51,0,27,27,0,0,0,69,21,27,33,0,40,48,6,0,19,0,32,0,10,21,0,44,0,22,26,0,32,0,22,21,0,69,21,33,0,41,48,6,1,4,33,0,42,48,6,1,5,33,0,43,48,6,1,6,33,0,44,48,6,1,7,33,0,45,48,7,34,0,1,0,11,16,0,46,1,8,26,34,0,4,17,0,22,16,7,0,19,0,22,0,22,21,0,53,0,119,27,0,20,0,13,0,54,0,11,27,0,58,0,40,0,54,0,20,0,25,0,13,0,54,0,5,27,21,27,27,0,73,21,11,2,0,56,0,13,0,11,0,69,21,27,33,0,2,48,6,32,1,32,32,1,31,0,53,0,120,27,0,121,34,0,2,11,3,26,0,42,20,33,0,3,48,6,32,0,1,0,54,0,35,27,0,54,0,18,0,58,0,19,0,32,0,13,21,0,51,34,0,3,27,27,27,0,19,0,20,21,33,0,4,48,6,32,0,1,0,35,34,0,1,0,33,16,33,0,5,48,17,33,0,6,48,0,26,0,53,0,1,27,0,14,0,26,21,0,69,17,0,49,0,10,26,0,58,0,22,0,53,0,68,27,0,44,0,32,26,32,0,6,21,0,22,0,122,21,0,42,20,27,16,6,0,20,0,33,34,0,6,21,0,6,0,69,21,0,44,0,1,26,0,69,21,0,44,0,35,26,34,0,5,21,34,0,4,0,20,21,7,34,0,2,33,0,3,33,0,4,12,2,48,6,0,99,0,14,32,0,1,17,33,0,5,48,6,0,100,0,14,32,0,1,17,33,0,6,48,0,9,0,53,0,28,0,53,0,68,0,68,11,2,27,27,16,0,32,16,33,0,7,48,6,0,101,0,14,32,0,1,17,33,0,8,48,0,32,16,33,0,9,48,6,32,0,7,32,0,9,0,26,0,59,17,32,0,5,0,32,16,11,3,0,22,16,33,0,10,48,0,33,16,33,0,11,48,6,32,0,10,0,35,32,0,11,17,33,0,10,49,6,34,0,7,0,0,0,70,17,34,0,9,0,26,0,69,17,0,69,0,22,32,1,8,0,39,32,0,1,17,17,0,32,16,0,32,0,53,32,0,5,0,50,0,0,26,16,0,22,0,68,17,0,54,0,35,0,51,0,29,0,54,0,1,27,27,27,27,16,11,3,0,22,16,0,35,34,0,11,17,33,0,12,48,6,0,43,0,68,11,1,26,1,9,0,13,0,54,0,22,27,21,0,20,0,32,0,12,21,0,13,21,33,0,13,48,6,0,35,0,53,32,0,12,0,33,32,0,10,17,34,0,13,16,27,0,48,0,32,26,20,0,25,32,0,1,0,13,16,21,33,0,14,48,6,34,0,10,32,0,14,16,33,0,15,48,6,34,0,12,34,0,14,16,33,0,16,48,6,32,0,16,0,10,32,0,15,17,33,0,17,48,0,50,0,13,26,0,69,17,33,0,18,48,6,32,0,18,0,11,34,0,16,17,0,9,32,0,8,0,10,32,0,6,17,17,0,49,0,10,26,0,58,1,10,27,16,6,0,102,0,14,32,0,1,17,0,9,32,0,18,17,33,0,19,48,6,34,0,6,0,9,32,0,15,17,0,29,16,0,10,32,0,19,17,0,32,16,33,0,20,48,6,32,0,20,34,0,19,0,54,0,35,27,0,2,0,97,0,1,0,102,17,21,0,1,32,0,1,0,54,0,35,27,21,16,33,0,21,48,6,32,0,8,0,9,33,0,15,50,0,28,16,0,9,32,0,8,17,33,0,22,48,0,12,33,0,18,50,6,34,0,17,0,9,34,0,8,17,0,50,0,13,26,16,0,11,0,69,0,54,0,22,27,0,52,0,2,0,53,0,50,0,0,26,27,27,0,19,21,34,0,22,0,29,16,0,12,34,0,15,17,33,0,23,48,17,0,44,0,1,26,0,69,17,0,44,0,41,26,32,0,1,17,33,0,24,48,6,32,0,18,0,32,16,33,0,25,48,6,32,0,18,0,29,0,69,17,0,32,16,0,25,0,53,0,13,27,32,0,25,17,33,0,26,48,6,32,0,25,34,0,5,0,54,0,35,27,0,2,0,1,21,32,0,26,17,0,1,33,0,26,50,6,34,0,1,0,35,32,0,25,17,32,1,33,16,33,0,27,48,6,32,1,22,32,1,26,32,0,27,17,0,28,16,0,12,32,1,21,0,36,16,0,14,32,0,27,17,17,33,0,28,48,6,32,1,30,0,14,32,0,27,17,33,0,29,48,6,32,1,24,0,36,0,52,0,44,0,1,26,0,24,0,19,21,27,32,1,21,17,32,1,26,32,0,27,17,0,11,34,0,28,17,0,10,32,0,29,17,33,0,30,48,0,11,0,53,0,29,27,16,33,0,31,48,6,32,1,23,0,49,0,0,26,16,0,0,0,59,17,0,14,32,0,27,17,33,0,32,48,6,32,1,24,0,36,16,0,14,32,0,27,17,33,0,33,48,6,32,0,30,0,10,32,0,33,17,0,28,0,9,0,29,21,0,54,0,9,27,0,10,0,11,21,32,0,32,17,0,28,0,10,0,29,21,16,0,10,32,0,32,0,28,0,11,0,29,21,16,17,0,9,32,0,29,17,0,49,0,10,26,0,58,1,11,27,16,6,32,0,32,0,12,32,0,30,17,0,19,0,32,0,10,21,0,28,0,32,0,20,21,0,69,21,0,11,0,32,21,32,0,31,17,0,49,0,10,26,0,58,1,12,27,16,6,32,0,27,0,32,32,0,31,17,0,44,0,1,26,32,1,23,0,36,16,17,0,44,0,3,0,51,0,5,27,26,32,1,7,17,0,2,32,0,29,0,32,32,0,31,17,0,8,16,17,33,0,34,48,6,32,1,23,0,36,16,0,0,32,1,7,17,0,16,32,0,27,17,0,9,32,0,30,17,0,2,32,1,7,17,0,1,33,0,27,50,6,32,0,30,0,28,16,0,12,32,0,33,17,0,49,0,10,26,0,58,1,13,27,16,6,32,0,33,0,10,0,53,0,29,27,16,0,13,33,0,31,50,6,32,0,33,0,32,32,0,31,17,0,20,0,0,0,8,0,54,0,2,27,21,0,68,0,16,32,0,34,17,0,2,0,70,17,17,33,0,35,48,0,11,0,68,17,33,0,36,48,6,32,0,36,0,8,16,0,22,0,68,17,0,35,32,0,31,0,50,0,0,26,16,17,0,9,32,0,30,17,33,0,37,48,0,12,32,0,30,17,33,0,38,48,6,32,0,30,0,2,32,0,27,17,0,22,0,53,0,68,27,0,32,32,0,37,0,22,0,68,17,0,28,0,54,0,10,27,16,0,11,32,0,32,0,22,0,68,17,17,21,0,52,32,1,43,27,32,0,26,17,33,0,39,48,6,34,0,34,0,32,34,0,36,17,0,14,0,53,0,70,27,0,54,0,9,27,0,0,0,20,21,32,0,38,0,11,0,53,0,28,27,16,0,44,0,32,26,32,0,32,17,17,33,0,40,48,6,32,0,29,0,28,16,0,9,32,0,32,17,0,10,32,0,29,17,33,0,41,48,0,10,32,0,37,17,0,12,32,0,31,17,33,0,42,48,6,32,0,42,0,50,0,0,26,16,0,2,32,0,29,0,10,32,0,32,17,0,12,34,0,38,17,17,33,0,43,48,0,11,0,53,0,50,0,6,26,0,29,20,27,16,33,0,44,48,6,32,0,31,0,9,34,0,37,17,0,10,32,0,44,17,33,0,45,48,6,34,0,33,0,32,34,0,42,17,33,0,46,48,6,34,0,44,0,32,16,32,0,27,0,54,0,35,27,0,12,32,1,23,0,36,16,21,0,11,32,0,46,21,0,54,0,20,0,49,0,10,26,20,0,58,1,14,27,27,16,6,32,1,9,0,35,32,0,27,17,0,41,0,69,0,1,34,0,43,17,17,0,41,0,70,0,22,34,0,46,17,17,0,36,0,55,0,22,0,53,32,0,4,27,27,16,33,0,47,48,6,34,0,18,0,29,16,0,50,0,0,26,16,0,35,34,0,23,0,32,16,0,22,34,0,20,17,17,0,22,32,0,45,0,32,16,0,35,0,53,0,34,27,34,0,41,0,32,32,0,31,17,0,8,16,0,44,0,32,26,34,0,35,17,17,17,33,0,48,48,6,34,0,39,34,0,21,34,0,24,11,3,0,22,34,0,47,17,33,0,49,48,6,32,0,49,0,46,0,37,26,16,33,0,50,48,0,44,0,46,0,32,0,53,0,50,0,6,26,0,29,0,59,21,0,12,0,20,21,27,26,26,33,0,49,50,6,32,0,49,0,36,0,53,0,69,27,0,55,34,0,3,27,16,33,0,49,49,6,32,1,24,32,1,26,32,0,27,17,0,10,32,0,30,17,0,8,16,33,0,51,48,6,32,0,31,0,10,32,0,51,17,0,44,0,32,26,33,0,26,50,6,34,0,30,0,28,0,54,0,12,27,16,0,10,32,0,51,17,0,44,0,32,26,33,0,25,50,6,32,0,27,0,35,0,53,34,0,48,27,0,55,32,0,49,0,46,0,13,26,16,33,0,52,48,0,29,32,1,36,17,0,50,0,0,26,16,0,0,34,0,50,17,0,22,16,0,26,0,53,0,13,27,34,0,4,17,27,16,33,0,27,49,6,34,0,51,0,10,34,0,45,17,0,10,34,0,29,17,0,44,0,32,26,33,0,27,50,6,32,1,14,0,36,0,54,0,1,27,0,2,32,1,26,21,32,0,27,17,0,1,33,0,27,50,6,32,1,27,0,14,32,0,27,17,0,44,0,22,26,0,13,0,22,21,0,69,17,0,32,16,0,26,0,69,17,0,26,0,59,17,33,0,53,48,0,46,0,69,26,16,0,50,0,13,26,16,33,0,54,48,6,32,1,17,0,36,16,0,0,0,75,0,71,0,63,11,3,17,33,0,55,48,6,32,0,27,0,35,32,0,54,0,1,32,0,53,17,17,0,0,0,53,32,0,54,27,0,44,0,39,26,34,0,55,21,0,10,32,1,15,0,54,32,1,26,27,21,16,0,28,0,54,0,10,27,16,0,12,34,0,54,17,0,44,0,32,26,34,0,53,17,33,0,56,48,6,32,1,27,0,13,32,0,27,17,0,35,0,53,34,0,56,27,0,55,0,46,0,69,26,27,16,0,44,1,15,26,33,0,27,50,6,34,0,52,0,25,0,70,17,0,49,0,0,26,16,0,24,32,1,36,17,32,1,26,32,0,27,17,0,10,32,1,30,0,14,32,0,27,17,17,33,0,57,48,6,0,68,0,22,32,1,37,17,0,35,32,0,27,0,5,32,1,36,17,17,0,32,0,53,34,0,57,27,0,55,34,0,40,27,16,33,0,58,48,6,32,0,27,0,15,0,53,0,0,0,53,0,75,27,27,0,0,0,71,21,0,2,0,71,0,54,0,24,27,32,1,26,0,20,21,21,32,1,20,0,36,16,17,0,0,33,0,27,50,6,32,0,27,0,14,0,2,0,64,21,0,0,0,11,21,32,1,35,17,0,1,33,0,27,50,6,34,0,27,34,0,58,34,0,49,32,0,26,32,0,25,11,5,7,1,16,33,0,3,48,6,32,1,32,32,1,31,0,53,0,129,27,0,130,32,1,9,0,54,0,35,27,0,131,11,4,26,33,0,4,48,6,32,1,21,0,49,0,27,0,54,0,0,27,26,16,0,22,0,132,0,49,0,1,26,16,0,0,32,1,23,0,36,16,17,17,0,46,32,0,1,0,54,0,14,27,26,16,33,0,5,33,0,6,33,0,7,33,0,8,33,0,9,12,5,48,6,32,1,23,0,36,16,0,11,32,0,1,17,0,10,32,0,5,17,0,8,16,0,10,32,1,30,0,14,32,0,1,17,17,32,0,2,32,0,3,32,0,1,0,54,0,32,27,0,51,34,0,4,27,27,16,6,32,0,1,0,14,0,68,17,33,0,10,48,0,10,32,0,5,17,33,0,11,48,0,10,32,0,6,17,33,0,12,48,6,32,0,11,0,10,32,0,7,17,0,8,16,33,0,13,48,6,32,0,11,0,29,16,0,12,32,0,7,17,32,0,2,32,0,3,0,133,27,16,6,32,0,12,0,10,32,0,7,17,0,9,32,0,12,0,28,0,69,17,17,32,0,2,32,0,3,0,134,27,16,6,32,0,1,0,32,32,0,12,17,0,11,0,53,0,29,27,0,10,0,14,0,53,0,68,27,21,16,0,8,16,32,0,2,0,32,34,0,12,21,32,0,3,0,135,27,16,6,32,0,5,0,29,16,0,12,32,0,7,17,0,10,32,0,10,17,0,28,0,10,34,0,5,0,28,16,0,9,32,0,8,17,21,0,9,0,29,21,0,69,17,0,12,32,0,9,0,10,34,0,8,17,17,34,0,2,34,0,3,0,136,27,16,6,32,0,13,0,9,0,53,0,8,32,1,40,0,52,0,12,27,32,1,22,0,36,16,0,13,32,0,1,17,33,0,14,48,0,11,32,0,6,17,21,0,15,0,28,21,27,16,33,0,15,48,0,11,0,53,32,0,6,27,0,50,0,0,26,20,32,1,38,0,1,0,20,21,0,8,21,16,33,0,16,48,6,34,0,14,0,10,32,0,15,17,0,8,16,0,30,0,55,0,50,0,0,26,32,1,38,0,1,0,20,21,0,8,21,0,29,20,27,16,0,2,32,0,6,17,33,0,17,48,6,34,0,17,0,1,32,0,16,17,0,32,0,53,32,0,15,0,28,0,54,0,12,27,16,0,10,32,0,6,17,27,0,52,0,32,0,53,0,29,0,53,0,69,27,27,0,24,0,32,21,0,53,0,8,27,27,32,0,6,17,33,0,18,33,0,19,12,2,48,6,0,64,0,27,16,0,22,0,79,0,69,11,2,17,0,22,0,59,17,0,54,0,35,27,0,50,0,0,0,53,0,64,0,54,0,2,27,27,0,2,0,15,0,53,0,68,27,21,26,0,68,21,0,32,0,14,0,53,0,68,27,0,28,0,69,21,21,33,0,20,48,6,0,2,0,53,32,1,21,0,36,16,0,0,0,69,17,0,1,34,0,1,17,27,0,32,0,11,0,53,34,0,6,27,0,10,0,12,0,53,0,28,27,21,21,34,0,20,20,33,0,21,48,6,34,0,15,32,0,21,1,17,11,2,0,56,0,80,0,12,32,0,18,17,0,49,0,10,26,16,27,16,33,0,22,48,6,34,0,7,0,29,16,0,32,34,0,13,0,29,0,54,0,12,27,16,33,0,23,48,17,0,44,0,35,26,0,69,0,59,11,2,17,0,2,34,0,22,17,33,0,24,48,6,34,0,10,0,28,0,29,0,69,21,0,52,0,32,27,34,0,11,17,33,0,25,48,6,0,69,0,83,11,2,0,35,34,0,9,0,32,34,0,23,17,17,0,2,32,0,24,17,0,32,32,0,25,17,33,0,26,48,6,32,0,25,0,8,16,0,2,34,0,24,17,0,28,16,0,44,0,1,26,34,0,19,0,1,32,0,18,17,17,0,32,34,0,25,17,33,0,27,48,6,0,84,0,6,32,0,27,17,33,0,28,48,0,1,32,0,27,17,0,0,34,0,27,0,6,0,68,17,17,33,0,29,48,6,34,0,26,0,32,0,53,32,0,29,0,13,0,68,17,27,0,55,0,2,0,53,0,4,0,53,0,64,27,27,27,34,0,29,17,0,32,0,53,32,0,28,0,12,0,68,17,27,0,55,0,44,0,1,0,4,0,64,21,0,54,0,3,27,26,27,34,0,28,17,7,34,0,2,33,0,3,33,0,4,33,0,5,33,0,6,33,0,7,12,5,48,6,34,0,4,0,13,16,33,0,8,48,6,1,18,33,0,9,48,6,1,19,33,0,10,48,6,32,0,1,0,13,16,0,11,0,68,17,0,42,0,138,17,6,32,1,17,32,1,26,32,0,1,17,0,2,32,0,3,0,2,0,70,17,0,1,0,59,17,17,33,0,11,48,0,50,0,0,26,16,33,0,12,48,0,33,16,33,0,13,48,6,0,59,0,14,32,0,3,17,0,35,32,0,13,17,33,0,14,48,6,32,0,1,0,35,32,0,13,17,33,0,15,48,0,32,0,53,0,68,0,54,0,11,27,27,0,44,0,1,26,0,69,21,0,17,0,32,0,53,0,68,0,54,0,12,27,27,21,32,0,11,0,35,32,0,13,17,33,0,16,48,17,0,8,0,58,32,0,1,0,51,34,0,9,27,27,16,6,34,0,12,0,36,32,0,13,0,36,16,17,0,12,0,68,17,32,0,13,0,25,0,69,21,32,0,10,0,139,27,16,6,32,0,15,0,32,32,0,14,17,0,14,0,53,32,1,27,27,0,9,0,53,0,29,27,0,14,0,53,32,1,17,0,36,16,27,21,16,32,0,13,0,32,32,0,14,21,32,0,10,0,140,27,16,6,32,0,15,0,32,0,14,32,1,17,0,36,16,0,0,0,70,17,21,0,22,0,70,21,0,35,0,19,0,51,0,50,0,0,26,27,21,34,0,16,0,14,0,69,17,17,33,0,17,48,6,32,1,15,32,1,26,32,0,15,17,0,11,32,0,17,0,14,0,69,17,17,32,0,13,32,0,10,0,141,27,16,6,34,0,14,0,22,0,69,17,0,9,0,53,0,28,0,53,0,69,27,27,16,1,20,16,6,0,74,0,14,32,0,3,17,33,0,18,48,0,10,0,53,0,28,27,16,33,0,19,48,6,32,0,11,0,0,32,0,3,17,0,15,0,68,17,0,11,32,0,18,17,0,28,16,33,0,20,48,0,10,0,77,0,15,32,0,3,17,0,29,16,17,0,12,32,1,16,0,36,16,0,14,32,0,1,17,17,0,1,33,0,3,50,6,32,0,3,0,15,0,68,17,0,11,32,0,18,17,0,29,16,0,9,32,1,16,0,36,16,0,0,0,70,17,0,14,32,0,1,17,0,10,34,0,20,17,17,0,12,32,0,3,0,77,0,54,0,15,27,0,9,0,11,0,53,0,86,27,21,16,17,0,13,0,27,20,32,0,10,0,143,27,16,6,32,0,3,0,14,0,86,17,0,35,32,0,13,17,0,11,34,0,17,0,11,0,68,17,17,32,0,13,32,0,10,0,144,27,16,6,32,1,28,0,14,32,0,1,17,0,9,32,0,3,0,14,0,86,17,0,29,16,17,0,13,0,27,20,32,0,10,0,145,27,16,6,32,1,35,32,0,8,11,2,32,1,26,32,0,1,17,0,28,16,0,12,32,0,18,17,0,13,0,27,20,32,0,10,0,146,27,16,6,0,77,0,14,32,0,3,17,0,10,0,53,0,28,27,16,33,0,21,48,0,35,0,53,32,0,13,0,35,0,53,32,0,19,0,54,0,35,27,0,33,20,27,16,27,0,55,0,29,27,16,33,0,22,48,6,32,0,22,0,10,32,0,21,17,0,8,16,33,0,23,48,6,32,1,17,0,36,16,0,0,0,69,17,0,14,32,0,1,17,33,0,24,48,6,32,1,19,0,36,16,0,14,32,0,1,17,0,2,0,70,17,0,0,32,1,29,0,36,16,0,0,0,70,17,0,14,32,0,1,17,17,0,35,32,0,24,0,8,16,32,1,39,16,17,33,0,25,48,6,0,68,33,0,26,48,6,32,0,25,0,13,16,0,27,16,33,0,27,48,6,1,21,33,0,28,48,6,32,0,19,0,10,32,0,21,17,33,0,29,48,0,35,32,0,13,17,0,33,16,0,44,0,35,26,33,0,13,50,6,32,0,3,0,13,16,0,27,16,0,35,0,53,32,0,13,27,0,55,0,29,0,53,0,13,27,27,16,33,0,30,48,6,0,59,0,14,32,0,3,17,0,10,34,0,29,17,0,35,32,0,13,17,0,22,0,69,17,0,0,0,53,0,50,0,0,26,27,16,0,33,16,0,44,0,35,26,0,8,0,33,0,54,0,44,0,35,26,27,21,0,35,0,53,0,33,27,0,19,21,32,0,13,0,22,0,59,17,17,0,26,0,59,17,0,50,0,0,26,16,0,33,16,33,0,31,48,6,32,1,17,0,36,16,0,0,0,70,17,0,70,11,2,32,1,26,32,0,1,17,0,2,32,0,11,17,0,35,32,0,31,17,33,0,32,48,0,50,0,0,26,16,33,0,33,48,0,33,16,33,0,34,48,6,32,0,34,0,44,0,35,26,33,0,31,50,6,32,0,34,0,44,0,35,26,33,0,33,50,6,32,0,34,0,44,0,35,26,33,0,32,50,6,32,0,31,0,44,0,35,26,33,0,1,50,6,32,0,31,0,44,0,35,26,33,0,18,50,6,32,0,31,0,44,0,35,26,33,0,5,50,6,32,0,31,0,44,0,35,26,33,0,6,50,6,0,14,0,53,0,70,0,54,0,0,27,27,0,10,0,14,21,33,0,35,48,6,32,0,11,0,35,32,0,31,17,0,44,0,1,26,32,0,32,17,33,0,11,49,0,50,0,0,26,16,0,33,16,33,0,13,49,6,34,0,11,0,35,32,0,13,17,0,12,32,0,13,0,54,0,32,27,0,52,0,24,27,0,11,21,0,68,17,33,0,36,48,6,32,0,18,0,10,0,53,0,28,27,16,0,35,32,0,13,17,0,33,16,0,44,0,35,26,33,0,13,50,6,32,0,31,0,35,32,0,13,17,33,0,37,48,6,32,0,21,0,1,32,0,22,17,0,35,32,0,37,17,0,12,0,32,0,52,0,1,27,0,11,21,0,68,17,0,44,0,3,26,0,70,17,0,0,0,69,17,33,0,38,48,6,32,1,17,0,36,16,0,0,0,71,17,0,44,32,0,35,26,32,0,1,17,0,35,32,0,13,17,0,32,16,33,0,39,48,6,0,68,0,12,32,0,32,17,33,0,40,48,6,0,68,0,11,34,0,32,17,0,32,16,33,0,41,48,6,32,0,40,0,32,16,32,0,41,11,2,0,46,0,22,26,33,0,36,50,6,32,0,21,0,35,32,0,37,17,0,33,16,33,0,42,48,0,44,0,35,26,33,0,13,50,6,32,0,31,0,35,32,0,13,17,33,0,37,49,6,32,0,13,0,33,16,33,0,43,48,6,32,1,15,0,36,16,0,14,32,0,1,17,33,0,44,48,6,32,1,15,0,36,16,0,0,0,69,17,0,14,32,0,1,17,33,0,45,48,6,32,0,45,0,10,32,0,40,17,33,0,46,48,0,50,0,0,26,16,33,0,47,48,6,0,20,32,1,41,0,51,0,8,27,32,0,46,21,33,0,48,48,6,32,0,44,32,0,48,16,33,0,49,48,0,10,32,1,28,0,14,32,0,1,17,32,0,48,16,17,33,0,50,48,6,32,0,45,0,32,32,0,46,17,33,0,51,48,0,8,16,0,22,0,69,17,33,0,52,48,6,32,0,51,0,28,0,54,0,10,27,16,0,22,0,68,17,33,0,53,48,6,32,0,50,0,26,0,9,32,0,51,21,0,11,0,26,0,53,0,1,27,21,0,69,17,32,0,46,0,32,20,32,0,10,0,147,27,16,6,32,0,50,0,26,0,59,17,0,12,32,0,51,17,0,9,0,53,0,29,27,16,32,0,46,0,32,20,32,0,10,0,148,27,16,6,34,0,45,0,32,16,0,22,32,0,41,17,0,35,34,0,51,0,28,16,0,33,16,0,33,16,17,33,0,54,48,6,32,0,44,0,10,32,0,46,17,0,35,0,53,32,0,13,0,30,16,27,0,55,32,1,39,0,54,0,44,0,35,26,27,27,34,0,44,17,33,0,55,48,0,32,16,33,0,56,48,6,32,0,1,0,35,32,0,56,17,0,37,0,1,0,19,0,51,0,13,27,21,32,1,34,17,33,0,57,48,0,14,0,68,17,33,0,58,48,6,32,0,57,0,14,0,53,0,70,27,0,9,32,0,58,0,29,0,69,17,21,0,10,0,16,0,53,0,29,27,21,16,0,11,32,0,58,17,32,0,56,32,0,10,0,149,27,16,6,32,0,57,0,29,16,0,32,34,0,58,17,33,0,59,48,6,34,0,57,0,14,0,68,17,0,44,0,32,26,33,0,56,50,6,32,0,56,0,44,0,35,26,32,0,31,17,32,0,3,0,54,0,35,27,0,2,32,0,23,0,54,0,35,27,21,16,33,0,60,48,6,32,0,60,0,14,0,59,17,33,0,61,48,0,28,0,0,0,29,0,53,0,69,27,21,16,33,0,62,48,0,14,0,70,17,33,0,63,48,6,32,0,55,0,35,32,0,56,0,32,32,0,61,17,0,44,0,35,26,32,0,43,17,0,0,0,69,17,0,44,0,35,26,32,0,13,17,17,32,0,56,0,32,32,0,61,21,32,0,10,0,150,27,16,6,32,0,60,0,15,0,70,17,33,0,64,48,0,11,32,0,63,17,0,20,0,9,0,75,0,14,32,0,60,17,21,0,28,20,0,10,0,29,21,16,33,0,65,48,6,34,0,64,0,10,32,0,61,17,0,9,32,0,65,17,0,10,0,75,0,14,32,0,60,17,0,9,32,0,59,17,17,32,0,56,32,0,10,0,151,27,16,6,34,0,62,0,14,0,69,17,0,9,32,0,60,0,14,0,68,17,17,0,11,32,0,65,17,33,0,66,48,0,10,32,0,65,17,0,8,16,33,0,67,48,6,32,0,61,0,32,32,0,67,17,0,14,0,53,0,29,0,53,0,69,27,27,16,32,0,56,0,32,32,0,67,21,32,0,10,0,152,27,16,6,32,0,22,0,35,32,0,31,17,0,8,16,0,2,32,0,1,17,0,35,32,0,56,17,33,0,68,48,0,33,32,0,8,0,22,32,1,29,17,0,50,0,0,26,16,17,0,44,0,1,26,0,69,17,0,7,0,75,17,33,0,69,48,6,32,0,69,0,13,0,69,17,0,9,32,0,60,0,14,0,68,17,17,0,9,32,0,63,17,33,0,70,48,0,12,32,0,67,17,33,0,71,48,6,32,0,70,0,0,33,0,60,50,6,32,0,70,0,12,33,0,63,50,6,32,0,60,0,5,0,70,17,0,44,0,1,26,0,69,17,0,2,0,75,17,0,2,32,0,71,17,0,0,32,0,60,0,14,0,75,17,0,28,16,0,0,0,74,17,0,2,32,0,65,17,17,0,0,32,0,61,0,28,16,0,0,0,69,17,0,2,32,0,66,17,0,0,34,0,70,17,17,33,0,72,48,6,32,1,29,0,36,16,0,0,32,0,72,17,0,13,34,0,68,17,0,9,32,0,69,0,14,0,68,17,17,32,0,56,32,0,10,0,153,27,16,6,32,0,60,0,14,0,68,17,0,9,32,0,63,17,0,10,32,0,61,17,0,8,16,0,2,33,0,69,50,6,32,0,61,0,12,33,0,67,50,6,32,0,67,0,44,0,32,26,33,0,60,50,6,32,0,66,0,32,32,0,61,0,29,0,69,17,17,33,0,73,48,6,34,0,65,0,2,32,0,59,17,0,29,0,54,0,1,27,16,0,1,33,0,59,50,6,32,0,59,0,11,0,68,17,0,11,32,0,67,17,32,0,56,32,0,10,0,149,27,16,6,0,68,0,22,32,0,73,17,0,35,0,53,0,50,0,0,26,27,32,0,61,17,0,12,32,0,66,17,32,0,56,32,0,10,0,154,27,16,6,0,70,0,13,32,0,69,17,0,12,34,0,71,17,32,0,56,32,0,10,0,155,27,16,6,32,0,67,0,44,0,32,26,33,0,59,50,6,32,0,60,0,14,0,69,17,0,10,33,0,73,50,6,32,0,59,0,11,0,68,17,0,11,32,0,73,17,32,0,56,0,32,32,0,67,21,32,0,10,0,156,27,16,6,32,0,69,0,13,0,68,17,33,0,74,48,0,0,0,69,17,0,2,34,0,66,17,0,6,32,0,63,17,0,29,16,0,32,32,0,61,17,33,0,75,48,6,32,0,59,0,14,0,70,17,33,0,76,48,0,9,32,0,75,0,14,0,68,17,17,32,0,56,0,32,32,0,67,21,32,0,10,0,157,27,16,6,32,0,52,0,28,0,11,0,20,21,0,69,17,0,11,32,0,50,0,29,16,17,0,28,0,54,0,1,27,16,0,0,0,69,17,0,32,0,53,32,0,49,27,0,55,34,0,76,0,2,0,70,17,0,6,34,0,75,17,27,16,33,0,77,48,6,34,0,67,0,44,0,32,26,33,0,63,50,6,32,0,55,0,35,0,53,32,0,56,27,0,55,32,0,74,0,8,16,27,16,33,0,78,48,6,32,0,56,0,32,32,0,74,17,0,44,0,35,26,32,0,43,17,33,0,79,48,6,32,0,69,0,32,32,0,74,17,0,14,0,70,17,33,0,80,48,6,32,1,29,0,36,16,0,1,32,0,1,17,0,35,0,53,34,0,56,27,0,55,0,1,0,53,32,0,72,27,0,2,34,0,69,0,11,0,68,17,21,0,0,0,20,21,27,16,0,33,0,68,0,75,0,71,0,78,11,4,17,33,0,81,48,6,32,1,29,0,36,16,0,0,0,75,17,0,14,32,0,1,17,0,9,0,75,0,14,32,0,3,17,0,35,32,0,31,17,17,0,0,33,0,81,50,6,34,0,81,0,54,0,14,27,32,1,41,0,51,0,8,27,34,0,40,21,0,35,32,0,52,0,50,0,0,26,0,59,17,21,33,0,82,48,6,32,1,29,32,1,26,32,0,1,17,0,11,32,0,78,17,0,32,16,33,0,83,48,6,0,69,32,0,82,16,33,0,84,48,6,0,75,34,0,82,0,52,0,20,0,2,0,70,21,0,6,0,19,21,27,0,70,17,33,0,85,48,0,0,0,53,0,11,0,53,0,68,27,0,10,32,0,84,21,27,16,33,0,86,48,6,32,0,84,0,32,32,0,49,17,0,11,32,0,73,17,0,11,32,0,63,17,0,10,32,0,86,0,32,32,0,49,17,0,11,32,0,60,17,17,32,0,46,0,51,0,32,27,0,22,0,68,21,0,32,32,0,49,21,32,0,10,0,158,27,16,6,32,0,86,0,32,0,53,32,0,49,27,0,55,34,0,60,27,16,33,0,86,49,0,44,0,1,26,0,69,17,0,6,33,0,85,50,6,32,0,84,0,32,0,53,32,0,49,27,0,55,0,6,0,53,34,0,73,27,27,16,33,0,84,49,6,32,0,86,0,36,16,0,11,0,68,17,32,0,1,0,51,1,22,27,0,32,20,32,0,10,0,159,27,16,6,32,0,84,0,12,32,0,53,17,0,11,34,0,50,0,32,0,53,32,0,49,27,0,55,34,0,63,0,8,16,27,16,0,10,0,53,0,29,27,16,17,0,26,0,69,17,32,0,46,0,32,20,32,0,10,0,160,27,16,6,32,0,84,0,2,0,75,17,0,0,0,68,0,70,0,75,11,3,0,35,32,0,85,17,17,33,0,87,48,6,32,0,84,0,32,32,0,49,17,0,8,16,0,2,0,75,17,0,35,34,0,61,0,50,0,0,26,16,0,29,16,17,0,1,33,0,72,50,6,32,0,3,0,35,0,53,32,0,31,0,35,32,0,41,17,27,0,55,34,0,86,0,32,32,0,52,17,0,26,0,69,17,27,16,0,2,32,0,23,17,0,44,0,1,26,32,0,21,17,33,0,3,49,6,32,0,23,0,9,34,0,24,17,33,0,88,48,6,0,68,0,11,32,0,3,17,0,44,0,22,26,0,69,17,0,35,32,0,30,17,33,0,89,48,0,29,16,0,9,32,0,88,17,33,0,90,48,6,32,0,3,0,35,32,0,90,0,8,16,32,1,39,16,17,0,2,32,0,90,17,0,0,32,0,3,17,0,20,0,15,0,70,21,0,11,32,0,89,21,0,1,0,20,21,0,6,0,20,0,14,0,75,21,0,2,34,0,89,0,0,0,69,17,21,0,44,0,22,26,0,68,21,0,35,34,0,30,21,21,16,33,0,91,48,6,32,0,91,0,35,0,0,0,6,0,69,21,0,5,0,20,21,34,0,90,0,8,16,0,50,0,0,26,16,0,54,0,20,0,1,0,35,21,27,21,0,68,0,14,32,0,91,17,0,9,32,0,88,17,0,8,16,32,1,39,16,17,0,6,33,0,91,50,6,32,0,91,0,29,16,0,2,34,0,88,17,0,0,33,0,3,50,6,32,0,25,0,14,0,69,17,0,9,32,0,91,0,13,0,68,17,17,0,10,33,0,26,50,0,8,16,0,2,33,0,25,50,6,32,0,25,0,1,32,0,25,0,14,0,68,17,0,2,32,0,91,17,17,33,0,91,49,6,0,59,0,14,32,0,3,17,0,29,0,69,17,0,9,0,86,0,14,32,0,3,17,17,0,1,33,0,3,50,6,0,68,0,14,32,0,3,17,0,29,16,0,12,0,74,0,14,32,0,3,17,17,32,0,31,0,51,0,33,27,32,0,10,0,161,27,16,6,34,0,19,0,20,0,1,0,8,0,54,0,2,27,21,33,0,3,50,6,32,1,35,0,1,32,0,1,17,33,0,92,48,6,34,0,36,0,49,1,23,26,16,6,32,0,13,0,44,0,35,26,33,0,1,50,6,34,0,55,0,35,32,0,13,17,33,0,93,48,6,32,0,37,0,44,0,35,26,33,0,3,50,6,32,0,37,0,44,0,35,26,33,0,23,50,6,32,0,37,0,44,0,35,26,33,0,91,50,6,34,0,21,0,12,34,0,22,17,0,35,32,0,37,17,0,32,16,0,22,34,0,42,0,33,16,0,35,32,0,39,17,33,0,94,48,17,33,0,39,49,6,32,0,1,0,35,34,0,94,17,0,44,0,1,26,32,1,17,0,36,16,0,0,0,71,17,17,0,44,0,22,26,32,0,38,0,46,0,68,26,16,17,33,0,95,48,6,32,0,3,0,76,0,54,0,15,27,0,9,0,11,0,53,0,87,27,21,16,33,0,96,48,6,0,68,0,11,32,0,3,17,0,11,32,0,96,17,33,0,97,48,6,32,0,97,0,29,16,32,1,39,16,0,44,0,35,26,32,0,91,17,33,0,98,48,0,15,0,69,17,33,0,99,48,6,32,0,91,0,1,16,0,6,0,68,17,33,0,100,48,6,32,0,98,0,1,16,0,6,0,68,17,33,0,101,48,6,32,0,13,33,0,27,49,6,34,0,37,0,44,0,35,26,33,0,26,50,6,32,0,96,0,2,32,0,101,17,32,0,28,0,162,26,16,6,32,1,28,0,14,32,0,1,17,0,2,32,0,101,17,32,0,28,0,163,26,16,6,0,70,0,16,32,0,3,17,0,9,0,70,0,11,32,0,98,17,17,33,0,102,48,0,11,32,0,93,17,0,32,16,0,30,16,33,0,103,48,6,0,75,0,14,32,0,3,17,33,0,104,48,0,9,32,0,102,17,0,28,16,0,10,32,0,102,17,33,0,105,48,6,0,70,0,27,16,0,39,32,0,3,17,0,10,32,0,105,17,0,16,32,0,104,17,0,2,0,70,17,0,6,32,0,100,17,0,29,0,2,34,0,104,21,0,6,0,28,21,0,70,17,0,2,32,0,102,0,11,32,0,93,17,17,32,0,28,0,164,26,16,6,32,1,27,0,14,32,0,1,17,33,0,106,48,6,32,1,17,0,36,16,0,0,0,70,17,32,1,15,0,36,16,0,0,0,69,17,11,2,0,39,32,0,1,17,33,0,107,48,6,32,1,17,0,36,16,0,0,0,74,17,0,44,34,0,35,26,32,0,1,17,33,0,108,48,32,1,39,0,52,0,11,27,32,0,107,17,0,9,32,0,106,17,33,0,109,48,6,0,68,0,14,32,0,3,17,0,11,0,53,0,10,0,53,0,29,27,27,32,0,105,17,0,28,0,54,0,9,27,16,32,0,13,32,0,10,0,165,27,16,6,32,0,3,0,14,0,86,17,0,29,0,68,0,68,11,2,17,0,11,32,0,97,17,32,0,13,32,0,10,0,144,27,16,6,32,1,16,0,36,16,0,0,0,70,17,0,14,32,0,1,17,33,0,110,48,6,0,69,0,16,34,0,91,17,0,28,16,0,9,32,0,110,17,0,11,32,0,99,17,33,0,111,48,6,32,0,97,0,29,0,69,17,0,9,33,0,110,50,6,32,0,110,0,11,32,0,111,17,32,0,13,32,0,10,0,166,27,16,6,32,0,111,0,10,32,0,105,17,0,8,16,0,30,0,55,32,1,38,0,1,0,19,21,0,53,0,13,0,51,0,27,27,27,27,16,33,0,112,48,6,32,0,96,0,32,16,33,0,113,48,0,0,0,53,32,0,112,0,54,0,35,27,27,16,0,0,0,69,17,33,0,114,48,6,0,69,0,22,32,0,97,17,0,35,32,0,114,17,32,0,13,0,35,0,53,0,69,0,54,0,1,27,27,32,0,114,21,32,0,10,0,167,27,16,6,32,0,3,0,35,32,0,113,17,0,13,0,86,17,33,0,115,48,6,32,0,3,0,35,32,0,114,17,33,0,116,48,6,32,0,98,0,35,32,0,114,17,0,6,0,68,17,0,13,32,0,116,17,0,9,32,0,115,17,32,0,13,0,35,32,0,114,21,32,0,10,0,168,27,16,6,32,0,1,0,35,32,0,113,17,0,44,0,1,26,32,1,16,0,36,16,17,0,0,32,0,111,0,35,32,0,113,17,17,0,0,34,0,116,0,15,0,68,17,17,0,0,32,0,115,17,33,0,117,48,6,32,0,79,0,22,33,0,114,50,6,32,0,1,0,46,0,68,26,16,0,35,0,53,32,0,114,27,0,55,32,0,79,0,46,0,78,26,16,0,22,32,0,117,17,27,16,0,1,0,53,0,28,27,16,33,0,118,48,6,32,0,118,0,35,32,0,43,17,0,2,0,53,0,50,0,0,26,0,14,0,68,21,0,10,0,53,0,29,0,53,0,69,27,27,20,27,16,0,50,0,0,26,16,0,29,16,33,0,118,49,0,35,32,0,13,17,33,0,119,48,0,11,0,68,17,33,0,120,48,6,32,0,119,0,14,0,71,17,33,0,121,48,6,32,0,100,0,14,0,70,17,0,9,32,0,120,17,33,0,122,48,0,9,32,1,19,0,36,16,0,14,32,0,1,17,17,0,32,16,33,0,123,48,6,32,0,109,0,10,32,0,108,17,0,29,16,0,15,32,0,23,17,0,11,32,0,122,17,0,2,32,0,100,17,34,0,28,0,169,26,16,6,32,0,122,0,9,32,0,121,17,32,0,13,32,0,10,0,170,27,16,6,32,0,97,0,28,0,69,17,0,9,32,1,17,0,36,16,0,0,0,78,17,0,14,32,0,1,17,17,0,11,32,0,120,0,11,32,0,121,17,17,32,0,13,32,0,10,0,171,27,16,6,32,0,118,0,14,0,78,17,0,2,0,75,17,0,1,33,0,118,50,6,34,0,119,0,14,0,78,17,33,0,124,48,6,32,0,100,0,14,0,69,17,0,2,32,0,120,17,0,6,33,0,26,50,6,32,1,16,0,36,16,0,44,0,1,26,32,1,35,17,0,14,32,0,92,17,0,11,32,0,118,17,32,0,48,16,33,0,125,48,6,32,0,26,0,35,32,0,43,17,34,0,48,16,33,0,126,48,6,32,0,31,0,35,32,0,54,17,0,22,0,68,17,0,44,0,1,26,0,69,17,1,24,16,6,32,0,126,33,0,127,48,6,32,0,52,32,1,40,0,52,0,16,27,33,0,126,50,6,0,68,0,14,32,0,77,17,0,9,32,0,126,17,0,26,0,69,17,32,0,46,0,32,20,32,0,10,0,173,0,160,11,2,0,56,0,11,0,53,34,0,127,0,26,0,69,17,27,0,49,0,10,26,20,27,27,16,6,32,0,126,0,2,0,70,17,0,6,33,0,77,50,6,32,0,84,0,2,33,0,77,50,6,32,0,77,0,14,0,70,17,0,35,32,0,47,17,0,35,32,0,13,17,33,0,128,48,6,32,0,128,0,14,0,1,0,19,21,33,0,100,50,6,34,0,128,0,14,0,1,0,19,21,33,0,101,50,6,32,1,35,0,1,32,0,1,17,32,0,8,0,54,0,11,27,0,9,0,15,0,53,0,88,27,21,16,33,0,129,48,6,32,1,35,0,0,32,0,8,17,0,16,32,0,1,17,0,9,32,0,124,17,33,0,130,48,0,32,16,33,0,131,48,6,32,1,17,32,1,26,0,11,0,36,0,0,0,75,21,0,54,0,14,27,21,32,0,1,17,0,10,32,1,18,0,36,16,0,14,32,0,1,17,0,28,16,0,12,32,0,97,17,17,0,10,34,0,130,17,0,10,32,0,129,17,0,11,0,68,0,16,32,0,3,17,0,9,32,0,120,17,0,28,16,0,11,32,0,97,17,0,11,32,0,93,17,17,33,0,132,48,6,34,0,122,0,10,34,0,132,17,0,10,32,0,96,17,0,11,32,0,102,0,10,34,0,124,17,0,12,32,0,105,17,0,10,32,0,18,0,35,32,0,13,17,17,17,0,12,32,0,120,17,32,0,13,32,0,10,0,174,27,16,6,32,0,120,0,35,32,0,113,17,0,11,0,70,0,14,34,0,117,17,0,11,34,0,121,0,35,32,0,113,17,17,17,32,0,13,0,35,32,0,113,21,32,0,10,0,175,27,16,6,32,0,120,0,12,0,53,0,29,27,16,0,9,32,0,3,0,15,0,68,17,17,0,9,32,0,98,0,11,0,68,17,17,0,11,32,0,93,17,32,0,13,32,0,10,0,176,27,16,6,32,0,120,0,35,32,0,113,17,33,0,133,48,0,12,33,0,115,50,6,32,0,113,0,32,34,0,133,17,33,0,134,48,6,32,1,17,0,36,16,0,0,0,74,17,0,14,32,0,1,17,0,10,32,0,109,17,0,29,16,0,9,34,0,23,17,0,9,34,0,129,17,0,35,0,69,0,1,32,0,134,17,17,0,8,16,32,0,13,0,35,32,0,134,21,32,0,10,0,177,27,16,6,32,0,115,0,44,0,32,26,33,0,113,50,6,32,0,79,0,46,0,69,26,16,0,22,34,0,115,17,0,44,0,32,26,33,0,114,50,6,34,0,18,0,29,16,33,0,135,48,0,32,16,33,0,136,48,6,32,0,92,32,0,8,0,54,0,11,27,0,9,0,15,0,53,0,68,27,21,16,0,11,34,0,96,0,9,32,0,120,17,0,28,16,0,35,32,0,43,17,0,10,34,0,135,17,0,10,34,0,78,17,17,0,32,16,33,0,137,48,6,32,0,118,0,35,32,0,83,17,33,0,138,48,0,11,0,68,17,33,0,139,48,6,0,70,0,70,11,2,32,1,26,34,0,118,0,35,32,0,137,17,33,0,140,48,17,33,0,141,48,6,0,74,0,11,34,0,138,17,0,9,32,0,139,17,32,0,83,32,0,10,0,178,27,16,6,32,0,47,0,35,32,0,137,17,33,0,142,48,6,32,0,92,0,35,32,0,137,17,33,0,143,48,6,32,0,7,0,13,16,0,11,32,0,143,17,0,9,32,0,142,0,14,0,68,17,17,0,9,32,0,141,17,33,0,144,48,6,32,0,7,0,35,32,0,143,0,32,32,0,144,17,17,33,0,145,48,0,14,0,68,17,32,0,137,0,32,32,0,144,21,32,0,10,0,179,27,16,6,32,0,141,0,32,0,53,34,0,144,27,0,55,34,0,145,0,15,0,68,17,27,16,33,0,141,49,6,0,68,0,15,32,0,7,17,0,32,16,33,0,146,48,0,46,0,68,26,16,33,0,147,48,6,32,0,143,0,32,32,0,141,17,33,0,148,48,0,22,32,0,146,17,0,41,32,0,87,0,13,16,0,22,32,0,142,0,32,32,0,141,17,33,0,149,48,17,0,22,32,0,147,17,33,0,150,48,17,33,0,151,48,6,32,0,34,0,35,34,0,54,17,0,44,0,1,26,0,69,17,0,22,32,0,1,0,13,16,17,0,35,32,0,149,17,0,22,34,0,34,0,32,34,0,46,17,0,22,0,59,17,0,35,34,0,142,17,0,0,32,0,140,0,14,0,69,17,17,17,33,0,152,48,6,32,0,152,0,33,16,0,35,0,53,32,0,148,0,22,32,0,143,17,33,0,153,48,0,54,0,35,27,0,33,20,27,16,33,0,154,48,6,32,0,154,0,32,0,53,0,15,0,53,32,0,141,0,13,16,27,27,16,1,25,16,6,32,0,154,0,35,34,0,148,0,46,0,59,26,16,0,22,32,0,141,17,0,35,32,0,154,17,0,50,0,0,26,16,33,0,155,48,0,33,16,17,0,32,0,53,32,0,141,0,13,16,0,54,0,11,27,27,16,33,0,154,49,6,32,0,154,0,44,0,35,26,33,0,141,50,6,32,0,154,0,44,0,35,26,33,0,137,50,6,32,0,154,0,44,0,35,26,33,0,140,50,6,34,0,155,0,11,0,68,17,0,10,0,53,0,29,27,16,0,8,16,0,49,0,0,26,16,33,0,156,48,6,34,0,143,0,35,32,0,154,0,25,32,0,156,17,17,33,0,157,48,6,32,0,7,0,13,16,0,16,32,0,157,17,32,0,137,0,25,32,0,156,21,32,0,10,32,0,157,0,54,0,32,27,0,40,20,32,1,31,0,180,21,27,16,6,32,0,140,0,11,0,68,17,33,0,158,48,0,9,0,75,0,11,34,0,140,17,17,33,0,159,48,6,34,0,33,0,35,32,0,137,17,0,35,0,53,32,0,141,32,1,39,16,0,26,32,0,156,17,27,0,22,34,0,7,0,6,0,68,17,0,1,16,33,0,160,48,0,35,32,0,157,17,21,0,1,0,20,21,16,33,0,161,48,6,32,0,161,0,11,0,68,17,0,9,32,0,159,17,32,0,137,32,0,10,0,181,27,16,6,34,0,159,32,1,41,0,26,0,69,21,0,16,0,32,21,32,0,141,17,33,0,162,48,0,35,34,0,154,0,32,32,0,141,17,0,33,16,33,0,163,48,17,0,22,34,0,147,17,0,41,34,0,150,17,33,0,164,48,6,34,0,149,0,22,34,0,160,17,0,38,0,0,32,0,87,0,54,0,35,27,21,16,0,20,0,26,0,53,0,13,27,34,0,146,21,0,35,0,53,0,33,27,34,0,163,21,0,35,32,0,141,0,26,34,0,156,17,0,50,0,0,26,0,59,17,21,0,22,0,35,0,53,34,0,157,27,21,16,33,0,165,48,6,32,0,161,0,11,0,68,17,32,1,41,0,11,34,0,162,0,22,0,69,17,21,0,35,0,53,0,50,0,0,26,27,0,19,21,32,0,141,17,0,9,32,0,141,0,28,0,69,17,0,11,32,0,158,17,17,33,0,166,48,6,32,0,92,0,35,32,0,83,17,0,0,0,75,17,0,0,32,0,84,0,2,0,75,17,0,35,32,0,47,0,35,32,0,83,17,33,0,167,48,17,17,33,0,168,48,6,34,0,167,0,2,0,78,17,0,0,32,0,168,17,0,30,0,55,0,39,27,16,0,22,33,0,166,50,6,0,69,0,1,32,0,79,17,0,44,0,35,26,32,0,13,17,0,0,0,69,17,32,0,136,32,0,83,0,22,32,0,137,17,11,3,0,32,0,75,0,70,0,75,11,3,17,0,22,16,33,0,169,48,6,34,0,139,0,22,34,0,158,17,0,12,0,2,0,70,21,0,0,0,20,21,34,0,166,17,0,0,0,89,17,33,0,170,48,6,32,0,79,0,46,0,89,26,16,32,0,79,0,46,0,68,26,16,34,0,72,0,32,34,0,74,17,32,0,136,0,46,0,85,26,16,34,0,92,0,35,34,0,136,17,34,0,170,34,0,83,0,46,0,68,26,16,0,22,34,0,161,17,34,0,168,0,22,34,0,165,17,11,8,33,0,171,48,6,32,0,105,0,8,16,0,50,0,0,26,16,32,1,38,0,1,0,20,21,32,0,97,17,0,7,0,10,0,12,21,0,70,17,0,9,32,0,99,17,33,0,172,48,6,34,0,102,0,29,16,0,10,0,69,0,14,32,0,3,17,17,33,0,173,48,0,11,32,0,120,0,11,32,0,97,17,0,10,0,53,0,28,27,16,0,10,32,0,105,17,0,10,34,0,172,17,0,10,32,0,93,17,33,0,174,48,17,0,32,16,33,0,175,48,6,34,0,173,0,10,34,0,174,17,0,12,32,0,99,17,32,0,13,32,0,10,0,182,27,16,6,0,68,0,14,32,0,3,17,0,11,32,0,105,17,0,10,0,68,0,16,32,0,3,17,0,9,34,0,99,17,17,0,8,16,0,2,0,70,17,0,6,34,0,100,17,0,28,0,70,17,0,35,32,0,175,17,33,0,176,48,0,13,0,70,17,33,0,177,48,6,32,1,27,0,11,32,0,1,17,0,11,34,0,93,17,0,32,16,33,0,178,48,0,44,0,35,26,32,0,1,17,33,0,179,48,0,40,16,0,9,16,33,0,180,48,0,44,0,37,26,34,0,179,17,33,0,181,48,6,34,0,8,0,0,32,1,35,17,33,0,182,48,0,16,32,0,1,17,0,32,16,33,0,183,48,0,22,34,0,178,17,33,0,184,48,6,32,0,1,0,35,34,0,183,17,0,0,32,0,180,0,13,16,0,44,0,1,26,34,0,182,17,17,0,22,33,0,181,50,6,34,0,43,0,35,34,0,41,17,33,0,185,48,6,0,68,0,22,32,0,109,17,0,50,0,0,26,16,0,32,0,69,0,22,32,0,108,17,17,0,26,0,69,17,0,29,0,54,0,1,27,16,0,0,34,0,97,0,28,0,69,17,0,32,34,0,108,17,0,8,16,17,0,44,0,22,26,34,0,38,17,33,0,186,48,6,0,87,0,14,32,0,3,17,0,29,16,0,10,34,0,109,17,0,10,32,0,101,0,14,0,70,17,17,0,12,34,0,106,17,0,32,16,0,22,32,0,79,0,32,0,53,0,8,27,32,0,80,17,17,33,0,187,48,6,34,0,107,0,32,16,33,0,188,48,6,32,1,28,0,14,32,0,1,17,0,32,16,33,0,189,48,6,32,0,177,0,0,32,0,175,17,0,0,0,53,32,0,112,0,54,0,35,27,0,2,32,0,177,21,27,16,33,0,190,48,6,32,0,190,0,32,34,0,101,0,35,32,0,175,17,33,0,191,48,0,14,0,70,17,33,0,192,48,0,2,32,0,177,0,0,0,69,17,17,17,0,22,33,0,187,50,6,32,0,192,0,8,16,33,0,192,49,6,32,0,192,0,44,0,32,26,33,0,175,50,6,32,0,192,0,44,0,32,26,33,0,190,50,6,34,0,80,0,1,16,0,22,34,0,110,0,0,32,0,111,17,0,0,32,0,1,17,0,35,32,0,113,17,0,44,0,1,26,32,1,16,0,36,16,0,0,0,69,17,17,0,6,0,68,17,17,0,0,0,90,17,33,0,193,48,6,32,0,184,32,0,184,32,0,185,32,0,185,32,0,131,32,0,123,32,0,39,0,32,0,70,17,32,0,114,32,0,187,32,0,189,0,69,0,0,32,0,134,17,0,69,0,0,32,0,134,17,34,0,112,0,35,32,0,103,17,0,6,0,69,17,0,0,32,0,103,17,34,0,190,32,0,188,11,15,33,0,194,48,0,22,16,0,44,0,35,26,32,0,13,17,0,22,32,0,169,17,33,0,195,48,0,33,16,33,0,196,48,6,34,0,184,0,46,0,68,26,16,34,0,181,32,0,185,0,46,0,69,26,16,34,0,185,0,13,16,0,27,16,0,0,0,69,17,34,0,131,0,46,0,91,26,16,34,0,123,0,46,0,92,26,16,34,0,186,0,23,34,0,120,0,35,34,0,39,17,0,0,34,0,95,17,0,0,0,66,17,17,0,31,16,0,21,16,34,0,193,34,0,187,0,46,0,78,26,16,34,0,189,0,46,0,93,26,16,32,0,134,0,46,0,94,26,16,34,0,1,0,35,0,69,0,1,34,0,134,17,17,0,44,0,1,26,32,1,35,17,34,0,3,0,35,32,0,103,17,0,0,0,62,17,34,0,98,0,35,32,0,175,17,0,11,0,68,17,0,2,0,74,17,0,0,34,0,176,0,14,0,69,17,0,6,34,0,191,17,0,2,0,70,17,0,0,34,0,177,17,0,32,34,0,192,17,17,0,0,0,95,17,32,0,125,0,0,0,63,17,33,0,197,48,0,26,0,59,17,11,15,0,22,34,0,171,17,0,22,16,0,35,32,0,196,17,33,0,198,48,6,34,0,194,0,46,0,13,26,16,0,22,34,0,169,0,13,16,17,0,35,0,46,0,27,0,54,0,0,27,26,0,50,0,0,26,0,29,20,0,54,0,35,27,21,0,72,0,65,0,96,11,3,17,33,0,199,48,6,34,0,195,0,35,0,53,32,0,199,0,22,16,27,0,55,34,0,113,34,0,79,11,2,0,46,0,13,26,16,0,44,0,32,26,0,69,0,68,11,2,17,0,1,34,0,114,17,34,0,103,0,69,0,1,32,0,175,17,11,3,0,46,32,0,13,0,54,0,35,27,26,16,0,36,0,53,0,70,27,0,55,0,0,0,53,0,69,27,27,16,0,22,16,27,16,33,0,200,48,6,32,0,5,32,0,6,11,2,0,46,0,35,0,53,0,35,0,53,32,0,196,27,0,44,0,22,26,0,59,21,27,26,32,0,200,34,0,200,0,35,0,53,34,0,199,0,36,0,59,17,27,0,55,34,0,111,0,10,34,0,105,17,0,8,16,0,29,16,32,1,39,16,0,35,34,0,175,17,0,44,0,35,26,32,0,13,17,27,16,11,2,17,33,0,201,48,6,32,0,49,0,32,0,53,34,0,49,27,0,55,32,0,59,27,16,33,0,59,49,0,11,0,68,17,0,10,32,0,77,0,13,0,69,17,0,9,32,0,84,17,17,0,10,33,0,53,50,6,32,0,53,0,32,16,33,0,202,48,0,44,0,35,26,34,0,77,17,33,0,203,48,0,14,0,69,17,0,0,0,69,17,33,0,204,48,0,32,16,33,0,205,48,6,34,0,203,0,11,0,69,17,0,0,34,0,59,0,35,32,0,202,17,0,2,0,70,17,17,0,5,0,74,17,33,0,206,48,6,32,0,52,0,35,32,0,202,17,33,0,207,48,0,50,0,0,26,0,59,17,33,0,208,48,6,32,0,206,0,0,34,0,204,17,0,35,0,53,0,34,0,51,0,35,0,53,32,0,208,0,54,0,35,27,0,33,20,0,32,34,0,207,21,27,27,27,16,0,6,32,0,84,0,32,32,0,53,0,9,32,0,52,17,17,0,8,16,0,1,0,70,17,17,33,0,209,48,6,32,0,202,0,35,32,0,205,17,0,41,32,0,209,0,50,0,0,26,16,0,22,0,68,17,0,26,0,35,34,0,208,21,0,0,34,0,206,21,0,35,0,0,0,19,0,51,0,38,27,21,34,0,205,21,0,44,0,22,26,0,25,21,0,59,17,17,0,41,0,53,0,32,27,34,0,209,17,33,0,202,49,6,34,0,85,0,32,32,0,52,17,34,0,84,0,8,16,0,32,32,0,52,17,32,0,52,0,32,16,0,32,0,53,34,0,53,0,32,34,0,52,17,27,0,55,34,0,202,27,16,11,3,33,0,210,48,6,34,0,188,0,13,0,52,0,1,27,32,0,198,17,0,16,34,0,196,17,0,22,0,69,17,0,32,16,32,0,151,0,46,0,13,26,16,0,0,34,0,87,17,34,0,151,34,0,164,11,4,33,0,211,48,6,34,0,197,0,36,0,59,17,0,22,34,0,198,17,34,0,180,34,0,210,34,0,211,34,0,201,11,5,7,11,0,0,46,0,183,0,51,0,42,27,26,11,0,0,68,0,27,16,11,4,33,0,3,48,6,34,0,2,0,13,0,11,0,74,21,0,58,0,24,27,16,0,43,34,0,3,26,0,26,0,13,21,0,54,0,22,27,16,33,0,4,33,0,5,33,0,6,33,0,7,12,4,48,6,34,0,1,32,1,42,34,0,5,32,0,6,11,2,17,33,0,8,48,33,0,9,33,0,10,33,0,11,33,0,12,33,0,13,12,5,48,6,34,0,9,32,1,44,34,0,10,32,0,11,0,36,16,34,0,12,34,0,13,34,0,6,0,46,0,68,26,16,0,29,34,0,7,17,11,5,17,33,0,14,33,0,15,33,0,16,33,0,17,33,0,18,12,5,48,6,34,0,14,34,0,11,0,26,0,69,17,0,22,34,0,4,0,35,34,0,15,17,11,1,17,0,22,16,34,0,16,0,12,16,0,31,16,0,45,0,11,26,16,34,0,17,0,12,16,0,31,16,0,45,0,11,26,16,34,0,18,34,0,8,11,6,7,34,0,1,34,0,2,16,7,32,0,2,0,35,32,0,1,17,0,22,34,0,1,17,0,36,0,53,0,59,27,0,52,0,13,27,0,58,34,0,0,27,34,0,2,0,44,0,35,26,16,17,7,34,0,1,0,32,16,0,36,16,0,124,11,2,0,42,16,7,32,1,26,0,32,34,0,1,17,0,125,11,2,0,42,16,7,34,0,1,0,22,0,68,17,0,35,0,53,0,50,0,0,26,27,32,1,31,17,0,9,32,1,32,17,0,44,0,32,26,32,1,26,17,0,126,11,2,0,42,16,7,32,1,26,0,32,34,0,1,17,0,127,11,2,0,42,16,7,34,0,2,0,32,34,0,1,17,0,44,0,35,26,32,1,26,17,0,128,11,2,0,42,16,7,32,0,2,0,44,0,32,26,33,1,26,50,6,32,0,2,0,44,0,32,26,33,1,25,50,6,34,0,1,0,32,34,0,2,17,7,0,49,0,10,26,0,58,34,0,1,0,24,34,0,2,0,54,0,32,27,21,0,42,20,27,7,32,1,16,0,16,0,81,17,0,9,33,0,1,50,6,0,81,0,5,33,1,18,50,6,0,80,0,1,32,1,18,17,0,6,0,68,17,33,0,3,48,0,22,0,68,17,0,35,32,0,1,0,11,0,53,0,29,27,16,0,50,0,0,26,16,17,0,15,32,1,16,17,0,9,32,0,1,17,33,0,4,48,0,12,33,0,1,50,6,34,0,1,32,1,21,16,0,32,0,53,0,68,0,12,34,0,3,17,27,0,55,0,0,0,53,34,0,4,32,1,21,16,0,2,0,82,17,27,27,16,7,32,0,1,0,54,0,36,27,33,0,3,48,6,0,26,0,25,11,2,0,46,1,26,26,16,33,0,4,33,0,5,12,2,48,6,0,36,0,55,0,26,0,53,0,59,27,27,0,24,20,33,0,6,48,6,0,46,0,25,26,0,30,20,0,46,0,22,26,0,46,0,26,26,21,0,53,0,59,0,68,11,2,27,33,0,7,48,6,1,27,33,0,8,48,6,32,2,17,32,2,26,34,0,1,17,0,32,16,0,30,16,0,49,0,46,34,0,8,26,0,22,20,0,32,0,53,0,46,0,36,26,0,39,20,27,20,0,25,0,53,0,13,0,5,0,85,21,27,20,26,0,68,0,27,16,0,44,0,24,26,16,0,24,16,17,0,46,0,22,26,16,0,36,0,53,0,46,0,13,26,0,49,0,5,26,0,37,0,20,21,0,36,20,20,27,16,33,0,9,48,6,0,69,32,0,9,32,1,10,34,0,9,32,2,31,0,137,17,27,16,7,0,14,0,58,0,49,0,10,26,27,0,58,34,0,1,0,24,34,0,2,0,54,0,32,27,0,44,0,69,0,57,0,35,27,26,0,43,32,1,6,26,0,23,32,1,5,21,21,0,31,0,51,0,9,27,20,21,0,42,20,27,7,32,1,15,0,22,0,68,17,0,32,32,0,1,17,0,12,32,2,17,0,36,16,0,0,0,74,17,17,32,1,13,0,22,0,68,21,0,32,34,0,1,21,32,1,10,0,142,27,16,7,34,0,1,0,6,33,1,26,50,0,14,0,70,17,32,1,27,32,1,10,34,0,4,27,16,7,32,2,29,32,2,26,34,0,1,17,0,9,32,1,47,0,14,0,68,17,17,7,32,1,5,0,35,0,53,32,0,1,27,0,55,32,1,5,0,35,32,0,2,17,27,16,33,1,5,49,6,32,1,6,0,35,0,53,34,0,2,27,0,55,32,1,6,0,35,34,0,1,17,27,16,33,1,6,49,7,32,1,25,0,35,32,0,1,17,0,2,0,53,0,8,27,32,1,125,17,0,6,33,1,126,50,0,14,0,70,17,32,1,31,0,51,0,33,27,0,35,34,0,1,21,32,1,10,0,172,27,16,7,32,1,152,0,35,0,53,32,0,1,27,0,13,0,53,0,29,27,20,0,52,0,10,27,32,1,153,17,0,8,16,32,1,137,0,32,0,53,32,1,141,27,0,54,0,22,27,20,0,35,34,0,1,21,32,1,10,0,179,27,16,7,0,44,0,24,34,0,1,20,0,54,0,46,0,22,26,27,26,0,24,20,7,34,0,1,32,1,4,32,1,5,0,20,32,1,6,20,32,1,7,0,54,34,0,0,27,0,22,32,1,5,21,11,2,0,56,0,36,0,36,0,59,21,0,54,32,1,3,0,52,0,1,27,27,0,13,0,69,21,27,11,2,0,56,0,20,0,51,0,36,0,51,0,13,27,27,0,11,0,68,21,27,11,2,0,56,32,1,3,0,7,0,70,21,27,34,0,2,19,7] + ,[runtime[0],runtime[1],runtime[2],runtime[3],runtime[4],runtime[6],runtime[7],runtime[8],runtime[9],runtime[10],runtime[11],runtime[12],runtime[13],runtime[14],runtime[15],runtime[16],runtime[17],runtime[18],runtime[19],runtime[20],runtime[21],runtime[22],runtime[23],runtime[24],runtime[25],runtime[26],runtime[27],runtime[28],runtime[29],runtime[30],runtime[31],runtime[32],runtime[33],runtime[34],runtime[35],runtime[36],runtime[37],runtime[38],runtime[39],runtime[40],runtime[41],runtime[42],runtime[43],runtime[44],runtime[45],runtime[46],runtime[47],runtime[48],runtime[49],runtime[50],runtime[52],runtime[53],runtime[54],runtime[55],runtime[56],runtime[57],runtime[59],runtime[60],runtime[62],-1,26,23,24,7,10,13,11,9,0,1,2,5,8,30,4,3,-3,-2,6,Math.PI,15,20,1e15,Infinity,-308,64,-4,-5,-6,32,48,43,44,42,66,16,14,'\0','0','#','\'','\"','@',str("aA"),str("àÀ"),str("⋄,"),str(":;?"),str("⇐←↩"),str("(){}⟨⟩[]"),str("‿"),str("·"),str("𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕣𝕗𝕘"),str(".¯π∞"),str("_"),str("•"),str("𝕨"),str(" "),str("#\'\"@"),str("s"),str("\'"),str("Unknown character"),str(": "),str("Character set conflict: "),str("˜⁼"),str("Unclosed quote"),str("𝕣 can only appear as 𝕣, _𝕣, or _𝕣_"),str("Words can\'t only have underscores"),str("System dot with no name"),str("Numbers can\'t start with underscores"),str("Letter"),str(" \""),str("\" not allowed in numbers"),str("ea"),str("Negative sign in the middle of a number"),str("Portion of a number is empty"),str("Ill-formed decimal or exponent use"),str("π and ∞ must occur alone"),str("Unmatched bracket"),str("Empty program"),str("Swapped open and closed brackets"),str("Parentheses can\'t contain separators"),str("Punctuation : ; ? outside block top level"),str("Empty statement or expression"),str("Invalid assignment or stranding use"),str("Can\'t use export statement as expression"),str("Can\'t use export statement as predicate"),str("Dot must be followed by a name"),str("Header-less bodies must come last"),str("At most two header-less bodies allowed"),str("Invalid Undo header syntax"),str("Only one header per body allowed"),str("Missing operand in header"),str("Invalid header structure"),str("Incorrect special name"),str("Header left argument without right"),str("Header operation must be a plain name"),str("Header with ⁼ must take arguments"),str("Header with ˜⁼ must have left argument"),str("Block header type conflict"),str("Special name outside of any block"),str("Unreachable body"),str("Dot must be preceded by a subject"),str("Nothing (·) cannot be assigned"),str("Can\'t use Nothing (·) as predicate"),str("Missing operand"),str("Double subjects (missing ‿?)"),str("No right-hand side in non-modified assignment"),str("Assignment role mismatch or missing modified assignment target"),str("Role of the two sides in assignment must match"),str("Can\'t use Nothing (·) in lists"),str("Can\'t modify Nothing (·)"),str("Square brackets can\'t be empty"),str("Can\'t return Nothing (·)"),str("Invalid use of 𝕨 in monadic case"),str("Assignment target must be a name or list of targets"),str("Can\'t nest assignments (write aliases with ⇐)"),str("Can\'t use result of function/modifier assignment without parentheses"),str("Alias must have a name on the right and appear within ⟨⟩"),str("Can\'t define special name"),str("Redefinition"),str("Undefined identifier"),str("Can\'t export from surrounding scope"),str("Second-level parts of a train must be functions"),str("System values not supported")] + ,[[0,1,0],[0,0,1],[1,0,2],[1,1,3],[0,0,[[],[4]]],[0,0,[[],[5]]],[0,0,[[],[6]]],[0,0,[[],[7]]],[0,0,[[],[8]]],[0,0,[[],[9]]],[0,0,10],[0,0,11],[0,0,12],[0,0,13],[0,0,[[],[14]]],[0,0,[[],[15]]],[2,1,16],[0,0,17],[0,0,18],[2,1,19],[0,0,20],[1,0,21],[0,0,22],[0,0,[[],[23]]],[0,0,24],[0,0,25],[0,0,26],[0,0,27]] + ,[[0,0],[3,46],[661,5],[680,7],[913,59],[3089,30],[4074,212],[13061,19],[13299,3],[13307,3],[13351,3],[13368,3],[13385,3],[13430,3],[13447,3],[13473,3],[13509,3],[13535,5],[13666,10],[13887,3],[13949,3],[13999,5],[14025,3],[14047,3],[14105,3],[14158,3],[14220,3],[14241,3]] +); +let compgen = sys => { + let gl = sys.glyphs, rt = sys.runtime; + let comp = compgen_raw(list(gl)); + return sys.comps = sysargs => { + let system = (x,w) => { + let r = table(s=>sysvals[unstr(s)])(x); + if (r.some(v=>!has(v))) { + let m = x.filter((_,i)=>!has(r[i])).map(s=>"•"+unstr(s)).join(" "); + throw Error("Unknown system values (see •listSys for available): "+m); + } + return table(v=>v.dynamic?v(sysargs):v)(r); + } + let rts = list([rt, system].concat(sysargs.addrt||[])); + return src => { + let s=str(src), c; + try { c=comp(s,rts); } catch(e) { if (typeof e.message!=="string") e.message.src=s; throw e; } + c.push(s); return c; + } + } +} +let sysargs = {runtime, glyphs:glyphs.map(str)}; +let compile = compgen(sysargs)(sysargs); +let bqn = src => run(...compile(src)); +runtime[43] = rtAssert; + +// Formatter +let fmtnum = x => str(x==Infinity ? "∞" : x==-Infinity ? "¯∞" + : (""+x).replace(/-/g,"¯").replace(/\+/g,"")); +let placeholder = ["array","function","1-modifier","2-modifier"].map(s => str("*"+s+"*")); +let repop = x => x.ns ? str("{"+listkeys(x).join("‿")+"⇐}") + : gl[x.prim] || placeholder[type(x)-2]; +let [fmt1,repr] = run( + [1,1,7,34,0,1,33,0,3,33,0,4,33,0,5,33,0,6,12,4,48,6,0,71,0,16,0,19,0,19,21,0,42,0,72,27,11,2,0,46,0,10,0,42,0,61,27,27,32,0,6,11,2,0,46,0,61,0,43,0,8,27,27,33,0,7,48,6,1,2,33,0,8,48,6,0,11,0,8,0,53,21,0,48,1,3,27,33,0,9,48,6,1,4,33,0,10,48,6,1,5,33,0,11,48,6,1,6,1,7,11,2,0,46,1,8,0,52,11,2,0,46,0,10,0,43,0,10,0,42,0,52,27,0,41,0,7,27,27,27,27,33,0,12,48,6,0,81,0,20,0,80,17,1,9,1,10,11,2,0,46,0,10,0,11,0,49,21,0,7,0,11,0,10,0,53,21,21,27,11,2,0,46,0,15,0,15,0,49,0,49,11,2,21,27,33,0,13,48,6,1,11,33,0,14,48,6,1,12,33,0,15,48,6,32,0,15,0,52,26,33,0,16,48,6,1,13,1,14,1,15,11,3,0,46,0,17,0,40,0,32,0,61,26,0,8,0,18,21,0,40,0,37,0,0,26,0,12,0,0,0,8,0,42,0,49,27,21,0,10,21,27,27,27,33,0,17,48,6,0,17,0,40,32,0,7,27,0,20,20,34,0,17,32,0,16,11,2,0,46,0,17,0,40,0,36,32,0,3,26,27,0,12,0,58,21,0,18,0,40,0,37,0,7,26,27,20,27,32,0,16,11,3,0,46,0,17,0,40,0,14,27,0,3,0,53,21,27,33,0,18,48,6,0,85,0,43,0,19,27,0,19,0,84,21,33,0,19,48,6,1,16,33,0,20,48,6,0,88,33,0,21,48,6,0,17,0,40,0,30,27,32,0,5,20,32,0,21,11,2,0,46,0,53,0,43,0,11,27,27,32,0,20,32,0,18,0,42,0,51,0,51,11,2,27,0,40,34,0,21,0,29,11,2,0,46,0,10,0,11,0,52,21,27,27,27,0,30,0,52,21,0,20,20,33,0,22,48,6,1,17,33,0,23,48,6,1,18,33,0,24,48,6,1,19,33,0,25,48,6,1,20,33,0,26,48,6,0,73,0,17,0,16,0,19,0,17,0,28,0,11,0,0,0,52,21,21,21,0,19,0,16,21,0,70,21,0,35,32,0,7,0,19,0,82,21,26,0,19,0,25,0,75,21,0,19,0,74,21,0,19,0,23,0,52,21,11,2,0,46,0,10,0,8,0,52,21,27,20,0,35,32,0,26,0,19,0,90,21,26,0,19,20,0,25,0,75,21,0,19,0,74,21,11,3,0,46,0,36,32,0,3,26,0,33,0,29,26,0,53,0,18,0,59,17,0,26,0,53,0,52,0,49,11,3,17,21,0,37,0,4,26,20,27,11,2,0,46,0,10,0,8,0,49,21,27,33,0,27,48,6,0,30,0,40,32,0,26,27,0,19,0,91,21,32,0,19,20,32,0,27,0,18,34,0,27,0,41,0,19,0,42,0,92,0,43,0,19,27,27,27,0,15,21,32,0,19,20,11,3,0,46,0,11,0,3,0,53,21,27,33,0,28,48,6,34,0,7,34,0,28,11,2,0,46,32,0,3,0,11,0,49,21,27,33,0,29,48,6,0,32,0,49,26,0,31,0,93,21,34,0,20,34,0,26,27,0,30,0,52,21,33,0,30,48,6,0,17,0,17,34,0,29,20,34,0,30,11,2,0,46,0,16,0,12,0,58,21,27,32,0,3,21,33,0,31,48,6,34,0,25,0,40,0,34,0,60,0,0,0,61,17,0,43,0,19,27,26,27,0,18,20,0,23,0,50,21,32,0,31,11,2,7,0,52,0,35,0,22,26,34,0,1,0,1,16,17,0,27,0,44,0,39,0,33,0,36,0,2,26,26,26,27,16,0,37,0,50,0,51,11,2,0,47,0,0,27,26,34,0,2,19,0,18,16,0,30,0,42,0,50,27,0,44,0,49,27,16,7,32,0,1,0,15,16,0,23,0,50,17,33,0,3,48,0,4,0,52,17,32,1,8,16,33,0,4,48,6,1,21,33,0,5,48,6,32,0,1,0,18,34,0,1,0,15,16,0,22,0,50,17,0,19,34,0,3,0,37,0,2,26,16,17,17,0,22,0,42,0,37,0,0,26,27,34,0,5,11,2,0,46,0,17,0,40,0,10,27,0,8,0,49,21,27,34,0,4,17,7,32,0,1,0,18,16,0,35,0,32,0,62,26,0,18,0,15,0,30,0,50,21,0,43,0,20,27,21,0,19,0,17,21,26,34,0,1,0,15,16,32,1,8,0,52,17,17,0,19,16,7,0,62,0,18,32,0,1,0,10,16,34,0,2,11,2,17,33,0,3,48,6,32,0,3,34,0,1,34,0,3,11,3,0,20,16,0,19,16,7,0,75,0,19,34,0,1,0,29,16,0,23,0,52,17,0,23,0,50,17,17,0,19,0,74,17,0,20,16,7,32,0,1,0,15,16,0,30,0,50,17,33,0,3,48,6,0,76,32,0,2,0,17,0,3,0,52,21,0,33,0,29,26,0,77,21,0,18,20,32,1,6,11,2,0,46,0,8,0,42,0,54,27,27,16,11,2,0,19,16,0,22,32,0,3,17,0,20,16,34,0,1,0,30,0,44,0,78,0,30,0,52,0,1,34,0,2,17,0,3,0,55,17,0,4,0,49,17,17,27,16,0,79,0,22,0,42,0,1,27,34,0,3,17,0,20,16,11,3,0,19,16,7,34,0,1,0,29,16,0,36,0,11,26,0,73,17,0,38,0,1,26,16,0,39,0,0,26,16,0,11,0,53,17,0,37,0,7,26,16,7,34,0,1,0,35,0,62,26,16,32,1,11,0,52,17,32,1,12,0,53,17,0,30,0,42,0,49,0,50,11,2,27,0,44,0,63,27,16,7,34,0,1,0,15,16,0,73,0,35,32,1,6,26,0,35,0,19,0,42,0,82,27,26,20,0,19,20,0,30,0,44,0,64,27,20,11,2,0,46,0,10,0,8,0,52,21,27,16,0,20,16,7,32,0,1,0,35,0,15,26,16,33,0,5,48,6,32,0,5,0,35,0,30,26,0,52,17,0,18,0,32,0,52,26,0,1,0,11,21,0,48,0,38,0,4,26,27,11,2,0,46,0,11,0,8,0,49,21,27,16,33,0,6,48,6,34,0,5,0,35,0,30,26,16,0,11,0,8,0,49,21,0,48,0,52,0,47,0,38,0,4,26,27,27,16,33,0,7,48,6,34,0,1,0,35,0,22,26,0,52,0,22,32,0,6,0,10,16,0,2,32,0,4,17,0,1,16,17,0,6,34,0,6,17,0,2,34,0,4,17,0,36,0,21,26,32,0,7,17,17,0,11,0,1,0,53,21,0,4,0,49,21,0,48,0,20,27,16,0,53,0,47,0,19,0,40,0,8,27,27,16,33,0,8,48,6,34,0,8,32,1,10,0,9,0,40,32,1,9,27,11,2,0,46,34,0,7,0,18,16,0,14,0,42,0,27,0,42,0,52,27,27,16,27,16,32,1,11,0,53,17,7,32,0,1,0,11,16,33,0,5,48,6,32,1,14,34,0,4,26,32,1,12,32,0,5,21,33,0,6,48,6,34,0,1,0,35,32,1,23,26,0,42,0,8,27,32,0,6,20,1,22,11,2,0,46,0,51,0,43,0,8,27,0,37,0,7,26,20,27,34,0,2,19,7,32,0,1,0,11,16,33,0,3,48,6,32,0,1,0,23,0,49,17,0,35,0,8,26,16,0,9,16,33,0,1,49,6,32,0,1,0,15,16,0,23,0,50,17,33,0,4,48,0,10,16,0,1,16,0,11,0,42,0,49,27,0,48,0,51,27,16,33,0,5,48,6,32,0,3,0,8,0,49,17,0,33,0,30,26,0,83,17,33,0,6,48,6,1,23,33,0,7,48,6,32,0,1,0,28,0,42,0,17,0,11,32,0,6,21,0,0,0,52,21,27,34,0,7,11,2,0,46,32,0,3,0,10,0,52,17,27,16,33,0,1,49,6,32,0,6,0,22,0,42,0,1,27,32,0,4,17,32,0,5,0,47,0,19,27,34,0,1,17,34,0,5,0,47,0,19,27,0,68,0,22,32,0,4,0,19,0,52,17,0,30,0,50,17,17,0,18,34,0,4,17,0,30,0,44,34,0,6,27,16,17,0,20,16,32,0,3,0,10,0,52,17,0,48,32,1,9,32,1,11,0,52,21,32,1,12,34,0,3,21,27,16,7,34,0,1,32,1,16,0,42,34,0,2,27,32,1,13,11,2,0,46,0,15,0,11,0,49,21,0,37,0,7,26,20,27,16,7,34,0,1,32,1,15,0,50,26,34,0,2,19,7,0,17,0,17,34,0,4,20,0,21,0,49,21,34,0,0,11,2,0,46,0,16,0,12,0,58,21,27,32,1,3,21,33,0,6,48,6,32,0,1,32,1,4,16,33,0,7,48,0,30,16,33,0,8,48,6,0,69,0,1,0,86,17,0,30,32,0,8,17,33,0,9,48,6,0,17,0,35,34,0,6,0,43,0,30,0,42,0,52,27,0,16,0,12,32,0,9,0,3,0,53,17,21,0,48,0,17,0,40,32,1,19,27,27,0,30,0,43,0,0,27,21,27,26,0,10,0,40,0,24,27,0,11,0,49,21,0,1,20,0,52,0,9,32,0,9,17,0,48,0,27,27,20,21,0,19,20,33,0,10,48,6,32,0,7,0,23,0,52,17,0,32,34,0,1,26,32,1,5,0,40,0,18,27,20,0,17,34,0,5,34,0,2,23,34,0,10,11,3,0,46,34,0,8,0,5,16,0,3,0,53,17,27,16,33,0,11,48,6,32,0,11,32,0,9,0,12,0,53,17,0,48,0,32,34,0,7,26,0,30,0,50,21,32,1,3,20,0,9,0,58,21,0,48,0,87,0,43,0,19,27,27,27,16,33,0,11,49,6,34,0,9,34,0,11,11,2,7,32,0,1,32,1,3,16,33,0,3,48,6,34,0,1,32,1,18,32,1,22,0,42,32,0,3,27,11,2,0,46,34,0,3,0,12,0,58,17,27,34,0,2,19,7,34,0,1,33,0,3,48,0,15,16,33,0,4,48,0,8,32,0,2,19,33,0,5,48,6,32,0,3,32,0,5,0,37,0,7,26,16,0,48,1,24,27,34,0,2,19,7,0,89,33,0,3,48,6,32,0,2,0,49,0,10,0,13,0,53,21,11,2,0,46,0,11,0,13,0,52,21,27,18,0,31,34,0,3,19,6,34,0,1,32,1,23,32,1,24,0,16,21,0,51,0,51,11,2,0,26,0,45,0,17,27,34,0,2,19,0,27,16,17,7,34,0,1,32,1,31,16,7,34,0,1,0,19,0,42,0,29,0,40,0,35,0,62,26,27,27,16,0,29,34,0,2,0,0,0,52,19,0,19,0,49,19,0,28,18,0,2,0,42,0,8,0,42,0,26,27,27,18,19,7,0,52,0,9,32,1,5,17,0,53,11,2,33,0,3,48,6,32,0,1,0,15,16,0,30,0,40,0,24,27,0,2,0,53,21,0,36,0,21,26,0,23,0,40,0,35,0,24,26,0,2,0,27,0,44,0,17,0,39,0,2,0,0,0,52,21,26,0,52,21,27,21,0,37,0,36,0,0,26,26,0,49,21,27,21,0,50,17,33,0,4,48,6,0,32,0,65,0,18,0,52,0,52,11,2,17,26,33,0,5,48,6,34,0,1,0,35,32,2,23,32,0,5,11,2,0,46,0,49,0,43,0,12,27,0,37,0,7,26,20,27,0,15,0,43,0,8,27,0,37,0,7,26,20,0,48,0,17,0,40,34,0,5,27,27,0,16,21,0,42,0,1,0,42,34,0,3,0,1,34,0,2,19,27,27,26,34,0,4,17,33,0,6,48,6,34,0,6,32,1,6,16,7,0,57,0,0,0,61,17,0,8,32,0,1,17,0,2,0,61,0,1,0,67,17,17,0,0,0,56,0,0,0,61,17,0,17,0,1,0,66,21,0,2,0,11,21,32,0,1,17,17,0,0,34,0,1,17,7,32,1,4,0,3,34,0,2,19,0,33,0,1,26,32,1,5,17,33,0,3,48,6,32,1,5,0,35,0,52,0,43,0,18,27,0,43,0,19,27,26,32,0,3,17,0,37,0,36,0,21,26,26,16,33,0,4,48,6,32,0,4,0,35,0,65,26,16,0,30,0,44,32,1,3,0,22,34,0,3,17,27,16,0,35,0,18,26,34,0,4,17,0,19,16,7] + ,[runtime[0],runtime[1],runtime[2],runtime[6],runtime[7],runtime[8],runtime[9],runtime[11],runtime[12],runtime[13],runtime[14],runtime[15],runtime[16],runtime[17],runtime[18],runtime[19],runtime[20],runtime[21],runtime[22],runtime[23],runtime[24],runtime[25],runtime[26],runtime[27],runtime[28],runtime[29],runtime[30],runtime[31],runtime[33],runtime[36],runtime[37],runtime[43],runtime[44],runtime[45],runtime[46],runtime[47],runtime[48],runtime[50],runtime[51],runtime[52],runtime[53],runtime[54],runtime[55],runtime[56],runtime[57],runtime[58],runtime[59],runtime[60],runtime[62],0,-1,Infinity,1,2,5,4,127,32,3,7,10,'\0',' ','┐','↕','…','␡','␀','·','0','\"',str("@"),str("\'"),str("⟨⟩"),str("⟨"),str("⟩"),str("┌"),str("·─"),str("·╵╎┆┊"),str("┘"),str("┌┐"),str("└┘"),str("‿"),str("\'\""),str("("),str(")"),str("00321111"),str("{𝔽}"),str("*array*"),str("•Fmt: 𝕨 must be a list of up to two numbers (width, height)"),str(","),str("<"),str("⥊"),str("Can\'t represent block")] + ,[[0,1,0],[0,0,1],[0,0,2],[0,0,3],[0,0,4],[0,0,[[],[5]]],[0,0,6],[0,0,[[],[7]]],[0,0,8],[0,0,9],[0,0,10],[1,0,11],[1,0,12],[0,0,13],[0,0,[[],[14]]],[0,0,15],[2,0,16],[0,0,17],[0,0,18],[0,0,19],[0,0,20],[0,0,21],[0,0,22],[0,0,23],[0,0,24]] + ,[[0,0],[3,32],[823,3],[889,6],[989,3],[1040,4],[1079,3],[1109,4],[1232,3],[1270,3],[1309,3],[1362,9],[1592,7],[1665,8],[1908,3],[1943,3],[1957,12],[2235,4],[2280,6],[2327,4],[2400,3],[2408,3],[2460,7],[2663,3],[2719,5]] +)(list([type, decompose, repop, fmtnum])); +let fmt = x => unstr(fmt1(x)); + +let errHasSrc = (w,a) => w&&w.loc||(!a&&w.sh&&w.sh[0]===2); +let fmtErr = e => { + let a=e.kind==='!', w=e.message, loc=[]; + while (errHasSrc(w,a)) { + let s=w.src, is; [is,w]=w; + let n=is.sh?is.sh[0]:0, i=n?is[0]:is; + let pair=n&&is.sh.length>1; if (pair) n*=2; + let to=i=>s.slice(0,i).join('').split('\n').map(l=>Array.from(l)); + let ll=to(i), l=ll.length-1, j=ll[l].length, m=to()[l]; + let k=1,o=i-j,cl=j; while (k<n&&(cl=is[k]-o)<m.length) k++; + let ol=k<n; if (pair) { if (k%2) cl=m.length; else { cl=is[--k]-o+1; } } + let c=Array(cl).fill(0); c[j]=1; + for (let h=1;h<k;h++) c[j=Math.max(j,is[h]-o+(pair?h%2:0))]^=1; + if (pair) for (let h=1;h<cl;h++) c[h]^=c[h-1]; + let add = ['',m.join(''),c.map(t=>t?'^':' ').join('')]; + loc = add.concat(ol?['(and other lines)']:[], loc); + } + if (a) w=w?fmt(w).replace(/^/gm,'! '):'! Error'; + else w=w.sh?w.join(''):w; + return [w].concat(loc).join('\n'); +} +let currenterror = (x,w) => { + let e=save_error; + if (!has(e)) throw Error("No error is currently caught by ⎊"); + let a=e.kind==='!'; w=e.message; + while (errHasSrc(w,a)) w=w[1]; + return a||w.sh ? w : str(w); +} + +let dynsys = f => { f.dynamic=1; return f; } +let isstr = x => x.sh && x.sh.length==1 && x.every(c=>typeof c==="string"); +let unixtime = (x,w) => Date.now()/1000; +let req1str = (e,x,w) => { + if (!isstr(x)) throw Error(e+": 𝕩 must be a string"); + if (has(w)) throw Error(e+": 𝕨 not allowed"); + return unstr(x); +} +let dojs = (x,w) => { + let s = req1str("•JS",x,w); + let r = Function("'use strict'; return ("+s+")")(); + let toBQN = x => { + if (isnum(x)) return x; + if (x===undefined) return '\0'; + if (typeof x==='string') { if (Array.from(x).length!==1) throw Error("•JS: JS strings are one character; use Array.from for BQN strings"); return x; } + if (x instanceof Array) return arr(x.map(toBQN),x.sh||[x.length],has(x.fill)?tofill(toBQN(x.fill)):x.fill); + if (isfunc(x)) { let f=(a,b)=>toBQN(x(a,b)); f.m=x.m; return f; } + throw Error("•JS: Unrecognized JS result"); + } + return toBQN(r); +} + +let update_state = (st,w)=>w; // Modified by Node version to handle •state +let push_state = st => st; +let copy_state = st_old => { + let st={...st_old}; st.addrt=[]; push_state(st); return st; +} +let makebqn = (proc,fn) => st => (x,w) => { + let src = proc(x,w,update_state,st); + return fn(st.comps(st)(src)); +} +let makebqnfn = (e,fn) => makebqn((x,w,u,s)=>req1str(e,x,u(s,w)), fn); +let dynsys_copy = fn => dynsys(st => (x,w) => fn(copy_state(st))(x,w)); + +let rebqn = dynsys_copy(state => (x,w) => { + let req = (r,s) => { if (!r) throw Error("•ReBQN: "+s) }; + req(!has(w), "𝕨 not allowed"); + req(x.ns, "𝕩 must be a namespace"); + let [repl,primitives] = ["repl","primitives"].map(nsget(x)); + + if (has(primitives)) { addprimitives(state, primitives); } + let cmp = makebqnfn("•ReBQN evaluation", r=>r)(state); + + repl = has(repl) ? ["none","loose","strict"].indexOf(unstr(repl)) : 0; + req(repl>=0, "invalid value for 𝕩.repl"); + return repl ? rerepl(repl,cmp,state) : ((x,w) => run(...cmp(x,w))); +}); +let addprimitives = (state, p) => { + let req = (r,s) => { if (!r) throw Error("•ReBQN 𝕩.primitives: "+s) }; + req(p.sh && p.sh.length===1, "Must be a list"); + req(p.every(e=>e.sh&&e.sh.length===1&&e.sh[0]===2), "Must consist of glyph-primitive pairs"); + let pr=glyphs.map(_=>[]), rt=pr.map(_=>[]); + p.forEach(([gl,val])=>{ + req(typeof gl==="string", "Glyphs must be characters"); + req(isfunc(val), "Primitives must be operations"); + let k=val.m||0; + pr[k].push(gl); rt[k].push(val); + }); + state.glyphs = pr.map(str); + state.runtime = list(rt.flat()); + compgen(state); +} +let rerepl = (repl, cmp, state) => { + let rd = repl>1 ? 0 : -1; + let vars0, names0, redef0; + let vars = [], names = [], redef = []; + vars.inpreview = true; + state.addrt = [names,redef]; + let copyarr = (to,src) => { + to.length = src.length; + for (let i=0;i<to.length;i++) to[i] = src[i]; + } + let f = (x,w) => { + if (preview) { + vars0 = vars.slice(0); + names0 = names.slice(0); + redef0 = redef.slice(0); + } + names.sh=redef.sh=[names.length]; + let c = cmp(x,w); + let pnames = c[5][2][0]; + let newv = c[3][0][2].slice(vars.length); + names.push(...newv.map(i=>pnames[i])); + redef.push(...newv.map(i=>rd)); + vars .push(...newv.map(i=>null)); + try { + return run(...c, vars); + } finally { + if (preview) { + copyarr(vars, vars0); + copyarr(names, names0); + copyarr(redef, redef0); + } + } + } + f.preview = (x,w) => { + preview = true; + try { + return f(x,w); + } finally { + preview = false; + } + }; + return f; +} +let primitives = dynsys(state => { + let gl=state.glyphs.flat(), rt=state.runtime; + return list(gl.map((g,i) => list([g,rt[i]]))); +}); + +let parsefloat = (x,w) => { + let n = req1str("•ParseFloat",x,w); + if (! /^-?(\.[0-9]+|[0-9]+\.?[0-9]*)([eE][-+]?[0-9]+)?$/.test(n)) throw Error("•ParseFloat: invalid float format"); + return parseFloat(n); +} + +let whileop = m2((f,g)=>(x,w)=>{ + let bool = n => { if (0!==n&&1!==n) throw Error("•_while_: 𝔾 result must be 0 or 1"); return n; } + while(bool(call(g,x,w))) x=call(f,x,w); + return x; +}); +let isint = n => isnum(n) && n===(n|0); +let isnat = n => isint(n) && n>=0; +let fact = (x,w) => { + if (has(w)) throw Error("•math.Fact: Left argument not allowed"); + if (!isnat(x)) throw Error("•math.Fact: Argument other than a natural number not yet supported"); + let p = 1; while (x>0 && p<Infinity) { p*=x; x--; } + return p; +} +let comb = (x,w) => { + if (!has(w)) throw Error("•math.Comb: Left argument required"); + if (!(isint(w) && isint(x))) throw Error("•math.Comb: Non-integer arguments not yet supported"); + let n=w, k=Math.min(x, n-x); + let sgn = 1; + if (n >= 0) { + if (k<0) return 0; + } else { + let j=n-k; if (j<0) return 0; if (j&1) sgn = -1; + let t = Math.min(j, -1-n); n = -1-k; k = t; + } + if (k > 514) return Infinity; + let p = 1; + for (let i=0; i<k; i++) { + p*= (n-i) / (k-i); + if (p === Infinity) return sgn*p; + } + return sgn * Math.round(p); +} +let gcd = (x,w) => { + if (!has(w)) throw Error("•math.GCD: Left argument required"); + if (!(isnat(w) && isnat(x))) throw Error("•math.GCD: Arguments other than natural numbers not yet supported"); + while (w) { let t=w; w=x%w; x=t; } + return x; +} +let lcm = (x,w) => w===0 ? 0 : (w / gcd(x,w)) * x; +let pervfn = f => { f.prim=null; return runtime[61](f,0); } // ⚇ +let mathfn = (f,dy) => { + let p = pervfn((x,w) => { + if (!isnum(x) || (dy && !isnum(w))) throw Error("Arguments must be numbers"); + return f(x,w); + }); + return !dy + ? ((x,w) => {if ( has(w)) throw Error("Left argument not allowed"); return p(x);}) + : ((x,w) => {if (!has(w)) throw Error("Left argument required"); return p(x,w);}); +} +let mathfn_pick = f => mathfn(f, f===Math.atan2 || f===Math.hypot); +let trig = "cos cosh sin sinh tan tanh".split(" "); +let mathkeys = trig.concat(trig.map(n=>"a"+n),"atan2 cbrt expm1 hypot log10 log1p log2 round trunc".split(" ")); +let mathns = makens( + mathkeys.concat(["fact","comb","gcd","lcm"]), + mathkeys.map(k=>mathfn_pick(Math[k])).concat([fact,comb,gcd,lcm].map(pervfn)) +); +trig.map((_,i)=>{let f=mathns[i],g=mathns[i+trig.length]; f.inverse=g; g.inverse=f;}); +(m_atan2 => { + m_atan2. inverse = mathfn((x,w)=>w*Math.tan(x) , 1); + m_atan2.sinverse = mathfn((x,w)=>w/Math.tan(x+0), 1); +})(mathns[2*trig.length]); + +let nsns = (() => { + let keys = (x,w) => { + if (has(w)||!x.ns) throw Error("•ns.Keys: Takes one namespace argument"); + return list(listkeys(x).map(str)); + } + let req1name = (e,x,w) => req1str(e,x,w).replaceAll("_","").toLowerCase(); + let getq = (e,x,w) => { + if (!has(w)||!w.ns) throw Error(e+": 𝕨 must be a namespace"); + return nsget(w)(req1name("•ns."+e,x)); + } + let hasq = (x,w) => +has(getq("Has",x,w)); + let get = (x,w) => { + let v = getq("Get",x,w); + if (!has(v)) throw Error("•ns.Get: key not found"); + return v; + } + let map = (x,w) => { + if (has(w)||!x.ns) throw Error("•ns.Map: Takes one namespace argument"); + let g=nsget(x), getq = (e,x,w)=>g(req1name("Namespace map."+e,x,w)); + let hasq = (x,w) => +has(getq("Has",x,w)); + let get = (x,w) => { + let v = getq("Get",x); + if (has(v)) return v; if (has(w)) return w; + throw Error("Namespace map.Has: key not found"); + } + return makens(["has","get"], [hasq,get]); + } + return makens(["keys","has","get","map"], [keys,hasq,get,map]); +})(); + +let rand = (() => { + let reqnat = (e,x) => { + if (!isnum(x) || x<0 || x!=Math.floor(x)) throw Error("•rand."+e+" must be a natural number"); + }; + let randnat = n => Math.floor(n*Math.random()); + let range = (x,w) => { + reqnat("Range: 𝕩", x); + let r = x ? (()=>randnat(x)) : Math.random; + if (!has(w)) return r(); + let n = 1; + if (!w.sh) reqnat("Range: 𝕨", n=w); + else { + if (w.sh.length>1) throw Error("Range: array 𝕨 must have rank at most 1"); + w.map(m => {reqnat("Range: 𝕨 element", m); n*=m;}); + } + return arr(Array(n).fill().map(r), w.sh?w:[n], 0); + }; + let iota = x => Array(x).fill().map((_,i)=>i); + let deal_err = e => (x,w) => { + reqnat(e+": 𝕩", x); + if (!has(w)) w=x; else { + reqnat(e+": 𝕨", w); if (w>x) throw Error("•rand."+e+": 𝕨 must be less than or equal to 𝕩"); + } + let r = iota(x); + for (let i=0; i<w; i++) { + let j = i + randnat(x-i); + let t=r[i]; r[i]=r[j]; r[j]=t; + } + r.length = w; return list(r,0); + }; + let deal = deal_err("Deal"); + let subset = (x,w) => { + reqnat("Subset: 𝕩", x); + if (!has(w)) return list(iota(x).filter(_=>Math.random()<0.5), 0); + return deal_err("Subset")(x,w).sort((a,b)=>a-b); + }; + return makens(["range", "deal", "subset"], [range, deal, subset]); +})(); + +let platform = dynsys(_ => { + let unk = str("unknown"); + let ns = (k,v) => makens([k], [v]); + return makens( + ["os", "environment", "cpu", "bqn"], + [unk, str("javascript"), ns("arch",unk), ns("impl",str("JS BQN"))] + ); +}); + +let sysvals = { + bqn:dynsys_copy(makebqnfn("•BQN",r=>run(...r))), rebqn, primitives, + type, glyph, decompose, fmt:fmt1, repr, currenterror, unixtime, platform, + js:dojs, parsefloat, math:mathns, ns:nsns, rand, while:whileop, + listsys: dynsys(_ => list(Object.keys(sysvals).sort().map(str))) +}; + +let make_timed = tfn => { + let timed = f => (x,w) => { + let n=has(w)?w:1; + if (!isnum(n) || n!==Math.floor(n) || n<1) throw Error("•_timed: 𝕨 must be an integer above 1"); + return tfn(() => { for (let i=0;i<n;i++) f(x); })/n; + } + timed.m=1; + return timed; +} +if (typeof process!=='undefined') { + let sec = t => t[0]+t[1]/1e9; + sysvals.monotime = (x,w) => sec(process.hrtime()); + sysvals.timed = make_timed(f => { + let t0=process.hrtime(); f(); return sec(process.hrtime(t0)); + }); +} else if (typeof performance!=='undefined') { + sysvals.monotime = (x,w) => performance.now()/1000; + sysvals.timed = make_timed(f => { + let t0=performance.now(); f(); return (performance.now()-t0)/1000; + }); +} + +if (typeof module!=='undefined') { // Node.js + bqn.fmt=fmt; bqn.fmtErr=fmtErr; bqn.compile=compile; bqn.run=run; + bqn.sysargs=sysargs; bqn.sysvals=sysvals; + bqn.makebqn=fn=>makebqn(fn,r=>run(...r)); + bqn.makerepl=(st,repl)=>rerepl(repl, makebqn(x=>x,r=>r)(st), st); + bqn.util={has,list,str,unstr,dynsys,req1str,makens}; + bqn.setexec = (u,p) => { update_state=u; push_state=p; } + module.exports=bqn; +} diff --git a/sketches/01/index.html b/sketches/01/index.html new file mode 100644 index 0000000..7c59b0e --- /dev/null +++ b/sketches/01/index.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <title>Gen bqn.js</title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <style> + pre#debug { + word-wrap: break-word; + white-space: pre-wrap; + overflow: auto; + background-color: #0f0c19; + color: #fff; + padding: 1rem; + } + canvas { + border: 1px solid #000; + } + </style> + </head> + <body> + <script src="./bqn.js"></script> + <script> + const debugNode = () => { + const $debug = document.getElementById('debug') ?? document.createElement('pre') + $debug.parentNode || document.body.appendChild($debug) + $debug.id = 'debug' + return $debug + } + const debug = (value) => { + console.log(fmt(value)) + const $dbg = debugNode() + $dbg.innerText = `${$dbg.innerText || '> start'}\n> ${fmt(value)}` + } + </script> + <script src="./script.js"></script> + </body> +</html> diff --git a/sketches/01/mandelbrot.bqn b/sketches/01/mandelbrot.bqn new file mode 100644 index 0000000..e844df8 --- /dev/null +++ b/sketches/01/mandelbrot.bqn @@ -0,0 +1,23 @@ +CMul ← { ⟨a, b⟩𝕊⟨c, d⟩: ⟨a×c - b×d, a×d + b×c⟩ } +CMag ← +´×˜ +MandelbrotFn ← +⟜(CMul˜) + +MBValue ← {⟨w, h⟩ 𝕊 ⟨x, y⟩: + p ← 6 × ⟨(x - w÷2)÷w, (y - h÷2)÷h⟩ + iters ← 0 + old ← 0‿0 + CMag p⊸MandelbrotFn •_while_ { + isFinite ← 70 > CMag (𝕩 - old) + old↩𝕩 + iters+↩1 + isFinite ∧ iters < 10 + } 0‿0 +} + +MBGrid ← {dimens 𝕊 grid: {⟨0.7, 0.4, 1⟩ × (dimens MBValue 𝕩) | 255}¨grid} + +{𝕊⟨w, h⟩: + grid ← (>{↕h}¨↕w) ∾¨ h⥊˘↕w + p ← ⟨1, 1⟩ + ⟨w, h⟩ MBGrid grid +} diff --git a/sketches/01/mandelbrot.frag b/sketches/01/mandelbrot.frag new file mode 100644 index 0000000..689f2a4 --- /dev/null +++ b/sketches/01/mandelbrot.frag @@ -0,0 +1,55 @@ +varying vec4 v_position; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_mouse; + +#define MAX_ITERATIONS 100 + +vec2 cdiv(vec2 a, vec2 b) { + float r = length(b); + float theta = atan(b.y, b.x); + return vec2(cos(theta), sin(theta)) * (dot(a, b) / (r * r)); +} + +vec2 cpow(vec2 z, float n) { + float r = length(z); + float theta = atan(z.y, z.x); + return pow(r, n) * vec2(cos(n * theta), sin(n * theta)); +} + +void main() { + float time = 1.1 + mod(u_time * 1000.0, 100000.0) / 10000.0; + // float time = 4.0; + + float ratio = u_resolution.x / u_resolution.y; + vec2 pos = v_position.xy/vec2(1.0, ratio); + + vec2 c = 2.0 * (pos - vec2(0.0, 0.0)); + vec2 z = vec2(0.0, 0.0); + int i; + + vec2 prevZ = z; + for (i = 0; i < MAX_ITERATIONS; i++) { + prevZ = z; + z = cpow(z, time) + c; + + if (length(z - prevZ) > 10.0) { + break; + } + } + + if (i == MAX_ITERATIONS) { + gl_FragColor = vec4(27., 14., 50., 255.0) / 255.; + } else if (i > 5) { + gl_FragColor = vec4(97., 42., 191., 255.0) / 255.; + } else if (i > 4) { + gl_FragColor = vec4(150., 191., 69., 255.0) / 255.; + } else if (i > 3) { + gl_FragColor = vec4(230., 123., 40., 255.0) / 255.; + } else if (i > 2) { + gl_FragColor = vec4(27., 14., 50., 255.0) / 255.; + } else { + gl_FragColor = vec4(0., 0., 0., 1.); + } +} + diff --git a/sketches/01/script.js b/sketches/01/script.js new file mode 100644 index 0000000..9c1eaba --- /dev/null +++ b/sketches/01/script.js @@ -0,0 +1,36 @@ +const program = (url) => + fetch(url) + .then((f) => f.text()) + .then(bqn) + +const setupCanvas = (width, height) => { + const $canvas = Object.assign(document.createElement('canvas'), { width, height }) + const ctx = $canvas.getContext('2d') + $canvas.parentNode || document.body.appendChild($canvas) + return ctx +} + +const start = async () => { + console.dir(bqn) + sysvals.show = (x) => debug(x) + + const getPoints = await program('./mandelbrot.bqn') + + const ctx = setupCanvas(200, 200) + const points = getPoints(list([ctx.canvas.width, ctx.canvas.height])) + + // console.log(points) + // debug(points) + + const imageDataRaw = points.flatMap((x) => (x.length === 4 ? x : [...x, 255])) + const imageData = new ImageData( + new Uint8ClampedArray(imageDataRaw), + ctx.canvas.width, + ctx.canvas.height + ) + ctx.putImageData(imageData, 0, 0) + + console.log('DONE') +} + +start().catch((e) => console.log(fmtErr(e))) diff --git a/sketches/02/newton.frag b/sketches/02/newton.frag new file mode 100644 index 0000000..ac31d73 --- /dev/null +++ b/sketches/02/newton.frag @@ -0,0 +1,58 @@ +varying vec4 v_position; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_mouse; + +#define MAX_ITERATIONS 100 + +vec2 cmul(vec2 a, vec2 b) { + return vec2(a.x*b.x - a.y*b.y, a.x*b.y + a.y*b.x); +} + +vec2 cdiv(vec2 a, vec2 b) { + float denominator = b.x*b.x + b.y*b.y; + if (denominator == 0.) return a; + return cmul(a, vec2(b.x, -b.y)) / denominator; +} + +vec2 cpow(vec2 z, float n) { + float r = length(z); + float theta = atan(z.y, z.x); + return pow(r, n) * vec2(cos(n * theta), sin(n * theta)); +} + +void main() { + float time = mod(1.1 + mod(u_time * 1000.0, 100000.0) / 10000.0, 10.); + // float time = 2.0; + + float ratio = u_resolution.x / u_resolution.y; + vec2 pos = v_position.xy/vec2(1.0, ratio); + + vec2 z = 2.0 * (pos - vec2(0., 0.)); + int i; + + vec2 prevZ = z; + for (i = 0; i < MAX_ITERATIONS; i++) { + prevZ = z; + vec2 value = cpow(z, 3.0) + vec2(1., 0.); + vec2 value_der = 3.0 * cpow(z, 2.0); + z = z - time * cdiv(value, value_der); + + if (length(z - prevZ) > 30.0) { + break; + } + } + + gl_FragColor = vec4(0., 0., 0., 1.); + + float diff = length(z - prevZ); + + if (diff > 10.0) { + gl_FragColor = vec4(97., 42., 191., 255.0) / 255.; + } else if (diff > 1.0) { + gl_FragColor = vec4(150., 191., 69., 255.0) / 255.; + } else if (diff > 0.0) { + gl_FragColor = vec4(27., 14., 50., 255.0) / 255.; + } +} + diff --git a/sketches/03/flow.frag b/sketches/03/flow.frag new file mode 100644 index 0000000..b878df9 --- /dev/null +++ b/sketches/03/flow.frag @@ -0,0 +1,32 @@ +#define CELL_COUNT 10.0 + +varying vec4 v_position; +uniform vec2 u_resolution; +uniform float u_time; + +uniform sampler2D testImage; + +struct Particle { + vec2 position; + vec2 velocity; +}; + +bool is_between(vec2 pos, vec2 min, vec2 max) { + return pos.x > min.x && pos.x < max.x && pos.y > min.y && pos.y < max.y; +} + +void main() { + float time = sin(u_time); + float ratio = u_resolution.x / u_resolution.y; + vec2 pos = (v_position.xy + 1.)/2./vec2(1.0, ratio); + + float cell_size = 1.0/CELL_COUNT; + vec2 cell_pos = cell_size * abs(floor(pos / cell_size)); + + gl_FragColor = vec4(0., 0., 0., 1.); + if (is_between(pos, cell_pos, cell_pos + cell_size)) { + vec4 tex = texture2D(testImage, cell_pos); + float value = (tex.r + tex.g + tex.b) / 3.; + gl_FragColor = vec4(value, value, value, 1.0); + } +} diff --git a/sketches/03/test.png b/sketches/03/test.png Binary files differnew file mode 100644 index 0000000..e81a1bb --- /dev/null +++ b/sketches/03/test.png diff --git a/sketches/04/polka.frag b/sketches/04/polka.frag new file mode 100644 index 0000000..97baa9c --- /dev/null +++ b/sketches/04/polka.frag @@ -0,0 +1,32 @@ +varying vec4 v_position; +uniform vec2 u_resolution; +uniform float u_time; + +#define DOTS 32. + +const float segment = 2.0 / (DOTS + 1.); + +void main() { + float time = u_time * 2.; + + float ratio = u_resolution.x / u_resolution.y; + vec2 pos = (v_position.xy - 1.0)/vec2(1.0, ratio); + + vec2 cell_pos = abs(floor(pos / segment)) - 0.5; + int alt = int(mod(cell_pos.x + cell_pos.y, 2.)); + + float radius = (sin(time - length(pos + 0.5)) + 1.)*0.02; + if (alt == 0) { + radius = (0.04 - radius); + } + + gl_FragColor = vec4(0., 0., 0., 1.); + if (length(pos - 0.0 + cell_pos*segment) < radius) { + if (alt == 0) { + gl_FragColor = vec4(.17, .24, .31, 1.); + } else { + gl_FragColor = vec4(0.75, 0.22, 0.17, 1.); + } + } +} + |
